com.harryaskham.flotilla · Kotlin · protocol version 1

Flotilla

A window manager for Android's floating windows, which other apps opt into. Flotilla keeps tiling and floating layouts, named workspaces, focus, visibility and window style in one persistent service. Each participating app keeps its own windows, sessions, rendering and keyboard input, and applies what Flotilla asks of them.

Three Flotilla screens side by side: Windows, showing the Main workspace map with a build terminal; Spaces, with Main, Work and Reference workspaces and BSP, Floating and Monocle layout buttons; Settings, with NOD Term, Flotsam and Omni integrations and service options.
The Windows, Spaces and Settings tabs.

Cooperation, not control

Who owns what How Flotilla cooperates with other apps. NOD Term, Flotsam, Omni, PulseServer, X11 Droid and Waylandroid each keep their own floating windows, sessions, rendering and input. After the user approves them in Flotilla, each binds to Flotilla's service and holds a session over Android's Messenger IPC. Flotilla keeps the policy in one persistent service: layouts, workspaces, focus, visibility and style. It sends each app requests to move, resize, focus or restyle its windows, and the app applies them and acknowledges. The protocol carries no text input, shell commands, screen capture or arbitrary intents. NOD Term Flotsam Omni keyboard PulseServer X11 Droid · Waylandroid sessionMessenger IPCapproved scopes Flotillalayouts · workspacesfocus · visibility · style KEEP THEIR WINDOWS requests · acknowledgements
The apps keep their windows. Flotilla holds the policy and asks; the app applies the change and acknowledges it.

Android gives no app control of another app's windows, so Flotilla works with apps that choose to join. NOD Term, Flotsam, the Omni keyboard, PulseServer, X11 Droid and Waylandroid can all join, through the shared flotilla-api client. Each app picks one coordinator, which can be its own local window handling, Sandbox or Flotilla, and stopping or revoking Flotilla hands control back to the app.

Joining needs the user's approval in Flotilla, separately for window control, commands and keyboard presentation, and an approval is tied to the installed app and its signing identity. Requests are bounded (8 KiB each, 32 windows per app), and a request that is never acknowledged is reported as an error rather than assumed to have worked.

What the protocol cannot do

The protocol carries no text input, shell commands, screen capture or arbitrary intents. Launch recipes show how far that goes: when you add a recipe, the app's own approval screen stores the real thing (NOD Term keeps the command, Flotsam the URL) and Flotilla only stores an opaque reference to it.

Layouts and workspaces

One set of windows, three layouts The same three windows in Flotilla's three layouts. In BSP, the screen is split into a binary tree: a terminal on the left half, a browser and a volume window sharing the right half. In floating mode the windows overlap at their own sizes and can snap to edges. In monocle mode the focused window fills the work area. In every layout the work area stops above the visible keyboard, which Flotilla never moves. BSP keyboard (never moved) terminal browser volume FLOATING keyboard (never moved) terminal browser volume MONOCLE keyboard (never moved) browser (focused) Monocle and fullscreen are reversible views over the same windows.

The whole configuration (workspaces, bindings, recipes, Omni keys) is a YAML file, editable in the app with a preview, and importable and exportable; approvals are never part of an import.

Keys and gestures

Default hardware keys
KeysAction
Ctrl Alt + arrowsFocus in a direction
Alt Shift + arrowsMove or swap
Ctrl Alt Shift + arrowsResize
Ctrl Alt Space / BTiling or floating / balance
Ctrl Alt 1…9Go to a workspace; with Shift, send the window there
Ctrl Alt EnterOpen the switcher

Cooperating apps handle these keys while they have the keyboard. For keys pressed in other apps, Flotilla offers an optional Android accessibility key filter, disclosed as such; it cannot read window contents, inject gestures, record typed text or keep a key history. Without it, Android gives no ordinary app global keys.

The Omni keyboard can carry twelve keys whose labels and actions come from Flotilla's configuration, and the floating switcher, a home-screen widget and a Quick Settings tile cover the same actions by touch.

Flotilla's Controls tab with Focus, Move and Resize arrow pads and Previous, Next and Fullscreen buttons.
The Controls tab.

Limits