<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[squarebracket.io Weblog]]></title><description><![CDATA[squarebracket.io Weblog]]></description><link>https://blog.squarebracket.io</link><image><url>https://cdn.hashnode.com/uploads/logos/6846baaed6848d9bb88d5c63/f2fb59fc-a33d-4012-a989-ac6e0cf88950.png</url><title>squarebracket.io Weblog</title><link>https://blog.squarebracket.io</link></image><generator>RSS for Node</generator><lastBuildDate>Sat, 12 Sep 2026 13:37:48 GMT</lastBuildDate><atom:link href="https://blog.squarebracket.io/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[BillMyCommits 1.0.0]]></title><description><![CDATA[I'm terrible at tracking time. I start the timer but forget to stop it. I stop the timer but forget to start it again. I haven't been able to find tooling that actually works for me so I thought that,]]></description><link>https://blog.squarebracket.io/billmycommits-1-0-0</link><guid isPermaLink="true">https://blog.squarebracket.io/billmycommits-1-0-0</guid><category><![CDATA[launch]]></category><category><![CDATA[Build In Public]]></category><dc:creator><![CDATA[Aaron Cruz]]></dc:creator><pubDate>Fri, 04 Sep 2026 21:31:19 GMT</pubDate><content:encoded><![CDATA[<p>I'm terrible at tracking time. I start the timer but forget to stop it. I stop the timer but forget to start it again. I haven't been able to find tooling that actually works for me so I thought that, with the help of Claude, I would finally finish a side project and build something that tracks my time at the piece of work instead of multiple times where I have proven to be quite forgetful.</p>
<p>I'm tired of guessing how long I worked on this feature and having to round down (to be as honest as possible) and just leaving cash on the table.</p>
<p>BillMyCommits fixes that. Version 1.0.0 is live today, free during beta (probably forever).</p>
<h2>What BillMyCommits does</h2>
<p>BMC connects to your GitHub repos, groups them by client, and turns commit history into the bones of an invoice.</p>
<p>Pick a client and a date range. BMC pulls commits from every repo tied to that client, sorts each one into a category (feature, bugfix, refactor, docs, test, chore), and lets you turn the ones you want to bill into line items in one pass. Set hours and rates globally or per line, add a tax rate if you need one, export to PDF or email it to the client.</p>
<p>No timer to start. No timer to forget. You write code, you commit code, and the raw material for the invoice is already sitting there at the end of the month.</p>
<h2>The privacy promise</h2>
<p>I want to be specific here, because I'm a freelance dev too and most repos I touch are covered by NDAs that say your code doesn't leave your machine without permission.</p>
<p><strong>BMC never fetches your code.</strong></p>
<p>The integration calls two GitHub endpoints. One lets you pick which repos belong to a client. The other reads commit metadata: message, timestamp, author, SHA. It never calls the contents API, never pulls diffs, never reads file bodies, never touches branch contents or PR descriptions. Commit messages and metadata are what an invoice needs. Nothing else gets read.</p>
<p>One caveat about OAuth. GitHub's permission model is coarse. To list commits on private repos, BMC has to request the <code>repo</code> scope, which on paper grants full read and write access to your private repositories. GitHub offers no "commits only" scope. BMC's code never asks GitHub for your files. The <a href="privacy">privacy page</a> spells out exactly what gets read and what doesn't.</p>
<p>If your commit messages contain sensitive information, that's a commit hygiene decision you already make every time you push to a code host or a CI provider. BMC treats commit messages with the same trust boundary they already cross.</p>
<h2>Why I built this</h2>
<p>I'm a freelance Elixir dev in Vienna. I bill in dollars and euros, I'm bad at time tracking despite knowing better, and I've watched years of revenue leak out of invoices built on "I forgot what I did that week."</p>
<h2>What's in 1.0.0</h2>
<ul>
<li><p><strong>GitHub integration.</strong> OAuth login, repo selection, commit fetching with date filtering. GitHub only at launch.</p>
</li>
<li><p><strong>Multi-repo aggregation per client.</strong> Attach any number of repos to a client. Cross-repo work comes back as one list of line items.</p>
</li>
<li><p><strong>Automatic commit categorization.</strong> Every commit lands in one of seven buckets (feature, bugfix, refactor, docs, test, style, chore) via conventional-commit keyword matching. The commit message becomes the line item description, and you edit anything too technical before sending.</p>
</li>
<li><p><strong>Hour estimation.</strong> BMC suggests hours per commit. Override per line, or change the hourly rate for the whole invoice.</p>
</li>
<li><p><strong>Multi-currency.</strong> USD, EUR, GBP, AUD, CAD, JPY, CHF, set per client.</p>
</li>
<li><p><strong>PDF export and email send.</strong> Send from BMC with the PDF attached, or download it and send through your own pipeline.</p>
</li>
<li><p><strong>Public share links.</strong> Every invoice gets a UUID-based public URL. Send the link, no client login needed.</p>
</li>
<li><p><strong>Invoice status tracking.</strong> Draft, sent, paid, cancelled.</p>
</li>
<li><p><strong>Draft-first workflow.</strong> Nothing leaves your account without an explicit send.</p>
</li>
</ul>
<h2>What's deliberately not in 1.0.0</h2>
<p>Things people will ask about:</p>
<ul>
<li><p><strong>Real-time time tracking.</strong> BMC works after the fact by design. If you want a timer, run one alongside it.</p>
</li>
<li><p><strong>LLM-written commit summaries.</strong> Commit messages become descriptions verbatim today. Rewriting them into client-friendly prose is on the roadmap.</p>
</li>
<li><p><strong>Recurring or scheduled invoice generation.</strong> You start each invoice from a date range. Per-client cadences (weekly, biweekly, monthly auto-draft) are on the roadmap.</p>
</li>
<li><p><strong>GitLab and Bitbucket.</strong> GitHub only at launch. Other providers are on the roadmap.</p>
</li>
<li><p><strong>Editing an invoice after send.</strong> Status still moves through sent, paid and cancelled, but line items lock on send. Re-issue if the billed work needs to change.</p>
</li>
<li><p><strong>Client portals.</strong> No client login. Clients get PDFs and share links.</p>
</li>
<li><p><strong>Variable retainer modeling.</strong> Retainers work as fixed amounts today. Variable work against a retainer is on the roadmap.</p>
</li>
<li><p><strong>Multi-jurisdiction tax.</strong> One tax rate per invoice. Real multi-jurisdiction tax is its own product and I'm not going to pretend otherwise.</p>
</li>
<li><p><strong>Multi-user teams.</strong> BMC is for solo freelancers. Agencies aren't the audience right now.</p>
</li>
</ul>
<p>Every one of these is a decision, not an oversight.</p>
<h2>Pricing</h2>
<p>BillMyCommits is <strong>free during beta</strong> (and probably forever).</p>
<h2>Start using BMC</h2>
<p><a href="https://billmycommits.com">Sign up at billmycommits.com.</a> Connect a repo, tell BMC which client it belongs to, and let it draft the first invoice.</p>
<p>If something breaks, the Discord is the fastest way to reach me. I'm in there and I answer.</p>
<h2>Join the Discord</h2>
<p>There's a <a href="https://discord.gg/334DJPUt6U">BMC Discord</a>.</p>
<p>Roadmap updates land there, bug reports get triaged fastest there, and freelance devs compare their own invoicing workflows. The early cohort is the useful place to be, because their feedback shapes the next year of the product.</p>
<p>I'm in there daily. If something is broken, I'd rather hear it from you in #bugs than discover it in a billing mess three months later.</p>
<h2>Release notes</h2>
<p>Starting with this post, every BillMyCommits release gets a blog post with a changelog.</p>
<p>Release post or it didn't happen.</p>
<h3>Changelog: 1.0.0</h3>
<p><strong>Added</strong></p>
<ul>
<li><p>Initial public release</p>
</li>
<li><p>GitHub OAuth login and repo selection</p>
</li>
<li><p>Commit fetching with date filtering and per-repo caching</p>
</li>
<li><p>Automatic commit categorization (feature, bugfix, refactor,</p>
</li>
<li><p>Hour estimation per commit with per-line and global overrides</p>
</li>
<li><p>Multi-repo aggregation per client</p>
</li>
<li><p>Multi-currency support: USD, EUR, GBP, AUD, CAD, JPY, CHF</p>
</li>
<li><p>PDF export via ChromicPDF</p>
</li>
<li><p>Email send with PDF attachment</p>
</li>
<li><p>Public invoice share links (UUID-based, no auth required)</p>
</li>
<li><p>Invoice status tracking (draft / sent / paid / cancelled)</p>
</li>
<li><p>Client management (CRUD) with per-client hourly rate, defaul</p>
</li>
<li><p>Account dashboard</p>
</li>
<li><p>Draft-first send workflow</p>
</li>
</ul>
<h2>Closing</h2>
<p>If you're a freelance dev who has ever guessed at last month's hours, try <a href="https://billmycommits.com">BillMyCommits</a>.</p>
<p>Free during beta. No card on file. <a href="https://discord.gg/334DJPUt6U">The Discord</a> is open. And if something's wrong, I want to know.</p>
<p><a href="https://billmycommits.com">Sign up.</a> · <a href="https://discord.gg/334DJPUt6U">Join the Discord</a>.</p>
]]></content:encoded></item><item><title><![CDATA[The execution loop: GitHub, Coolify, Playwright, and the two touch points that run the studio]]></title><description><![CDATA[Part 3 of How I Ship Side Projects. Part 1: planning. Part 2: the agent crew.


By the end of part 2, the agent crew was running. The CEO summary lands on my Discord at 06:00 Vienna. The product PMs w]]></description><link>https://blog.squarebracket.io/the-execution-loop-github-coolify-playwright-and-the-two-touch-points-that-run-the-studio</link><guid isPermaLink="true">https://blog.squarebracket.io/the-execution-loop-github-coolify-playwright-and-the-two-touch-points-that-run-the-studio</guid><dc:creator><![CDATA[Aaron Cruz]]></dc:creator><pubDate>Thu, 27 Aug 2026 15:58:38 GMT</pubDate><content:encoded><![CDATA[<p><em>Part 3 of How I Ship Side Projects.</em> <a href="https://blog.squarebracket.io/from-idea-to-linear-plan-how-i-scope-a-side-project-before-any-code-gets-written"><em>Part 1: planning</em></a><em>.</em> <a href="https://blog.squarebracket.io/12-agents-one-ceo-and-the-trust-boundary-that-holds-it-together"><em>Part 2: the agent crew</em></a><em>.</em></p>
<img src="https://cdn.hashnode.com/uploads/covers/6846baaed6848d9bb88d5c63/6b6b81fd-e66e-43dc-9c79-b2cadfe7d52a.png" alt="" style="display:block;margin:0 auto" />

