- 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>
Models looked for generate_3d with mcp_search, which only searched MCP
servers, and concluded it did not exist (the chat had been in plan mode, then
switched to build). The search now lists matching built-in tools first:
"available – call it directly" or "not in the read-only mode plan – ask the
user to switch to build mode".
Co-Authored-By: Claude Opus 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>