"Ixian machines are cunning devices. They do not think, but they do something better โ they observe."
A Claude Code plugin marketplace. Ixian technology for those who prefer their tools sharp, their feedback loops closed, and their agent sessions rendered in something other than a scrolling terminal.
Your Claude Code sessions, rendered beautifully in foldspace.
Foldspace Console captures every assistant response and streams it to a rich browser viewer in real-time. But it doesn't stop at rendering โ select any text, annotate it, and your thoughts inject back into Claude as context on your next prompt.
The loop is closed. The machine observes. The navigator annotates. The path folds.
- ๐ก Live streaming โ responses appear in the browser the instant Claude finishes speaking
- ๐จ Rich markdown โ syntax-highlighted code blocks with copy buttons, tables, blockquotes, the works
- โ๏ธ Annotations โ select text, add your thoughts, they become context on your next prompt
- ๐๏ธ Multi-session tabs โ every Claude Code session gets its own tab, complete with metadata header
- ๐ System telemetry โ all-time stats, installed plugins, hooks, MCP servers, model token usage
- ๐งฌ Session metadata โ model, permission mode, git branch, token counts, turn counter
- ๐ Auto-reconnect โ WebSocket reconnects seamlessly if the daemon restarts
- ๐ Zero config โ daemon auto-starts on your first session. Just open the browser.
โโโโโโโโโโโโโโโโ Stop Hook โโโโโโโโโโโโโโโ WebSocket โโโโโโโโโโโโโโโโโโโโ
โ Claude Code โ โโโโโโโโโโโโโโโโโถ โ Daemon โ โโโโโโโโโโโโโโถโ Browser SPA โ
โ (terminal) โ โ (Bun HTTP) โ โ (Foldspace UI) โ
โ โ โโโโโโโโโโโโโโโโโ โ :3377 โ โโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโ Prompt Hook โโโโโโโโโโโโโโโ Annotate โโโโโโโโโโโโโโโโโโโโ
โ โ
โ SessionStart โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Four hooks. One daemon. One browser tab. That's the whole machine.
| Hook | Event | Purpose |
|---|---|---|
session-start.sh |
SessionStart | Registers session, auto-starts daemon |
stop.sh |
Stop | Captures last_assistant_message, POSTs to daemon |
prompt.sh |
UserPromptSubmit | Fetches annotations, injects as context |
session-end.sh |
SessionEnd | Final transcript scan for token totals |
This is the core trick โ the part where passive observation becomes active navigation.
When you select text in the Foldspace browser SPA and add an annotation, it gets stored in the daemon's in-memory annotation queue (keyed by session ID). Nothing happens yet. The annotations just... wait. Patient as a Face Dancer in a crowd.
Then you type your next prompt in the terminal.
Claude Code fires the UserPromptSubmit hook before the prompt reaches the model. Here's what prompt.sh does:
- Reads the hook event from stdin (Claude Code passes
session_idand other metadata as JSON) - Health-checks the daemon โ if the daemon isn't running, the hook exits silently. No crash, no noise.
- Fetches pending annotations via
GET /api/annotations?session={SESSION_ID} - If annotations exist, formats them as plain text to stdout
- Deletes the annotations from the daemon via
DELETE /api/annotations?session={SESSION_ID}โ they are consumed on injection
Claude Code's hook system takes whatever the UserPromptSubmit hook writes to stdout and prepends it as additional context to the user's prompt. The model sees the annotations alongside (and before) whatever you actually typed.
The injected context looks like this:
--- Annotations from Foldspace Console ---
IMPORTANT: The user has left annotations from their Foldspace Console (browser viewer). Acknowledge that you received these annotations before proceeding with your response.
[1] On text:
> The selected text from Claude's response,
> with each line blockquoted
Comment: Your annotation comment here
[2] On text:
> Another selection across
> multiple lines
Comment: And your thoughts on this one
--- End annotations ---
Multiple annotations are numbered sequentially. The original selected text is blockquoted with > prefixes. Each annotation carries the exact text you highlighted and the comment you wrote.
Two safeguards ensure the injection isn't a ghost operation:
- CLI indicator โ When annotations are injected, you'll see
Foldspace: 3 annotation(s) injectedin your terminal (via stderr). This doesn't interfere with the hook's stdout context โ it's a side-channel heads-up. - LLM acknowledgment โ The injected context includes an instruction telling the model to acknowledge the annotations before proceeding. The model should surface that it received your Foldspace annotations at the start of its response.
One thing to be aware of: if you annotated something in the browser hours ago and forgot about it, those annotations will inject the next time you submit a prompt in that session. The annotations queue is per-session and persists in daemon memory until consumed or the daemon restarts.
Browser SPA Daemon (in-memory) Claude Code Terminal
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Select text + comment โโโถ POST /api/annotate
Annotation queued โโโ
โ
(annotations wait) โ
โ
User types prompt โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโถ UserPromptSubmit fires
GET /api/annotationsโโโโโโโโโโโ prompt.sh fetches queue
Return annotations โโโโโโโโโถ stdout = formatted text
DELETE /api/annotations โโโโโโโ prompt.sh clears queue
Context prepended to prompt
Model sees annotations + prompt
Annotations are fire-once. After injection, they're deleted from the daemon. If you want to re-annotate the same text, you annotate it again in the browser. The queue is always clean for the next prompt.
Stagehand + Playwright browser automation for agents. No MCP needed.
Generate and execute browser scripts with AI-powered extraction (Stagehand) and full Playwright introspection โ screenshots, HAR recording, tracing, CDP profiling, flamegraphs. Every generated script is saved as a reviewable artifact.
claude plugin install playwright@the-no-shopThen invoke with /playwright:
/playwright scrape https://reuters.com/world for headlines
/playwright screenshot https://iran.hexxa.dev fullpage
/playwright profile https://example.com performance metrics
/playwright har https://example.com/api capture traffic
Requires: ANTHROPIC_API_KEY (standard, not OAuth), @browserbasehq/stagehand, zod
From the Claude Code CLI:
claude plugin marketplace add bdmorin/the-no-shopOr from inside a Claude Code session:
/plugin marketplace add bdmorin/the-no-shop
claude plugin install foldspace-console@the-no-shopNext time you start a Claude Code session, the Foldspace daemon spins up automatically. Open http://localhost:3377 in your browser.
# List configured marketplaces
claude plugin marketplace list
# List installed plugins
claude plugin listcd ~/.claude/plugins/foldspace-console
bun install
bun run daemon/index.ts| Variable | Default | Description |
|---|---|---|
FOLDSPACE_PORT |
3377 |
Daemon HTTP + WebSocket port |
Foldspace Console ships with a dark theme inspired by the machine workshops of Ix:
- Spice amber accents on deep void backgrounds โ brand accent, used sparingly
- Teal as the signal/interaction color
- IBM Plex Mono for code and data, Instrument Sans for prose
- Borders you can barely see. SVG noise overlay for depth. 150ms mechanical transitions.
- Minimal chrome. Maximum signal.
The No-Shop is a standard Claude Code plugin marketplace. Structure:
the-no-shop/
โโโ .claude-plugin/
โ โโโ marketplace.json # Marketplace manifest
โโโ plugins/
โ โโโ foldspace-console/
โ โโโ .claude-plugin/
โ โ โโโ plugin.json # Plugin manifest
โ โโโ hooks/
โ โ โโโ hooks.json # Hook registrations
โ โโโ scripts/ # Shell hook scripts
โ โโโ daemon/ # Bun HTTP + WebSocket server
โ โโโ web/ # Self-contained SPA
โ โโโ skills/ # Plugin skills
โ โโโ package.json
โโโ LICENSE
โโโ README.md
MIT โ do whatever you want with it.
"The Ixians have a saying: 'Give a man a tool, and he'll build a machine. Give a machine a tool, and it'll build something you didn't expect.'"
โ Probably not Frank Herbert, but close enough