Niklas J. Thaler12 downloadsRun Claude Code sessions as terminal views inside Obsidian, with a cockpit dashboard.
English | Deutsch

Glasscockpit is an Obsidian plugin that runs Claude Code sessions as terminal tabs inside your vault. A dashboard shows usage limits, context size, tasks, vault status and GitHub search results, either as cards or as a cockpit picture. The photo above uses example data.
The plugin's settings and labels are in German. There is no English interface yet.
claude), installed and logged in.jq, for the status line (optional, see "First steps").Option A: without the ZIP (BRAT, or the community store once the plugin is listed).
nyko073006/glasscockpit) or from the community plugins list. Both fetch main.js, manifest.json and styles.css only.node-pty for your Mac once and checks it (see "Network" below). Then start a session.Option B: the complete ZIP.
glasscockpit with main.js, manifest.json, styles.css and native/.<your vault>/.obsidian/plugins/.The plugin is not in the community store yet. native/ holds the terminal library node-pty as a compiled binary (Option B ships it, Option A downloads it). On first start the plugin removes the macOS quarantine flag from that folder (xattr).
Open the command palette and run "Neue Claude-Sitzung" (new Claude session) or "Dashboard öffnen" (open dashboard). Settings are under Settings, Glasscockpit.
Most vault-related settings start empty. Empty means "not set up", never an error. The matching card or field then shows "aus" or "nicht eingerichtet" and the plugin reads nothing for it:
| Setting | Empty means |
|---|---|
| Projektordner | "Neue Sitzung" offers no project subfolders. |
| Briefing-Ordner | No briefing card, no automatic git pull. |
| Aufgabenliste | The task card shows "fehlt" with a button to create the file. The default name is Cockpit Tasks.md. |
| Inbox-Ordner, Index-Datei, Ordner der Daily Notes | The vault panel shows "aus" for that line. |
| Lint-Befehl | No lint button. |
| Radare | No radar lamps. A radar is a name plus the path to a JSON state file you write yourself. |
Telegram, the research searches and the other switches have their own defaults, listed under "Disclosures".
Claude Code can show a status line. This repo ships one that also feeds the usage card, the token counter and the context gauge. It needs jq.
npm run deploy:statusline
This copies statusline/statusline-command.sh to ~/.claude/statusline-command.sh. It replaces a file that already exists there. Then point Claude Code at it in ~/.claude/settings.json:
{ "statusLine": { "type": "command", "command": "~/.claude/statusline-command.sh", "refreshInterval": 30 } }
Without the status line the plugin works, but the usage card and the context and token gauges stay empty.
A Stop hook shows a coloured banner "Session clearable" after an answer in which Claude reports the session as ready to hand off: a code block whose first line starts with Handoff:, or the word "clearable" without "not"/"nicht" before it. The banner only appears once the session has enough context and enough of your own messages. Both thresholds are settings ("Handoff frühestens ab Kontext (%)", default 10, and "Handoff frühestens ab Nachrichten", default 2). Slash commands do not count as messages. The hook reads the context from the status line; without it only the message threshold applies. It needs python3. The banner text is German.
npm run deploy:hook
This copies hooks/clearable-banner.py to ~/.claude/hooks/clearable-banner.py. Then register it in ~/.claude/settings.json:
{ "hooks": { "Stop": [ { "hooks": [ { "type": "command", "command": "python3 \"$HOME/.claude/hooks/clearable-banner.py\" 2>/dev/null || true", "timeout": 10 } ] } ] } }
For Claude to set the signal, add an instruction to your CLAUDE.md, for example: "When the session is ready to hand off, end the answer with a code block that starts with Handoff:."
The plugin can continue a project from the handoff note of an earlier session. It is off until you set two paths.
| Setting | Meaning |
|---|---|
hubsDir |
Vault folder with one subfolder per project. Empty = off. |
handoffsDir |
Folder name inside each project folder that holds its handoff notes. Empty = off. |
hubSuffix |
Ending of the project's hub note. Default " - PMO HUB.md". |
handoffPrompt |
First message of a continued session. {datei} becomes the handoff path, {auftrag} the next task. |
A handoff is a Markdown note with this frontmatter:
status: offen # offen = waiting, aufgenommen = taken up
erstellt: 2026-01-05
naechster_auftrag: Short description of the next task
The hub note may name the project's repo folder with repo: ~/path/to/repo. ~ is your home folder. Without repo, or if the folder does not exist, the session starts in the vault and the entry says so.
Per project the newest open handoff counts. The field "Neue Sitzung" on the dashboard shows "N offen". The new-session menu lists each one as "Weiter" above the normal entries, and Enter without typing picks the top entry. The plugin sets status: aufgenommen (and aufgenommen: <date>) only once the session is running, so a failed start leaves the handoff open.
Claude Code sends some text (for example the question of a choice prompt) as fixed white. In a light Obsidian theme that text is invisible. The setting "Mindestkontrast im Terminal" (1 to 21, default 4.5, 1 = off) lifts text that is too pale for the background up to that contrast ratio. It applies at once to open terminals.
File paths in the terminal open with Cmd+click: absolute, with ~ or relative to the session's start folder, each optionally with :line or :line:column. While Cmd is held, a path is underlined, but only if it exists as a file. Files in the vault open as a tab, all others in a window with a plain-text editor: Cmd+S saves, Esc closes. If the file changed since it was opened (for example by Claude), the window asks before overwriting. Files larger than "Datei-Viewer: Höchstgröße (MB)" (default 2) and binary files are not shown. Turn it off with "Pfade per Cmd+Klick öffnen". In shell sessions the start folder still applies after cd.
If a relative path is not in the start folder, the cockpit looks for it in the folders Claude has worked in during this session: cd targets and the folders of files it read or edited. So when Claude names src/main.ts:10 from a repo in a vault session, it becomes a link. If several of these folders have the file, for example the repo and a worktree, it opens from the folder Claude worked in most recently; the window title shows the full path. Turn it off with "Relative Pfade auch in Claudes Ordnern suchen".
The macOS banner (setting "macOS-Banner") closes itself after "Banner ausblenden nach (Sekunden)" (1 to 60, default 6) and does not stay in Notification Center. Each session has at most one banner: a new one replaces the old one. Open banners are closed when the plugin is disabled. A click brings the session to the front. If @electron/remote is unavailable in Obsidian, the plugin falls back to the window's web notification; then closing is not guaranteed.
The switch "Rechteabfragen überspringen" is off by default.
Warning: when it is on, new sessions start with --dangerously-skip-permissions. Claude then runs commands and edits files without asking you. Turn it on only in folders and vaults where you accept that.
The switch applies to sessions started after you change it. Running sessions keep their mode.
This follows the disclosure rules of the Obsidian developer policies.
Runs programs.
claude in a terminal session, and your $SHELL for shell sessions. On load the plugin starts your login shell once ($SHELL -i -l -c) to read PATH and LANG.git pull --ff-only in the briefing folder, only if you set one (every 5 minutes by default, while a dashboard is open).git status in your project folders, for the repo panel. No fetch.afplay for the alert sound, xattr for the quarantine flag, ps to find the parent process for the IDE bridge.Reads outside the vault.
~/.claude/projects/: the Claude transcripts, to count tokens, find the last code block, show the active session and know the folders Claude worked in (for relative paths).~/.claude/skills/, agents/, commands/, settings.json and plugins/installed_plugins.json: to list skills, agents and commands in the launcher. The same folders under the vault and the project folder are read too.~/.claude/cockpit/: usage.json and sessions/*.json (written by the status line script), plus the plugin's own files below..env file named in settings (default ~/.claude/channels/telegram/.env) for the bot token, and access.json next to it for the chat ID. The token is read for each message and never stored by the plugin.stat on the paths of that line, the content only after Cmd+click (switch "Pfade per Cmd+Klick öffnen").Writes outside the vault.
~/.claude/cockpit/tokens-today.json (today's output tokens for the status line; switch "Tokens für die Statuszeile schreiben", on by default), thresholds.json (context thresholds from your settings) and research.json (cache of GitHub results).~/.claude/ide/<port>.lock: lock file of the IDE bridge (switch "IDE-Brücke", on by default). It lets Claude sessions started by the plugin see your selection and open notes. The server listens on 127.0.0.1 only. The lock file is removed on exit.npm run deploy:statusline writes ~/.claude/statusline-command.sh. You run that yourself.npm run deploy:hook writes ~/.claude/hooks/clearable-banner.py; you run that yourself too. The hook reads ~/.claude/cockpit/thresholds.json, sessions/*.json and the session transcript, and appends a log to ~/.claude/hooks/clearable-banner.log.Writes inside the vault. The plugin's data.json (settings, session list), the folder native/darwin-<arch>/ inside the plugin folder when you press "Binärdateien laden" (plus a temporary folder .native-download-* there while it runs, removed afterwards), the task file when you press "Anlegen" or tick a task, and the result of git pull in the briefing folder.
Network.
api.github.com/search/repositories) for the Research card, without a token. It sends your search lines from the settings and nothing else. Without a token GitHub allows 10 searches per minute.api.telegram.org), only if you enable "Telegram, wenn eine Sitzung fertig ist" or "…eine Frage hat" (both off by default). It sends a short status text.node-pty for your Mac from github.com/nyko073006/glasscockpit/releases/download/<plugin version>/glasscockpit-native-darwin-<arch>.zip. The plugin sends no data beyond the request itself. The address is fixed in the code. Before anything is installed, every file of the download is compared against a SHA256 list that is built into the plugin (no extra files, no symbolic links, every checksum must match); on any mismatch nothing is changed. The downloaded files are native code that Obsidian then loads, so the checksums are the safeguard: they come from the plugin itself, not from the download.claude program, not this plugin.No telemetry. The plugin sends no usage data, no analytics and no crash reports.
No affiliation. Glasscockpit is not connected to Anthropic or Obsidian and not endorsed by either. "Claude" and "Obsidian" are trademarks of their respective owners.
native/ holds binaries for Apple Silicon (arm64) and Intel (x64); the loader picks by architecture. The arm64 build is the tested one, x64 is untested inside Obsidian.MIT, see LICENSE. Third-party licenses are in THIRD-PARTY-NOTICES.md.
The background image assets/cockpit-bg.jpg was generated with Google Flow (Nano Banana Pro).