A terminal-first overlay workspace for macOS. Onyx wraps always-on SSH + tmux sessions in a translucent, keyboard-driven window — then layers on the things you normally juggle across half a dozen apps: a full-screen work monitor, GitHub and GitLab PR/pipeline tracking, Apple Reminders, Timing.app stats, a remote file browser with git, built-in notes, browser sessions, and live integration with Claude Code.
It's designed to sit on top of everything, jet-black and barely there, so you can glance at "what's running, what's due, what's merging" without breaking flow — and drop it to near-transparent to see the meeting behind it.
A full-window heads-up display (toggle with `) that pulls your whole working context into one place:
- System stats — CPU, memory, and GPU with Activity-Monitor-style grid charts and a multi-week history heatmap; 5-second or 1-minute polling.
- PR & pipeline tracking — open pull/merge requests and CI pipeline status from GitHub and GitLab, side by side (see below).
- Apple Reminders — your lists inline, with a "due today / by tomorrow" scope indicator so you can see how much is on deck at a glance.
- Timing.app — weekly hours, a per-day bar chart, a half-year heatmap, and a per-project time-ratio bar.
- Docker — live per-container CPU/memory for the containers on the host.
- Claude Code sessions — active agent sessions and their pending permission requests, surfaced from the hook integration.
- SSH connection pool — health of the warm tmux/mux masters Onyx keeps per host.
- Session notes — a one-line "what is this session doing" note (
Cmd+;) shown right in the overlay. - Simple mode (
S) — strips down to just giant CPU/GPU charts and compact status pills for ambient, at-a-glance monitoring. - Peek (
X) — momentarily drops the overlay to near-transparent so you can see the desktop or another app (e.g. a Zoom call) behind it.
Track what's in flight across both forges, merged into one list:
- Pull requests / merge requests — open PRs and MRs from your configured GitHub repos and GitLab projects, each row tagged with a
GH/GLbadge and a single mergeable / blocked / conflicts / checks-failing indicator. - "Only mine" — an independent per-provider toggle. Show every PR on small GitHub repos, but filter the busy GitLab project with dozens of MRs down to just yours. Your username is auto-detected from the token.
- CI pipelines — explicitly tracked GitHub Actions runs/workflows and GitLab pipelines, with live in-progress / succeeded / failed job counts and an overall status dot.
- Add from a PR — the
+button suggests pipelines from your open PRs' branches, or paste any pipeline URL and Onyx routes it to the right provider automatically.
- SSH to one or more hosts (or run locally) with tmux persistence and automatic reconnection (exponential backoff).
- Multiple sessions discovered at launch —
Shift+Tabto cycle,+to create,Cmd+1–9for favorites. - Docker container sessions — drop into a container's tmux, or stream its
docker logs -f. - Browser sessions — open a WKWebView "session" alongside your terminals with a URL bar (
Cmd+L). - Guided SSH key setup when key auth fails.
- Remote file browser (
Cmd+O) — browse and view files over SSH with git status, fuzzy search, and file preview. - Built-in notes (
Cmd+E) — local Markdown/text notes, searchable, without leaving the terminal. - Artifacts panel (
Cmd+D) — text, Mermaid/PlantUML diagrams, and 3D models pushed in by coding agents over MCP. - Command palette (
Cmd+K) — fuzzy access to everything.
- Translucent jet-black glass with configurable opacity — the overlay is always at least as see-through as the terminal, and the desktop shows through behind both.
- Multi-window — each window is independent, with its own active session and accent.
- Live browser dashboard — Onyx serves a self-updating monitoring page over local HTTP.
- Accent themes, custom window titles (handy for time-tracking), and a CPU-fleet screensaver.
- macOS 14 (Sonoma) or later
- Swift 5.9+ toolchain (Xcode 15+ or standalone Swift)
- tmux installed on the target machine
- (optional) GitHub / GitLab personal access tokens for PR & pipeline tracking; a Timing.app API token for time stats
git clone <repo-url> && cd onyx
./install.shThis builds a release binary, bundles it as Onyx.app, signs it ad-hoc, and copies it to /Applications.
To build and run from source without installing:
swift build && .build/debug/Onyx| Shortcut | Action |
|---|---|
` (backtick) |
Toggle the monitor overlay |
| Cmd+K | Command palette |
| Cmd+E / Shift+Cmd+E | Toggle notes / new note |
| Cmd+O / Shift+Cmd+O | File browser panel / full-window file browser |
| Cmd+D | Toggle artifacts panel |
| Cmd+L | Focus the browser URL bar |
| Cmd+; | Set/edit the active session's status note |
| Cmd+J | Toggle session manager |
| Cmd+, | Settings |
| Shift+Tab | Cycle tmux sessions |
| Cmd+1–9 | Switch to favorite session |
| Cmd+R | Refresh / reconnect active session |
| Cmd+\ | Cycle side-panel split ratio |
| Cmd+Ctrl+Arrows | Resize the tmux pane |
| Shift+Cmd+C | Toggle selectable terminal-text mode |
| Escape | Dismiss the top overlay |
While the monitor overlay is open (single keys):
| Key | Action |
|---|---|
| S | Simple / full monitor layout |
| X | Peek — drop the overlay to near-transparent |
| T | Toggle poll interval (5s / 1m) |
| M | Toggle the memory chart |
| C | Toggle all-containers view |
| P | Toggle 12/24-hour clock |
Open Settings (Cmd+,) and fill in the GitHub and/or GitLab sections:
- Token — a personal access token. GitHub: classic token,
reposcope. GitLab:read_apiscope (gitlab.com). - Repos / Projects — one
owner/repo(GitHub) orgroup/project(GitLab) per line. - Only mine — toggle per provider to filter the PR/MR list to PRs you authored (username is auto-detected).
- Pipelines — paste pipeline URLs to track, or use the
+button in the overlay's PIPELINES section to add one from an open PR's latest run. GitHub workflow/run URLs and GitLab…/-/pipelines/<id>URLs are both accepted and routed automatically.
Everything then appears in the monitor overlay (`), merged into single OPEN PRs and PIPELINES lists with per-row provider badges.
The project is split into three targets:
- OnyxLib — all app logic and views (library, testable)
- Onyx — the executable entry point (
@main) - OnyxMCP — stdio-to-socket bridge for MCP agent integration
Source is organized into strict layers (Models → Services → Stores → Managers → App → Views); see CLAUDE.md for the layering rules. A few key managers:
| Area | Type |
|---|---|
| Terminal pool, SSH lifecycle, reconnect | TerminalSessionManager, SSHKeeper |
| System / Docker / Timing monitoring | MonitorManager, DockerStatsManager, TimingManager |
| PR & pipeline tracking | PullRequestManager, WorkflowMonitor, GitLabMergeRequestManager, GitLabPipelineMonitor |
| Files, git, notes, artifacts, browser | FileBrowserManager, GitManager, NotesManager, ArtifactManager, BrowserManager |
| Claude Code integration | ClaudeSessionManager |
| Local servers | MCPServer, DashboardServer |
swift test569 tests covering monitor output parsing, SSH command generation, config serialization, file-browser parsing and navigation, note management, shell escaping, artifact management, MCP message handling, JSON-RPC encoding, git status parsing, PR/pipeline URL parsing and provider routing (GitHub + GitLab), and right-panel state.
Onyx includes a built-in MCP (Model Context Protocol) server that lets coding agents display artifacts to the user. This works transparently over SSH — agents running in remote tmux sessions can communicate back to Onyx on the local Mac.
- Onyx starts a TCP listener on
127.0.0.1(dynamic port) and a Unix socket at~/Library/Application Support/Onyx/mcp.sock - SSH connections automatically include
-R 19432:127.0.0.1:<local_port>to forward a port back through the tunnel - The
ONYX_MCP_PORTenvironment variable is exported into the remote tmux session - The
OnyxMCPbridge reads this variable and connects via the forwarded port
Build and install OnyxMCP on the remote machine, then configure your MCP client:
{
"mcpServers": {
"onyx": {
"command": "/path/to/OnyxMCP"
}
}
}| Tool | Description |
|---|---|
show_text |
Display text/markdown in a slot (0–7) |
show_diagram |
Render Mermaid/PlantUML diagram in a slot |
show_model |
Display a 3D model (OBJ/USDZ/STL) in a slot |
clear_slot |
Clear a specific artifact slot |
list_slots |
List all occupied slots |
View artifacts with Cmd+D.
All data is stored in ~/Library/Application Support/Onyx/:
hosts.json— multi-host SSH connection settingsappearance.json— font size, opacity, accent color, window title, reminders listsfolders.json— saved remote folder paths for the file browserfavorites.json— favorited session orderingnotes/— local note files (.md, .txt)mcp.sock— Unix domain socket for local MCP connections
GitHub/GitLab tokens, watched repos/projects, tracked pipelines, the "only mine" toggles, and the Timing.app token are stored in the standard user defaults and configured entirely through Settings.
MIT