Repository navigation
Motion, so the app feels alive - #21
Merged
Merged
Conversation
A bot's avatar is now just the mascot in its color, with a thin edge (dark on the light theme, light on the dark one) so light colors such as the palette's beige keep their shape. Botloft's own white mascot, in the title bar and on the daemon's messages, keeps the black square of the app icon: without it, it would vanish on the light theme.
The whole window is now drawn at 125% (the webview's zoom), so text, spacing, icons and avatars grow together; at 100% the app looked tiny on a monitor without Windows scaling. A Size menu in the title bar picks 100%, 110%, 125% or 150%, Ctrl+= and Ctrl+- step through them and Ctrl+0 goes back to the default. The choice is remembered and applied before the first paint, so the window never flashes small.
Like the account corner of a chat app: the owner's name (the Windows account's display name), their Claude plan and a menu with Usage, Settings, Language, What's new and Help. Usage shows each window of the plan the bots have used and when it resets; Settings holds the theme, size and language, and the versions. Theme, size and language leave the title bar, which keeps only the language on the setup screens that have no sidebar. The sidebar now shows from the welcome screen on. The daemon reads the owner's display name once (GetUserNameExW) and the email, plan and organization from `claude auth status`, and sends them in `system.status.account`.
Buttons, fields and menu rows get 8 px corners, cards and menus 12 px, the chat's bubbles, cards and dialogs 16 px. Menus and dialogs float on a light themed shadow. The chat is a centered column with the day as a pill, and the open conversation in the sidebar is an inset rounded block instead of a full-width bar. Menus share one popover look and one hook that closes them.
Like Claude Code's mode picker, below the chat: Auto, Manual, Accept
edits and Plan, each described by what the bot does ("Scout decides
what needs your OK"), and Bypass permissions behind a confirmation that
says the bot is then not held to its folder. A bot that asks nothing is
marked in red in the picker and its header.
The daemon stores the mode (migration 0004) and starts the bot with it.
Claude Code reads --permission-mode only at start, so a new mode
restarts the process with --resume once nothing is in progress, and
never cuts a turn short. When an approved plan moves the bot out of plan
mode, the system/init of the next turn says so and the stored mode
follows.
A bot in plan mode asks to go ahead with ExitPlanMode: the chat shows
the whole plan (kept up to 32 KB) with Approve plan and Keep planning,
which sends back what should change.
Spec: 7.4, 10.1, 11.2, 12, 13 (what bypassing means on Windows), 15.1,
15.3 and two rows in section 19 to check with the real Claude Code.
Bots ran on whatever the account's default is. The owner now picks Fable, Opus, Sonnet, Haiku or the plan's default per bot, in the chat and when creating or editing a bot. Claude Code only reads --model at start, so a new model restarts the bot with --resume once nothing is in progress, like a new permission mode (the relaunch code now serves both). system/init names the model in use; the daemon keeps it so the app can say which model the plan's default is. A model the account cannot use fails the turn with model_not_found, now told as its own notice. Plan exit now follows the mode the process started with, so a pending model change no longer hides an approved plan.
A crew worked only in its shared folder, which sat outside each bot's workspace: Claude Code asked before every edit there, even in accept edits mode. Every bot now gets the crew's work folder with --add-dir, and loads its CLAUDE.md with the bot's memory. The owner can pick that folder when creating a crew, or move the crew later, with Windows' folder picker (tauri-plugin-dialog). The daemon never writes into a chosen folder, refuses drives, Botloft's own data and the folder of every bot, and restarts each bot once it is idle.
Every new crew now starts with a chief, made from the goal the owner writes for it. The chief plans the work, hands out tasks and, when the crew lacks a specialist, calls the new suggest_bot tool. The suggestion shows in its chat as a card: the owner can change the name, role, model and instructions, then create the bot or say no with a note. A chief that bypasses permissions creates it at once. Only the chief may suggest, up to max_per_crew bots; the owner can move the chief or remove it. Approvals split into the waiting itself, now shared by permission requests and suggestions, and Claude Code's permission prompt.
A chief on Sonnet suggested a designer, waited for the card, got it on Haiku after the owner changed the model, handed it a task and checked its result. The welcome screen now says each crew starts with a chief.
The mascot now has a mood that follows its bot: it blinks, flickers while it works, hops while it waits for the owner and sleeps while paused. What arrives while the owner looks (messages, tool calls, requests, new bots) rises in, while what was already there stays still. The thinking dots bounce, text being written has a caret, a pending request pulses once and the approval hand waves. Switching bots or crews fades the main pane with a view transition. Menus, dialogs and toasts open with motion, details slide, the tab line slides, usage bars fill and buttons give under the click. All in CSS, and all of it stops when Windows turns animations off.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Motion across the app, so it feels alive without getting in the way. Stacked on #20, the last of the stack.
What changes
<details>slides open, the selected tab's line slides to the new tab, usage bars fill, crew cards lift on hover, buttons give under the click and the empty-chat and welcome mascots float.src/motion.css), no new library, and everything stops when Windows turns animations off (prefers-reduced-motion).Spec: 15.3 ("Movimento").
Tested
pnpm check: 99 tests pass. The new ones cover each state's mood, that only what arrives after the owner opened a chat animates, and that view transitions run where the webview has them and are skipped with reduced motion.To check in the installed app