<p>By the end of part 2, the agent crew was running. The CEO summary lands on my Discord at 06:00 Vienna. The product PMs work morning and evening shifts. Twelve agents share Linear as their workplace, and one label, <code>agent</code>, is the trust boundary that keeps me in control of the parts I should still own.</p>
<p>What part 2 left out was the rest of the loop. Where does the engineer's code go? How do I review it without burning my whole day on it? Where do the marketer's landing-page drafts end up? And how do I keep all of it reachable from my phone in a café without giving the agents internet access to anything dangerous?</p>
<p>This is the article for the devs in the audience. It's the most concrete and most copyable of the three. The previous two were "here's how to think about it." This one is "here's the wiring."</p>
<p>The whole loop comes down to two daily touch points, Linear and GitHub. Everything else is automated. I'll walk through each piece in roughly the order a feature flows through the system.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6846baaed6848d9bb88d5c63/14f3268b-05e7-4e66-8bd0-653900adc060.png" alt="" style="display:block;margin:0 auto" />

<h2>The deliverables repo trick</h2>
<p>Before I get to code, the most useful piece of plumbing in the whole setup is one I almost didn't bother to write up because it sounds too simple. It's not.</p>
<p>There's a single shared GitHub repo, <a href="https://github.com/mraaroncruz/paperclip-deliverables"><code>mraaroncruz/paperclip-deliverables</code></a>, where every non-code artifact from every agent lands.</p>
<p>The repo is organized by sub-company:</p>
<pre><code class="language-plaintext">paperclip-deliverables/
├── encroach/        # Encroach marketing &amp; assets
├── billmycommits/   # BMC marketing &amp; assets
├── happyclients/    # HappyClients marketing &amp; assets
├── content/         # Content Strategist drafts (cross-company)
└── talks/           # Talk Researcher proposals &amp; outlines
</code></pre>
<img src="https://cdn.hashnode.com/uploads/covers/6846baaed6848d9bb88d5c63/971f3231-730c-4f08-a98a-291694f90ebf.png" alt="" style="display:block;margin:0 auto" />

