gezel Gezel Handboek

1.26237 — 25 August 2026

Three days after 1.26234, and this one is about work you get to look at before it lands.

If you read only one thing: when a gezel fixes a problem in your files now, it doesn't change them. It writes the change up, you read it, and it happens when you say so.

Your crew proposes changes instead of making them

A gezel — one of the AI workers on your crew — used to edit your files directly, or not at all. There was no third option, which meant every fix was a small act of trust: you found out what it did by looking at what it had already done.

Now there is a third option. The gezel works exactly as before, but the edits are collected into a change proposal instead of being written to your project. Your files are untouched. The proposal shows up in the project's Proposals tab — which only appears once there's something in it — with the gezel's reasoning written out and every edit laid out line by line. You read it, and you press Apply. Or you don't.

The useful consequence is that this works on folders your crew has no permission to write to. You never have to hand over edit access to get a fix drafted, and you don't have to give it to the night shift either.

Two things a proposal will tell you plainly. If a file changed after the proposal was written — you edited it, or a teammate did — it's marked out of date, and applying it asks you to confirm first, naming the files that moved. And if two proposals touch the same file, both say so, because applying one puts the other out of date. If you'd rather read the change somewhere else entirely, every proposal exports as a zip with the diffs, the notes, and the git apply line to use them.

Fixes always arrive this way. Press Fix on a problem your Boekwachter — the crew member who reads your project and files issues about it — has flagged, and what you get back is a proposal, not an edited file. Other work uses proposals where they fit: a task whose recipe supports drafting will propose rather than edit whenever it runs unattended, or whenever writing was never on the table.

Overnight, they write themselves

If a project has both a Boekwachter and a developer on its crew, the night shift now includes fixing. The Boekwachter finds the problems, and overnight the developer works through them — grouping related ones together and writing one proposal per group.

What's waiting in the morning is a set of proposals, not a changed project. The home panel that summarizes the night now leads with them, since they're the part that's waiting on a decision rather than on being read, and each row says which project, how many files, and how many lines change.

This is on by default, but only for projects that already have that pair on the crew — assembling one is the opt-in. Turn it off per project with Fix problems overnight in the project's settings. There's a limit of 40 issues per project per night, deliberately: above that the developer spends the window triaging and you wake up to a queue nobody will get through. The whole thing runs on a model on your own machine if that's what you use — no network, nobody's cloud. More in The night shift.

A stuck task has a Try again button

When a task pauses to ask for help — it ran out of attempts on a step, or kept failing the same check — getting it moving again meant flipping its status back to active by hand. That usually did nothing. The counters that stopped it were still spent, so the scheduler would look at it on the next pass and pause it right back.

The needs-input card now has Try again, and it does the three things that were actually required: clears the counters that tripped the pause, sets the task working again, and gets the assignee started immediately instead of waiting out a stall window. It continues the same conversation, so the gezel can see its own failed attempts, and it's pointed at the note explaining why it stopped — a retry that repeats the attempt word for word is a wasted turn.

It doesn't try to judge whether retrying can work. If the fix was an edit you made between the pause and the click, refusing the button would just hide it from the person who already fixed the problem.

Craftbooks are shelved by subject

A craftbook is a saved recipe for a piece of work. There are close to 300 of them, and browsing was organized by where a recipe fits in a project's life — starters, maintenance, general. On a code project that collapsed into two enormous piles, the larger of which was called "General work" and was mostly recipes about writing, media, and household admin.

The browse rail in the new-task dialog now shelves them by what the work is about, split into recipes for working on software and everything else. "Recommended" still sits on top and still knows what kind of project you're in.

An AI App packages a project type, a crew, craftbooks, scripts, and pages into one reusable thing. Last release it got a written guide. This release it gets the full loop from the command line:

gezel app new my-app        scaffold a source folder
gezel app validate my-app   check it
gezel app pack my-app       produce my-app-1.0.0.gezapp
gezel app add <file> --yes  review and install one
gezel app apply my-app      outfit the current folder with it
gezel app serve my-app      share its pages as a mini-site

serve is the new one worth knowing about. It turns an applied app into a small website — the app's pages, working the way they do in the Output pane — and prints a share link. Add --chat and visitors get their own conversation with the project's lead gezel. The site lives on your machine; putting it in front of anyone else means running a tunnel yourself, and the printed output tells you how.

