<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Ariel Frischer: writing</title>
  <id>https://ariel-frischer.pages.dev/</id>
  <updated>2026-09-30T00:00:00Z</updated>
  <author>
    <name>Ariel Frischer</name>
  </author>
  <link href="https://ariel-frischer.pages.dev/feed.xml" rel="self" type="application/atom+xml"></link>
  <link href="https://ariel-frischer.pages.dev/classic.html#writing" rel="alternate" type="text/html"></link>
  <entry>
    <title>From ~/.claude to ~/.omp: nine months of agent workflow</title>
    <link href="https://ariel-frischer.pages.dev/posts/agent-workflow-evolution.html"></link>
    <id>https://ariel-frischer.pages.dev/posts/agent-workflow-evolution.html</id>
    <published>2026-09-30T00:00:00Z</published>
    <updated>2026-09-30T00:00:00Z</updated>
    <category term="workflow"></category>
    <summary type="text">Four config folders, one per coding agent era. What changed in each, what stuck, and why the setup now edits itself.</summary>
    <content type="html">&lt;p&gt;My home directory tells the story better than I can. There&amp;rsquo;s a config folder for every coding agent I moved into this year, and each one holds a slightly different idea of how I should work.&lt;/p&gt;&#xA;&lt;div class=&#34;dg&#34;&gt;&#xA;&lt;ol class=&#34;tl&#34;&gt;&#xA;&lt;li&gt;&lt;time&gt;Jan&lt;/time&gt;&lt;b&gt;~/.claude/&lt;/b&gt; one agent, a task list with approval gates&lt;span class=&#34;ev&#34;&gt;first sessions Jan 5 · config under git Jan 24 · dstask skill Jan 29&lt;/span&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;time&gt;Apr 28&lt;/time&gt;&lt;b&gt;~/.codex/&lt;/b&gt; Beads and worktrees show up&lt;span class=&#34;ev&#34;&gt;AGENTS.md on May 20 already says: worktree by default for substantial work&lt;/span&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;time&gt;Jul 31&lt;/time&gt;&lt;b&gt;~/.jcode/&lt;/b&gt; a small team with job titles&lt;span class=&#34;ev&#34;&gt;root agent, workers, research lane · Aug 13: a worktree for every repo change&lt;/span&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;time&gt;Sep 20&lt;/time&gt;plain plans become the default; Autospec is opt-in&lt;span class=&#34;ev&#34;&gt;last completed Autospec implement run: Sep 5&lt;/span&gt;&lt;/li&gt;&#xA;&lt;li class=&#34;now&#34;&gt;&lt;time&gt;Sep 24&lt;/time&gt;&lt;b&gt;~/.omp/&lt;/b&gt; Opus 5.5, a lighter process, and a setup that edits itself&lt;span class=&#34;ev&#34;&gt;Opus 5.5 daily driver Sep 25 · phone app fork Sep 27&lt;/span&gt;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;These eras overlap. I never deleted a folder, and Claude Code came back in September. But the center of gravity moved four times.&lt;/p&gt;&#xA;&lt;h2 id=&#34;claude-january-one-agent-and-a-task-list&#34;&gt;~/.claude/ (January): one agent and a task list&lt;/h2&gt;&#xA;&lt;p&gt;The first &lt;code&gt;CLAUDE.md&lt;/code&gt; was mostly about manners. One of its rules: &amp;ldquo;Patterns: propose, don&amp;rsquo;t impose.&amp;rdquo; If code was drifting toward an abstraction, the agent should mention it and ask, not refactor on its own.&lt;/p&gt;&#xA;&lt;p&gt;Tracking came a few days later. On January 29 I added a &lt;code&gt;dstask&lt;/code&gt; workflow skill with approval gates, and a line saying Autospec, my spec-driven development CLI, was for &amp;ldquo;medium+ features&amp;rdquo;. The same commit added a &lt;code&gt;self-improve&lt;/code&gt; skill. I wanted the agent to learn from its mistakes from day one. It took until September to get that working, which is its own section below.&lt;/p&gt;&#xA;&lt;h2 id=&#34;off-to-the-side-opencode-january-to-july&#34;&gt;Off to the side: OpenCode (January to July)&lt;/h2&gt;&#xA;&lt;p&gt;OpenCode never got a folder in my home directory. Its config lives in &lt;code&gt;~/.config/opencode/&lt;/code&gt;, so it&amp;rsquo;s missing from the list above. It still ran about 3,600 sessions between January and July.&lt;/p&gt;&#xA;&lt;p&gt;Most of those weren&amp;rsquo;t me typing. My OpenClaw bot launched OpenCode from its own workspace for background jobs like news summaries and research notes, on free models: mostly MiniMax M2.5 from February to April, then DeepSeek V4 Flash. It went quiet in August.&lt;/p&gt;&#xA;&lt;h2 id=&#34;codex-from-late-april-beads-and-worktrees&#34;&gt;~/.codex/ (from late April): Beads and worktrees&lt;/h2&gt;&#xA;&lt;p&gt;Codex is where the structure started. By May 20 my &lt;code&gt;AGENTS.md&lt;/code&gt; already had the three rules that survived every era since:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Track work in &lt;a href=&#34;https://github.com/steveyegge/beads&#34;&gt;Beads&lt;/a&gt;.&lt;/strong&gt; One issue per outcome, with scope, acceptance criteria, and handoff notes. The agent can pick up where the last one left off.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Isolate substantial work in a Git worktree.&lt;/strong&gt; Agents stay out of my main checkout. A &lt;code&gt;nowt&lt;/code&gt; escape hatch skipped the worktree for tiny fixes.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Size the planning to the task.&lt;/strong&gt; Obvious one-sitting work skipped Autospec. Roughly 2 to 5 design decisions or 3 to 10 files meant a full spec.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;jcode-from-late-july-a-team-with-job-titles&#34;&gt;~/.jcode/ (from late July): a team with job titles&lt;/h2&gt;&#xA;&lt;p&gt;Jcode is where it turned into an org chart. My workflow doc from that era sums it up in one line:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Beads hold memory. Worktrees hold code. Subagents hold noise.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;One Bead, one branch, one worktree per outcome. A root agent owns the plan, routing, approvals, and integration. Workers do one bounded job and never delegate further. On August 13 the worktree rule tightened from &amp;ldquo;substantial work&amp;rdquo; to every change that touches a repository.&lt;/p&gt;&#xA;&lt;div class=&#34;dg&#34;&gt;&#xA;&lt;div class=&#34;tree&#34;&gt;&#xA;&lt;div class=&#34;n&#34;&gt;&lt;b&gt;root agent&lt;/b&gt;plans · routes · approves · integrates&lt;/div&gt;&#xA;&lt;div class=&#34;kids&#34;&gt;&#xA;&lt;div class=&#34;n&#34;&gt;&lt;b&gt;worker&lt;/b&gt;one bounded change&lt;br&gt;in its own worktree&lt;/div&gt;&#xA;&lt;div class=&#34;n&#34;&gt;&lt;b&gt;research lane&lt;/b&gt;file discovery,&lt;br&gt;fact-gathering&lt;/div&gt;&#xA;&lt;div class=&#34;n&#34;&gt;&lt;b&gt;reviewer&lt;/b&gt;a different model&lt;br&gt;than the author&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;p class=&#34;dg-cap&#34;&gt;The shape since Jcode. Workers report back; only root closes the Bead.&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;This is also when volume went through the roof. Here&amp;rsquo;s every session each agent left on disk, by month:&lt;/p&gt;&#xA;&lt;div class=&#34;dg&#34;&gt;&#xA;&lt;div class=&#34;legend&#34;&gt;&lt;i class=&#34;c-opencode&#34;&gt;&lt;/i&gt;OpenCode &lt;i class=&#34;c-codex&#34;&gt;&lt;/i&gt;Codex &lt;i class=&#34;c-jcode&#34;&gt;&lt;/i&gt;Jcode &lt;i class=&#34;c-omp&#34;&gt;&lt;/i&gt;omp &lt;i class=&#34;c-claude&#34;&gt;&lt;/i&gt;Claude Code&lt;/div&gt;&#xA;&lt;div class=&#34;bars&#34;&gt;&#xA;&lt;span&gt;Jan&lt;/span&gt;&lt;div class=&#34;t&#34;&gt;&lt;i class=&#34;c-opencode&#34; style=&#34;width:2.81%&#34;&gt;&lt;/i&gt;&lt;i class=&#34;c-claude&#34; style=&#34;width:.62%&#34;&gt;&lt;/i&gt;&lt;/div&gt;&lt;em&gt;368&lt;/em&gt;&#xA;&lt;span&gt;Feb&lt;/span&gt;&lt;div class=&#34;t&#34;&gt;&lt;i class=&#34;c-opencode&#34; style=&#34;width:5.83%&#34;&gt;&lt;/i&gt;&lt;/div&gt;&lt;em&gt;626&lt;/em&gt;&#xA;&lt;span&gt;Mar&lt;/span&gt;&lt;div class=&#34;t&#34;&gt;&lt;i class=&#34;c-opencode&#34; style=&#34;width:10.49%&#34;&gt;&lt;/i&gt;&lt;/div&gt;&lt;em&gt;1,126&lt;/em&gt;&#xA;&lt;span&gt;Apr&lt;/span&gt;&lt;div class=&#34;t&#34;&gt;&lt;i class=&#34;c-opencode&#34; style=&#34;width:7.28%&#34;&gt;&lt;/i&gt;&lt;i class=&#34;c-codex&#34; style=&#34;width:.17%&#34;&gt;&lt;/i&gt;&lt;/div&gt;&lt;em&gt;799&lt;/em&gt;&#xA;&lt;span&gt;May&lt;/span&gt;&lt;div class=&#34;t&#34;&gt;&lt;i class=&#34;c-opencode&#34; style=&#34;width:3.58%&#34;&gt;&lt;/i&gt;&lt;i class=&#34;c-codex&#34; style=&#34;width:10.55%&#34;&gt;&lt;/i&gt;&lt;/div&gt;&lt;em&gt;1,516&lt;/em&gt;&#xA;&lt;span&gt;Jun&lt;/span&gt;&lt;div class=&#34;t&#34;&gt;&lt;i class=&#34;c-opencode&#34; style=&#34;width:1.87%&#34;&gt;&lt;/i&gt;&lt;i class=&#34;c-codex&#34; style=&#34;width:6.88%&#34;&gt;&lt;/i&gt;&lt;/div&gt;&lt;em&gt;939&lt;/em&gt;&#xA;&lt;span&gt;Jul&lt;/span&gt;&lt;div class=&#34;t&#34;&gt;&lt;i class=&#34;c-opencode&#34; style=&#34;width:1.77%&#34;&gt;&lt;/i&gt;&lt;i class=&#34;c-codex&#34; style=&#34;width:14.81%&#34;&gt;&lt;/i&gt;&lt;i class=&#34;c-jcode&#34; style=&#34;width:.42%&#34;&gt;&lt;/i&gt;&lt;/div&gt;&lt;em&gt;1,824&lt;/em&gt;&#xA;&lt;span&gt;Aug&lt;/span&gt;&lt;div class=&#34;t&#34;&gt;&lt;i class=&#34;c-opencode&#34; style=&#34;width:.04%&#34;&gt;&lt;/i&gt;&lt;i class=&#34;c-codex&#34; style=&#34;width:4.98%&#34;&gt;&lt;/i&gt;&lt;i class=&#34;c-jcode&#34; style=&#34;width:94.98%&#34;&gt;&lt;/i&gt;&lt;/div&gt;&lt;em&gt;10,729&lt;/em&gt;&#xA;&lt;span&gt;Sep&lt;/span&gt;&lt;div class=&#34;t&#34;&gt;&lt;i class=&#34;c-opencode&#34; style=&#34;width:.21%&#34;&gt;&lt;/i&gt;&lt;i class=&#34;c-codex&#34; style=&#34;width:.28%&#34;&gt;&lt;/i&gt;&lt;i class=&#34;c-jcode&#34; style=&#34;width:22.24%&#34;&gt;&lt;/i&gt;&lt;i class=&#34;c-omp&#34; style=&#34;width:1.67%&#34;&gt;&lt;/i&gt;&lt;i class=&#34;c-claude&#34; style=&#34;width:.7%&#34;&gt;&lt;/i&gt;&lt;/div&gt;&lt;em&gt;2,692&lt;/em&gt;&#xA;&lt;/div&gt;&#xA;&lt;p class=&#34;dg-cap&#34;&gt;Sessions, not tasks: one task that spawns subagents writes several. OpenCode counts come from its session database, the rest from session files. Claude Code only has January and September files left.&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;August was the swarm month: 10,191 Jcode session files. Every one of those runs costs something, so my rules now say one worker by default, and at most three in parallel when the pieces are truly independent.&lt;/p&gt;&#xA;&lt;h2 id=&#34;omp-since-september-24-opus-55-and-less-process&#34;&gt;~/.omp/ (since September 24): Opus 5.5 and less process&lt;/h2&gt;&#xA;&lt;p&gt;Two things changed at once. I moved to &lt;a href=&#34;https://github.com/can1357/oh-my-pi&#34;&gt;Oh My Pi&lt;/a&gt; (&lt;code&gt;omp&lt;/code&gt;) as my main harness, and on September 25 I made Claude Opus 5.5 my daily model.&lt;/p&gt;&#xA;&lt;p&gt;Opus 5.5 is good enough that most of my process started to feel like ceremony. Autospec is the clearest example. I built it, it has 144 stars, and I barely use it now. On September 20 plain Markdown plans became my default, and the last Autospec implement run that finished is from September 5. For most features, the extra specify, plan, and tasks stages were time I spent waiting on a model that would&amp;rsquo;ve gotten it right from a short plan. I still reach for Autospec on big, interdependent, multi-milestone work. That&amp;rsquo;s rare.&lt;/p&gt;&#xA;&lt;p&gt;The same week, dstask finally left my skills folder. Beads had done its job for months.&lt;/p&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s what a tracked change looks like today:&lt;/p&gt;&#xA;&lt;div class=&#34;dg&#34;&gt;&#xA;&lt;div class=&#34;steps&#34;&gt;&#xA;&lt;div class=&#34;n&#34;&gt;&lt;b&gt;Bead&lt;/b&gt;scope and acceptance&lt;br&gt;criteria&lt;/div&gt;&#xA;&lt;div class=&#34;n&#34;&gt;&lt;b&gt;worktree&lt;/b&gt;its own branch,&lt;br&gt;away from main&lt;/div&gt;&#xA;&lt;div class=&#34;n&#34;&gt;&lt;b&gt;Opus 5.5 plans&lt;/b&gt;and owns&lt;br&gt;the change&lt;/div&gt;&#xA;&lt;div class=&#34;n&#34;&gt;&lt;b&gt;workers&lt;/b&gt;Sol codes,&lt;br&gt;Luna researches&lt;/div&gt;&#xA;&lt;div class=&#34;n&#34;&gt;&lt;b&gt;review&lt;/b&gt;by the model that&lt;br&gt;didn&#39;t write it&lt;/div&gt;&#xA;&lt;div class=&#34;n&#34;&gt;&lt;b&gt;merge-wt&lt;/b&gt;lands it and&lt;br&gt;closes the Bead&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;table&gt;&#xA;&lt;thead&gt;&#xA;&lt;tr&gt;&#xA;&lt;th&gt;Job&lt;/th&gt;&#xA;&lt;th&gt;Model&lt;/th&gt;&#xA;&lt;/tr&gt;&#xA;&lt;/thead&gt;&#xA;&lt;tbody&gt;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Root: planning, orchestration, hard calls&lt;/td&gt;&#xA;&lt;td&gt;Claude Opus 5.5, medium effort&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Scoped implementation with clear tests&lt;/td&gt;&#xA;&lt;td&gt;GPT-6.1 Sol, medium&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Code review&lt;/td&gt;&#xA;&lt;td&gt;Whichever of Opus or Sol didn&amp;rsquo;t write it&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Research, file discovery, checklists&lt;/td&gt;&#xA;&lt;td&gt;GPT-6 Luna, max effort&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;h2 id=&#34;too-many-agents-so-config-became-its-own-job&#34;&gt;Too many agents, so config became its own job&lt;/h2&gt;&#xA;&lt;p&gt;Look at that list again: Claude Code, Codex, Jcode, omp, plus OpenCode and OpenClaw on the side. Every model release meant editing the same instructions, roles, and skills in half a dozen formats, and they drifted apart every time.&lt;/p&gt;&#xA;&lt;p&gt;So I built &lt;a href=&#34;https://ariel-frischer.pages.dev/posts/profile-mango&#34;&gt;profile-mango&lt;/a&gt;. One profile describes my models, effort levels, roles, instructions, and skills, and &lt;code&gt;mango&lt;/code&gt; writes it into each agent&amp;rsquo;s native config, whether that&amp;rsquo;s &lt;code&gt;~/.omp/&lt;/code&gt; or &lt;code&gt;~/.config/opencode/&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;dg&#34;&gt;&#xA;&lt;div class=&#34;tree&#34;&gt;&#xA;&lt;div class=&#34;n&#34;&gt;&lt;b&gt;profile.yaml&lt;/b&gt;models · roles · instructions · skills&lt;/div&gt;&#xA;&lt;div class=&#34;kids&#34;&gt;&#xA;&lt;div class=&#34;n&#34;&gt;Claude Code&lt;/div&gt;&lt;div class=&#34;n&#34;&gt;Codex&lt;/div&gt;&lt;div class=&#34;n&#34;&gt;OpenCode&lt;/div&gt;&lt;div class=&#34;n&#34;&gt;Pi&lt;/div&gt;&lt;div class=&#34;n&#34;&gt;Oh My Pi&lt;/div&gt;&lt;div class=&#34;n&#34;&gt;OpenClaw&lt;/div&gt;&lt;div class=&#34;n&#34;&gt;Hermes&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;The Opus 5.5 switch on September 25 was a new profile, &lt;code&gt;opus55-claude&lt;/code&gt;, applied to every agent with &lt;code&gt;mango use&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;All of it is also in Git. A systemd timer runs a small &lt;code&gt;repo-sync&lt;/code&gt; tool every 30 minutes. It commits and pushes &lt;code&gt;~/.claude&lt;/code&gt;, &lt;code&gt;~/.jcode&lt;/code&gt;, &lt;code&gt;~/.omp&lt;/code&gt;, &lt;code&gt;~/.openclaw&lt;/code&gt;, and &lt;code&gt;~/.profile-mango&lt;/code&gt;, session files included, to private GitLab repos. It does the same for the tracked files in &lt;code&gt;~/.config&lt;/code&gt;, and exports OpenCode&amp;rsquo;s session database to a repo of its own first. That&amp;rsquo;s where every number in this post comes from: nine months of config history and sessions, still on disk and in Git.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-setup-edits-itself-now&#34;&gt;The setup edits itself now&lt;/h2&gt;&#xA;&lt;p&gt;This is the part I tried in January and only got working this month. The loop:&lt;/p&gt;&#xA;&lt;div class=&#34;dg&#34;&gt;&#xA;&lt;div class=&#34;flow&#34;&gt;&#xA;&lt;div class=&#34;n&#34;&gt;&lt;b&gt;I correct&lt;/b&gt;an agent&lt;/div&gt;&lt;i class=&#34;a&#34;&gt;→&lt;/i&gt;&#xA;&lt;div class=&#34;n&#34;&gt;&lt;b&gt;same turn&lt;/b&gt;it fixes the skill&lt;br&gt;or AGENTS.md at fault&lt;/div&gt;&lt;i class=&#34;a&#34;&gt;→&lt;/i&gt;&#xA;&lt;div class=&#34;n&#34;&gt;&lt;b&gt;profile-mango&lt;/b&gt;commits it, installs&lt;br&gt;it everywhere&lt;/div&gt;&lt;i class=&#34;a&#34;&gt;→&lt;/i&gt;&#xA;&lt;div class=&#34;n&#34;&gt;&lt;b&gt;next session&lt;/b&gt;starts with&lt;br&gt;the fix&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;p class=&#34;loop&#34;&gt;← and the next correction starts it again&lt;/p&gt;&#xA;&lt;/div&gt;&#xA;&lt;p&gt;Three rules make it work:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Fix the source, not the symptom.&lt;/strong&gt; When I correct something a skill or instruction should have covered, the agent edits that skill or the project&amp;rsquo;s &lt;code&gt;AGENTS.md&lt;/code&gt; in the same turn, checks the edit against my correction, and tells me what it changed.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Codify on the third repeat.&lt;/strong&gt; A tracker counts recurring task shapes. The second time something comes up, the agent proposes a shortcut. The third time, it builds the lightest thing that fits: a flag on an existing skill, a Make target, or a new skill if the job needs judgment.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Remember across sessions.&lt;/strong&gt; omp&amp;rsquo;s local memory saves facts from finished turns and recalls the relevant ones when a new session starts.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;An insights skill sits on top of that. It reads my session logs and writes reports with recommendations, and I decide what to take. Between September 25 and 30, &lt;code&gt;~/.profile-mango&lt;/code&gt; got 15 commits to skills and instructions. One of them trimmed my global omp &lt;code&gt;AGENTS.md&lt;/code&gt; from 3,602 words to 1,451.&lt;/p&gt;&#xA;&lt;h2 id=&#34;new-hands-omp-on-my-phone&#34;&gt;New hands: omp on my phone&lt;/h2&gt;&#xA;&lt;p&gt;The newest piece isn&amp;rsquo;t on the laptop at all. I forked &lt;a href=&#34;https://github.com/slopus/happy&#34;&gt;Happy&lt;/a&gt;, an open-source mobile client for coding agents, and added omp support: &lt;a href=&#34;https://github.com/ariel-frischer/happy&#34;&gt;ariel-frischer/happy&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;div class=&#34;dg&#34;&gt;&#xA;&lt;div class=&#34;flow&#34;&gt;&#xA;&lt;div class=&#34;n&#34;&gt;&lt;b&gt;phone&lt;/b&gt;Happy app&lt;/div&gt;&lt;i class=&#34;a&#34;&gt;⇄&lt;/i&gt;&#xA;&lt;div class=&#34;n&#34;&gt;&lt;b&gt;laptop&lt;/b&gt;happy daemon&lt;/div&gt;&lt;i class=&#34;a&#34;&gt;⇄&lt;/i&gt;&#xA;&lt;div class=&#34;n&#34;&gt;&lt;b&gt;omp&lt;/b&gt;live TUI, or a&lt;br&gt;tmux session&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;/div&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;My normal omp session on the laptop mirrors itself to the phone. Messages from the phone go into that same session, and steer it if a turn is running.&lt;/li&gt;&#xA;&lt;li&gt;Sessions I start from the phone run omp in a detached tmux session I can attach to later.&lt;/li&gt;&#xA;&lt;li&gt;Agent questions show up as forms on the phone and in the terminal. The first answer wins.&lt;/li&gt;&#xA;&lt;li&gt;Tool calls, subagent progress, and images show up live.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I wrote it over three days, September 27 to 29. It&amp;rsquo;s a personal, experimental fork, not affiliated with the Happy maintainers.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-id-tell-someone-starting-now&#34;&gt;What I&amp;rsquo;d tell someone starting now&lt;/h2&gt;&#xA;&lt;p&gt;Most of what I built in the middle was scaffolding for weaker models. What survived all four folders is small:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;A ticket with acceptance criteria an agent can be graded against.&lt;/li&gt;&#xA;&lt;li&gt;An isolated workspace per change.&lt;/li&gt;&#xA;&lt;li&gt;One agent with the authority to say &amp;ldquo;done&amp;rdquo;.&lt;/li&gt;&#xA;&lt;li&gt;A rule that turns every correction into a permanent fix.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Add process when a model keeps getting something wrong, and take it away when a better model stops needing it. I added a lot of process this year. The best change of the last month was cutting a lot of it.&lt;/p&gt;&#xA;</content>
  </entry>
  <entry>
    <title>Autospec 0.12: a model per stage, and when I actually reach for specs</title>
    <link href="https://ariel-frischer.pages.dev/posts/autospec-0-12.html"></link>
    <id>https://ariel-frischer.pages.dev/posts/autospec-0-12.html</id>
    <published>2026-09-29T00:00:00Z</published>
    <updated>2026-09-29T00:00:00Z</updated>
    <category term="release"></category>
    <summary type="text">Autospec is a Go CLI that makes a coding agent work through four stages instead of one long chat: specify, plan, tasks, implement. Each stage writes a YAML file you can read, ed…</summary>
    <content type="html">&lt;p&gt;&lt;a href=&#34;https://github.com/ariel-frischer/autospec&#34;&gt;Autospec&lt;/a&gt; is a Go CLI that makes a coding agent work through four stages instead of one long chat: specify, plan, tasks, implement. Each stage writes a YAML file you can read, edit, and validate before the next one runs.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/user-attachments/assets/85b6be0f-1ec6-4121-b5ef-91ca3fd20f11&#34;&gt;Watch the 44-second demo&lt;/a&gt;&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -fsSL https://raw.githubusercontent.com/ariel-frischer/autospec/main/install.sh &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;autospec run -s &lt;span class=&#34;s2&#34;&gt;&amp;#34;Add user authentication with OAuth&amp;#34;&lt;/span&gt;   &lt;span class=&#34;c1&#34;&gt;# write the spec&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# review specs/001-user-auth/spec.yaml&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;autospec run -pti                                       &lt;span class=&#34;c1&#34;&gt;# plan, tasks, implement&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It started from GitHub&amp;rsquo;s &lt;a href=&#34;https://github.com/github/spec-kit&#34;&gt;SpecKit&lt;/a&gt;. The difference is that the artifacts are YAML, so the CLI can check them, and the orchestration happens in one Go binary instead of in a chat window.&lt;/p&gt;&#xA;&lt;h2 id=&#34;whats-new-in-012&#34;&gt;What&amp;rsquo;s new in 0.12&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;A different model for each stage.&lt;/strong&gt; Planning and implementation are different jobs, so now you can set &lt;code&gt;models.&amp;lt;stage&amp;gt;&lt;/code&gt; in the config. Use a strong model for the plan and a cheaper one for the grind, or the other way around. The rules for which setting wins are now written down, so a flag, a profile, and a config file won&amp;rsquo;t quietly fight each other.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Named profiles.&lt;/strong&gt; Switch a whole config set with &lt;code&gt;--profile&lt;/code&gt;. That makes it easy to keep, say, a careful profile and a cheap profile side by side.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Jcode support.&lt;/strong&gt; &lt;a href=&#34;https://github.com/1jehuang/jcode&#34;&gt;Jcode&lt;/a&gt; joins Claude Code, Codex, and OpenCode as a supported agent. There&amp;rsquo;s also an experimental, opt-in runner that talks to Jcode through its Go SDK instead of shelling out.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Smaller fixes that matter day to day:&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Specs are found correctly inside linked Git worktrees.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;autospec doctor&lt;/code&gt; checks for the agent you actually configured.&lt;/li&gt;&#xA;&lt;li&gt;History works with project-local state, and status handles empty phases.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;when-i-use-it-and-when-i-dont&#34;&gt;When I use it (and when I don&amp;rsquo;t)&lt;/h2&gt;&#xA;&lt;p&gt;I built Autospec, and it&amp;rsquo;s no longer my default for everything.&lt;/p&gt;&#xA;&lt;p&gt;In early 2025 I used it for any medium-sized feature. Models have gotten good enough that a clear Markdown plan from the main agent covers most medium work. Extra stages cost time when the task is already obvious.&lt;/p&gt;&#xA;&lt;p&gt;Where Autospec still earns its place is large, interdependent work: several milestones, lots of moving parts, and a real risk the agent drifts halfway through. There, having a spec and a task list that a program can validate, plus fresh bounded sessions per task, beats one enormous conversation.&lt;/p&gt;&#xA;&lt;p&gt;My rule of thumb:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Clear task, one area of code:&lt;/strong&gt; skip it, write a short plan.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Big feature across many files or milestones:&lt;/strong&gt; &lt;code&gt;autospec run -a&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;try-it&#34;&gt;Try it&lt;/h2&gt;&#xA;&lt;p&gt;MIT licensed. Native binaries for Linux and macOS; Windows works through WSL. You need Git and one of the supported agent CLIs. Run &lt;code&gt;autospec doctor&lt;/code&gt; first; it&amp;rsquo;ll tell you what&amp;rsquo;s missing.&lt;/p&gt;&#xA;</content>
  </entry>
  <entry>
    <title>kb 1.4: stop guessing whether your RAG settings help</title>
    <link href="https://ariel-frischer.pages.dev/posts/kb-1-4.html"></link>
    <id>https://ariel-frischer.pages.dev/posts/kb-1-4.html</id>
    <published>2026-09-29T00:00:00Z</published>
    <updated>2026-09-29T00:00:00Z</updated>
    <category term="release"></category>
    <summary type="text">kb is a CLI that turns a pile of documents into something you can search and ask questions about. Point it at your notes, docs, and PDFs, and you get hybrid search plus answers…</summary>
    <content type="html">&lt;p&gt;&lt;a href=&#34;https://github.com/ariel-frischer/kb&#34;&gt;kb&lt;/a&gt; is a CLI that turns a pile of documents into something you can search and ask questions about. Point it at your notes, docs, and PDFs, and you get hybrid search plus answers with sources. Everything lives in one SQLite file.&lt;/p&gt;&#xA;&lt;p&gt;Version 1.4 adds the feature I wanted most: a way to measure whether a change actually helps.&lt;/p&gt;&#xA;&lt;p&gt;&lt;video controls playsinline preload=&#34;none&#34; width=&#34;1920&#34; height=&#34;1080&#34; poster=&#34;https://ariel-frischer.pages.dev/media/v/kb.b338633e.webp&#34; aria-label=&#34;kb 1.4 demo, 24 seconds&#34;&gt;&lt;source src=&#34;https://ariel-frischer.pages.dev/media/v/kb.b338633e.h264.mp4&#34; type=&#34;video/mp4&#34;&gt;&lt;/video&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-quick-version&#34;&gt;The quick version&lt;/h2&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -LsSf https://github.com/ariel-frischer/kb/raw/main/install.sh &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kb init&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kb add ~/notes ~/docs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kb index&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kb ask &lt;span class=&#34;s2&#34;&gt;&amp;#34;what are the recommended deployment patterns?&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It reads 30+ formats (Markdown, PDF, DOCX, EPUB, HTML, email, subtitles, and more), and can index source code too if you turn that on. Search combines vector similarity with SQLite full-text search. &lt;code&gt;kb fts&lt;/code&gt; gives you keyword-only results with no API cost at all.&lt;/p&gt;&#xA;&lt;p&gt;It can also run fully local. Use local embeddings, a local cross-encoder for reranking, and a local model for query expansion. The only step that needs an LLM is the final answer in &lt;code&gt;kb ask&lt;/code&gt;, and that can be Ollama.&lt;/p&gt;&#xA;&lt;h2 id=&#34;whats-new-kb-eval&#34;&gt;What&amp;rsquo;s new: &lt;code&gt;kb eval&lt;/code&gt;&lt;/h2&gt;&#xA;&lt;p&gt;RAG tuning is mostly vibes. Swap an embedding model, turn on reranking, and you probably eyeball three queries and call it better.&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;kb eval&lt;/code&gt; runs kb&amp;rsquo;s real retrieval pipeline against public &lt;a href=&#34;https://github.com/beir-cellar/beir&#34;&gt;BEIR&lt;/a&gt; datasets, which come with human relevance judgments. You get nDCG, recall, MRR, precision, latency, and dollars spent for each mode.&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kb &lt;span class=&#34;nb&#34;&gt;eval&lt;/span&gt;                                   &lt;span class=&#34;c1&#34;&gt;# scifact, fts + hybrid&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kb &lt;span class=&#34;nb&#34;&gt;eval&lt;/span&gt; nfcorpus --mode fts,hybrid,rerank&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;kb &lt;span class=&#34;nb&#34;&gt;eval&lt;/span&gt; scifact --budget &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt;                &lt;span class=&#34;c1&#34;&gt;# cap spend for this run&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Two things I cared about:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;It never touches your index.&lt;/strong&gt; Eval corpora and indexes live in their own directory.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;It has a hard spend cap.&lt;/strong&gt; The default is $10 total across runs. A run gets refused up front if its estimated cost won&amp;rsquo;t fit, and it stops early if actual spend gets close.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s the reference run on SciFact: all 300 test queries, local embeddings, no LLM steps, $0.&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&lt;thead&gt;&#xA;&lt;tr&gt;&#xA;&lt;th&gt;mode&lt;/th&gt;&#xA;&lt;th&gt;nDCG@10&lt;/th&gt;&#xA;&lt;th&gt;Recall@10&lt;/th&gt;&#xA;&lt;th&gt;MRR@10&lt;/th&gt;&#xA;&lt;/tr&gt;&#xA;&lt;/thead&gt;&#xA;&lt;tbody&gt;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;keyword only&lt;/td&gt;&#xA;&lt;td&gt;0.697&lt;/td&gt;&#xA;&lt;td&gt;0.816&lt;/td&gt;&#xA;&lt;td&gt;0.663&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;hybrid&lt;/td&gt;&#xA;&lt;td&gt;0.759&lt;/td&gt;&#xA;&lt;td&gt;0.897&lt;/td&gt;&#xA;&lt;td&gt;0.721&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Hybrid wins on this dataset. Now that&amp;rsquo;s a number, not a feeling.&lt;/p&gt;&#xA;&lt;h2 id=&#34;other-changes-in-14&#34;&gt;Other changes in 1.4&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Better keyword search.&lt;/strong&gt; FTS now matches any of your terms and skips stopwords, instead of requiring every word to appear.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;ChatGPT subscription support.&lt;/strong&gt; Set &lt;code&gt;llm_provider = &amp;quot;chatgpt&amp;quot;&lt;/code&gt; and LLM steps run on your ChatGPT plan through the Codex login. No API key needed.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;New defaults.&lt;/strong&gt; GPT-6 Luna for chat, a ModernBERT cross-encoder for reranking, and Qwen3 for local query expansion.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;It also ships an MCP server (&lt;code&gt;kb mcp&lt;/code&gt;), so Claude Code and other agents can search your knowledge base directly. My own agents are told to check &lt;code&gt;kb&lt;/code&gt; before they start grepping through docs.&lt;/p&gt;&#xA;&lt;h2 id=&#34;try-it&#34;&gt;Try it&lt;/h2&gt;&#xA;&lt;p&gt;MIT licensed, Python 3.12+. The minimal install skips PDF and Office support to keep dependencies light; add &lt;code&gt;kb[all]&lt;/code&gt; if you need them.&lt;/p&gt;&#xA;&lt;p&gt;If you run &lt;code&gt;kb eval&lt;/code&gt; on your own settings and find something that beats hybrid, open an issue. I want to know.&lt;/p&gt;&#xA;</content>
  </entry>
  <entry>
    <title>Locus: I&#39;m building a software factory, and right now it mostly breaks</title>
    <link href="https://ariel-frischer.pages.dev/posts/locus-software-factory.html"></link>
    <id>https://ariel-frischer.pages.dev/posts/locus-software-factory.html</id>
    <published>2026-09-29T00:00:00Z</published>
    <updated>2026-09-29T00:00:00Z</updated>
    <category term="agents"></category>
    <summary type="text">Locus is a Go CLI I’ve been building that takes a coding task and runs it through a declared workflow until it becomes an accepted Git change. You pick the agent (Codex or Jcode…</summary>
    <content type="html">&lt;p&gt;Locus is a Go CLI I&amp;rsquo;ve been building that takes a coding task and runs it through a declared workflow until it becomes an accepted Git change. You pick the agent (Codex or Jcode), the model, the steps, and the checks. Locus runs the worker in an isolated worktree, checks what it handed back, merges it, and closes the task.&lt;/p&gt;&#xA;&lt;p&gt;That&amp;rsquo;s the pitch. Here&amp;rsquo;s the honest status: it&amp;rsquo;s pre-release, Linux only, and most runs fail. I don&amp;rsquo;t have a real use case for it yet either. I&amp;rsquo;m writing this anyway because I want it to work, and I&amp;rsquo;d rather build it in public than polish it in private.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-it-does&#34;&gt;What it does&lt;/h2&gt;&#xA;&lt;p&gt;The core idea is that the agent writing code is the easy part. What Locus owns is everything around it:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Task in.&lt;/strong&gt; A prompt, a local task file, or a &lt;a href=&#34;https://github.com/steveyegge/beads&#34;&gt;Beads&lt;/a&gt; board.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Sealed run.&lt;/strong&gt; The workflow YAML gets compiled, validated, and frozen before anything executes, so the run you approved is the run you get.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Isolated worker.&lt;/strong&gt; Each task gets its own Git worktree.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Independent checks.&lt;/strong&gt; Locus runs your checks itself (&lt;code&gt;make test&lt;/code&gt;, &lt;code&gt;make lint&lt;/code&gt;, &lt;code&gt;make build&lt;/code&gt;) instead of trusting the agent when it says &amp;ldquo;done&amp;rdquo;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Serial integration.&lt;/strong&gt; Merges happen one at a time, then the task provider gets updated.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Local ledger.&lt;/strong&gt; Every intent, receipt, and check result goes into a SQLite file, so a crashed run can be recovered instead of guessed at.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;prompt / task file / Beads&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          ▼&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;workflow YAML → compile → sealed run&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          ▼&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;worktree + agent (Codex / Jcode)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          │&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          ▼&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;checks → merge → update task → ledger.sqlite&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;IndyDevDan&amp;rsquo;s &lt;a href=&#34;https://github.com/disler/super-simple-software-factory&#34;&gt;super-simple-software-factory&lt;/a&gt; sums up the idea in four words: &amp;ldquo;agent proposes, code disposes.&amp;rdquo; The agent can say whatever it wants. The controller decides what&amp;rsquo;s true.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-it-breaks&#34;&gt;Why it breaks&lt;/h2&gt;&#xA;&lt;p&gt;In an August snapshot of 435 indexed runs, 111 completed, 206 failed, and 76 got blocked. The default Go workflow finished 79 of 201.&lt;/p&gt;&#xA;&lt;p&gt;Those numbers aren&amp;rsquo;t all that useful on their own, because the failures mostly weren&amp;rsquo;t bad code from the model. When I looked through the failure archives, the top reasons were:&lt;/p&gt;&#xA;&lt;table&gt;&#xA;&lt;thead&gt;&#xA;&lt;tr&gt;&#xA;&lt;th&gt;Reason&lt;/th&gt;&#xA;&lt;th style=&#34;text-align:right&#34;&gt;Count&lt;/th&gt;&#xA;&lt;/tr&gt;&#xA;&lt;/thead&gt;&#xA;&lt;tbody&gt;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Final candidate check failed&lt;/td&gt;&#xA;&lt;td style=&#34;text-align:right&#34;&gt;22&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Worker didn&amp;rsquo;t claim &lt;code&gt;merge_ready&lt;/code&gt;&lt;/td&gt;&#xA;&lt;td style=&#34;text-align:right&#34;&gt;10&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Stage routed to handoff&lt;/td&gt;&#xA;&lt;td style=&#34;text-align:right&#34;&gt;9&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Branch mismatch&lt;/td&gt;&#xA;&lt;td style=&#34;text-align:right&#34;&gt;6&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Missing result commit&lt;/td&gt;&#xA;&lt;td style=&#34;text-align:right&#34;&gt;6&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Session recovery failed&lt;/td&gt;&#xA;&lt;td style=&#34;text-align:right&#34;&gt;5&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Most of that is plumbing. Locus treats &amp;ldquo;agent finished&amp;rdquo;, &amp;ldquo;candidate is valid&amp;rdquo;, &amp;ldquo;checks passed&amp;rdquo;, &amp;ldquo;merge completed&amp;rdquo;, and &amp;ldquo;task closed&amp;rdquo; as five separate facts. That&amp;rsquo;s what makes it auditable. But every translation between those facts is a place where good work can get rejected or mislabeled.&lt;/p&gt;&#xA;&lt;p&gt;My own architecture review counted eight overlapping failure vocabularies and six lifecycle enums with 37 states between them. That&amp;rsquo;s the real bug. I built a system strict enough to catch agents lying, and in the process it started catching itself.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-im-changing&#34;&gt;What I&amp;rsquo;m changing&lt;/h2&gt;&#xA;&lt;p&gt;The plan is to make it smaller, not smarter:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;One lifecycle, one failure vocabulary.&lt;/strong&gt; The runner interprets what happened, once. Everything else just reads it.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Sequential is the golden path.&lt;/strong&gt; Parallel waves showed up in 6 of 425 runs. They can come back once single-task runs finish unattended.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Green base first.&lt;/strong&gt; Capture baseline check health, so a test that was already broken doesn&amp;rsquo;t count as the agent&amp;rsquo;s regression.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Keep the safety core.&lt;/strong&gt; Sealed approval, runner-observed Git, receipts, and recovery all stay. They&amp;rsquo;re the whole reason Locus exists.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;None of that is shipped yet. I haven&amp;rsquo;t measured an improvement, so I&amp;rsquo;m not claiming one.&lt;/p&gt;&#xA;&lt;h2 id=&#34;where-i-want-it-to-go&#34;&gt;Where I want it to go&lt;/h2&gt;&#xA;&lt;p&gt;The goal is simple enough to say: &lt;strong&gt;a software factory architecture a small business can actually run.&lt;/strong&gt; Hand it a backlog, get back reviewed, merged changes, on a laptop or in the cloud.&lt;/p&gt;&#xA;&lt;p&gt;Right now it&amp;rsquo;s fully local. State lives in SQLite plus files on disk, process tracking reads Linux &lt;code&gt;/proc&lt;/code&gt;, and the dashboard only binds to &lt;code&gt;127.0.0.1&lt;/code&gt;. Before a cloud version makes sense, three things have to be true:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Local runs complete reliably without me babysitting them.&lt;/li&gt;&#xA;&lt;li&gt;A candidate and its evidence survive the worker&amp;rsquo;s machine going away.&lt;/li&gt;&#xA;&lt;li&gt;There&amp;rsquo;s one runtime path, so &amp;ldquo;cloud&amp;rdquo; doesn&amp;rsquo;t turn into a second engine to maintain.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;If you&amp;rsquo;ve built something like this, or tried and hit the same wall, I&amp;rsquo;d love to hear what architecture held up for you. I&amp;rsquo;ll post again when the simplified runner either works or teaches me something new.&lt;/p&gt;&#xA;</content>
  </entry>
  <entry>
    <title>Why I use a different AI model for each coding job</title>
    <link href="https://ariel-frischer.pages.dev/posts/no-best-coding-model.html"></link>
    <id>https://ariel-frischer.pages.dev/posts/no-best-coding-model.html</id>
    <published>2026-09-29T00:00:00Z</published>
    <updated>2026-09-29T00:00:00Z</updated>
    <category term="models"></category>
    <summary type="text">Benchmarks disagree, the harness changes the score, and cost decides the rest. Here&#39;s which model does what in my setup.</summary>
    <content type="html">&lt;p&gt;Every few weeks a new model tops a leaderboard, and I used to switch my whole setup to it. After a summer of that, I stopped asking which model is best. Now each model gets the job it&amp;rsquo;s good at, and the rest of this post is why.&lt;/p&gt;&#xA;&lt;h2 id=&#34;benchmarks-dont-agree&#34;&gt;Benchmarks don&amp;rsquo;t agree&lt;/h2&gt;&#xA;&lt;p&gt;I run coding benchmarks on my own machine, and the results jump around.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;On &lt;a href=&#34;https://github.com/1jehuang/jcode-bench&#34;&gt;Jcode Bench&lt;/a&gt; (the model has to cut instruction counts on three small C functions, and every output is checked for correctness), GPT-5.6 Sol averaged 4.07 and Claude Opus 4.8 averaged 3.76 in my July run.&lt;/li&gt;&#xA;&lt;li&gt;A week earlier, in a single run, Opus 4.8 beat Sol on all three tasks. It also took about 1,423 minutes to Sol&amp;rsquo;s 60.&lt;/li&gt;&#xA;&lt;li&gt;The benchmark&amp;rsquo;s README says scores wobble by about 0.1 between runs. A lot of &amp;ldquo;wins&amp;rdquo; are smaller than that.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Public charts don&amp;rsquo;t settle it either. On the GPT-6 charts I used, Sol and Luna swap places depending on whether you look at FrontierCode or DeepSWE.&lt;/p&gt;&#xA;&lt;p&gt;The numbers are fine. They&amp;rsquo;re measuring different things.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-tool-around-the-model-matters-too&#34;&gt;The tool around the model matters too&lt;/h2&gt;&#xA;&lt;p&gt;The same model scores differently depending on the coding tool running it. With GPT-5.6 Sol on high effort, Codex beat Jcode by about 1.3x on my benchmark. With Opus 5, Jcode was behind Claude Code at medium effort and slightly ahead at high effort, but took more than three times as long.&lt;/p&gt;&#xA;&lt;p&gt;So &amp;ldquo;which model is best?&amp;rdquo; is really three questions: which model, in which tool, at what effort level.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-i-use-for-what&#34;&gt;What I use for what&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;&lt;thead&gt;&#xA;&lt;tr&gt;&#xA;&lt;th&gt;Job&lt;/th&gt;&#xA;&lt;th&gt;Model&lt;/th&gt;&#xA;&lt;th&gt;Why&lt;/th&gt;&#xA;&lt;/tr&gt;&#xA;&lt;/thead&gt;&#xA;&lt;tbody&gt;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Main agent: planning and writing code&lt;/td&gt;&#xA;&lt;td&gt;Claude Opus 5.5, medium effort&lt;/td&gt;&#xA;&lt;td&gt;Strong on benchmarks and feels fast&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Research, finding files, mechanical checks&lt;/td&gt;&#xA;&lt;td&gt;GPT-6 Luna, max effort&lt;/td&gt;&#xA;&lt;td&gt;Cheap enough to run at max effort&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Hard problems&lt;/td&gt;&#xA;&lt;td&gt;Opus 5.5, high effort&lt;/td&gt;&#xA;&lt;td&gt;Only after medium effort actually failed&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;tr&gt;&#xA;&lt;td&gt;Code review&lt;/td&gt;&#xA;&lt;td&gt;Not Sonnet, not Luna&lt;/td&gt;&#xA;&lt;td&gt;Neither is good enough at review yet&lt;/td&gt;&#xA;&lt;/tr&gt;&#xA;&lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;What got me here:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Good judgment costs a lot. I usually like GPT-6 Astra&amp;rsquo;s judgment best, but it burned through credits so fast I couldn&amp;rsquo;t use it every day. I bring it in for specific problems now.&lt;/li&gt;&#xA;&lt;li&gt;A cheap model that plans well can&amp;rsquo;t necessarily build well. Luna writes solid plans. That doesn&amp;rsquo;t make it a replacement for Sol or Opus when the code has to be ready to merge.&lt;/li&gt;&#xA;&lt;li&gt;Your subscription decides how many agents you can run. In September I moved from ChatGPT&amp;rsquo;s $200 plan to Claude Max 20x, same price, to make Opus 5.5 my daily model. Now the weekly usage cap, not per-token pricing, limits how many agents I run at once.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;if-youre-setting-this-up-yourself&#34;&gt;If you&amp;rsquo;re setting this up yourself&lt;/h2&gt;&#xA;&lt;p&gt;Think of it like staffing a team. You don&amp;rsquo;t pay your most senior engineer to grep through files, and you don&amp;rsquo;t let the newest hire approve code review.&lt;/p&gt;&#xA;&lt;p&gt;Pick one default model, give the cheap repetitive work to a cheaper one, and check again when a new model comes out. Just don&amp;rsquo;t rebuild everything because one leaderboard changed.&lt;/p&gt;&#xA;</content>
  </entry>
  <entry>
    <title>profile-mango: one profile for all your coding agents</title>
    <link href="https://ariel-frischer.pages.dev/posts/profile-mango.html"></link>
    <id>https://ariel-frischer.pages.dev/posts/profile-mango.html</id>
    <published>2026-09-29T00:00:00Z</published>
    <updated>2026-09-29T00:00:00Z</updated>
    <category term="release"></category>
    <summary type="text">I use several coding agents, and every new model release meant updating four config files in four formats. Claude Code wants one thing, Codex wants TOML, OpenCode wants its own…</summary>
    <content type="html">&lt;p&gt;I use several coding agents, and every new model release meant updating four config files in four formats. Claude Code wants one thing, Codex wants TOML, OpenCode wants its own agent files. My instructions, subagent roles, and skills drifted apart every time.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/ariel-frischer/profile-mango&#34;&gt;profile-mango&lt;/a&gt; fixes that. You describe your setup once in a YAML profile, and &lt;code&gt;mango&lt;/code&gt; writes it into each agent&amp;rsquo;s native config.&lt;/p&gt;&#xA;&lt;p&gt;&lt;video controls playsinline preload=&#34;none&#34; width=&#34;1920&#34; height=&#34;1080&#34; poster=&#34;https://ariel-frischer.pages.dev/media/v/profile-mango.75006e70.webp&#34; aria-label=&#34;profile-mango demo, 42 seconds&#34;&gt;&lt;source src=&#34;https://ariel-frischer.pages.dev/media/v/profile-mango.75006e70.av1.mp4&#34; type=&#39;video/mp4; codecs=&#34;av01.0.08M.08&#34;&#39;&gt;&lt;source src=&#34;https://ariel-frischer.pages.dev/media/v/profile-mango.75006e70.h264.mp4&#34; type=&#34;video/mp4&#34;&gt;&lt;/video&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;how-it-works&#34;&gt;How it works&lt;/h2&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -fsSL https://raw.githubusercontent.com/ariel-frischer/profile-mango/main/install.sh &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; sh&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mango init                     &lt;span class=&#34;c1&#34;&gt;# starter profile in ~/.profile-mango&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mango doctor                   &lt;span class=&#34;c1&#34;&gt;# which agents you have installed&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mango install default --all    &lt;span class=&#34;c1&#34;&gt;# preview only; nothing is written yet&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The preview ends with the exact command to apply it. &lt;code&gt;mango&lt;/code&gt; backs up whatever it replaces, and &lt;code&gt;mango undo&lt;/code&gt; puts it back.&lt;/p&gt;&#xA;&lt;p&gt;A profile bundles four things:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;A model route:&lt;/strong&gt; which model and effort to use.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Subagent roles:&lt;/strong&gt; worker, planner, research, and so on, each with its own model.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Global instructions:&lt;/strong&gt; whole files like &lt;code&gt;AGENTS.md&lt;/code&gt; and &lt;code&gt;CLAUDE.md&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Skills:&lt;/strong&gt; skill folders copied into each agent&amp;rsquo;s skill directory.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Actual provider and model names live in a separate local bindings file. So the profile stays shareable and never holds credentials.&lt;/p&gt;&#xA;&lt;p&gt;Switching models is one command:&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mango route &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;local&lt;/span&gt; --model gpt-6-sol --effort medium&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mango use default&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;what-it-supports&#34;&gt;What it supports&lt;/h2&gt;&#xA;&lt;p&gt;Claude Code, Codex, OpenCode, Pi, Oh My Pi, OpenClaw, and Hermes. Each agent gets what it can actually support. Pi only takes a model and one instructions file, for example, while Codex gets named profiles, role subagents, and skills. Anything an agent can&amp;rsquo;t take gets listed as skipped instead of silently dropped.&lt;/p&gt;&#xA;&lt;h2 id=&#34;whats-new-in-02&#34;&gt;What&amp;rsquo;s new in 0.2&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Per-agent role overrides.&lt;/strong&gt; Keep one shared route, but give a single agent&amp;rsquo;s research role a different model.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Placeholders in instructions and skills.&lt;/strong&gt; Your &lt;code&gt;AGENTS.md&lt;/code&gt; can reference the current route&amp;rsquo;s models, so the text stays accurate when you switch.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Stale-name warnings.&lt;/strong&gt; If you replace a model but a profile still mentions it by name, &lt;code&gt;mango&lt;/code&gt; tells you.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;OpenClaw skills.&lt;/strong&gt; Installs skills and can manage per-agent skill allowlists.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Safer ownership checks.&lt;/strong&gt; &lt;code&gt;mango&lt;/code&gt; can tell the difference between you editing a field it owns and an agent just rewriting its config file.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;what-it-isnt&#34;&gt;What it isn&amp;rsquo;t&lt;/h2&gt;&#xA;&lt;p&gt;It isn&amp;rsquo;t a manager for every agent setting. MCP servers, credentials, sessions, plugins, keybindings, and themes stay in each agent&amp;rsquo;s own config, and &lt;code&gt;mango&lt;/code&gt; never reads or writes them. Portable permission rules can be declared, but no agent installs them yet.&lt;/p&gt;&#xA;&lt;p&gt;That limit is on purpose. The portable slice (models, roles, instructions, skills) is the part that changes every time a new model ships. Everything else changes rarely enough to leave alone.&lt;/p&gt;&#xA;&lt;h2 id=&#34;try-it&#34;&gt;Try it&lt;/h2&gt;&#xA;&lt;p&gt;MIT licensed, written in Go. If you&amp;rsquo;d rather let your agent drive it:&lt;/p&gt;&#xA;&lt;pre class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npx skills add ariel-frischer/profile-mango --skill profile-mango -g&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
  </entry>
  <entry>
    <title>Neovim is Essential</title>
    <link href="https://ariel-frischer.pages.dev/posts/neovim-is-essential.html"></link>
    <id>https://ariel-frischer.pages.dev/posts/neovim-is-essential.html</id>
    <published>2024-05-14T00:00:00Z</published>
    <updated>2024-05-14T00:00:00Z</updated>
    <category term="tools"></category>
    <summary type="text">Why neovim pays dividends as a Software Engineer.</summary>
    <content type="html">&lt;aside class=&#34;hindsight&#34;&gt;&lt;span class=&#34;hindsight-tag&#34;&gt;😂 2026 me, reading this&lt;/span&gt;&#xA;&lt;p&gt;I was so wrong. I wrote this in 2024, right before the AI coding boom. Then coding agents happened, and now Neovim is mostly a glorified file viewer for me, or a quick editor. Keeping the post up for the laughs.&lt;/p&gt;&#xA;&lt;/aside&gt;&#xA;&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Over the last 6+ years of my programming journey, I&amp;rsquo;ve come to understand that Neovim is the most productive tool I&amp;rsquo;ve used. Neovim is a lightweight editor that runs in the terminal. At first, it traps unsuspecting victims from exiting, but sooner or later, you won&amp;rsquo;t want to leave. Neovim is a fork of the popular vim repository, it has widespread adoption, and it has special &amp;ldquo;vim&amp;rdquo; bindings that make text editing and navigation easy, ergonomic, and effective.&lt;/p&gt;&#xA;&lt;p&gt;You can navigate to the beginning of each word with the &lt;code&gt;w&lt;/code&gt; key, or the end of each word with &lt;code&gt;e&lt;/code&gt; - these are called vim motions. Vim commands + motions allow for effective code editing for example &lt;code&gt;d&lt;/code&gt; is the deletion command paired with &lt;code&gt;w&lt;/code&gt; will delete the word under the cursor. Neovim is keyboard-centric it saves so many keypresses and so using the mouse is discouraged and truly unnecessary. Once the vim bindings are ingrained in your head, you&amp;rsquo;re able to swiftly edit code at the speed of thought.&lt;/p&gt;&#xA;&lt;br /&gt;&#xA;&lt;p align=&#34;center&#34;&gt;&#xA; &lt;img src=&#39;img/goneovim.webp&#39;/&gt;&#xA;&lt;/p&gt;&#xA;&lt;p&gt;Yes, the transition from regular editors like VSCode is not easy or straightforward but was 1000% worth it. I find myself preferring to edit text everywhere with vim, whether in the browser or in the command line. Both are now possible with software like firenvim and &amp;ldquo;vi&amp;rdquo; mode for zsh. It&amp;rsquo;s so much faster that I actually feel uncomfortable going back to the &amp;ldquo;normal&amp;rdquo; way of text editing.&lt;/p&gt;&#xA;&lt;p&gt;There is a learning curve, not just with the bindings but also with setting up language servers, plugins, etc. I wouldn&amp;rsquo;t say it&amp;rsquo;s a super steep learning curve; it&amp;rsquo;s more of an easy-medium difficulty. It took me about two weeks to become productive with vim bindings and start efficiency editing code. Initially, FlashDevelop was my first go-to editor back in the day, followed by VSCode. VSCode was great it had built-in language support, syntax highlighting, debugger, extensions etc&amp;hellip; However, it wasn&amp;rsquo;t until I stumbled upon a YouTube channel, probably ThePrimeagen, that I saw Neovim in action and had that &amp;ldquo;Aha&amp;rdquo; moment. The way he navigated through files and edited code was like watching a master pianist at work. I knew right away that Neovim would be an invaluable tool for any programmer.&lt;/p&gt;&#xA;&lt;p&gt;If you&amp;rsquo;re just starting out and would like to learn vim bindings without needed all the neovim configuration you can try out VSCode with the Neovim extension. Alternatively, you can use preconfigured neovim setups listed lower in this article. Although VSCode is an excellent beginner friendly editor, it is not as fast or lightweight as Neovim and is a bloated electron app. For many reasons, it will never be as good as Neovim.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-neovim&#34;&gt;Why Neovim?&lt;/h2&gt;&#xA;&lt;h3 id=&#34;customizability&#34;&gt;Customizability&lt;/h3&gt;&#xA;&lt;p&gt;Neovim&amp;rsquo;s core architecture is unparalleled as it was designed with modularity and customization in mind. You can tweak it to create a coding environment that suits your workflow perfectly. I constantly create small lua functions and give them key bindings to solve any custom repetative tasks. The plugin ecosystem is insane in a good way, you can essentially get all the features you want and build them in modular fashion.&lt;/p&gt;&#xA;&lt;h3 id=&#34;efficiency-and-speed&#34;&gt;Efficiency and Speed&lt;/h3&gt;&#xA;&lt;p&gt;The efficiency and speed that Neovim provides are remarkable. The keyboard-centric design minimizes context switching and keystrokes, keeping you in the coding flow. The analogy of &amp;ldquo;gliding through a piece of paper with scissors&amp;rdquo; really encapsulates the experience. Once you get accustomed to the key bindings, the speed at which you can write, edit, navigate, and execute code is astounding.&lt;/p&gt;&#xA;&lt;p&gt;At my last company there were constant incidents so an emphasis on quickly resolving them was invaluable. Neovim allowed me to manipulate code and lists of strings effortlessly which comes in clutch when resolving incidents. Need to dedup a list of strings? Do a visual highlight and run &lt;code&gt;:sort u&lt;/code&gt; to dedup the list. Need to format a list in a specific way or do any repetative set of keystrokes? Use vim macros! Need to combine a bunch of lines into one paragraph, do a visual highlight and run &lt;code&gt;:join&lt;/code&gt; or &lt;code&gt;:j&lt;/code&gt; the shortcut for it. You can pipe terminal commands into neovim and manipulate the text as well. The control you get is unparalleled as your vim/terminal knowledge expands.&lt;/p&gt;&#xA;&lt;h3 id=&#34;community&#34;&gt;Community&lt;/h3&gt;&#xA;&lt;p&gt;Neovim boasts a vibrant and supportive community. The discussions on GitHub, Reddit, and other forums are immensely helpful. Whenever I faced an issue or needed help customizing my setup, a solution was just a post or a search away. Moreover, the community continually contributes to the rich plugin ecosystem, making Neovim ever-evolving.&lt;/p&gt;&#xA;&lt;h3 id=&#34;cross-platform-and-extensible&#34;&gt;Cross-platform and Extensible&lt;/h3&gt;&#xA;&lt;p&gt;Being cross-platform, Neovim is a versatile choice for teams working across different operating systems. Its extensibility is another strong point. I&amp;rsquo;ve integrated it with other tools and technologies, creating a seamless workflow regardless of the platform.&lt;/p&gt;&#xA;&lt;h3 id=&#34;modern-features&#34;&gt;Modern Features&lt;/h3&gt;&#xA;&lt;p&gt;Neovim has embraced modern features like built-in LSP (Language Server Protocol), providing IDE-like features such as auto-completion, linting, and much more. It&amp;rsquo;s like having the best of both worlds-the simplicity and speed of a text editor, with the robust features of an IDE.&lt;/p&gt;&#xA;&lt;h3 id=&#34;the-neovim-plugin-ecosystem&#34;&gt;The Neovim Plugin Ecosystem&lt;/h3&gt;&#xA;&lt;p&gt;The plugin ecosystem has exploded in the last few years thanks to neovims clever decision to use &lt;code&gt;lua&lt;/code&gt; instead &lt;code&gt;vimscript&lt;/code&gt; which was used for the older vim. Some of the most popular plugins include:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/nvim-telescope/telescope.nvim&#34;&gt;Telescope.nvim&lt;/a&gt;: Highly extendable fuzzy finder.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/nvim-treesitter/nvim-treesitter&#34;&gt;nvim-treesitter&lt;/a&gt;: Parser generator tool and an incremental parsing library. It can build a concrete syntax tree for a source file and efficiently update the syntax tree as the source file is edited.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/preservim/nerdtree&#34;&gt;NerdTree&lt;/a&gt;: File system explorer for navigating the file system and opening files.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/hrsh7th/nvim-cmp&#34;&gt;nvim-cmp&lt;/a&gt;: Completion engine plugin that aims to provide full support for LSP completion and offers powerful customizability.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Fuzzy finders, like &lt;code&gt;telescope&lt;/code&gt; and &lt;code&gt;fzf&lt;/code&gt; can jump to any token, symbol, buffer, module, or file in a project in a fast, sane, and intuitive manner. This is just the tip of the iceberg, checkout &lt;a href=&#34;https://dotfyle.com/neovim/plugins/trending&#34;&gt;dotfyle&lt;/a&gt; for trending plugins. Installing + configuring packages manually is time intensive and not efficient this is where plugin managers come in clutch. The fastest current plugin manager seems to be &lt;a href=&#34;https://github.com/folke/lazy.nvim&#34;&gt;Lazy.nvim&lt;/a&gt; nowadays but there are many to choose from: &lt;a href=&#34;https://github.com/rockerBOO/awesome-neovim?tab=readme-ov-file#plugin-manager&#34;&gt;awesome-neovim#plugin-manager&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;pre-configured-neovim-repositories&#34;&gt;Pre-configured Neovim Repositories&lt;/h2&gt;&#xA;&lt;p&gt;For those who find the initial setup of Neovim daunting, there are pre-configured repositories available that can significantly ease the transition. Projects listed below offer ready-to-use configurations that come with a curated set of plugins and settings. These repositories are designed to provide a robust starting point, allowing you to experience the power of Neovim without the hassle of manual configuration. You can always customize these setups further to suit your specific needs.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://github.com/nvim-lua/kickstart.nvim&#34;&gt;Kickstart&lt;/a&gt;&lt;/strong&gt; - A starting point for Neovim that is small, single-file, documented, and modular. This config is meant to be used as by YOU to begin your Neovim journey; remove the things you don&amp;rsquo;t use and add what you miss.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://www.lunarvim.org/&#34;&gt;LunarVim&lt;/a&gt;&lt;/strong&gt; - LunarVim is a highly customizable Neovim distribution that aims to provide a good starting point for personal configuration with sensible defaults. It includes a variety of plugins for code completion, linting, and a user-friendly status line, among others.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://astronvim.com/&#34;&gt;AstroVim&lt;/a&gt;&lt;/strong&gt; - AstroVim is a modern Neovim configuration aimed at providing a simple, out-of-the-box, fully functional Neovim setup. It focuses on minimalism and modularity, allowing users to easily add or remove features as needed.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://nvchad.com/&#34;&gt;NvChad&lt;/a&gt;&lt;/strong&gt; - NvChad is a minimalistic Neovim setup that focuses on performance and aesthetics. It comes with a custom UI and a selection of plugins that are tailored for a smooth development workflow.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://spacevim.org/&#34;&gt;SpaceVim&lt;/a&gt;&lt;/strong&gt; - SpaceVim is a community-driven vim distribution that seeks to manage collections of plugins in layers. It has a modal interface similar to spacemacs, focusing on providing features for multiple programming languages and an extensive set of plugins.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;general-features&#34;&gt;General Features&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Easy to Customize&lt;/strong&gt;: Neovim&amp;rsquo;s API (Application Programming Interface) is well-documented, easy to find, and versioned, making it simple to extend and customize.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Works with Any Language&lt;/strong&gt;: Neovim uses MessagePack for structured communication, allowing extensions to be written in any programming language.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Safe and Efficient Plugins&lt;/strong&gt;: Remote plugins run as separate processes, ensuring they are safe and do not slow down Neovim.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Embed Neovim Anywhere&lt;/strong&gt;: You can embed Neovim in GUIs, IDEs, and web browsers, using it as an editor or script host.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Easy Lua Plugins&lt;/strong&gt;: Creating plugins in Lua is as straightforward as creating them in Vimscript. You can even write your configuration in a file called &lt;code&gt;init.lua&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Better Syntax Highlighting&lt;/strong&gt;: Neovim&amp;rsquo;s parsing engine produces an Abstract Syntax Tree (AST), enabling faster and more accurate syntax highlighting, code navigation, refactoring, and text manipulation.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Built-in Language Server Protocol (LSP) Client&lt;/strong&gt;: Neovim includes an LSP client for advanced code inspection and refactoring, such as going to definitions, finding references, and formatting code.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Great Default Settings&lt;/strong&gt;: Neovim comes with strong default settings that work well out of the box.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Consistency&lt;/strong&gt;: Neovim works the same way on all platforms with one build type and one command.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Modern Terminal Features&lt;/strong&gt;: Neovim supports modern terminal features like cursor styling, focus events, and bracketed paste.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Built-in Terminal Emulator&lt;/strong&gt;: Neovim includes a terminal emulator, allowing you to run terminal commands directly within the editor.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;last-remarks&#34;&gt;Last Remarks&lt;/h2&gt;&#xA;&lt;p&gt;Everything I&amp;rsquo;ve listed here is just an introduction, neovim has so many built-in features I&amp;rsquo;m still learning new and exciting features after 6+ years of usage. Neovim has profoundly impacted my career as a Software Engineer and makes coding enoyable. The flexibility, efficiency, and productivity gains should make it a compelling choice for any developer. I encourage up and coming software engineers and/or writers to just try Neovim and enjoy your new supertool. Its not just an editor, its a game changer, and for me - it is absolutely essential.&lt;/p&gt;&#xA;&lt;h2 id=&#34;references&#34;&gt;References&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://neovim.io/&#34;&gt;https://neovim.io/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://dotfyle.com/&#34;&gt;https://dotfyle.com/&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/rockerBOO/awesome-neovim&#34;&gt;awesome-neovim&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</content>
  </entry>
  <entry>
    <title>Nix &amp; NixOS - First Impressions</title>
    <link href="https://ariel-frischer.pages.dev/posts/nix-nixos-first-impressions.html"></link>
    <id>https://ariel-frischer.pages.dev/posts/nix-nixos-first-impressions.html</id>
    <published>2024-05-02T00:00:00Z</published>
    <updated>2024-05-02T00:00:00Z</updated>
    <category term="linux"></category>
    <summary type="text">My first impressions: does Nix live up to the hype?</summary>
    <content type="html">&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;I picked up NixOS out of curiosity to see what all the hype was about, and I&amp;rsquo;m blown away. As a software engineer who has tried too many Linux distributions, I was quite skeptical. I can confidently say now my distro search is over, NixOS is my final destination. So what is Nix/NixOS? The Nix terminology can be confusing to newcomers, so let&amp;rsquo;s clear that up. This article will cover my first impressions, the Nix ecosystem, installation, usage examples, and the pros and cons of NixOS.&lt;/p&gt;&#xA;&lt;h2 id=&#34;nix-ecosystem&#34;&gt;Nix* Ecosystem&lt;/h2&gt;&#xA;&lt;p&gt;Nix encompasses several distinct but interconnected components, each serving a unique purpose within the ecosystem:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;h3 id=&#34;nix-the-package-manager&#34;&gt;Nix (The Package Manager)&lt;/h3&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Nix is a purely &lt;strong&gt;functional package manager&lt;/strong&gt; meaning packages are built by functions, don’t have side-effects, and never change. Nix builds packages in isolation from each other and stores them in the Nix store in unique cryptographic hash subdirectories. This method allows multiple versions of a package to be installed simultaneously and prevents the rigmarole of conflicting software (Python v3.x, I&amp;rsquo;m looking at you). You don&amp;rsquo;t need NixOS to run the Nix package manager; you can get started on macOS and Windows (WSL).&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;h3 id=&#34;nix-the-programming-language&#34;&gt;Nix (The Programming Language)&lt;/h3&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Nix is also a functional programming language, which means if you start with the same input, you are guaranteed to get the same output. This simple principle gives Nix its reproducibility anywhere and enables long build times to be skipped by using a cache system. If your build configuration input is identical to someone else&amp;rsquo;s build input and that is in the cache, you don&amp;rsquo;t need to build from source; you just pull the output from the cache.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;h3 id=&#34;nixos-the-linux-distribution&#34;&gt;NixOS (The Linux Distribution)&lt;/h3&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;NixOS is a free, open-source Linux distribution that uses the Nix package manager to manage software in the system. NixOS is based on an immutable design and atomic update model and uses a declarative configuration system for reproducibility and portability.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;h3 id=&#34;nixpkgs-the-package-repository&#34;&gt;Nixpkgs (The Package Repository)&lt;/h3&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Nixpkgs is a &lt;a href=&#34;https://github.com/NixOS/nixpkgs&#34;&gt;GitHub repository&lt;/a&gt; that is the largest package repository in the world. It allows the Nix package manager to install any package by name instead of referencing some obscure GitHub repo. It is the culmination of years of hard work meticulously building up a foundation of packages, making installation of any package in any language simple. An increasing number of contributors constantly create new package builds that keep Nix up to date.&lt;/p&gt;&#xA;&lt;p&gt;Those are the main tools, but the ecosystem is vast. Check out the full &lt;a href=&#34;https://nixos.wiki/wiki/Main_Page&#34;&gt;wiki page here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;installation-of-nixos&#34;&gt;Installation of NixOS&lt;/h2&gt;&#xA;&lt;p&gt;I had a spare USB drive and turned it into a bootable drive with NixOS using the &lt;a href=&#34;https://rufus.ie/en/&#34;&gt;Rufus tool&lt;/a&gt;. For my default Windows laptop, I partitioned the drive into two for dual-booting. This gives me a partition to install Linux while keeping windows for gaming.&lt;/p&gt;&#xA;&lt;p&gt;The installation process was straightforward. I booted into the USB and followed the installation instructions, which installed NixOS. There is a known issue/non-issue where it seems like the installer is stuck at 46% but that process just takes a while - there is a clickable log button that will show you the commands its running to reassure the installer is not stuck. The installer has many desktop environments. I chose KDE Plasma, but you can switch to whatever you want later with a simple line change in your configration.nix file. After installation, I rebooted, and it just worked out of the box.&lt;/p&gt;&#xA;&lt;h3 id=&#34;post-installation-setup&#34;&gt;Post-Installation Setup&lt;/h3&gt;&#xA;&lt;p&gt;I needed Firefox, so I added it to my &lt;code&gt;configuration.nix&lt;/code&gt; and rebuilt with &lt;code&gt;nixos-rebuild switch&lt;/code&gt;, and voila, it just existed in my start menu. That was my first &amp;ldquo;holy-cow&amp;rdquo; moment. I was used to spending a darn week installing all my programs, going through websites one by one, clicking next, next, next, agree, next, done. Previously, I would need to run multiple CLI commands which are all DIFFERENT depending on which package manager your distro is using and install them in the correct order because this program needs this program as a dependency. Nix saved me from that pain I was dreading.&lt;/p&gt;&#xA;&lt;p&gt;So I went ham and added a bunch of common packages. It all worked on the first try. It felt stable somehow, and the icing on the cake was the BLAZINGLY fast build time. I couldn&amp;rsquo;t really believe it was all working so smoothly; I was conditioned into random software breaking in Linux. After the first few days, I was quite satisfied with my system and thought that was it, but no, there is way more icing to this cake.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-power-of-nix&#34;&gt;The Power of Nix&lt;/h2&gt;&#xA;&lt;p&gt;The distillation of all configuration in one file empowers users with simplicity, portability, and modularity. The NixOS approach streamlines system management, allowing for stable deployment on different machines. The modularity of Nix enables users to customize, extend, or reuse configurations with ease. Such a system not only simplifies the setup and maintenance of software but also significantly reduces the complexity associated with managing dependencies and system-specific variations.&lt;/p&gt;&#xA;&lt;h2 id=&#34;running-an-old-windows-game&#34;&gt;Running an Old Windows Game&lt;/h2&gt;&#xA;&lt;p&gt;Recently, I wanted to revisit an old game I developed in 2012. To run this Windows-based executable on NixOS, I needed Wine, a Windows compatibility program. Using &lt;code&gt;nix-shell -p wine&lt;/code&gt;, I quickly installed Wine CLI. Then ran my game with &lt;code&gt;wine my_game.exe&lt;/code&gt;, and it just worked. When you exit nix-shell, the &lt;code&gt;wine&lt;/code&gt; program is no longer available and did not clutter my user space. If you want to install anything permanently, you can; if you need to run a quick one-off, you can. Nix is clean and handles environment isolation brilliantly.&lt;/p&gt;&#xA;&lt;p&gt;As a side note there is this incredible repository &lt;a href=&#34;https://github.com/MatthewCroughan/NixThePlanet&#34;&gt;NixThePlanet&lt;/a&gt; which allows you to run &amp;ldquo;medieval&amp;rdquo; operating systems with a single nix command.&lt;/p&gt;&#xA;&lt;h2 id=&#34;stability-and-reliability&#34;&gt;Stability and Reliability&lt;/h2&gt;&#xA;&lt;p&gt;NixOS introduces the concept of &amp;ldquo;generations,&amp;rdquo; allowing you to roll back to previous versions of your system while booting. If anything breaks or is not running as intended, you can always revert to a previous generation. Surprisingly, my new ASUS laptop, manufactured with Windows in mind, actually crashes way more often than NixOS. I believe there is some issue with the Nvidia hybrid settings on Windows that causes constant crashes, giving the blue screen of death (BSOD).&lt;/p&gt;&#xA;&lt;h2 id=&#34;common-issues-and-troubleshooting&#34;&gt;Common Issues and Troubleshooting&lt;/h2&gt;&#xA;&lt;p&gt;While NixOS has many advantages, it is not without its challenges:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;h3 id=&#34;learning-curve&#34;&gt;Learning Curve&lt;/h3&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;There is a steep learning curve that involves learning the Nix language and all the details of the Nix ecosystem. As a software developer that has dabbled in Linux distros, I really would never recommend this to any Linux beginner. I would recommend it to software developers that really value stability and portability or any intermediate/advanced Linux users that want the same.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;h3 id=&#34;documentation&#34;&gt;Documentation&lt;/h3&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Unfortunately, the documentation is not good enough, but as more folks start embracing Nix, it should gradually improve.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;h3 id=&#34;limited-binary-compatibility&#34;&gt;Limited Binary Compatibility&lt;/h3&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;NixOS doesn’t use the traditional &lt;code&gt;/bin&lt;/code&gt;, &lt;code&gt;/sbin&lt;/code&gt;, &lt;code&gt;/lib&lt;/code&gt; directory structure but instead uses its own store paths. This can lead to compatibility issues with binary packages that expect a traditional Linux filesystem layout. In my case this did cause issues with my Neovim configuration some Mason binaries did not work as usual but I was generally able to solve the issue quickly by installing the binaries through the nixpkgs repo instead - they were all available and easy to lookup.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&#xA;&lt;h3 id=&#34;integration-with-other-systems&#34;&gt;Integration with Other Systems&lt;/h3&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Because of its unique approach, integrating Nix or NixOS with tools and platforms expecting a more conventional Linux environment can be more involved. Although there probably is a Nix way to get it running, it may become time-consuming. However, once it is set up, it should work forever. I hope as Nix continues to grow, we will begin to see more integration and simpler compatibility.&lt;/p&gt;&#xA;&lt;h2 id=&#34;conclusion-embracing-the-nix-philosophy&#34;&gt;Conclusion: Embracing the Nix Philosophy&lt;/h2&gt;&#xA;&lt;p&gt;This is all just putting my feet in the water; there is much more to the Nix ecosystem that makes life simpler as a software engineer. If you&amp;rsquo;re thinking about trying NixOS, I say just give it a shot. It will give you stability, easy reproducibility when adding a new machine, and peace of mind. The Nix philosophy has changed the way I view systems and software. This is how software should be.&lt;/p&gt;&#xA;&lt;h2 id=&#34;resources-for-learning-nix&#34;&gt;Resources for Learning Nix&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://nixos.org&#34;&gt;NixOS Official Website&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://nixos.org/guides/how-nix-works/&#34;&gt;How Nix Works&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://nixos.wiki/wiki/Main_Page&#34;&gt;NixOS Wiki&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://youtu.be/6Le0IbPRzOE?si=loaiUxK1fdmLTNVN&#34;&gt;What Nix Can Do&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</content>
  </entry>
</feed>