<p>Every agent that produces a non-code deliverable (landing-page copy, social posts, weekly analytics digests, talk proposals, blog drafts, screenshots, hero images, style guides) saves it into the right subdirectory and commits. The agents have write access to this repo and only this repo.</p>
<p>When an agent finishes a draft, it follows the same pattern across all twelve roles. The exact instruction in the Encroach Marketing agent's <code>AGENTS.md</code>:</p>
<blockquote>
<p>All content deliverables (marketing drafts, images, social posts, etc.) MUST be saved to the shared deliverables repo at <code>/home/aaron/Projects/deliverables/encroach/</code>. This repo is published at <code>https://github.com/mraaroncruz/paperclip-deliverables</code>.</p>
<ul>
<li><p>Save files using descriptive filenames</p>
</li>
<li><p>Commit and push your deliverables to the repo</p>
</li>
<li><p>In your Paperclip task comments, Linear issues, and GitHub PRs, link to the file on GitHub</p>
</li>
</ul>
</blockquote>
<p>So the agents don't email me drafts. They don't generate files into a local folder I'd never see. They commit, push, and link. The link is what I get in Discord and Linear.</p>
<p>Why this matters more than it sounds:</p>
<ol>
<li><p>I don't need access to the Mac mini to see what the agents made. I'm in a café in Vienna with a laptop. The marketer just produced three blog post drafts. They're in GitHub, and I can read them on my phone. No Tailscale into my home network, no asking the agent to send me the file. They're already in the place I'd look anyway.</p>
</li>
<li><p>The agents on the Mac mini don't need outbound access to my hosting. The marketer has no credentials for Cloudflare Pages, Plausible, or Kit.com. It pushes to a GitHub repo. From there, downstream automation (which I control, with its own credentials) deploys. If the agent goes haywire, the worst it can do is commit nonsense to a repo I review before any of it goes live.</p>
</li>
<li><p>The whole studio gets versioned. Every landing page change, blog post, and analytics digest is a commit. I can roll back a marketing change as easily as a code change. I can find out why the homepage hero changed last Tuesday and what the agent's reasoning was, because the commit message and the linked Linear issue are right there.</p>
</li>
<li><p>It works when I'm offline. The agents keep running on the Mac mini whether I'm online or not. When I come back, GitHub has the diffs waiting for me.</p>
</li>
</ol>
<p>The deliverables repo is the most novel piece of plumbing in this setup, and it's a five-minute change. If you take one thing from this article, take this.</p>
<h2>Code: the engineer agents' PR loop</h2>
<p>The engineer agents work against the product repos themselves. For Encroach: <code>encroach</code>. For BillMyCommits: <code>billmycommits_ex</code>. For HappyClients: <code>happyclients_ex</code>.</p>
<p>The flow is what you'd expect:</p>
<ol>
<li><p>The PM picks up an issue labeled <code>agent</code> from Linear and either does the work itself or delegates a Paperclip subtask to the engineer.</p>
</li>
<li><p>The engineer checks out a feature branch, writes the code, runs <code>mix test</code> and <code>mix format</code> (enforced in every engineer's <code>AGENTS.md</code>), commits.</p>
</li>
<li><p>Before opening the PR, the engineer captures Playwright screenshots of any changed UI (more on this below).</p>
</li>
<li><p>It opens the PR via the <code>gh</code> CLI with a description that closes the Linear issue (<code>Closes ELB-1234</code>), explains what changed, and embeds the screenshots.</p>
</li>
<li><p>It posts a Discord notification with the PR link.</p>
</li>
<li><p>I review. Screenshots first, then the Coolify preview if I need it, then the diff if I still need it.</p>
</li>
<li><p>I merge or comment back. The engineer reads the merge in the next batch and moves the Linear issue to <code>Done</code>.</p>
</li>
</ol>
<img src="https://cdn.hashnode.com/uploads/covers/6846baaed6848d9bb88d5c63/ac909f2a-2099-4baa-bcc0-cd030859437e.png" alt="" style="display:block;margin:0 auto" />

<p>The Linear-to-PR link is the one rule I won't bend on. Every PR description ends with <code>Closes ELB-XXXX</code>. Every commit message references the issue. Six months from now, when I'm asking "why does this code exist?", I can go from git blame to commit, commit to issue, issue to milestone, milestone to the original product hypothesis. Full traceability for the cost of one line per PR.</p>
<h2>Playwright screenshots in the PR</h2>
<p>This is the piece that surprised me most once the workflow was running.</p>
<p>I have a <code>playwright-cli</code> skill that any engineer agent can call. Before opening a PR for any UI change, the engineer:</p>
<ol>
<li><p>Starts the Phoenix dev server.</p>
</li>
<li><p>Navigates to each affected route.</p>
</li>
<li><p>Captures screenshots at two viewports: desktop (1280x720) and mobile (375x812).</p>
</li>
<li><p>Embeds the screenshots in the PR body using markdown.</p>
</li>
</ol>
<p>The skill, in summary:</p>
<pre><code class="language-bash"># Desktop screenshot
playwright screenshot --viewport-size "1280,720" \
  http://localhost:4000/dashboard \
  dashboard-desktop.png

# Mobile screenshot
playwright screenshot --viewport-size "375,812" \
  http://localhost:4000/dashboard \
  dashboard-mobile.png
</code></pre>
<p>A typical PR ends up looking like:</p>
<pre><code class="language-markdown">## What changed

Added CSV export to the billing history page (Closes ELB-1234).

## Screenshots

### Desktop
![Desktop](dashboard-desktop.png)

### Mobile
![Mobile](dashboard-mobile.png)
</code></pre>
<p>Most of my UI review now happens in the PR itself, on my phone, before I click through to anything else. I scan the screenshots. If the change looks right at both viewports, I merge. If something looks off, a button in the wrong place or a layout glitch on mobile, I catch it without spinning anything up.</p>
<p>The Playwright pattern handles maybe 70% of my visual review. Coolify previews handle the other 30%, the cases where I need to click on the thing, fill in a form, or watch state change. I need both.</p>
<p>I didn't expect this part. Capturing mobile screenshots by default has caught more bugs than any other single change to the workflow. Left alone, the agents optimize for what they can see in the dev server, which is desktop. Forcing a mobile screenshot into every PR forces mobile awareness onto every change. Most of the layout regressions I've caught in agent PRs were mobile-only and would have been invisible without it.</p>
<h2>Coolify previews: review the running app, not the diff</h2>
<p>For the 30% where screenshots aren't enough, anything stateful or interactive, I rely on Coolify PR previews.</p>
<p>Each product has a Coolify application connected to its GitHub repo with PR preview deployments enabled. When the engineer opens a PR, Coolify builds the branch and deploys it to a unique URL like <code>pr-142.encroach.example.com</code>. That takes a couple of minutes, and a post-deploy webhook posts the preview URL as a comment on the PR. You could also set up something similar using AWS Cloudformation or <a href="https://jhuleatt.com/posts/cloud-run-pr-previews/">GCS Cloud Run</a> if you don't want to host it yourself.</p>
<p>I never pull the branch, install dependencies, or run anything locally to review a feature. I click the link, use the running thing, and decide.</p>
<p>Reviewing a 600-line PR from an agent by reading the diff is hard. The diff doesn't tell you the new validation message is too quiet, or that the export button sits below the fold on small screens. Screenshots catch the visual stuff. The running app catches everything else. The diff lies about what code does in ways that running code can't.</p>
<p>I now read the diff only when something in the running app or a screenshot feels off and I want to know why. The diff is a diagnosis tool, not an approval gate.</p>
<h3>Coolify preview setup, the abridged version</h3>
<p>This assumes you've got Coolify running on a server. Mine is on a Hetzner box. A $5 VPS works for small projects.</p>
<p><strong>1. Wildcard DNS.</strong> Add a wildcard CNAME for the preview pattern:</p>
<pre><code class="language-plaintext">*.encroach.example.com  →  CNAME  →  &lt;your-coolify-server&gt;
</code></pre>
<p>This single record covers all preview subdomains forever. No per-PR DNS work.</p>
<p><strong>2. Enable preview deployments on the application.</strong> Settings → Preview Deployments → Enable. Coolify registers the GitHub webhook for you if you've connected your GitHub account.</p>
<p><strong>3. Set the preview URL pattern.</strong> Default is <code>pr-{number}.{domain}</code>. Fine for most cases.</p>
<p><strong>4. Enable automatic SSL.</strong> Let's Encrypt for the preview domains. This matters if your app uses cookies, service workers, or anything secure-context-only. Without it, previews behave differently from production in confusing ways.</p>
<p><strong>5. Set per-application resource limits.</strong> If three products each have two previews running at once, that's six containers eating your server. Cap CPU and memory per preview container so a busy week doesn't starve your main applications.</p>
<p><strong>6. Wire the post-deploy notification.</strong> Coolify can call a webhook when a deploy completes. I have a small Cloudflare Worker that listens for those events and posts the preview URL as a comment on the PR. Without this piece, the loop technically works but doesn't feel automated, and you stop using it. With it, the URL is one tap away from wherever I'm reading the morning summary.</p>
<p>The whole setup is an evening of work, including waiting on wildcard DNS propagation. The post-deploy worker is the part most people skip and shouldn't.</p>
<h2>The two touch points</h2>
<p>I said at the top that the loop comes down to two daily touch points. Here's what that looks like.</p>
<p>Linear is where I:</p>
<ul>
<li><p>Refine issues the PM flagged as needing my input</p>
</li>
<li><p>Apply the <code>agent</code> label to issues I'm willing to hand to an agent</p>
</li>
<li><p>Create new issues from product ideas that didn't go through the planning pipeline</p>
</li>
<li><p>Read clarifying questions from agents and answer them as comments</p>
</li>
<li><p>Sync with the PMs at noon Vienna</p>
</li>
</ul>
<p>GitHub is where I:</p>
<ul>
<li><p>Review PRs (screenshots first, then the Coolify preview if needed, then the diff if anything still feels off)</p>
</li>
<li><p>Review marketing deliverables in <code>paperclip-deliverables</code></p>
</li>
<li><p>Merge or close PRs</p>
</li>
<li><p>Occasionally edit an <code>AGENTS.md</code> file when an agent drifts in some new way</p>
</li>
</ul>
<p>Everything else is push notifications. Discord at 06:00 with the CEO summary, more Discord pings as PRs and drafts land through the day, and the noon sync with the PMs. I don't open Coolify daily. I don't open Cloudflare daily. I don't open the Mac mini's terminal. I don't tail logs.</p>
<p>When the system is working, which is most days, I spend something like 45 to 75 minutes on it, in a couple of focused chunks. Not zero, but a lot less than these three products would eat if I were the only one moving them forward.</p>
<p>When it's not working (usually an agent has drifted, an issue was scoped badly, or a milestone was wrong from step 1), I find out through blocker pings or by noticing the morning summary has too many "waiting on you" items. The fix is almost always upstream. Tighten an issue, add a line to an <code>AGENTS.md</code>, sharpen the milestone exit criterion. The loop itself rarely needs fixing. The inputs do.</p>
<h2>What I'd do differently if I were starting over</h2>
<p>A few things I learned the slow way.</p>
<p><strong>Set up the deliverables repo on day one, not month two.</strong> I started without it and had agents emailing me drafts. It was bad. The repo solves a problem I didn't know I had until I'd lived with it.</p>
<p><strong>Set up Playwright screenshots in PRs before Coolify previews.</strong> I had Coolify first and added screenshots later. I'd flip that order. Screenshots are cheaper to set up, faster to consume, and cover most cases.</p>
<p><strong>Set up Coolify previews before you trust the engineer agent.</strong> Reviewing the engineer's first PRs from the diff was painful and made me distrust the agent more than I should have. Once previews were live, the trust came back, because I was reviewing the feature instead of the code.</p>
<p><strong>Wire the post-deploy notification first, not last.</strong> The difference between automated-but-clunky and automated-and-frictionless is the URL landing where I'm already looking.</p>
<p><strong>Keep it to two touch points.</strong> Every extra tool that demands daily attention is a tax. Things I tried and rejected: a separate Slack workspace for agent-to-me communication (Discord won), a dashboard pulling Linear + GitHub + Plausible into one view (felt useful, went unused), a daily standup video the agents would record (please don't).</p>
<h2>What's not in this series</h2>
<p>A few things I skipped, in case you're wondering.</p>
<p>The prompts for each agent role. They drift, they're long, and the framework matters more than the prompt. Give a model the role definition (the <code>AGENTS.md</code>) and the boundary <code>agent</code> label semantics) and it'll do most of the work. The full company is a publishable Paperclip export and I may share an anonymized version as a follow-up.</p>
<p>Model selection per role. The engineer uses something stronger than the marketer, the PM is in between. Specifics change with every model release, so anything I write today is wrong in three months.</p>
<h2>Closing</h2>
<p>Three products, three Linear projects in the <code>ELB</code> team, twelve agents, one Mac mini, one Hetzner box, one shared deliverables repo, two daily touch points. Three side projects that are moving forward instead of rotting on Github with the last changes 7 years ago.</p>
<p>The trick wasn't the agents. It was the planning that happens before them (<a href="https://blog.squarebracket.io/from-idea-to-linear-plan-how-i-scope-a-side-project-before-any-code-gets-written">part 1</a>), the boundaries they work within (<a href="https://blog.squarebracket.io/12-agents-one-ceo-and-the-trust-boundary-that-holds-it-together">part 2</a>), and the loop that keeps me out of the day-to-day except where it matters (this one). The agents are the engine. The system is what makes the engine useful.</p>
<p>If you build a version of this and it works for you, I'd love to hear what you changed and why. If you build it and it doesn't work, I'd love to hear that more.</p>
<hr />
<p><em>Square Bracket eU is a one-person product studio in Vienna. Find me at</em> <a href="https://squarebracket.io"><em>squarebracket.io</em></a><em>.</em></p>
]]></content:encoded></item><item><title><![CDATA[12 Agents, One CEO, and the Trust Boundary That Holds It Together]]></title><description><![CDATA[Part 2 of How I Ship Side Projects. Part 1 covers planning. Part 3 covers the execution loop.
The first article in this series ended where most agent content starts: with a Linear project full of well]]></description><link>https://blog.squarebracket.io/12-agents-one-ceo-and-the-trust-boundary-that-holds-it-together</link><guid isPermaLink="true">https://blog.squarebracket.io/12-agents-one-ceo-and-the-trust-boundary-that-holds-it-together</guid><category><![CDATA[agents]]></category><category><![CDATA[AI]]></category><category><![CDATA[automation]]></category><category><![CDATA[Productivity]]></category><dc:creator><![CDATA[Aaron Cruz]]></dc:creator><pubDate>Mon, 11 May 2026 13:01:30 GMT</pubDate><content:encoded><![CDATA[<p><em>Part 2 of How I Ship Side Projects.</em> <a href="https://blog.squarebracket.io/from-idea-to-linear-plan-how-i-scope-a-side-project-before-any-code-gets-written"><em>Part 1 covers planning</em></a><em>. Part 3 covers the execution loop.</em></p>
<p>The first article in this series ended where most agent content <em>starts</em>: with a Linear project full of well-scoped milestones and issues, ready for someone to pick up.</p>
<p>This is the part where the agents come in. What works for me is something like a tiny org chart: a small company of narrow agents, each pinned to one job, sharing Linear as their workplace.</p>
<p>Currently there are twelve agents. They report up to a CEO agent who reports to me. The CEO produces a daily summary that lands on my Discord (super easy to set up a webhook for messages) at 06:00 Vienna so I have it before I sit down to work at 08:00. The product agents work in two shifts (06:30 morning batch and 21:00 evening batch), and I sync with them around noon to clear blockers and adjust priorities.</p>
<p>The most important piece of the whole setup isn't the agents themselves. It's a single Linear label that defines the trust boundary between work that's safe to delegate and work that isn't. I'll come back to that, but first the org chart.</p>
<h2>The org chart</h2>
<p>Twelve agents, organized in roughly the shape a real small company would take:</p>
<img src="https://cdn.hashnode.com/uploads/covers/6846baaed6848d9bb88d5c63/4923a433-6f15-4625-8920-d909f494b0bd.png" alt="" style="display:block;margin:0 auto" />

