One workspace per project. All in.
Workspaces aren't tabs. They're the full working context of a project — its path, its theme, its shells, its pipeline watcher, its editor, its open ports. You stop switching tools. You switch projects.
Pin the folder — the workspace knows the rest.
One workspace per project: its own path, theme, shell, pane layout, pipeline watcher. Right-click the workspace in the icon rail → "Choose Folder…" pins it. On restart everything is back exactly where it was.
- Pinned root directory per workspace — new panes launch there, no more manual `cd`
- Per-workspace theme, font, prompt style, and background opacity
- Per-workspace shell (zsh, bash, fish) and shell mode (Relay prompt or your own zshrc)
- Blueprints: save entire workspace configurations as templates, restore with one click
- Persistent UUIDs — on app restart, workspace, panes, tabs, editor files, and browser cookies are back exactly where you left them
- Per-window SessionManager — ⌘N opens a fresh set of workspaces, not clones
Not just colors. An entire visual system.
Other terminals swap color palettes. Relay swaps the entire design: typography, border radius, spacing, glassmorphism, scanlines, fonts — all at once. Midnight feels like a different app than Obsidian. Because it is.
- 93 design tokens per theme
- 11 modern themes (Studio · Paper · Mocha · Gruvbox · Nord · High Contrast · …)
- 8 historical retro themes (Xerox Alto to Game Boy)
- Live preview on switch
- Animated theme transition (0.35s)
Your workspace. Your layout.
From two tabs, you can split the active workspace into panes. The layout is per-workspace and persists between sessions.
- 9 layouts: single, 2/3/4 side, 2 stack, 1+2, 1+3, 2×2, focus
- Focus mode: 1 large + secondary pane dimmed
- Per-workspace configuration
- Layouts are persisted
12 styles. One of them is yours.
From minimalist Pure to information-dense Powerlevel10k — all prompt styles are built into Relay and configurable live. No manual .zshrc editing needed.
- Relay Compact, Robbyrussell, Minimal, Lambda, Powerblocks (built-in)
- Agnoster, Spaceship, Powerlevel10k, Starship (external via .zshrc)
- Per-workspace style — each workspace can use its own prompt
- .zshrc is generated automatically
CI/CD live in your terminal.
After every push, see exactly what your pipeline is doing — right in the sidebar. No tab switching, no browser.
- GitHub Actions · GitLab CI · CircleCI
- Jobs and steps in real time — with live status
- Logs available directly in a popover
- Rerun failed jobs with one click
Everything in view — without losing focus.
Workspaces, pane topology, and layout picker in one panel. No modal, no popover — one click is enough.
- Workspaces list with per-workspace activity indicator for running commands
- Pane mini-grid mirrors the real layout — drag-to-swap included
- Layout picker as header dropdown — 9 layouts as topology thumbnails
- Per pane: running command, exit-code badge, shell-mode toggle
- Collapsed sidebar shows workspace initials instead of anonymous dots
A real editor, right next to the terminal.
Any pane can convert into a code editor — tree-sitter highlighting for 40+ languages, multiple tabs, cursor memory, themes, everything you'd expect. No more tool-switching.
- Tree-sitter syntax highlighting for Swift, TS/JS, Rust, Python, Go, Ruby and more — like a real IDE
- Multi-tab with cursor memory: ⌘W closes, ⌘1–9 switches, position survives per file
- Six curated themes (Relay Dark/Light, Solarized, Nord, Monokai, GitHub Light)
- File tree context menu: New File, Rename, Move to Trash, Duplicate, Reveal in Finder, Copy Path
- Autocomplete for buffer words and language keywords, auto-triggered as you type
- Drag & drop from Finder, recent-files menu, multi-cursor, find & replace, code folding, minimap
The sidebar knows which project you're in.
As soon as you enter a git repo, Relay scans every manifest and shows each detected stack as its own card — with clickable scripts and top dependencies. Monorepos split correctly.
- Detects Node, Rust, Python, Go, Swift, Ruby, Docker, Hugo, Jekyll, Zola, mdBook and Supabase
- Framework hints: Next.js, Astro, FastAPI, Rails, SwiftPM, Tauri, Electron — precise, not just "Node"
- Multi-stack in monorepos: frontend/package.json + backend/Cargo.toml as separate cards
- Scripts are clickable — `cd frontend && npm run dev` straight from the sidebar
- Workspace markers (pnpm/turbo/nx/lerna/cargo) get their own treatment, with package list
Inputs where the command happens.
Snippets, pipeline logs, and blueprints expand right inside the sidebar — with live preview, parameter inputs, and one click to run.
- Snippet inputs with live-resolved preview ({{message}} → actual command)
- Click a pipeline step to open its log inline below — no separate window
- Blueprint folder picker via native macOS dialog, paths stored home-relative
- Run button disabled while parameters are empty — no broken commands
Browser, inspector and terminal — one application.
Any pane switches into a full-fidelity browser — with its own cookie container per workspace, and a native inspector that mirrors every Chrome DevTools surface. Save-on-reload pairs editor pane and browser: save the file, the sibling browser reloads.
- WKWebView browser with multi-tab, address bar, reader mode, force dark, find-in-page
- Workspace-isolated cookie stores — login in "Personal" stays separate from "Work"
- Private mode per workspace (non-persistent data store)
- DevTools pane with 8 tabs: Console · Network · DOM · Storage · Performance · Sources · Application · Audit
- Auto-reload trigger: editor save reloads sibling browser panes — Hugo/Jekyll/MDX workflows without tab switching
- JS bridge injected into every WKWebView — console streaming, network waterfall, live DOM tree
Multiple windows. Shared settings. Own workspaces.
⌘N opens a new window with a fresh default workspace — not a clone of the first. Every window runs its own workspaces, pipeline watchers and broadcasts, but shares themes, fonts and shortcuts globally. Workspaces can move between windows and keep their identity across restarts.
- Each window with its own SessionManager — workspaces, pipeline watchers, broadcast per window
- AppSettings (theme/font/shortcuts) stay shared globally
- Stable workspace UUIDs survive app quit and window migration
- Per-workspace theme override travels with the workspace — it "carries" its look between windows
- Todo overlay runs as a single floating NSWindow above all app windows — synced via file watcher
Every workspace belongs to a project.
Right-clicking a workspace in the icon rail lets you pin a project folder. New panes launch there — no more manual `cd`. The pin persists across app restarts and window migrations.
- Right-click on workspace → "Choose Folder…" — native macOS picker
- Home-relative path display (`~/WebDev`) inside the context menu
- Persisted in `sessions.json` — restart restores the same launch directory per workspace
- Empty = follow global startup setting (forward-compatible with old workspaces)
One compositing stack. Across the whole app.
Titlebar, icon rail, info panel, pane headers — every chrome surface uses the same composite: a `.sidebar` NSVisualEffectView blur plus `theme.bg.opacity(backgroundOpacity)` tint. The transparency slider in Settings → Effects affects every chrome surface proportionally; the whole chrome breathes in lockstep.
- Single-tint principle: every chrome surface has exactly one tint layer above the blur — no more stacking math
- Titlebar painted via AppKit — system VEVs neutralised, our `.sidebar` VEV installed, traffic-light buttons untouched
- Opacity-aware foreground: `fgSecond` and `fgTertiary` brighten as opacity drops — settings icons stay legible
- Glass themes (Studio, Midnight, Aurora…) get the blur; retro themes (BBC, C64…) stay solid — both correct
- Pane headers adopt the sidebar composite instead of the shell-background color — chrome reads as one continuous surface
Power features without UX traps.
Every consequential action asks first. Every dangerous mode stays visible. Every shortcut hint matches what the key actually does. This is not "nice to have" — it is the difference between an app you trust and one you fear.
- Broadcast mode paints an orange bottom-line and a BROADCAST pill on every target pane — visible even when the sidebar is closed
- Shell switch (relay ↔ zshrc) asks for confirmation — a misclick on the tiny header chip can no longer silently kill your running build
- Close Workspace shows the actual impact ("3 panes, 1 running command, 1 editor pane") — single idle terminals still close instantly
- Ask modal draft survives Escape and backdrop-tap — no more lost half-typed prompts
- Workspace rename now shows a pencil on hover — discoverable without trial-and-error
- ⌘1 / ⌘2 / ⌘3 actually switch the pane type now (Terminal / Editor / Browser) — the picker's hints used to be dead letters
Hover, Click, Pin — three clear verbs for the right sidebar.
Most sidebars have exactly two states: open and closed. That's not enough. Sometimes you want a quick peek, sometimes a section held open without a layout shift, sometimes the panel permanently wide. Relay surfaces all three — each with an unmistakable visual signal.
- **Hover** → 250 ms dwell → floating overlay slides out with the section. Cursor leaves → 500 ms later it closes.
- **Click** → pins it sticky. Overlay stays open without promoting the rail to .expanded. Terminal keeps its full width. Re-click toggles off; clicking another icon switches sticky to it.
- **Pin button in the overlay** → promotes to .expanded for permanent full-width display.
- Sticky icons render with a solid accent fill and high-contrast glyph color — unmistakable vs. the translucent hover state.
- Fly-by filter: cursor through an icon in under 80 ms = no open. Moving the cursor from the toolbar down to the pane stays silent.
- Esc closes a sticky overlay — only when something is pinned, so vim's Esc and REPL exits pass through undisturbed.
- Section expand states (Favorites, Bookmarks, Saved) live in settings. ⌘I cycling no longer resets them — they survive app quit.