Context engineering for humans in an agentic multitasking world.
A GNOME Shell extension that gives each project its own workspace — agent, browser, files — in a scrollable strip you supervise at a glance.

Get Started View on GitHub
$ git clone https://github.com/notiriel/kestrel.git && cd kestrel && make install

The Problem

Your OS wasn't built for agentic multitasking

You're supervising multiple AI agents across multiple projects. The idle time between interactions grows. Context-switching is the bottleneck. Your desktop can't keep up.

Lost context

Alt-Tab through terminals, browsers, and editors scattered across projects. By the time you find the right window, you've lost context on everything else.

Missed permissions

An agent needs approval. It stops and waits. You don't see the request for ten minutes. Everything stalls silently.

No project boundaries

15+ windows across virtual desktops. No spatial logic. Agent terminals mixed with unrelated browsers. Every context-switch costs you time and mental energy.

Kestrel overview — four workspaces with AI agent sessions, code editors, browsers, and terminals arranged in horizontal strips with status badges and a viewport indicator

Features

Every project has a place. Every agent has a status.

Kestrel transforms your desktop into a scrollable workspace strip where each project's context lives together, agent status is always visible, and switching is effortless.

Agent Supervision

Live status badges on every agent session

Each Claude Code window displays a real-time status indicator: working, needs-input, or done. You see the state of your entire fleet without switching a single window. Permission requests surface as overlay cards you can approve or deny inline.

Scrolling Tiling

Horizontal strip, infinite scroll

Windows arrange in horizontal strips at half or full monitor width. Scroll left and right through your workspace. No manual resizing, no overlapping. The strip grows as you open windows and shrinks as you close them.

Virtual Workspaces

Vertical stacking, dynamic creation

Workspaces stack vertically. Navigate up and down between contexts. Empty workspaces are pruned automatically. A fresh one is always waiting at the bottom. Name them for fast jumping via Ulauncher.

Overview

Bird's-eye view of your entire world

Hit the overview key to zoom out and see all workspaces, all windows, all agent statuses at once. Navigate with keyboard or click. Jump to any window instantly.

Multi-Monitor

One viewport across all screens

Multiple monitors combine into a single panoramic viewport. The strip flows seamlessly across screens. More monitors means more windows visible at once.

Keyboard-First

Every action has a binding

Navigate, move, resize, switch workspaces, toggle overview — all from the keyboard. Every binding is configurable via GSettings. Your hands never leave the home row.

Persistence

Layout survives restarts

Window positions, workspace assignments, and focus state persist across screen locks, extension restarts, and session recovery. Your spatial memory stays intact.

Quake Console

Hotkey-bound app overlays

Up to four application slots (Super+W/E/R/T) that slide in from the top, like the classic Quake terminal. Configure each slot with a desktop app. Apps pre-launch on startup so they appear instantly.

Window Stacking

Vertical splits within columns

Stack multiple windows in a single column with Super+J. Stacked windows share the column height equally. Navigate within stacks with Super+Up/Down before crossing to adjacent workspaces.

Workspace TODOs

Task list per workspace

Each workspace has its own TODO list toggled with Super+Z. Keyboard-driven task management with completion fade, dynamic numbering, and agent integration via DBus — agents can add, complete, and list tasks programmatically.


Keybindings

Muscle memory, not mouse hunting

All keybindings are configurable via GSettings. Kestrel takes over the Super key — make disable restores all original GNOME bindings.

Navigation
KeybindingAction
Super + Focus next column
Super + Focus previous column
Super + Focus down (within stack, then workspace below)
Super + Focus up (within stack, then workspace above)
Super + Alt + Force switch to workspace below
Super + Alt + Force switch to workspace above
Window Management
KeybindingAction
Super + Shift + Move column right
Super + Shift + Move column left
Super + Shift + Move down (within stack, then workspace below)
Super + Shift + Move up (within stack, then workspace above)
Super + FToggle half / full width
Super + JStack / unstack with left neighbor
Super + NNew window of focused app
Super + BackspaceClose focused window
Overlays & Tools
KeybindingAction
Super + -Toggle overview
Super + ZToggle workspace TODOs
Super + .Toggle notification focus mode
Super + 'Show keyboard shortcuts help
Super + W / E / R / TToggle quake console slots 1–4

Install

Up and running in two minutes

Kestrel is a GNOME Shell extension. Build from source, deploy, restart your session.

Step 01 — Requirements

Check your environment

  • GNOME Shell 45+ (Wayland or X11)
  • Node.js 18+ and npm
  • Claude Code (optional, for agent integration)
Step 02 — Clone & Build

Build and deploy the extension

git clone https://github.com/notiriel/kestrel.git
cd kestrel
npm install
make install    # Compile TypeScript, deploy to GNOME extensions dir
make enable     # Enable extension, disable conflicting extensions
Step 03 — Restart

Restart your session

Log out and back in (Wayland), or Alt+F2 → r → Enter (X11). Kestrel activates on the next session start. Verify with:

make status
What make install does

Compiles TypeScript to dist/, copies the extension to ~/.local/share/gnome-shell/extensions/, compiles GSettings schemas, and symlinks the Claude Code plugin and Ulauncher extension.

make enable enables the GNOME extension, disables conflicting extensions (Ubuntu tiling-assistant, DING, Ubuntu Dock), and registers the Claude Code plugin.


Claude Code Integration

Your agents, visible

Kestrel includes a Claude Code plugin that connects your AI sessions to the desktop via DBus hooks. The integration activates automatically.

Session Tracking

Each Claude Code terminal is mapped to its GNOME window automatically via title probes. Kestrel knows which window belongs to which session.

Status Badges

Window clones display live session status — working, needs-input, or done — as colored badges. See your entire fleet at a glance.

Permission Cards

Tool permission requests appear as overlay cards you can approve or deny inline. No window switching. No missed approvals. No stalled agents.

Notifications

Fire-and-forget status updates from Claude Code sessions surface as notification cards in the overview. Stay informed without context-switching.

Workspace TODOs

Agents can add, complete, and list tasks on a workspace's TODO list via DBus. Tasks persist as JSON files and are visible in the Super+Z overlay.

Data Flow

Claude Code → hook script → gdbus call → Kestrel DBus
  → controller → inject workspace name
  → notification overlay → user clicks
  ← hook polls response ← returns decision JSON

Architecture

Hexagonal core, tested in isolation

Pure TypeScript domain core with no GNOME imports. Fully testable with Vitest. Adapters handle all platform integration through port interfaces.

Reality GNOME signals
Domain Pure world model
Adapter Clutter clones
Reality Screen output

The domain is the source of truth. Adapters never compute layout or focus — they translate between GNOME signals and domain calls, then apply the domain's output.

Domain

Aggregate root, navigation, workspace operations, layout computation. Immutable operations returning WorldUpdate. Zero platform dependencies.

src/domain/

Ports

Adapter interfaces for clones, windows, focus, and monitors. Controller depends on ports, never on concrete adapters.

src/ports/

Adapters

GNOME Shell integration via gi:// imports. Clone rendering, window positioning, focus activation, signal handling, DBus service.

src/adapters/
Development Commands
make build          # Compile TypeScript
make test           # Run all Vitest tests
make dev            # Build + install + enable
npx vitest run test/domain/world.test.ts  # Single test file

# View extension logs
journalctl /usr/bin/gnome-shell --since "5 minutes ago" --no-pager