<p><strong>The CEO</strong> runs once daily at 06:00 Vienna, before I'm up. It reviews state across the three product PMs, surfaces ideas that bubbled up overnight, sets priorities for the day, and writes a single concise summary that lands on my Discord. The system prompt for this agent literally says: <em>"Lead with what needs founder attention (decisions, approvals, blockers). Follow with progress updates and metrics. End with recommended next actions."</em> That's the message format I read at 08:00.</p>
<p><strong>The product PMs</strong> (<a href="https://billmycommits.com">BillMyCommits</a>, <a href="https://encroach.app">Encroach</a>, <a href="https://happyclients.app">HappyClients</a>) are the workhorses. Each one runs twice daily (06:30 and 21:00 Vienna) and owns the backlog for its product. They pick up issues, delegate to their engineer and marketing agents, update Linear state, and post status back to Paperclip and Discord. Each PM reports to the CEO. They never report directly to me, which is by design. The CEO consolidates.</p>
<p><strong>The engineers and marketers</strong> (one of each per product) report to their respective PM. The engineers do the code; the marketers do the content. Both push deliverables to a shared GitHub repo (covered in part 3) so I can review from anywhere without touching the machine the agents run on.</p>
<p><strong>Two cross-company agents</strong> report to the CEO directly: a <strong>Content Strategist</strong> whose job is mining git history and PRs for stories worth writing about, and a <strong>Talk Researcher</strong> that drafts conference proposals and outlines. These exist outside the per-product structure because their work cuts across all three products. (The Content Strategist has an explicit "Building with AI" series mandate, which means this article series you're reading is, in a way, an attempt by me to do a job one of my agents was supposed to do. I notice the irony.)</p>
<p>The whole structure lives in version-controlled markdown. Each agent has its own <code>AGENTS.md</code> file with its role, its skills, its boundaries, and its reporting lines. Twelve files. Adding, removing, or modifying an agent is a commit. The whole company is a git repo.</p>
<h2>A real <code>AGENTS.md</code>, abridged</h2>
<p>Here's the actual top of the Encroach PM's role definition, cleaned up slightly for the article:</p>
<pre><code class="language-markdown">---
name: "Encroach PM"
title: "Product Manager: Encroach"
reportsTo: "ceo"
skills:
  - "linear-integration"
  - "discord-notification"
  - "gh-cli-skill"
---

You are the Product Manager for Encroach, a running game app where 
runners sync data from Strava and compete to capture squares on a 
map of their city. You report to the CEO.

## Linear Integration

- Project ID: `1234` (team: SQBR)
- Use the `linear` CLI to read milestones and issues
- Pick highest-priority issues from the current milestone
- Only pick up issues labeled `paperclip-ai`. The rest require 
  founder/human attention or are not ready for you and must not 
  be picked up by agents
- State transitions:
  - Pick up issue: `Ready for Progress` → `Started`
  - Work complete: keep `Started`, link PR or draft in comment
  - Founder approves: move to `Done`

## Decision Authority

- You CAN: pick up paperclip-ai issues, delegate to your team, 
  draft specs, update Linear state, write code if needed
- You CANNOT: merge PRs, publish marketing content, or change 
  strategic direction
- Escalate interesting ideas to the CEO, not directly to the founder
</code></pre>
<p>The pattern is the same across all twelve agents. Frontmatter for the structural details (name, title, who they report to, what skills they can call), then a free-form description of responsibilities, boundaries, and how they work. The agent reads this on every task.</p>
<h2>The trust boundary: the <code>paperclip-ai</code> label</h2>
<p>This is the most important section in this article.</p>
<p>In the Linear backlog there are issues the agents can pick up and issues they can't. The mechanism that distinguishes them is one label: <code>paperclip-ai</code>.</p>
<p>Agents are told, in their system prompts, to <strong>only pick up issues with this label</strong>. Anything in the backlog without it must not be touched. Two different kinds of issues end up unlabeled and the agents can't tell them apart, which turns out to be the right property: issues that are <em>mine</em> (decisions, sensitive client comms, things I want to handle for skill reasons), and issues that are <em>not yet ready for anyone</em> (under-specified, missing context, waiting on an upstream call). From the agent's perspective those are the same (no label, don't touch), and that's exactly the rule I want.</p>
<p>This sounds like a small distinction. It's not. The point is that <strong>the default is "this is my work or it's not ready," and the label is an explicit act of delegation.</strong> Every time I add <code>paperclip-ai</code> to an issue, I'm making a deliberate decision that the work is well-scoped enough, low-blast-radius enough, and obvious enough in intent that I'm willing to let an agent do it without further review of the <em>task itself</em>. The PR or the draft still gets reviewed. The <em>decision to delegate</em> gets made once, by me, when I apply the label.</p>
<p>The label is gated to me. The PMs can suggest that an issue is ready for the label (in a comment), but they cannot apply it themselves. Only I can. This protects the boundary from drifting toward whatever the PM finds easiest to delegate.</p>
<p>In practice the label goes on issues like:</p>
<ul>
<li><p>"Add a CSV export button to the billing history page"</p>
</li>
<li><p>"Draft a LinkedIn post about the new BMC pricing tier" (drafted by marketer, reviewed by me)</p>
</li>
<li><p>"Fix flash notification colors for dark theme on HappyClients"</p>
</li>
<li><p>"Write the weekly Plausible analytics digest for Encroach"</p>
</li>
</ul>
<p>And stays off issues like:</p>
<ul>
<li><p>"Decide on the Encroach pricing tier structure"</p>
</li>
<li><p>"Review the new Strava OAuth scopes before we ask for them"</p>
</li>
<li><p>"Migrate the H3 grid resolution: DB rewrite required"</p>
</li>
<li><p>"First conversation with the freelance designer about the BMC homepage"</p>
</li>
</ul>
<p>The mix is fluid. Some weeks I'm tightening the boundary because an agent surprised me. Other weeks I'm loosening it because I'm trusting them more. The label is the dial.</p>
<h2>Linear as the workplace</h2>
<p>The agents don't share a chat room. They don't have a group thread. They don't ping each other on Slack.</p>
<p>They share Linear, and Linear is their workplace.</p>
<p>Concretely:</p>
<ul>
<li><p>The PM picks up an issue labeled <code>paperclip-ai</code> from <code>unstarted</code>, transitions it to <code>started</code>, and either does the work itself or delegates a Paperclip subtask to its engineer or marketer.</p>
</li>
<li><p>The engineer's PR link goes in the issue as a comment.</p>
</li>
<li><p>The marketer's drafts go in the deliverables repo (covered in part 3) with a link in the issue.</p>
</li>
<li><p>All status flows through Linear states: <code>triage → backlog → unstarted → started → completed</code>. Plus <code>canceled</code> for things that go away.</p>
</li>
</ul>
<p>Without a shared workplace, multi-agent setups end up passing context through summaries and ad-hoc handoffs, and every handoff loses information. The Linear ticket is the single source of truth. Every agent appends to it instead of recreating context elsewhere.</p>
<p>The Linear team for all three products is <code>ELB</code> (ElixirBytes, my pre-Square-Bracket umbrella). One team, three projects, twelve agents. The CEO sees all three projects. Each PM sees one.</p>
<h2>What the agents are allowed to break</h2>
<p>Each agent's <code>AGENTS.md</code> carries explicit "you can / you cannot" lists. The shape is consistent across the company:</p>
<ul>
<li><p><strong>PMs</strong> can update issue state, delegate, draft specs, write code if needed. They cannot merge PRs, publish marketing content, or change strategic direction.</p>
</li>
<li><p><strong>Engineers</strong> can write code, run <code>mix test</code> and <code>mix format</code>, create PRs via the <code>gh</code> CLI, link to PRs in Paperclip and Linear. They cannot merge their own PRs, modify production environment variables, run migrations against production, or touch deploy configuration.</p>
</li>
<li><p><strong>Marketers</strong> can draft and commit content to the deliverables repo, draft analytics digests, propose nurture-sequence updates. They cannot publish anything externally. Drafts are surfaced for me to review, and I publish.</p>
</li>
<li><p><strong>CEO</strong> can reprioritize tasks, delegate to PMs, propose new initiatives. Cannot ship code, publish content, spend budget, or hire new agents without my approval.</p>
</li>
</ul>
<p>Some of these are enforced by the agent's tools (no production credentials), some by me being the only person with merge rights, some by the system prompt and crossed fingers. The defence is layered, not airtight, and I'm honest with myself about which is which.</p>
<p>A consistent line in the engineer agents' prompts that does more work than it looks like:</p>
<blockquote>
<p>Keep the work moving until it's done. If you need QA to review it, ask them. If you need your boss to review it, ask them. If someone needs to unblock you, assign them the ticket with a comment asking for what you need. Don't let work just sit here. You must always update your task with a comment.</p>
</blockquote>
<p>Three subtle effects of that one paragraph: agents delegate up and across instead of stopping silently, blocked tickets get visibly tagged so I can see them in summaries, and there's no "I tried for a while and gave up" state. The agent always either makes progress or asks for help in writing.</p>
<h2>The routines that surface only what needs my attention</h2>
<p>The crew runs continuously on a Mac mini in a closet. The schedule is the part that keeps it manageable:</p>
<table>
<thead>
<tr>
<th>Time (Vienna)</th>
<th>What runs</th>
<th>What lands</th>
</tr>
</thead>
<tbody><tr>
<td>06:00</td>
<td>CEO morning review</td>
<td>Discord summary at 06:00</td>
</tr>
<tr>
<td>06:30</td>
<td>Three PM morning batches</td>
<td>Issue picks, delegations, PRs</td>
</tr>
<tr>
<td>~08:00</td>
<td>I read the CEO summary</td>
<td>I plan my day</td>
</tr>
<tr>
<td>~12:00</td>
<td>Founder sync</td>
<td>I clear blockers, adjust priorities</td>
</tr>
<tr>
<td>21:00</td>
<td>Three PM evening batches</td>
<td>Iterate on noon feedback</td>
</tr>
</tbody></table>
<p>Discord is the only push-notification channel for the system. The webhook lives in a Paperclip secret called <code>DISCORD_WEBHOOK_URL</code>, and any agent can post to it via the <code>discord-notification</code> skill. The skill defines exactly four message formats: PR ready for review, marketing draft ready, CEO daily summary, and agent blocked. That's it. The constraint matters. Without it the channel becomes noisy, and I stop reading.</p>
<p>The Discord notification call, in full:</p>
<pre><code class="language-bash">curl -H "Content-Type: application/json" \
  -d '{"content": "🔀 **PR Ready for Review**\n\n**Issue:** ELB-XXXX: Issue title\n**PR:** https://github.com/owner/repo/pull/XX\n\nScreenshots attached to the PR."}' \
  "$DISCORD_WEBHOOK_URL"
</code></pre>
<p>Five lines of bash. Not glamorous. Doing the actual work of keeping me in the loop.</p>
<p>I deliberately did not build an agent that asks me clarifying questions in real time. That sounds nice but in practice would mean my phone interrupts me throughout the day, which is exactly what I'm trying to avoid. Clarifying questions go into the issue as comments. I see them at noon when I sync, or in the next CEO summary. The system batches my involvement instead of fragmenting it.</p>
<h2>What's next</h2>
<p>The CEO summary lands at 06:00 Vienna, the PM morning batches run at 06:30, and by the time I'm at my desk I have a Discord message telling me what to look at first.</p>
<p>What's not yet covered: how the actual deliverables move from agent to me to production. The engineer opens PRs. Where do they go? How do I review them without spending all day reading diffs? How does the marketer push landing-page changes if its machine isn't on the public internet?</p>
<p>That's part 3: the execution loop. A shared deliverables repo on GitHub, Coolify previews for the engineering PRs, and the Playwright screenshot pattern that means I can review most UI changes without even clicking through to the staging URL.</p>
]]></content:encoded></item><item><title><![CDATA[From Idea to Linear Plan: How I Scope a Side Project Before Any Code Gets Written]]></title><description><![CDATA[Part 1 of a three-part series on running a one-person product studio. Part 2 covers the agent crew that builds the thing. Part 3 covers the GitHub-and-Coolify loop that ships it.
The single biggest pr]]></description><link>https://blog.squarebracket.io/from-idea-to-linear-plan-how-i-scope-a-side-project-before-any-code-gets-written</link><guid isPermaLink="true">https://blog.squarebracket.io/from-idea-to-linear-plan-how-i-scope-a-side-project-before-any-code-gets-written</guid><dc:creator><![CDATA[Aaron Cruz]]></dc:creator><pubDate>Fri, 01 May 2026 15:29:44 GMT</pubDate><content:encoded><![CDATA[<p><em>Part 1 of a three-part series on running a one-person product studio. Part 2 covers the agent crew that builds the thing. Part 3 covers the GitHub-and-Coolify loop that ships it.</em></p>
<p>The single biggest predictor of whether a side project of mine ships or dies is how much work I do <em>before</em> any code gets written.</p>
<p>Not the brainstorming. Brainstorming is fun and cheap and produces nothing. I mean the unglamorous middle step between "I have an idea" and "I'm building it" - turning a vague intuition into a sharp product hypothesis, then turning that hypothesis into an MVP plan with milestones concrete enough that someone other than me could execute against them.</p>
<p>That last clause matters more than it sounds, because in my current setup, "someone other than me" is a small team of agents. But honestly it mattered before that too. The Linear projects I scoped well got finished. The ones I scoped poorly turned into a graveyard of half-built features and a domain I'm still paying renewal on.</p>
<p>This is the part of my workflow that runs entirely between me and a model. No agents yet. No tickets yet. Just me and Claude in a long conversation, going from idea to plan.</p>
<h2>Step 1. The product conversation</h2>
<p>I open a long-form chat with a strong reasoning model and we chat out the idea.</p>
<p>The point of this conversation is not to get an answer. It's to expose the parts of the idea I haven't actually thought about yet. A good model will push back on weak parts of the pitch the way a good co-founder would, if I'm prompting it to do that, and I am explicitly prompting it to do that. It will ask me tough questions and I just had to scrap an idea I've been wanting to build for years from the feedback it gave me. I was pretty bummed out afterward.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6846baaed6848d9bb88d5c63/a0ce18bf-d1b4-46dd-afeb-55efcc6abf8c.png" alt="" style="display:block;margin:0 auto" />