Visitors are not you. The share link mints a browser session that means nothing to the rest of gezel: no access to your projects, your files, or any other part of the daemon. Visitor chat has no tools at all, is rate-limited, and never feeds your gezel's memory. Pages can read and invoke only what the app's manifest declared. Sites are temporary — they end when you stop them or when the daemon restarts.

All of this is command line only for now; there's no button in the app. Three worked example apps ship in the repo, and the details are in Building AI Apps inside Gezel and the CLI reference.

Smaller things

  • Eleven more local models have measured scores — several Gemma 4 and Qwen 3.5 builds, Mistral 7B, and others — so the scoreboard covers more of what you might actually download.

  • The fitness column reached the DwarfStar engine, which is where it matters most: those are the models where "it loads" and "you can work with it" are furthest apart. Each row now shows the measured reading speed alongside the badge, because on a large model the wait you feel is the prompt being read, not the reply being written.

  • Models kept only for compatibility are marked as such, so they stop looking like a reasonable thing to download.

  • Model sizes read more honestly. Bit-depth labels are approximate on purpose (~4, ~8) and now fall back to what the model file says about itself when the catalog text names no depth at all, and the memory figure beside the download size accounts for what the context window costs on your device.

  • Your laptop stops cooking itself. When background summarizing kept timing out, it retried within milliseconds, forever — one captured morning spent four hours waking a large model on a closed-lid MacBook, overheating it, and timing out the call the heat had caused. A streak of timeouts now backs off for a while, measured on time the machine was actually awake, so sleeping through the cooldown doesn't count as recovering from it.

  • Questions from Claude are real question cards. If you run Claude as your provider, its clarifying questions used to arrive as a generic Allow/Deny box. They now render as the question they are, with the options laid out.

  • Rate-limit messages say something useful. "Claude subscription rate limit (seven-day): allowed_warning. Resets 5:00:00 PM." is now stated in plain words with the reset given relative to now — a seven-day window resets on a future weekday, and a bare clock time was wrong by days. It also stops repeating on every reply.

  • The Artificial Intelligence settings header shows which engine and model a new chat gets. Answering that used to mean opening the tab and reading two controls.

  • Scripts have a shared library. The Scripts view's source picker now has one, for scripts every project can run.

  • Git status says when it gave up. Repeated failures now read as "Skipped after repeated failures" rather than looking like nothing happened.

  • Craftbooks that depend on an up-to-date index can now ensure one before they start, and say honestly in their report what could not be brought current.

  • Catalog content moved to @bendyline/gilde 0.1.41.

For developers

  • Change proposals have an HTTP surface: /api/projects/:id/diffpacks for the lifecycle, plus a zip export carrying the per-file diffs, notes, manifest, and an APPLY.md. The draft tree and sealed diffs are write-denied through the artifact store, so a model cannot forge a diff it never drafted.

  • gezel app gained an authoring tracknew, validate, pack, and schemas run locally without the daemon. gezel app serve's control surface is /api/app-serve, documented in the repo's docs/app-serve.md.

  • Task retry is POST /api/projects/:id/tasks/:num/retry, exposed as retryTask on the typed client. It reports whether a turn was actually dispatched and why not.

  • Keyed locking moved into core and replaced ad-hoc mutex patterns across a dozen modules; long-running deadlines that can outlive a laptop nap now budget in awake time rather than wall clock.

  • The script RPC channel handles backpressure. A large request over the inherited descriptor could short-write and raise EAGAIN while the parent drained the first chunk; writes now retry against a bounded synchronous pause instead of hanging until the runner's timeout.

  • New craftbook gate checks for codebase-review reports, corpus coverage provenance, and workspace existence, plus stdlib scripts to drive them.

  • Two new repo guards: one on layering direction, one on the resolved default provider.

Anything to do?

No — update when you're offered it.

Two places are worth a visit afterwards. If you have a project with a Boekwachter and a developer on the crew, look at Fix problems overnight in that project's settings and decide whether you want it; it's on by default. And if you run local models, the model tables have more measured numbers on them than they did three days ago.

Watch this article as a slideshow