Skip to content

v0.21.0

Taking a model in is one press now: search, read the plan, confirm. The S3 bucket behind the catalogue became the ledger, so bytes nobody declared are visible instead of billed in silence. A deployment can also run several image engines at once, and every member — not only an administrator — can see whether the engines are awake.

  • Taking a model in is one press. Search, press “Add”, and a plan card lists every file the model needs with what it will cost (a download in MiB, or “nothing to fetch” when the bytes are already in the bucket), its licence and any warning; one button takes it in. Where the bytes go is decided for you, so a family split across several files arrives in one act and a row that is missing a part is completed from the same press.

  • The S3 bucket is the ledger. The catalogue’s second screen lists what is actually in storage — including objects that no catalogue row declares, which can be registered as a row or deleted. Forgetting a row used to make its files invisible while they kept being billed, and a file written to the wrong place is now repaired by moving it inside the bucket rather than fetching it again.

  • More than one image engine at once. Which engine makes a picture is the engine row now, not the kind of provider, so a deployment can prefer the ComfyUI on its own LAN, fall through to a borrowed engine when that machine is switched off, and still name either on purpose. The priority list in Settings › Agents is row-based to match.

  • An external ComfyUI’s files can be read off the machine. “Inspect this engine’s files” lists the checkpoints, LoRAs and VAEs it has loaded as candidates for the catalogue; turning one into a row is still your press, and the family is still yours to declare.

  • Every member can see the engines. A pill per role in the top bar, with a popover per row: its state, what is queued, and how long the instance has before it stops.

  • llm and image can be switched off for one tenant, in the tenant’s limits and by a super admin only. A tenant nobody has answered for keeps both, so nothing changes on upgrade.

  • An external or remote row can point at any OpenAI-compatible image server. Declare it once, with provider: "openai-compat":

    {"key":"oai-image","api":"images","provider":"openai-compat",
    "url":"http://<host>:<port>","health":"/v1/models","lifecycle":"external"}

    A bearer token, if the server wants one, reads from AF_ENGINE_API_KEY_<KEY>, where <KEY> is the row’s key upper-cased with every character that is not a letter or digit turned into _ — the row above reads AF_ENGINE_API_KEY_OAI_IMAGE, not AF_ENGINE_API_KEY_OAI-IMAGE. This path is tested against this project’s own test double, not against a real OpenAI-compatible server, so treat it as unverified until you have pointed it at one.

  • generate_image accepts steps, CFG, sampler and scheduler. A field you leave out runs at the model’s published value, and a family that ignores one of them says so rather than silently dropping it.

  • A LoRA’s trigger words reach the chat route, and are shown on a row before you pick it. Asking for a LoRA from chat used to load the adapter without its trigger words, which changed nothing about the picture and reported no failure.

  • SD 1.5, Anima and Krea 2 are families the catalogue knows, and the default size follows the family instead of always being 1024×1024.

  • A Civitai token can be registered, so assets behind Civitai’s login can be taken in. It sits with the Hugging Face token under “API tokens” in the administration modal, which is reachable even when no engine is configured yet.

  • A gallery folder shows a cover and how many images it holds, and opening an image serves a copy at the size of your screen instead of the original.

  • A pull request’s “start” opens a review: its head branch is checked out into a new working copy and the session is asked to review it.

  • A row whose provider this build cannot serve no longer disappears quietly. Before, a row still declaring sdcpp just meant generate_image fell out of the tool list, with no error and no mark anywhere. The “Inference engines” admin screen now marks the row and names the provider it is stuck on.
  • A running session sees a newly enabled checkpoint without being recreated. Its tool list is rebuilt when the catalogue moves and the agent is told; a borrowed deployment’s changes arrive within about two minutes rather than up to twenty.
  • The model catalogue works on a phone: search, filters and sort stay in place while the cards scroll, the next page loads when you reach the end, and example images arrive as thumbnails instead of full-size originals.
  • Ingest search can be narrowed to a family, and finds ComfyUI-shaped repositories that it used to pass over.
  • The engine audit log records the instance type that was actually bought, and its price.
  • Moving between gallery folders draws from what you already have instead of blanking first, and card thumbnails are asked for at the density of the screen showing them.
  • Translating a reply in the mirror, in several ways: it vanished when you switched tabs, broke emoji and other surrogate pairs while splitting a long answer, was missing on an answer whose only label was a quote, was withheld from an English answer that held a couple of Japanese display names, and was sent for intermediate replies folded away inside the working steps.
  • A managed session’s turn could fail and still be reported as a completed answer waiting on you. That race is closed.
  • After a usage limit, the resume reservation could stall, leaving the badge showing a time that had already passed and no further attempt scheduled.
  • ImageEngine is gone, along with the engine it chose. The image role runs ComfyUI and there is nothing to select, so the parameter is removed from 60-engines — as are the two that only ever meant something to the retired stable-diffusion.cpp engine, ImageImageTag (its ECR tag) and ImageExtraArgs (its sd-server flags). deploy refuses any of the three keys now. ImageComfyImageTag is unrelated and stays; don’t confuse the two when editing a parameter file. The EcrSdcpp ECR repository and its 2.31 GB image are also gone.
  • 🔴 Update 60-engines before 20-platform, for this one release only — the reverse of update.sh’s usual order. 60-engines used to import an export (EcrSdcppUri) that 20-platform no longer produces after this release; updating 20-platform first would try to delete an export CloudFormation still sees in use, and roll back. update.sh checks for this itself: if your 60-engines stack still imports EcrSdcppUri, it stops before touching anything and prints the exact aws cloudformation deploy command to update 60-engines alone first. Run that command, then re-run update.sh as usual.
  • Whatever your stack says about ImageEngine is dropped for you. standup.sh removes the line from a captured parameter file whichever value it holds, and update.sh passes nothing: a live stack simply loses its own value at the next update, which is what a removed parameter means. Neither script requires anything from you beyond running them normally, and that is as true of comfy as of sdcpp — deploy refuses a key the template does not declare whatever its value is, so hand-written deploy commands that still name ImageEngine have to drop it.

Agent CLI pins: Claude Code 2.1.273, OpenCode 1.18.31, Antigravity 1.2.3, Cursor 2026.09.10, Kiro 2.21.4. The others are unchanged from 0.20.2.