<p>A few things I've learned to insist on:</p>
<p><strong>Direct pushback. Not validation.</strong> I tell the model up front that I want it to argue against the weakest parts of the idea, not encourage me. "What's wrong with this?" gets better answers than "what do you think of this?"</p>
<p><strong>Comparable products, named.</strong> I make the model name three to five existing products in the space and explain how my idea would beat each one. If the answer is hand-wavy, the idea is hand-wavy. The exercise of naming concrete competitors and writing a one-sentence differentiator against each is the cheapest reality check in the world.</p>
<p><strong>The "why now" question.</strong> Why hasn't someone built this already, or if they have, why does it deserve another entrant? Sometimes the answer is honest ("everyone who could build this is busy at a big company"). Sometimes the answer is "they have, and they're doing fine, and you should not build this." I'd rather find out in a Tuesday-afternoon chat than after I've burned a bunch of time (or tokens) on it.</p>
<p><strong>One sharp differentiator, stated as a sentence.</strong> Not three differentiators. One. If I can't compress the reason this product is better than the alternatives into a sentence, the product isn't ready to plan yet.</p>
<pre><code class="language-plaintext">I want to talk through a side project idea. Your job is to argue 
against the weakest parts of it, not encourage me. Push back when 
my reasoning is thin. Name three to five existing products in 
the space and force me to articulate, in one sentence each, why 
mine would beat them. Don't let me get away with hand-waving on 
"why now." Ready when you are.
</code></pre>
<p>For Encroach, the differentiator went through about four versions before it landed at "a territory-claiming game where the territory is the route you actually ran, not a generic GPS grid." That sentence is now the load-bearing test for every feature decision: does it sharpen this differentiator, or does it dilute it?</p>
<p>This conversation usually takes a couple of hours over a few sittings. I don't rush it. The cost of skipping it is enormous, the cost of doing it is one afternoon.</p>
<h2>Step 2. The MVP plan</h2>
<p>Once the product hypothesis is sharp, I move to the same model but in a different mode: planning.</p>
<p>The output I want from this step is a list of milestones, ordered, each one shippable on its own. Not a Gantt chart. Not a feature list. <strong>Milestones that each represent a usable thing</strong>, even if the usable thing is small.</p>
<p>For a typical side product the shape ends up roughly:</p>
<ol>
<li><p>Foundation milestone (account creation, the smallest possible end-to-end flow that proves the idea works at all).</p>
</li>
<li><p>The differentiator milestone (the one feature that makes this product distinctive, built early, even if rough).</p>
</li>
<li><p>Polish-the-differentiator milestone.</p>
</li>
<li><p>The first real-user milestone (whatever you need to put it in front of three friends who'll actually use it).</p>
</li>
<li><p>Operational readiness milestone (this is the one most people skip; more on this in a moment).</p>
</li>
<li><p>Launch milestone (landing page live, signup flow real, first external traffic).</p>
</li>
</ol>
<p>The exact list varies. The discipline of milestones-as-shippable-things doesn't.</p>
<p>A couple of patterns I've come to insist on:</p>
<p><strong>The differentiator gets built early, not last.</strong> The strongest temptation in MVP planning is to ship the boring stuff first because it's well-understood, and save the "hard" differentiator feature for later. This is exactly backwards. If the differentiator turns out to be harder or duller than expected, you want to find out on day fifteen, not day sixty after you've built a beautiful house around it.<br />Also, with the use of agents, it's much quicker to work through the hard stuff early.</p>
<p><strong>Operational readiness is its own milestone.</strong> Observability, error tracking, basic deploy automation, the smallest possible monitoring you'd want before letting strangers near the thing. Most plans I see treat these as something to tack on at the end. They are not. They are a milestone, and they go <em>before</em> the launch milestone, not after. I have a Paperclip skill specifically for spinning up the observability stack: Prometheus, Grafana, Sentry, OpenObserve, structured logging, because every single project needs the same thing and there's no reason to design it from scratch each time. Same for a few other recurring milestones (the Coolify staging setup, the Cloudflare Pages landing page, the Plausible analytics wiring). Skills, not bespoke planning.</p>
<p><strong>Each milestone has an exit criterion stated as a behavior.</strong> "Foundation milestone is done when a user can sign up, log in, perform the core action once, and see it persisted across a logout." Not "auth complete and basic CRUD done." The behavior phrasing is what makes the milestone shippable rather than aspirational.</p>
<h2>Step 3. Loading the plan into Linear</h2>
<p>This is where the planning leaves the model conversation and becomes a real artifact in a real tool.</p>
<p>The plan goes into a new Linear project. One project per side product. The structure I use:</p>
<ul>
<li><p><strong>Linear project</strong> = the side product (Encroach, BillMyCommits, HappyClients).</p>
</li>
<li><p><strong>Milestones</strong> in Linear = the milestones from the plan. Each one has the behavior-based exit criterion in its description.</p>
</li>
<li><p><strong>Issues</strong> = the work to get a milestone to its exit criterion. Each issue is sized to roughly a day of work or less.</p>
</li>
<li><p><strong>Labels</strong> = lightweight tags. The most important one, which I'll cover in detail in part two, is <code>paperclip-ready</code>, a flag that says "this issue is fully specified and an agent can pick it up." Issues without that label are mine, or aren't ready yet.</p>
</li>
</ul>
<p>The skills I use here are workflow shortcuts I've built up over time: a milestone-creation skill that takes the plan output from step 2 and produces Linear milestones with proper descriptions and exit criteria; an observability-setup skill that produces the standard observability milestone with all the issues underneath it pre-filled; similar skills for Coolify staging setup and the launch-readiness checklist. A skill to use the linear terminal client instead of the MCP server (I find it faster and it seems to consume less context). These aren't fancy, they're glorified templates, but they save me an hour each time and, more importantly, they keep my projects structurally consistent. Every project has the same shape, which means every project is legible the same way.</p>
<p>Once the plan is loaded, the Linear project is the source of truth. Not the chat with the model. Not a Notion doc. Linear. Everything that happens from here on out: agent work, my own work, status updates, demo recordings, references Linear issues and milestones.</p>
<h2>Why this part matters more than the agents</h2>
<p>The strong temptation, especially if you're excited about agents, is to skip ahead and let the agents do the planning too. I've tried this. It doesn't work, for a specific reason.</p>
<p>The planning conversation is where my judgment is highest-leverage. It's where I'm deciding what to build and why, and those are decisions that depend on context I have and the agent doesn't, about my time, my market, my appetite for maintenance, my honest assessment of which competitors I can actually beat. I want the <em>model</em> in that conversation as a sparring partner. I don't want the <em>agent system</em> doing it for me, because the system would optimize for plausible plans rather than plans I'll actually finish.</p>
<p>The work done by the agents later is routine. The upstream planning is judgment. Putting an hour of careful judgment in at the top is the difference between an agent crew building the right thing well and an agent crew building the wrong thing very efficiently.</p>
<h2>What's next</h2>
<p>Once the Linear project exists with milestones, exit criteria, and a backlog of issues, the agents can come in. That's part two: spinning up a Paperclip subteam: a PM, a marketer, an engineer, with the routines that keep them honest and the boundaries that keep me in control of the parts I should still own.</p>
<p>Part three covers the execution loop itself: how the engineer agent's PRs get reviewed via Coolify previews, how a separate marketing repo lets the agents ship landing-page changes without needing access to my local machine, and how I keep my actual touch points down to two tools: Linear and GitHub, while the rest runs itself.</p>
<p>If you're new here: I'm Aaron, I run <a href="https://squarebracket.io">Square Bracket</a>, a one-person product and dev consulting studio in Vienna, and I'm building <a href="https://billmycommits.com">BillMyCommits</a>, <a href="https://encroach.app">Encroach</a>, and <a href="https://happyclients.app">HappyClients</a> on the side while doing client work full time. The whole reason I built this workflow is that I don't have time to do it any other way.</p>
]]></content:encoded></item></channel></rss>