Adam Fortuna
@adamfortuna Founder & developer. Triages, assigns work to people or Jules, reviews, merges, and deploys.
Also runs Nautilus, writes most of the agent commands, and sweeps the Ready to Deploy lane.
Software development lifecycle · Hardcover
This is how I build Hardcover in 2026: six developers, a roster of agents that go by "Jules", and a hub that wires them together with webhooks. The process changes often, so there is a changelog.
Three colors run through every diagram on this page. Orange is a person. Blue is an agent. Green is a service holding state or firing a webhook.
Decide what to build, sign off, and press deploy.
@adamfortuna Founder & developer. Triages, assigns work to people or Jules, reviews, merges, and deploys.
Also runs Nautilus, writes most of the agent commands, and sweeps the Ready to Deploy lane.
Three developers, Adam included, with permission to merge into main and run the deploy workflows.
When one of them assigns an issue, they become the PR's assignee: the person responsible for getting it to Ready to Deploy.
Three more developers who build and review but do not deploy yet.
They work in Conductor or their own editor, open PRs, and hand them to the reviewer bot or to a deployer.
Turns product feedback into tasks on a Hub task board, writes the prompt for each, and picks a branch.
Signs off on plans, drops tasks into "Ready to Develop", and clicks "Send for review" when a branch looks done.
Readers on Discord, support email, and the public roadmap who report bugs and upvote feature requests.
The source of most new work.
Collectively "Jules". Two GitHub accounts, many roles.
Interprets a request, answers from the vault when it can, delegates when it cannot.
The name everyone uses for "the bots". Delegates codebase questions to Eiko.
@jules-hardcover Writes and modifies code in the Hardcover codebase.
Runs /issue-async, /address-review, /fix-gh-ci, /rebase-pr, /pr-evidence and /hub-task. Also applies risk labels to new PRs.
@jules-hardcover-reviewer Reviews code and pull requests with a fixed rubric and evidence table, then moves the card on the PR board.
Runs /review. Verdicts: approve, request changes, or comment. Also runs the 2-hourly project audit and weekly review audit.
Verifies claims against the Hardcover codebase: is a reported bug real, and where does the code live?
Read-only. Validates issues and answers codebase questions for the other agents.
Breaks a request into a plan: scope, steps, risks, estimate. Drafts GitHub issues from conversation context.
Turns a Discord thread or support conversation into a reproducible issue.
Answers questions from the Obsidian vault. Called by other agents.
Agents do not call agents; they call Babel.
Drafts Help Scout support replies using vault context. Drafts only, never sends.
Email to jules@hardcover.app lands in Help Scout; Hanson has a draft waiting when a person opens it.
Reads the community, writes periodic digests, hands observations to Babel.
Posts under the @hardcover identity on Discord.
Where state lives and where webhooks come from.
The company brain and the agent dispatcher. Hears GitHub webhooks, picks an agent, model and location, and records every action as a Run.
Rails app on a Mac Mini behind a Cloudflare tunnel. Also hosts the product task boards, timelines, and the development board.
Issues, pull requests, Actions CI, and the "Hardcover Pull Requests" project board.
Every state change here is a webhook that Nautilus can react to.
Cloud workspaces where the coding agents do their work: one per issue or branch, with parallel sessions.
Reviews of agent PRs run as a second session inside the author's workspace.
The Mac Mini that hosts Nautilus also runs the inline agents and any bridge agent configured to run "on Nautilus".
Each run gets its own git worktree and port block.
The support inbox behind jules@hardcover.app. Bugs found here become issues, or get fixed on the spot.
Hanson drafts the reply; a person decides what happens next.
RSpec, Rubocop, React lint and tests, N+1 report, page budgets, migration report, scope drift, generated types.
Three jobs are required for merge readiness; the rest are conditional on what changed.
Kubernetes, Helm and SOPS on DigitalOcean. One manually dispatched GitHub Action per app, per environment.
No agent and no merge ever deploys. A person does.
Bugs arrive from Discord, email, error tracking and support. Features arrive from the public roadmap and from product planning. Almost all of it is normalized into one of two shapes: a GitHub issue or a Hub product task. Then someone, or something, picks it up.
Widths are rough proportions to show the shape of the flow, not measured counts. Hover a node to trace its paths.
Every arrow here is either a GitHub webhook hitting Nautilus, or Nautilus dispatching a command into a workspace. Whoever holds the baton is 'in control'; the hand-offs are what make it a loop instead of a script. Scroll the steps.
Nautilus records every action as a Run with a live log. The command it builds reads like this:
cd ~/code/hardcover && claude -p /review 4599 full --model opus --effort high Binary, model and effort come from the agent's model alias. If the model starts with gpt-, the binary is codex.
Every PR has one assignee: the developer responsible for getting it to Ready to Deploy, usually whoever assigned the issue in the first place. Reviewers are whoever has to say yes before that: always @jules-hardcover-reviewer, plus the assignee when Jean wrote the code, plus a person for migrations, schema, GraphQL or Hasura changes.
Assign the issue to yourself, build it, then either assign it to @jules-hardcover to finish, request @jules-hardcover-reviewer on your own PR, or run /goose:pr 4599 locally. Goose drives the PR through CI, review and fixes until it reaches a clean approve with zero findings.
Every open PR sits in one Status lane on the Hardcover Pull Requests project. Electra moves cards based on her verdict. Nobody but a person can drag a card into Ready to Deploy or Done.
PR exists but is not ready. Drafts and work still under way.
Reviewer requested. Set when a PR opens and whenever Electra posts a comment-only round.
Electra requested changes. Jean (or the author) is addressing them.
Approved by the reviewer. Now the assignee verifies it and decides whether it ships.
The assignee has verified it. Nautilus posts merge readiness; a deployer sweeps this lane to merge.
Merged into main and deployed.
Press play to watch a PR travel: opened, reviewed, sent back once, approved, verified, shipped.
Bugs are small and uniform. Features are not, so they can start in three different places. All three end at a pull request in the loop above.
Someone writes it up as an issue.
Readers add and upvote feature requests at roadmap.hardcover.app.
A bigger feature gets a Hub product with its own board and timeline.
Each product in Hub has its own board. A task carries its prompt, a plan, and a destination branch. One persistent Conductor Cloud workspace serves the branch, with as many parallel sessions as the branch's worker limit allows. All of a branch's tasks land on one batch PR.
Tap a lane for what it means. Colors show who moves cards into it.
There is no merge queue and no continuous deployment on purpose. Merging is a decision and deploying is a button, both pressed by a person.
Three to seven times a week, one of the three developers with deploy access opens the Ready to Deploy lane. Everything there has a reviewer approval and its assignee's sign-off.
Merge the whole batch into main by hand, one PR after another. Nautilus already posted a "Ready to merge" check; conflicts trigger an automatic /rebase-pr first.
Run "Deploy Application from Source" in the deployments repo for each app that changed, with environment set to stage. The Code: labels on the PRs say which.
hardcover-railshardcover-apihardcover-workerhasurasearch-proxyrecommendations-apiClick through what shipped. Watch Grafana and Bugsnag for anything new.
Same workflows, environment set to production, one app at a time. A deployment_status webhook adds "deployed" to each issue timeline.
Discord gets a build notice, UptimeRobot keeps watching, and the public roadmap changelog gets its entry.
The websites, apps and services that show up in the flows above, grouped by what they are for.
The primary agent CLI. Every slash command in the Hardcover repo is a Claude Code command.
The backup executor. Model aliases fall back to GPT models when Claude usage windows are exhausted.
Thinking, Balanced and Quick: each a ranked list of models and efforts tried in order.
Mac app for running many agents in parallel git worktrees, each with its own ports and database.
The same workspaces, hosted. Nautilus creates them over the API and streams the session back.
A small daemon on the Mac Mini that runs Claude Code or Codex locally when an agent is configured to run "on Nautilus".
Where bugs, features and tasks live. Assigning one to @jules-hardcover starts the machine.
Every open PR, in one of six Status lanes. Bots move the first four; only humans move the last two.
List of active products (features big enough to get their own board).
Everything that happened on one product: tasks moved, plans approved, runs dispatched, PRs opened.
Per-product kanban from New to Verified. Dropping a task into "Ready to Develop" dispatches an agent.
Every agent run in flight: Queued, Running, Failed, Done, with command, model and cost.
What is in progress, publicly. Feature requests can be added and upvoted; a public changelog records what shipped.
Where the community reports bugs (#bugs and elsewhere) and where daily digests and deploy notices land.
The support inbox. Email to jules@hardcover.app lands here; Hanson drafts a reply, a person sends it.
Logs, metrics and traces from every project in one place (Loki, Prometheus, Tempo).
Error tracking for the Rails app, the React client, and the API.
External uptime checks for each public service.
CI on every PR, and the manually dispatched deploy workflows in the deployments repo.
Helm charts and SOPS-encrypted secrets for stage and production, one app at a time.
The company knowledge base Nautilus distills into a wiki and embeds for agent retrieval.
Headless browser for screenshots and walkthrough videos attached to PRs as evidence.
The loop above did not arrive fully formed. Each entry is a change to how we work, not a change to the product.
Published sdlc.adamfortuna.com to explain the process end to end, with this changelog to track how it drifts.
When a provider hits its usage window, a running agent is interrupted and resumed on the next model in its alias instead of failing.
Electra reviews a Jean PR as a second session inside the same Conductor Cloud workspace, instead of spinning up a separate one. Also decided: PR evidence, auto-rebase, and "no agent or merge ever deploys".
Agents, their model aliases, effort, location and concurrency moved from JSON files in the vault into the Hub database, editable at /agents with no deploy.
Work waiting for a workspace slot now shows up on the Development board as a queued Run instead of disappearing into a job queue.
Issues are no longer added to the Hardcover Pull Requests project. The board is purely PR state.
The six-lane Status field on the GitHub project became the source of truth for PR state. Electra moves cards based on her verdict; Ready to Deploy and Done stay human-only.
@jules-hardcover-reviewer is created so the coder and the reviewer are different GitHub identities and can request each other.
The @jules-hardcover account is created: the first bot author at Hardcover.