[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-80412":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":15,"stars30d":14,"stars90d":15,"forks30d":15,"starsTrendScore":15,"compositeScore":16,"rankGlobal":9,"rankLanguage":9,"license":17,"archived":18,"fork":18,"defaultBranch":19,"hasWiki":18,"hasPages":18,"topics":20,"createdAt":9,"pushedAt":9,"updatedAt":21,"readmeContent":22,"aiSummary":23,"trendingCount":15,"starSnapshotCount":15,"syncStatus":14,"lastSyncTime":24,"discoverSource":25},80412,"sublodex","Pinperepette\u002Fsublodex","Pinperepette","Local-first desktop app on top of Claude Code. Multi-project, live file streaming, integrated terminal (local + SSH), full git tooling, multi-session per project.",null,"TypeScript",59,3,1,2,0,42.01,"MIT License",false,"main",[],"2026-06-12 04:01:28","# SubLodeX\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"docs\u002Fimg\u002F00-cover.png\" alt=\"SubLodeX — by Amani Andrea aka The Pirate Pinperepette\" \u002F>\n\u003C\u002Fp>\n\n\u003Ch3 align=\"center\">A local-first desktop app for Claude Code\u003C\u002Fh3>\n\u003Cp align=\"center\">\u003Cem>It feels like a dev environment that happens to have an AI inside, not a chat with code stapled on the side.\u003C\u002Fem>\u003C\u002Fp>\n\nMulti-project workspace, live file streaming, integrated terminal (local + SSH), git tooling, and per-project chat sessions — all in one window.\n\n\u003Cp align=\"center\">\n  \u003Ca href=\"docs\u002Fimg\u002F03-live-streaming.mp4\">\n    \u003Cimg src=\"docs\u002Fimg\u002F03-live-streaming.gif\" alt=\"Claude writing a Python file token-by-token in Monaco\" \u002F>\n  \u003C\u002Fa>\n  \u003Cbr \u002F>\n  \u003Cstrong>This isn't a wrapper.\u003C\u002Fstrong> The editor on the right shows the file being written, character by character, while Claude generates it. \u003Cem>Click for the higher-quality MP4.\u003C\u002Fem>\n\u003C\u002Fp>\n\n![SubLodeX main UI — sidebar (commands\u002Ffiles\u002Fgit), chat in the middle, editor on the right, terminal at the bottom](docs\u002Fimg\u002F01-hero.png)\n\n---\n\n## What it does (in one paragraph)\n\nYou point SubLodeX at a folder (local or remote via SSH). Claude shows up as a chat in the middle of the window. When Claude reads or writes a file, the editor on the right opens that file and **shows the changes appear character by character**. The left sidebar gives you the file tree, the project commands (`\u002Finit`, `\u002Fcost`, `\u002Fpermissions`, …), and a full git panel. The terminal at the bottom is a real PTY — local shell or `ssh user@host` depending on the project. Conversations are persisted, scoped per project, and you can have multiple parallel chat sessions on the same project. Themes are real themes — Monaco, xterm, and the UI all change together.\n\n---\n\n## Install (binary, recommended)\n\n> Pre-built bundles will be on the [Releases page](..\u002F..\u002Freleases) for macOS (Intel + Apple Silicon), Linux (`.deb` \u002F `.AppImage` \u002F `.rpm`), and Windows (`.msi` \u002F `.exe`).\n\nAfter download, on **macOS**:\n\n1. Drag `SubLodeX.app` into `\u002FApplications\u002F`.\n2. The app is unsigned. First launch needs Gatekeeper bypass:\n\n   ```bash\n   xattr -dr com.apple.quarantine \u002FApplications\u002FSubLodeX.app\n   ```\n\n   Or right-click → *Open* → confirm.\n\nOn **Linux**: `sudo dpkg -i SubLodeX_*.deb` (Debian\u002FUbuntu), or `chmod +x SubLodeX_*.AppImage && .\u002FSubLodeX_*.AppImage`.\n\nOn **Windows**: run the `.msi`. SmartScreen will warn (unsigned) — *More info → Run anyway*.\n\n### Runtime requirements\n\nThe bundle ships **everything**:\n\n* its own Bun runtime (sidecar binary, ~70 MB)\n* the bundled `server.ts` (single `.mjs` file)\n* the native `claude` binary (~217 MB — yes, that's why the `.app` is ~293 MB)\n* a Rust-native PTY (`portable-pty`) — no Node, no `node-pty`, no extra installs\n\nThe only **optional** runtime dependency:\n\n* `sshpass` — only if you want SSH password authentication for remote projects. Key-based \u002F agent SSH works without it. (`brew install sshpass` \u002F `apt install sshpass`).\n\n---\n\n## Authentication\n\nSubLodeX uses your existing Claude credentials:\n\n1. **Subscription (recommended)** — log in once with the `claude` CLI:\n\n   ```bash\n   claude          # then: \u002Flogin\n   ```\n\n   SubLodeX picks up the token from:\n   * macOS Keychain\n   * `~\u002F.claude\u002F.credentials.json` on Linux \u002F Windows\n\n   **No `claude` CLI installed?** The bundle already ships one. Use it directly or symlink it into your `$PATH`:\n\n   ```bash\n   # macOS (after installing \u002FApplications\u002FSubLodeX.app)\n   sudo ln -s \u002FApplications\u002FSubLodeX.app\u002FContents\u002FResources\u002F_up_\u002Fresources\u002Fclaude-bin\u002Fclaude \u002Fusr\u002Flocal\u002Fbin\u002Fclaude\n   claude \u002Flogin\n\n   # Linux (after installing the .deb)\n   sudo ln -s \u002Fusr\u002Flib\u002FSubLodeX\u002Fresources\u002Fclaude-bin\u002Fclaude \u002Fusr\u002Flocal\u002Fbin\u002Fclaude\n   claude \u002Flogin\n\n   # Windows: the binary is at\n   #   %ProgramFiles%\\SubLodeX\\resources\\claude-bin\\claude.exe\n   # add that folder to your PATH or call it directly with full path\n   ```\n\n   On Linux, calling the binary by full path will fail with `Executable not found in $PATH: \"claude\"` because it self-respawns through `$PATH`. The symlink (or a `PATH` prepend) fixes it.\n\n2. **API key** — set `ANTHROPIC_API_KEY` and start with `CLAUDE_WEB_USE_API_KEY=1`. By default the API key is **ignored** when subscription credentials are present, so subscription wins.\n\n---\n\n## Tour\n\n### Project picker\n\nMulti-project workspace. Each project has its own path (local or SSH), its own conversations, its own settings. You switch with one click and *everything* follows: file tree, terminal, chat, git state.\n\n![project picker — projects modal with local + SSH project, SSH form filled, test connection ✓ connected](docs\u002Fimg\u002F02-projects.png)\n\n### Live file streaming\n\nWhen Claude calls `Write` or `Edit`, the editor opens that file and writes it character by character, in real time. Not \"here's the code, paste it\" — you watch it happen.\n\nThere's a **speed regulator** because at full speed you barely see it:\n\n* `instant` — no animation, full speed (default)\n* `fast` — ~330 char\u002Fs\n* `normal` — ~100 char\u002Fs\n* `slow` — ~33 char\u002Fs, true typewriter\n\nSet it from *projects → live file write speed*. *(see the GIF at the top of this README for a demo)*\n\n### Real terminal (local + SSH)\n\nPTY backed by Rust `portable-pty`. Bytes streamed to xterm.js via Tauri Channel — no Node helper, no SIGHUP wrangling, no node-pty native modules to ship per platform. SSH sessions reuse a `ControlMaster` socket with the file-ops connection, so the second pane \u002F file open \u002F git op opens in ~10 ms instead of ~300 ms.\n\n![terminal — bottom panel showing a local shell on a project, with the project path visible](docs\u002Fimg\u002F04-terminal-local.png)\n\n![terminal ssh — bottom panel with the `ssh` pill in the header, prompt showing remote hostname](docs\u002Fimg\u002F05-terminal-ssh.png)\n\n### Multi-session per project\n\nOne project can have N parallel chat sessions. Use them for: bug fix vs new feature, daily threads, \"spike I might come back to\", onboarding vs implementation. Each session has its own Claude `session_id` so `--resume` keeps working independently.\n\nThe session bar above the chat shows the current session, summary of the first user message, and lets you switch \u002F create \u002F delete.\n\n![sessions — sessions bar with dropdown open, multiple sessions listed with summary + date, delete button visible](docs\u002Fimg\u002F06-sessions.png)\n\n### Git panel\n\nA full git panel in the sidebar (only appears if the project is a repo).\n\n* current branch + ahead\u002Fbehind counts\n* branch switcher (checkout existing or `-b` new)\n* dirty files split into **staged** \u002F **changes** with `M` \u002F `A` \u002F `D` \u002F `?` markers\n* `+` to stage, `−` to unstage, `⌫` to discard (with confirm — for untracked files = `git clean -f`)\n* **stage all** \u002F **unstage all** buttons in section headers\n* commit message + commit\n* pull \u002F push (disabled when ahead\u002Fbehind = 0)\n* **history** of last 30 commits — click any → editor opens `git show \u003Chash>` in diff highlighting\n* **stash** save \u002F pop \u002F drop\n* **PR review** — paste a GitHub PR url or `#number`, the app does `git fetch origin pull\u002FN\u002Fhead:pr-N` and opens the diff vs the default branch in the editor\n* every operation's stdout\u002Fstderr appears in a small drawer (`pull` showing changed files, `push` showing rejection reason, etc.)\n\n![git panel — full sidebar showing branch, changes, history expanded; editor on the right showing a unified diff with Monaco highlighting](docs\u002Fimg\u002F07-git-panel.png)\n\n![pr review — PR #4 fetched, diff vs main shown in the editor with full file stats](docs\u002Fimg\u002F08-pr-review.png)\n\n### Quick open (⌘P \u002F ⌘K)\n\nVS Code-style fuzzy finder. Press ⌘P (or ⌘K, or click the *find* button in the header), type 2-3 chars, hit ↵. Subsequence matching, basename bonus.\n\n![quick open — modal with search input \"auth\" and matching files highlighted](docs\u002Fimg\u002F09-quick-open.png)\n\n### Conversation export\n\nThe `⇣ export` button (visible only when the chat has messages) saves the conversation as a markdown file. Tool calls are expanded with their input + result. Useful for sharing debug sessions or saving \"how I solved X\" memos.\n\n### Theme system\n\n7 built-in themes:\n\n* Monokai (default)\n* Dracula\n* Nord\n* Tokyo Night\n* One Dark\n* Solarized Dark\n* GitHub Light\n\nThemes are **scoped per area** — you can mix. Editor in Monokai, terminal in Dracula, sidebar in Nord. Useful when one area has bad contrast against the other.\n\n![themes — theme picker modal showing the 7 cards, with one selected per area showing the scope tabs](docs\u002Fimg\u002F10-themes.png)\n\n### Commands sidebar\n\nNative Claude slash commands (`\u002Finit`, `\u002Fpermissions`, `\u002Fcost`, …) wired up in the left rail. Click → sent to Claude. There's also a small set of UI-only commands (settings, etc.).\n\n![commands — commands tab in sidebar showing the available actions](docs\u002Fimg\u002F11-commands.png)\n\n### Extensions panel\n\nA read-only viewer for what's hooked into your Claude Code:\n\n* **Plugins** — installed Claude Code plugins from `~\u002F.claude\u002Fplugins\u002Finstalled_plugins.json`, with their manifest, capabilities (commands \u002F agents \u002F skills \u002F hooks \u002F MCP \u002F LSP), version, scope.\n* **Extensions** — auto-detected: npm packages installed globally that hook into Claude Code (e.g. `@ccplug\u002Fclaude-reforge`). Inferred from hook command paths.\n* **MCP servers** — global (`~\u002F.claude\u002Fsettings.json`) + project (`.mcp.json`).\n* **Hooks** — grouped by event (`PreToolUse`, `UserPromptSubmit`, …), with matcher and command visible.\n* **Marketplaces** — registered plugin sources.\n\nRead-only: install \u002F enable \u002F remove via the official `claude plugin` CLI.\n\n![extensions — extensions modal with the Extensions tab open, showing auto-detected npm hook extensions like @ccplug\u002Fclaude-reforge with hook + event counts](docs\u002Fimg\u002F12-extensions.png)\n\n---\n\n## Remote projects (SSH)\n\nPoint a project at a remote and everything runs there:\n\n* `~\u002F.ssh\u002Fconfig` host names autocompleted when adding a project\n* password, identity file, or agent forwarding\n* connection reuse via `ControlMaster`\n* file tree, file open\u002Fsave, terminal, claude — all over SSH\n\nClaude runs *on the remote* (uses the remote's `claude` CLI). The local app proxies the conversation. **No per-character live streaming when editing remote files** — this is a **Claude CLI limitation**, not ours: the CLI's stream-json output doesn't emit partial tool input the way the local SDK does. Tool results still arrive (you see the diff after the tool returns), just no typewriter animation during the write.\n\n(See `02-projects.png` above for the SSH form.)\n\n---\n\n## Build from source\n\n### Prerequisites\n\n* [Bun](https:\u002F\u002Fbun.sh) ≥ 1.3\n* [Rust](https:\u002F\u002Frustup.rs\u002F) (stable) — required by Tauri\n* macOS \u002F Linux \u002F Windows\n\n```bash\n# macOS via Homebrew\nbrew install bun rustup-init\nrustup-init -y\n```\n\n```bash\n# Ubuntu 22.04+\nsudo apt-get install -y \\\n  libwebkit2gtk-4.1-dev libappindicator3-dev librsvg2-dev patchelf \\\n  build-essential\ncurl -fsSL https:\u002F\u002Fbun.sh\u002Finstall | bash\ncurl --proto '=https' --tlsv1.2 -sSf https:\u002F\u002Fsh.rustup.rs | sh\n```\n\n```powershell\n# Windows (PowerShell)\nwinget install -e --id Rustlang.Rustup\nirm bun.sh\u002Finstall.ps1 | iex\n```\n\n### Clone & install\n\n```bash\ngit clone \u003Cthis repo>\ncd claude-web\nbun install\n```\n\n### Run (dev)\n\n```bash\nbun run dev          # bun server :3001 + vite :5173\n```\n\nOpen http:\u002F\u002Flocalhost:5173 in any browser. Vite has HMR; for the desktop window use:\n\n```bash\nbun run tauri:dev\n```\n\n> The Tauri window in dev still loads from `:3001` (the bundled URL). If you change frontend code, run `bun run build` to refresh the static bundle the desktop window sees. For pure UI hacking, use the browser at `:5173` — much faster cycle.\n\n### Build a self-contained bundle\n\n```bash\n# (one-time per machine) download bun for the current arch\nmkdir -p src-tauri\u002Fbinaries\ncurl -fsSL https:\u002F\u002Fgithub.com\u002Foven-sh\u002Fbun\u002Freleases\u002Flatest\u002Fdownload\u002Fbun-darwin-x64.zip -o \u002Ftmp\u002Fbun.zip\nunzip -oq \u002Ftmp\u002Fbun.zip -d \u002Ftmp\ncp \u002Ftmp\u002Fbun-darwin-x64\u002Fbun src-tauri\u002Fbinaries\u002Fbun-x86_64-apple-darwin\nchmod 755 src-tauri\u002Fbinaries\u002Fbun-x86_64-apple-darwin\n\nbun run tauri:build\n```\n\nOutput ends up in `src-tauri\u002Ftarget\u002Frelease\u002Fbundle\u002F`. On macOS:\n\n```bash\ncp -R src-tauri\u002Ftarget\u002Frelease\u002Fbundle\u002Fmacos\u002FSubLodeX.app \u002FApplications\u002F\nxattr -dr com.apple.quarantine \u002FApplications\u002FSubLodeX.app\n```\n\nFor other targets, swap the bun zip URL:\n\n| Target | bun zip | rust triple |\n|---|---|---|\n| macOS Apple Silicon | `bun-darwin-aarch64.zip` | `bun-aarch64-apple-darwin` |\n| macOS Intel | `bun-darwin-x64.zip` | `bun-x86_64-apple-darwin` |\n| Linux x64 | `bun-linux-x64.zip` | `bun-x86_64-unknown-linux-gnu` |\n| Windows x64 | `bun-windows-x64.zip` | `bun-x86_64-pc-windows-msvc.exe` |\n\nThe `bun run tauri:build` script will:\n\n1. `vite build` → `dist\u002F`\n2. `bun build server.ts --target=bun --outfile=src-tauri\u002Fresources\u002Fserver.bundled.mjs`\n3. copy `dist\u002F`, the native `claude` binary, into `src-tauri\u002Fresources\u002F`\n4. compile the Rust shell, bundle as `.app` \u002F `.dmg` \u002F `.deb` \u002F `.msi`\n\nCI does the same per-platform — see `.github\u002Fworkflows\u002Frelease.yml`.\n\n---\n\n## Architecture\n\n```\n┌──────────────────────────────────────────────┐\n│  Tauri WebView (React + Vite)                │\n│  http:\u002F\u002F127.0.0.1:3001                       │\n└────┬──────────────────────────────────┬──────┘\n     │ REST \u002Fapi\u002F* + WebSocket \u002Fws       │ Tauri invoke + Channel\n     │                                   │\n┌────┴──────────────────────────┐  ┌─────┴────────────────────┐\n│  Bun server (sidecar)         │  │  Rust commands           │\n│  • settings, file ops         │  │  • portable-pty manager  │\n│  • git operations             │  │  • app data dir resolve  │\n│  • SSH (sshExec)              │  │  • bun sidecar lifecycle │\n│  • Claude SDK streaming       │  └──────────────────────────┘\n└────┬──────────────────────────┘\n     │ spawn\n     ↓\n   `claude` native binary (bundled)\n   or remote `claude` over SSH\n```\n\nWhy two communication channels? The Bun side is great at HTTP\u002FWS and has the Claude SDK. The Rust side is great at native PTYs and process management. Splitting along that axis keeps each side doing what it's good at.\n\nThe native `claude` binary is bundled so the `.app` works on a clean machine (no `npm install` required for the user). On launch the Tauri Rust setup hook:\n\n1. Resolves bundled paths (`server.bundled.mjs`, `dist\u002F`, `claude` binary)\n2. Computes the platform-specific app data dir\n3. Spawns the Bun sidecar with all of these as env vars\n4. Waits for `:3001` to come up before opening the window\n\nFrontend ↔ PTY uses Tauri `Channel` (typed streaming), not events — events broadcast unreliably to webviews loaded from non-frontend URLs in Tauri 2.\n\n---\n\n## Data & persistence\n\nEverything is local. The app data dir is platform-specific:\n\n* macOS — `~\u002FLibrary\u002FApplication Support\u002Fcom.pinperepette.sublodex\u002F`\n* Linux — `~\u002F.local\u002Fshare\u002Fcom.pinperepette.sublodex\u002F`\n* Windows — `%APPDATA%\\com.pinperepette.sublodex\\`\n\n```\nsettings.json\nconversations\u002F\u003CprojectId>\u002F\u003CsessionId>.json\n```\n\n* per-project conversations, multiple sessions per project\n* session resume supported (Claude `session_id` reused)\n* no external storage, no telemetry, no analytics\n\nWhen running from source (`bun run dev`), settings live in `\u003Crepo>\u002F.data\u002F` instead — dev runs don't touch your home dir.\n\n---\n\n## Limitations\n\n* **no live streaming for remote edits** — Claude CLI limitation, not ours\n* **remote file ops use shell** (cat\u002Ffind\u002Fetc.) — no SFTP yet, so they're slower than they could be on big repos\n* **passwords stored in plain text** in `settings.json`. Fine for localhost, but use SSH keys when possible\n* **app is unsigned** — first launch needs `xattr` \u002F right-click on macOS, SmartScreen confirmation on Windows\n\n---\n\n## Roadmap\n\n* SFTP for remote file ops\n* signed builds (macOS notarization, Windows code signing)\n* better streaming for remote (claude runs locally + proxied tool ops)\n* inline AI suggestions (Copilot-like, ghost text in editor)\n* MCP server mode — expose SubLodeX's PTY\u002Ffile\u002Fgit as an MCP server for external Claude clients\n* auto-updater (Tauri plugin)\n\n---\n\n## Status\n\nWorks well. The risky areas are the same areas any tool like this has:\n\n* streaming partial JSON\n* PTY lifecycle (Rust + portable-pty handles this much better than the old Node helper, but cross-platform PTYs are still cross-platform PTYs)\n* SSH (`sshpass`, ControlMaster, key types, agent forwarding — many corners)\n\nIf it doesn't explode on first launch, you're probably fine.\n\n---\n\n## Author\n\nSubLodeX — by **Amani Andrea** aka *The Pirate Pinperepette*.\n\nIf this saves you time, throw a coin to your captain:\n\n\u003Ca href=\"https:\u002F\u002Fwww.buymeacoffee.com\u002Fpinperepette\" target=\"_blank\">\u003Cimg src=\"https:\u002F\u002Fcdn.buymeacoffee.com\u002Fbuttons\u002Fv2\u002Fdefault-red.png\" alt=\"Buy Me a Coffee\" style=\"height: 60px !important;width: 217px !important;\" >\u003C\u002Fa>\n\n---\n\n## License\n\nMIT — see [LICENSE](.\u002FLICENSE).\n\n---\n\n## Closing note\n\nOnce you get used to watching files write themselves, copy-pasting code from a chat feels broken.\n","SubLodeX 是一个基于 Claude Code 的本地优先桌面应用程序，集成了多项目工作空间、实时文件流、终端（本地和SSH）、完整的Git工具以及每个项目的多个会话。其核心功能包括支持实时查看Claude生成代码的过程，提供强大的开发环境体验，并且所有操作在一个窗口内完成。该应用采用TypeScript编写，具有良好的跨平台兼容性，适用于需要高效整合AI辅助编程与传统开发工具的场景，特别适合开发者希望在统一界面下进行远程或本地项目管理、代码协作及版本控制的工作环境。","2026-06-11 04:00:38","CREATED_QUERY"]