<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Workflow on JM's Site</title><link>/tags/workflow/</link><description>Recent content in Workflow on JM's Site</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 23 Apr 2026 23:43:10 +0000</lastBuildDate><atom:link href="/tags/workflow/index.xml" rel="self" type="application/rss+xml"/><item><title>CI/CD resume publication</title><link>/config/cicd-resume/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><guid>/config/cicd-resume/</guid><description>&lt;p&gt;I am terrible at word processors / editing so I build my resume &lt;a href="https://forgejo.jmopines.com/jm/resume/src/branch/main/examples/resume"&gt;with LaTeX templates&lt;/a&gt;. I gain a pretty, highly configurable resume, but it can be a pain to modify, build, share, etc. A couple weeks ago someone pointed out to me that I forgot to update my most recent role to reflect a promotion (staff software engineer, yeahh!!). I was not at home and I had to work quite a bit to only change a word in my resume. This has always been a pain to me so I figured, why not set up a CI/CD pipeline to build and publish my resume. These are the steps I took.&lt;/p&gt;</description></item><item><title>How Dates Work on This Site</title><link>/thissite/dates/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><guid>/thissite/dates/</guid><description>&lt;p&gt;Every page on this site has two dates: &lt;strong&gt;Created&lt;/strong&gt; and &lt;strong&gt;Updated&lt;/strong&gt;.
Neither one is maintained by hand. Here&amp;rsquo;s the full flow.&lt;/p&gt;
&lt;h2 id="creating-a-new-page"&gt;Creating a new page&lt;/h2&gt;
&lt;p&gt;New content is created with the &lt;code&gt;new.sh&lt;/code&gt; script:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./scripts/new.sh content/thissite/my-page.md
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This sources &lt;code&gt;.env&lt;/code&gt; for &lt;code&gt;HUGO_IMAGE&lt;/code&gt; and &lt;code&gt;SITE_DIR&lt;/code&gt;, then runs
&lt;code&gt;hugo new&lt;/code&gt; inside the Docker container.&lt;/p&gt;
&lt;p&gt;Hugo reads the archetype template at &lt;code&gt;archetypes/default.md&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;+++&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;date = &amp;#39;{{ .Date }}&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;draft = true&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;title = &amp;#39;{{ replace .File.ContentBaseName &amp;#34;-&amp;#34; &amp;#34; &amp;#34; | title }}&amp;#39;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;tags = []&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;+++&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;At creation time, Hugo substitutes &lt;code&gt;{{ .Date }}&lt;/code&gt; with the current
timestamp and writes it into the new file&amp;rsquo;s front matter. The result
looks like:&lt;/p&gt;</description></item><item><title>Organizing This Site</title><link>/config/site-organization/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><guid>/config/site-organization/</guid><description>&lt;p&gt;A reference for how this Hugo site is organized and what configuration
options are available.&lt;/p&gt;
&lt;h2 id="sections"&gt;Sections&lt;/h2&gt;
&lt;p&gt;Sections are created automatically from the directory tree under &lt;code&gt;content/&lt;/code&gt;.
Any directory with an &lt;code&gt;_index.md&lt;/code&gt; file becomes a section with its own list
page.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;content/
├── _index.md ← home page
├── about/
│ ├── _index.md ← /about/ list page
│ ├── whoami.md
│ └── now.md
├── software/
│ ├── _index.md ← /software/ list page
│ ├── ollama.md
│ └── hugo-setup/ ← page bundle (leaf)
│ ├── index.md
│ └── architecture.svg
└── config/
 ├── _index.md ← /config/ list page
 └── this-file.md
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;No config changes are needed — Hugo derives sections from the filesystem.&lt;/p&gt;</description></item><item><title>Python Packaging with uv</title><link>/software/python-uv/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><guid>/software/python-uv/</guid><description>&lt;p&gt;&lt;code&gt;uv&lt;/code&gt; is a fast Python package manager and project tool written in Rust.&lt;/p&gt;
&lt;h2 id="why-uv-over-pippoetrypipenv"&gt;Why uv over pip/poetry/pipenv?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;10–100x faster dependency resolution.&lt;/li&gt;
&lt;li&gt;Single tool: replaces pip, pip-tools, virtualenv, and pyenv.&lt;/li&gt;
&lt;li&gt;Lockfile support via &lt;code&gt;uv.lock&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="common-commands"&gt;Common commands&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uv init myproject &lt;span class="c1"&gt;# scaffold a new project&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uv add requests &lt;span class="c1"&gt;# add a dependency&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uv sync &lt;span class="c1"&gt;# install from lockfile&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;uv run pytest &lt;span class="c1"&gt;# run inside the managed venv&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="project-convention"&gt;Project convention&lt;/h2&gt;
&lt;p&gt;All Python projects in this workspace use &lt;code&gt;uv&lt;/code&gt; exclusively — no raw
&lt;code&gt;pip install&lt;/code&gt; or &lt;code&gt;python -m pytest&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>What I'm Doing Now</title><link>/about/now/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><guid>/about/now/</guid><description>&lt;p&gt;A &lt;a href="https://nownownow.com/about"&gt;/now page&lt;/a&gt;. Update this periodically with
what you&amp;rsquo;re currently focused on.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Building a Hugo site&lt;/li&gt;
&lt;li&gt;Experimenting with local LLMs via Ollama&lt;/li&gt;
&lt;li&gt;Indexing documentation with ChromaDB&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Automatic Dating with Git</title><link>/config/git-dates/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><guid>/config/git-dates/</guid><description>&lt;p&gt;Hugo can pull dates from Git history so you never have to update &lt;code&gt;lastmod&lt;/code&gt;
by hand.&lt;/p&gt;
&lt;h2 id="enable-git-info"&gt;Enable Git info&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c"&gt;# hugo.toml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;enableGitInfo&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="configure-front-matter-date-resolution"&gt;Configure front matter date resolution&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;frontmatter&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;date&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;:filename&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;:default&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;publishDate&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;:filename&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;:default&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;lastmod&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;:git&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;:fileModTime&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="how-it-works"&gt;How it works&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.Date&lt;/code&gt; — tries the filename first (&lt;code&gt;2026-04-03-post.md&lt;/code&gt;), then the
&lt;code&gt;date&lt;/code&gt; field in front matter.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.Lastmod&lt;/code&gt; — uses the Git author date of the last commit that touched
the file, falling back to filesystem mtime.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.PublishDate&lt;/code&gt; — same resolution chain as &lt;code&gt;.Date&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="filename-date-formats"&gt;Filename date formats&lt;/h2&gt;
&lt;p&gt;Hugo recognizes these patterns:&lt;/p&gt;</description></item><item><title>Tools I Use</title><link>/about/tools/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><guid>/about/tools/</guid><description>&lt;p&gt;A list of the hardware, software, and services I rely on daily.&lt;/p&gt;
&lt;h2 id="editor"&gt;Editor&lt;/h2&gt;
&lt;p&gt;VS Code with GitHub Copilot.&lt;/p&gt;
&lt;h2 id="terminal"&gt;Terminal&lt;/h2&gt;
&lt;p&gt;Bash on Linux.&lt;/p&gt;
&lt;h2 id="languages"&gt;Languages&lt;/h2&gt;
&lt;p&gt;Python (via uv), Go, shell scripts.&lt;/p&gt;</description></item></channel></rss>