<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Software on JM's Site</title><link>/software/</link><description>Recent content in Software on JM's Site</description><generator>Hugo</generator><language>en-us</language><atom:link href="/software/index.xml" rel="self" type="application/rss+xml"/><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>Running Local LLMs with Ollama</title><link>/software/ollama/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><guid>/software/ollama/</guid><description>&lt;p&gt;Ollama lets you run large language models locally with a single command.&lt;/p&gt;
&lt;h2 id="quick-start"&gt;Quick start&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;ollama run llama3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="why-local"&gt;Why local?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;No API keys or rate limits.&lt;/li&gt;
&lt;li&gt;Data stays on your machine.&lt;/li&gt;
&lt;li&gt;Works offline.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="models-i-use"&gt;Models I use&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;llama3&lt;/code&gt; — general purpose&lt;/li&gt;
&lt;li&gt;&lt;code&gt;codellama&lt;/code&gt; — code generation&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nomic-embed-text&lt;/code&gt; — embeddings for vector search&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Vector Search with ChromaDB</title><link>/software/chromadb/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><guid>/software/chromadb/</guid><description>&lt;p&gt;ChromaDB is an embedding database for building search and retrieval systems.&lt;/p&gt;
&lt;h2 id="how-i-use-it"&gt;How I use it&lt;/h2&gt;
&lt;p&gt;I chunk documentation (VyOS, Hugo) into paragraphs, embed them with
&lt;code&gt;nomic-embed-text&lt;/code&gt; via Ollama, and store the vectors in ChromaDB for
semantic search.&lt;/p&gt;
&lt;h2 id="stack"&gt;Stack&lt;/h2&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Documents → Chunker → Ollama embeddings → ChromaDB → Query API
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="key-concepts"&gt;Key concepts&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Collection&lt;/strong&gt;: a named group of embeddings (like a table).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Document&lt;/strong&gt;: the raw text stored alongside the vector.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Metadata&lt;/strong&gt;: key-value pairs for filtering results.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Setting Up Hugo with Docker</title><link>/software/hugo-setup/</link><pubDate>Wed, 01 Apr 2026 00:00:00 +0000</pubDate><guid>/software/hugo-setup/</guid><description>&lt;p&gt;This article is a &lt;strong&gt;page bundle&lt;/strong&gt; (leaf bundle). Notice it lives at
&lt;code&gt;software/hugo-setup/index.md&lt;/code&gt; — not &lt;code&gt;hugo-setup.md&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="what-makes-this-a-page-bundle"&gt;What makes this a page bundle?&lt;/h2&gt;
&lt;p&gt;The directory structure looks like this:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;content/software/hugo-setup/
├── index.md ← this file (the page content)
├── architecture.svg ← co-located resource (image)
└── notes.txt ← co-located resource (data)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Everything in this folder &lt;strong&gt;belongs to this page&lt;/strong&gt;. Hugo treats the sibling
files as &lt;em&gt;page resources&lt;/em&gt; accessible via &lt;code&gt;.Resources&lt;/code&gt; in templates.&lt;/p&gt;
&lt;h2 id="why-use-bundles"&gt;Why use bundles?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Co-location&lt;/strong&gt;: images and files live next to the article that uses them,
not in a global &lt;code&gt;static/&lt;/code&gt; folder.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Resource processing&lt;/strong&gt;: Hugo can resize, crop, and fingerprint bundled
images at build time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Portability&lt;/strong&gt;: move or delete the folder and everything travels together.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="using-a-bundled-image"&gt;Using a bundled image&lt;/h2&gt;
&lt;p&gt;In a template you&amp;rsquo;d access it with:&lt;/p&gt;</description></item></channel></rss>