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.
-
llmandimagecan 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
externalorremoterow can point at any OpenAI-compatible image server. Declare it once, withprovider: "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’skeyupper-cased with every character that is not a letter or digit turned into_— the row above readsAF_ENGINE_API_KEY_OAI_IMAGE, notAF_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_imageaccepts 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.
Improved
Section titled “Improved”- A row whose
providerthis build cannot serve no longer disappears quietly. Before, a row still declaringsdcppjust meantgenerate_imagefell 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.
Upgrade notes
Section titled “Upgrade notes”ImageEngineis gone, along with the engine it chose. The image role runs ComfyUI and there is nothing to select, so the parameter is removed from60-engines— as are the two that only ever meant something to the retired stable-diffusion.cpp engine,ImageImageTag(its ECR tag) andImageExtraArgs(itssd-serverflags).deployrefuses any of the three keys now.ImageComfyImageTagis unrelated and stays; don’t confuse the two when editing a parameter file. TheEcrSdcppECR repository and its 2.31 GB image are also gone.- 🔴 Update
60-enginesbefore20-platform, for this one release only — the reverse ofupdate.sh’s usual order.60-enginesused to import an export (EcrSdcppUri) that20-platformno longer produces after this release; updating20-platformfirst would try to delete an export CloudFormation still sees in use, and roll back.update.shchecks for this itself: if your60-enginesstack still importsEcrSdcppUri, it stops before touching anything and prints the exactaws cloudformation deploycommand to update60-enginesalone first. Run that command, then re-runupdate.shas usual. - Whatever your stack says about
ImageEngineis dropped for you.standup.shremoves the line from a captured parameter file whichever value it holds, andupdate.shpasses 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 ofcomfyas ofsdcpp—deployrefuses a key the template does not declare whatever its value is, so hand-written deploy commands that still nameImageEnginehave 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.