taskers 0.2.0

Agent-first terminal workspace app with a Niri-like tiling model.
taskers-0.2.0 is not a library.
Visit the last successful build: taskers-0.3.1

taskers

taskers is an agent-first terminal workspace app scaffolded around a Linux-first Rust shell, a flexible terminal backend boundary, and a Niri-like tiling model for terminal workspaces.

Tiling model

  • Each workspace is a scrollable canvas of top-level terminal windows rather than one monolithic fullscreen split tree.
  • Creating a new terminal window places it next to the active one in a cardinal direction, producing the same "keep moving through the workspace" feel as Niri-style tiling.
  • Each top-level window owns its own split tree, so related panes stay grouped locally without flattening the whole workspace into one layout.
  • Directional focus prefers neighboring top-level windows first, then falls back to pane-to-pane movement inside the active window.
  • Workspace viewport position is persisted, and overview mode zooms the current workspace out to fit the full arrangement on screen.

Workspace layout

  • taskers-domain: UI-agnostic workspace, pane, layout, signal, and persistence model
  • taskers-control: local control protocol, JSON framing, in-memory controller, and Unix socket server/client
  • taskers-runtime: PTY/session foundation and explicit OSC signal parser
  • taskers-ghostty: terminal backend abstraction and libghostty probe/fallback surface
  • taskers-cli: CLI for querying and mutating the app over the local control socket
  • taskers-app: GTK4/libadwaita shell that owns controller state, session persistence, and the local control socket

Quick start

cargo run -p taskers
cargo run -p taskers -- --demo
cargo run -p taskers-cli -- query status --socket /tmp/taskers.sock
cargo run -p taskers-cli -- pane new-window --workspace <workspace-id> --direction right
cargo run -p taskers-cli -- pane split --workspace <workspace-id> --axis vertical

Repository setup

If you use jj in this repository, run the repo setup script once per clone:

./scripts/setup-jj.sh

The vendored Ghostty tree includes approved upstream assets larger than Jujutsu's default 1 MiB snapshot limit. The setup script raises the repo-local limit just enough to snapshot the current vendored tree without changing your global jj behavior.

When refreshing vendor/ghostty, run the large-file check before pushing:

python3 scripts/check_ghostty_vendor_large_files.py

This fails if new files over 1 MiB appear outside the approved Ghostty allowlist, or if an approved file grows past the repo-local jj limit.

UI smoke test

Run the GTK/Ghostty smoke harness with:

python3 scripts/smoke_taskers_ui.py

This builds the local debug binaries, launches taskers-app under Xvfb, drives the app through the existing control socket, and asserts that the rendered pane/layout state stays consistent across pane split/close, workspace switch/close, and session restore.

Install locally

cargo run -p taskers-cli -- install

This installs the taskers binary into Cargo's bin directory and writes a desktop entry plus icon into your local XDG application directories so it shows up in Linux app launchers.

Current status

This foundation now includes:

  • domain model for scrollable workspaces, top-level workspace windows, nested pane layout trees, attention state, and persistence snapshots
  • explicit control protocol and Unix socket transport for workspace, window, pane, and viewport updates
  • PTY spawning foundation and explicit OSC marker parsing
  • GTK shell with live workspace switching, overview mode, directional workspace-window focus, split actions, autosave, and an app-hosted control server
  • real shell sessions per terminal pane, with live output streaming and input-on-enter in the pane UI
  • session load/save support with configurable session and socket paths, including persisted workspace viewport state

The actual libghostty embedding work is intentionally isolated behind taskers-ghostty so the app shell and domain logic stay stable if the integration strategy changes.