Several loops, one board
Each loop runs its own lane at its own pace. Loops trade work through the Task Book and the files on disk, never through each other’s context.
An architect, a coder, a reviewer and a tester pass the work around a ring on your own machine. When the tasks run out, you get a finish report, with your app one press away in a live preview.
Ask a single model for an app and you get one answer. In a loop, that answer is the first pass: the next bubble reads it, a failed check sends it to the fixer while the loop waits, and the ring turns again.
One prompt
A loop example log
The Manager is a chat that plans the board with you. In Plan mode it reads your folder, asks what it needs to, and writes cards into the Task Book once you agree.
Build proposes the loops: who sits in each ring, which folder each one may change, and where work goes when a check fails. Nothing is placed until you press Build it.
Each bubble runs one pass, and its output is the next bubble’s input. By default a Sub-loop runs when the bubble before it fails, so a failed review goes to the Fixer while the loop waits. Caps stop a loop that keeps failing instead of letting it spend all night.
When a run runs out of work on its own, the app writes a finish report from the run’s record, with a live preview of your app beside it.
I’ll draft the cards once one thing is settled.
Waiting on 1 decision
When should a day’s habits reset?
At local midnight recommendedWhen the app is first opened each dayOr write your own…Build this board?
Task Book
The app is finished — its report and preview are ready
The run completed and wrote a finish report: what was built, how to run it, what was tested and what is missing.
Long runs work when every bubble has a clear job, a limited reach and somewhere to send its mistakes.
Each loop runs its own lane at its own pace. Loops trade work through the Task Book and the files on disk, never through each other’s context.
A mode is what the Manager is allowed to change. Only you switch it, and Build writes no code.
Commands are parsed before they run. Commits and deletions ask first; shells, remote access and paths outside the project are refused.
A local SearXNG ships inside the app. If it is down, agents fall back to npm, GitHub, Stack Overflow, MDN and Wikipedia.
Pick a model per bubble, or a pool of up to eight that moves to the next when one is rate-limited or down. Free tiers and local models count.
When a call is refused, the loop mines a lesson from it, and the next pass is given it. You can accept, reject or forget each one, and set how sure it is.
A run that completes on its own hands over three things. You read what happened instead of asking a model how it went.
app/src/App.tsx+142app/src/habits.ts+61app/src/App.test.tsx+48app/README.md+22Task Book cards done: 9
Install first:
npm installFrom README.md:
npm run devnpm testPassed, 9/29/2026, 2:14:07 PM.
Nothing the run’s record can see.
Visual review: passed
1280 × 800 and 390 × 844 · 0 blocking
The reviewer opens the app in a real browser at desktop and phone widths. Blank pages, overflow, broken images and placeholder text fail it outright. If you have set a vision model, it also judges the screenshots against your DESIGN.md. The report’s Presentable line carries its verdict.
Built from the run’s own record, with no model asked to grade itself: what was built, the command that runs it, the last test run and its exit code, and anything still missing.
Your app’s dev server, one per board and held apart from the run. A new run does not stop it, so a Vite app keeps following the loop’s edits. Start, restart and stop it from the Report tab.
Perfica is a desktop app. Your code goes only to the model you pick, and with a local model it never leaves the machine.
$0
The whole app. Every loop, bubble, mode and tool.
$36/ year
Everything in Free, across all your machines.
Cloud cannot be bought yet. Nothing in the app needs it.
More in the docs.
The app is free. You pay your model provider for what your bubbles use, or nothing if you run free or local models. Cloud, when it opens, is US$36 a year.
Yes. Start free, the first screen of setup, walks you through a free OpenRouter key and a free Gemini key in about two minutes, and your first loop runs on free models. When a free tier runs out for the day, the loop pauses and starts again by itself. Ollama and LM Studio run models on your own machine with no key at all.
Only as part of the prompts your bubbles send to the model provider you chose, and as search queries when an agent searches the web. With a local model through Ollama or LM Studio, the prompts never leave the machine.
A run hands over when it runs out of work on its own. The report calls it finished when the README gives one command to start the app, the last test run passed, no bubble ended on FAIL or ERROR, and the preview did not crash. Anything short of that is listed under “What’s missing”. It also says whether the app is presentable, from the Reviewer’s visual review, without making that a condition of finished.
No. Each bubble holds only the tools its role grants, and its file tools write only inside its loop’s folder. With the sandbox on, its commands are held there too. Commands pass a guard that allows, asks or refuses; commits, pushes and deletions ask you first unless you turn on Full Auto.
Anthropic, OpenAI, Google, OpenRouter and NVIDIA with a key, and any model you run in Ollama or LM Studio. A bubble can use one model or a pool of up to eight that moves on when one is busy or out of quota.
The builds are not code-signed yet, so Windows SmartScreen warns the first time. For the same reason the macOS app cannot update itself; download new versions from the releases page.
An optional yearly plan, US$36, for syncing your boards across devices and keeping your keys in an encrypted vault. It is not on sale yet.