Repository structure
The otter-shell organization has one git repo per component. The monorepo folder on disk is a checkout layout, not one repo. Commit and push per component.
otter-zenith clones tagged shell releases and builds
.deb packages for PikaOS. otter-gaming-utils does the same for Otter Bench against a pinned LIB_VERSION of the shell libraries.
Architecture
- Describe layout with otter-ui Surface Description nodes
- Emit draw commands into a CommandList (otter-render)
- Rasterize with quad_renderer to Wayland SHM buffers (otter-wayland)
Requirements
- Zig 0.16.0: required by all Otter packages
- System dev libraries:
libwayland-dev,libfontconfig-dev,libfreetype-dev,libxkbcommon-dev - Optional:
libpam0g-dev(lock/greeter), FFmpeg dev (recorder) - A wlroots-based compositor with
zwlr_layer_shell_v1for most UI apps
Config convention
Apps read~/.config/otter-shell/<app>.conf. Shared styling is in ~/.config/otter-shell/theme.conf. See Configuration overview.
Workspace-only components
In the source tree but not packaged inotter-shell or otter-shell-extras:
otter-hypr: Hyprland layout and titlebar companionotter-cue: desktop interaction sound library (pinned in zenith for builds; nodebian/controlpackage yet)
otter-assist, otter-assistant, otter-assist-data, otter-assist-model) and speech model packages ship in otter-shell-extras.
otter-dock and otter-taskbar ship in the base otter-shell metapackage.
Otter Bench and Otter HUD ship in otter-gaming-utils (separate from otter-shell).
Next
- Building from source: compile any component locally
- Creating an app: start a new app with Otter libraries
- Writing plugins: bar widgets and launcher providers as
.sofiles - Libraries overview: stack diagram and compile flags
- Individual library pages under Libraries in the sidebar

