- 18 more icons (gamepad, computer, food, ...) with a test that keeps the
server whitelist and the client picker identical.
- The ⋯ menu of a message moves into the bubble foot (next to the time); its
popup opens upwards inside the bubble and is limited to the bubble's width.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- Bubbles: own messages right-aligned in their own colour, agent answers left.
- Chat icons (22, validated on the server), shown in list, top bar, project page.
- Colour tags: eight fixed hues (new: pink) with theme-matched lightness and the
highest chroma sRGB allows; stronger background tint.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- Claude Code as an engine: chats on a "claude-code/<alias>" model run through
the claude CLI (stream-json); tool approvals go through our permission
system. Sign in from the web UI (URL + pasted code), CLI version and update
from Settings; the Docker image contains the CLI.
- Small models (8k context) for side tasks: input is cut to the model's
context window; one-line chat status, "What does this do?" on approvals,
"Plan as automation" (job draft from a chat).
- Mobile: top bar no longer widens the page, image viewer (zoom, swipe, mark
up, use in message), jump to previous own message, message menu, time under
every message.
- Approvals: push actions (allow/reject), "always allow in this project"
(never for dangerous commands) with revoke.
- Per turn: changed files with diffs and rollback; project check command with
a green/red badge and "let the agent fix it".
- Colour tags for chats in the colours of the active theme.
- Project defaults for new chats, project page (timeline), offline queue.
Tested in a throwaway container with a mock model (8k small model): 26 API
checks passed (permissions, diffs, checks, defaults, job draft, side-task
budget, Claude Code status/login URL, unsigned-in chat).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- New tool: image-to-3D (project file or an image attached to the chat,
optional back/left/right views) or text-to-3D; image + prompt refines the
image with the prompt first (the 3D models take no text with an image).
Styles textured / geometry / lowpoly, optional PBR, face count. Runs through
fal.ai's queue API with progress, saves GLB + preview, books the cost
(published prices, overridable per model). Request bodies for the Hunyuan3D,
Tripo and Trellis families; defaults [images] model_3d / model_3d_text.
- Chat card: "Open in the 3D view"; media overview: kind "model" (also
STL/3MF/OBJ written by agents) with previews.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- opencode Go reports plan requests as cost 0 with the usage in allowance;
ModelConfig::cost values them at the model's list prices (charged amounts
and free requests stay as reported). Rows booked at 0 are valued once on
start (idempotent).
- opencode's price list now has per-duration cache prices for some models
({"30m": ..., "12h": ...}): the shortest duration is used, also in tiers.
Saving the provider's models failed with "untagged enum ModelEntry".
- Each answer shows tokens sent/received and the cost of the turn's requests
(usage.cost filled when messages are saved and loaded).
- The chat title keeps a minimum width in a crowded top bar.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Palette from the Tintenblau desktop theme (colors.toml, neovim.lua, zed.json):
ink blue with cream text, paper with dark ink. Also in the terminal client's
palettes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A git wrapper (docker/git-coauthor -> /usr/local/lib/codecraft/bin/git) adds
--trailer "$CODECRAFT_COMMIT_TRAILER" right after the commit subcommand; the
agent shell puts it first on PATH and sets the trailer in the script itself
(works inside the sandbox, which clears the environment). Default text:
"Co-Authored-By: {model} ({provider}) via CodeCraft" (server.commit_trailer,
Settings -> General; empty = off). Git skips duplicates (amend, model wrote it).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- AgentConfig.reverse_tools (Settings -> Agents & commands) gives any mode
binary_info and decompile; the clean-room check of the tools applies to
craft only (ToolCtx.clean_room = clean room && craft).
- decompile: optional processor (Ghidra language id) and base_address for raw
images (BinaryLoader); separate cache per processor/address.
- Skill "reverse-engineering": identify, convert HEX, processor table for
common chips, decompile, explore, notes in analysis/.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Performance (measured with 5,900 messages: open 9 s -> 0.7 s, typing 440 ms -> 25 ms)
- GET /sessions/{id}?limit=N loads the end of a chat (from the last summary
on, at most N); /sessions/{id}/messages?before|after|around loads more
(scrolling up stops at a summary unless asked). Without parameters the
full history as before (terminal client).
- Chat view: memoised message list (typing, streaming and status changes no
longer re-render the history), finished turns fold into "N steps · M files"
with the answer visible, tool card bodies and summaries are built only when
opened, scroll-to-bottom only when content changes.
Search: /sessions/{id}/search over the whole chat; a hit loads its part
(around) and marks the message, "back to the latest messages" returns.
Media: /sessions/{id}/media lists images, videos and audio of a chat and its
subagents (generated images, tool output, files written, media in answers,
attachments); ⋯ -> Media shows them with filters, a large view and a jump to
the message.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Context window
- Requests asked for the model's full max_output, but providers count
input + output against the window: long chats with large-output models
(DeepSeek V4.1 Flash, 384k) failed with "input too long" before automatic
compaction (85 %) kicked in. max_tokens is now what the window leaves
(estimated input = last usage + messages since), the chat is compacted when
less than 32k would remain for an answer, and a context-overflow error
compacts and retries once.
- ModelConfig.max_input (catalogue limit.input, editable in the provider
settings) lowers the compaction threshold for models with an input limit.
Enforced reviews (modes with refine.rounds > 0, refine.after_todos default on)
- Every todo marked completed is reviewed against the work since the last
review; with findings it is reopened and the feedback goes to the agent
(max. rounds per todo). Passed reviews leave a visible note.
- Ending the turn with open todos sends the agent back to work while it makes
progress (max. 10 reminders in a row without progress); such modes may take
up to 2,000 steps per turn. Reaching the step limit is reported.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
User messages are rendered with the same Markdown component as the model's
answers; single line breaks are kept (hard breaks outside code blocks), so
plain multi-line messages look as before. The eye button next to the text
field shows the formatted message before sending. The text sent to the model
is unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Mobile browsers scroll the whole page up to show the focused input and do not
always scroll it back when the keyboard closes; the app never scrolls the page
itself, so the top bar (menu) stayed out of reach.
- Viewport interactive-widget=resizes-content: on Android the keyboard shrinks
the page instead of shifting it.
- Elsewhere (iOS Safari) the page offset is undone when the visual viewport
grows again or the input loses focus.
- The chat keeps following the latest message when its pane shrinks.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agents tidy up folders after generating images (sort into subfolders, rename
revisions); the image records kept the old path, so /api/images/<id>/file
answered 404 and only the requesting device still showed them from its cache.
- Generated images get a copy in the image store (images.blob, kept by the
blob GC); existing ones are copied once on start-up.
- Records follow: after bash commands with mv/rename (missing images of the
owner from the last two weeks, found by name or by content hash), when moved
with the file manager (file or folder), and on access (served from the copy,
relocated in the background; without a copy found by file name).
- Chat gallery falls back to the preview the model saw when the file is gone.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>