← Otto Developer GuideOtto Components

Otto is one Cargo workspace. The compositor is the root crate; everything else is a library or a program in components/, crates/ or tools/. Each crate has a page here that explains how it is built, with a diagram, and a folder with an AGENTS.md holding the working notes: dependencies, how to build, run and test it, and its rules.

Every crate belongs to one layer of architecture.toml, and a layer may only use the layers it names. cargo run -p otto-arch checks this in CI; Architecture Rules explains the rules and draws the full dependency graph.

Every workspace crate by layer

Programs

The app layer: Wayland clients, daemons and the portal backend. Nothing depends on an app.

CrateWhat it is
otto-barThe top menu bar: global app menu, tray, keyboard layout, battery and clock
otto-islandsThe dynamic island, the session’s notification daemon and the system dialog
otto-launcherThe keyboard launcher, with Ask and the agents mode
otto-emojiThe emoji picker: search or browse, and the pick is typed where the cursor was
otto-settingsThe Settings app
otto-filesThe file browser, file picker and desk
otto-previewStudio: one file in a window of its own, with an agent chat and PDF editing
otto-stashThe card that collects selections, files and screen regions to hand to Ask
otto-canvasThe Agents panel in the side canvas
otto-greeterThe login screen, backed by greetd
otto-lockThe screen locker: holds the ext-session-lock-v1 lock and checks PAM
otto-authorizeThe polkit authentication agent: the password panel for pkexec, system services and protected settings
otto-dictateA proof of concept: dictation as a Wayland input method
otto-msgThe command-line client of org.otto.Shell1: commands, the tree as JSON, events; bug reports with otto-msg doctor
otto-agentsThe agent service: runs ACP agents and serves them over the Agent Host Protocol
otto-rdpThe RDP bridge that serves an output and forwards remote input
xdg-desktop-portal-ottoThe xdg-desktop-portal backend: screen sharing, settings, dialogs, screenshots and file chooser

Libraries

From the top of the stack down. A kit may use the toolkit, the services and the foundation; the toolkit and the services use only the foundation; the foundation uses nothing in the workspace.

LayerCrateWhat it is
kitotto-md-kitThe Markdown parser, producing the toolkit’s document blocks
kitotto-media-kitVideo playback: a Player and view, GStreamer in a sandboxed worker
kitotto-auth-uiThe password panel shared by the greeter, the lock screen and the polkit agent
kitotto-peekPeek, the Space-bar preview, with a sandboxed decode worker
kitotto-agents-kitThe session feed, Ask chat, log and keys shared by the agent UIs
toolkitotto-kitThe toolkit every app is built on, and the drawing half of the compositor’s chrome. Its widgets, pictured: otto-kit library
serviceotto-searchFile search: one query language over LocalSearch, as a library and a command
serviceotto-agents-clientThe wire between otto-agents and its clients: socket, session and file URIs
serviceotto-pdfEditing PDFs in place through a runtime-loaded PDFium
foundationotto-foundationsXDG directories, file:// URIs and name matching, over std alone
foundationotto-dbusTyped client proxies for Otto’s own org.otto.* D-Bus interfaces

The compositor and the tooling

LayerCrateWhat it is
compositorotto (the root crate)The compositor. It may use the toolkit to draw its own chrome, but no kit or app. Start at Project Structure
compositor-coreotto-renderThe render stack: the Skia renderer, its GL and Vulkan plumbing, and the scene render elements
toolsotto-archThe checker for architecture.toml, and the affected-crate selection CI runs on

Adding a crate

A new crate goes into one layer of architecture.toml, gets an AGENTS.md, and takes its version from the workspace (see Versioning). Give it a page here too: a docs/developer/<crate>.md with a diagram in diagrams/, a row in the tables above, and an entry in website/build-docs.sh so the site publishes it.