Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
177 changes: 34 additions & 143 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,167 +1,58 @@
<h1 align="center">
<img src="assets/readme-banner.png" alt="ide — a fast, lightweight, cross-platform code editor" width="800">
<img src="assets/app-icon/icon-animated.svg" alt="ide — a fast, lightweight, cross-platform code editor" width="160">
</h1>

A lean Tauri-based integrated development environment built for speed, local control, and agent-friendly editor context.

The goal is not to recreate Visual Studio Code. The goal is a focused editor shell that opens fast, keeps background work explicit, and exposes useful context to tools like Claude Code and Codex.

## Current State

Implemented:

- Tauri 2 desktop shell with a Rust backend.
- React frontend.
- File tree with package-backed coloured file icons, keyboard expansion/opening, accessible selection/expanded state, and folder fallbacks.
- Native folder picker for switching workspaces.
- Native toolbar buttons for opening files and folders in the desktop app.
- Native File menu with New File, New Folder, Open File, Open Folder, Recents, Save, Reload, Rename/Delete, Close Tab, and Close All.
- Native categorized Settings dialog for view toggles, performance limits, search limits, and OS storage locations.
- File/folder launch targets through the local runner and macOS Finder Quick Action.
- Packaged-app file associations for common text, code, web, config, and .NET project files.
- Runtime handling for native OS file-open events, including single-process window creation/focus for launched files and folders.
- Explicit workspace loading, empty, and load-failure retry states.
- Collapsible sidebar for focused editing.
- Collapsed file-name filtering and bounded text search across the current workspace, with visible capped-result notices plus searched/skipped file counts.
- Collapsed current-file search over loaded and unsaved editor contents, with Enter/Shift+Enter match navigation.
- Lightweight command palette for discoverable editor and workspace commands, including native file/folder open actions in the desktop app.
- Keyboard quick-open palette for opening editor-supported files by path, including arrow-key result selection and SQLite-backed candidates from indexed workspace metadata with bounded on-demand folder expansion.
- Settings Storage view that shows OS app-data paths plus live workspace-index coverage counts, so scan/cache limits are visible instead of hidden.
- IntelliJ-style keyboard file creation, tab navigation, and close commands.
- Native View menu Key Bindings dialog with searchable supported shortcuts.
- Native Search menu with Go to File, Go to Line, Find in File, and Find in Files actions.
- Native Navigate menu actions for LSP-backed Go to Definition and Find References.
- Dirty-file prompts before closing tabs or the native app window.
- Reload active files from disk, with confirmation before discarding unsaved edits.
- New-file creation inside the current workspace.
- New-folder creation inside the current workspace.
- File and folder rename inside the current workspace.
- Confirmed file and folder deletion inside the current workspace.
- Save active file and Save All commands.
- Stale-save protection so externally modified files are not silently overwritten.
- Guarded Rust-native workspace scanning, file/folder creation, rename, deletion, and file read/write commands.
- SQLite-backed workspace metadata index stored in OS app-local data, refreshed from initial scans, lazy folder loads, bounded quick-open expansion, and editor file mutations.
- Bounded initial tree scans surface a visible notice when the configured entry cap is reached, while folder expansion continues loading children on demand.
- User preferences and recents are stored in OS app data with paths exposed from Settings for backup; disposable workspace indexes stay in OS app-local data so they can be rebuilt.
- Common binary/media/font/archive files select in the tree without attempting text-editor reads.
- CodeMirror 6 editor.
- Syntax highlighting for common code and config files, including Rust, TypeScript, JavaScript, React/TSX/JSX, JSON, Markdown, shell scripts, HTML, CSS/SCSS/Sass, C#, C/C++, Java/Kotlin/Scala, Python, Go, Ruby, SQL, XML/YAML/TOML, Dockerfiles, PowerShell, diffs, and .NET project files.
- Lazy editor loading and lazy language loading for better startup performance.
- System light/dark mode via `prefers-color-scheme` with a high-contrast bias, including the editor surface.
- Active file, open file, and selection context stored in backend state.
- LSP process manager for Rust, TypeScript/React, and C# with status refresh after bridge events.
- LSP-backed editor keymaps from CodeMirror for definition, references, hover, rename, formatting, and signature help when the matching language server is installed.
- LSP diagnostics captured for read-only agent context, with an optional diagnostics panel for precise line/column navigation.
- Local HTTP context endpoint for terminal/browser integrations.
- Claude Code `/ide` discovery bridge with authenticated localhost WebSocket MCP and read-only editor-context tools.
- Codex-compatible read-only MCP endpoint with a persisted app-local bearer token.
- Bearer-token protection for mutating local HTTP browser API calls.

Planned:

- Diff review and write-capable Claude bridge tools with explicit editor UI review.
- Deeper Codex integration through `codex app-server` research once the editor has an explicit review/approval surface for rich agent workflows.
- PR-ready local polish and testing workflow.

## Run Locally
A lean, fast code editor built for local control and agent-friendly context. Tauri shell, Rust backend, CodeMirror editor: it opens fast, stays light, and stays out of your way.

```bash
./run.sh
```
<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="assets/screenshots/app-dark.png">
<img src="assets/screenshots/app-light.png" alt="The ide app — file tree, editor with git attribution, and commit info" width="800">
</picture>
</p>

The script installs Node dependencies when needed and starts Tauri dev mode.
This isn't a VS Code rebuild. It's a focused editor shell: open a folder, read and change code, commit, and give your AI tools real editor context — without extensions, background indexing surprises, or a plugin marketplace.

Open a specific folder or file:
## What you get

```bash
./run.sh /path/to/workspace
./run.sh /path/to/workspace/src/App.tsx
```
**A shell that stays simple.** An activity rail switches between Files, Search, and Source control. Quick open and a command palette cover the keyboard paths, IntelliJ-style shortcuts work out of the box, and a searchable key-bindings dialog shows what's available.

If ide is already running, `./run.sh /path/to/file-or-folder` hands the target to the running app through the authenticated loopback API instead of starting a second dev instance.
**Search that's honest.** One panel, two scopes: file `names` or file `contents`. Results are bounded by limits you control in Settings, and the UI tells you when a cap truncated the results instead of pretending the list is complete.

Install the lowercase shell commands:
**Git without leaving the editor.** Tick the files you want and commit from the sidebar. Fetch, pull, and push with a Sync button that walks you through merge conflicts as you resolve them. See who last touched the current file inline, and click the status bar for the full commit card — message, author with avatar, and an Open in GitHub link when the repo has a remote. Both git features are on by default and can be switched off in Settings.

```bash
./build.sh
```
**A real editor.** CodeMirror 6 with syntax highlighting for around 25 languages, from Rust and TypeScript to SQL and Dockerfiles. Install a language server (`rust-analyzer`, `typescript-language-server`, a C# LSP) and you get go-to-definition, find references, rename, hover, and a diagnostics panel — all optional, per language.

The build script creates the packaged macOS `.app` and installs the command launchers. It intentionally skips DMG creation for local command installs. If `/Applications` is writable, it also replaces `/Applications/ide.app`; otherwise use the interactive developer installer:
**Your look.** Light, dark, or follow-the-system themes with a one-click toggle on the rail. Pick the code font (IBM Plex Mono or your system mono). Right-click menus are tailored to each surface — tree, tabs, editor, search, commit panel.

```bash
./dev-install.sh
```
**Built for agents.** This is the differentiator: the editor exposes its context to AI coding tools running next to it.

`dev-install.sh` runs the build, prompts for the `/Applications/ide.app` replacement when admin permission is needed, refreshes Spotlight/Launch Services metadata where possible, and reveals the installed app in Finder. macOS can still cache app icons briefly, so quit/reopen ide and give Spotlight a moment if the old icon is still visible.
- Claude Code discovers a running ide through `/ide` — no config needed.
- Codex (and any MCP client) can read editor context through a local, token-protected MCP endpoint. Copy the config from the app's integrations panel into `~/.codex/config.toml`:

After installation, `ide <target>` opens or focuses a packaged app window for that target without holding the terminal. Bare `ide` focuses an existing running app or opens the last context, and `ide-dev` runs this checkout's dev runner:
```toml
[mcp_servers.ide]
url = "http://127.0.0.1:17877/mcp"
http_headers = { Authorization = "Bearer paste-token-from-ide" }
```

```bash
ide .
ide-dev .
```

Use `./scripts/install-cli-command.sh` only when the packaged app already exists and you just need to refresh the links.

On macOS, install the Finder Quick Action for direct file/folder opening:

```bash
./scripts/install-macos-finder-quick-action.sh
```
**A native citizen.** File associations for common code and text files, a macOS Finder Quick Action (right-click → Open in ide), and one app process with per-workspace windows so the Dock stays tidy.

After installation, use Finder's right-click menu: Quick Actions > Open in ide. Recent folders and files are stored in the OS app-data location and exposed through the native File menu, not as in-app sidebar content.
## Get started

The Finder Quick Action generator is covered by `npm run finder:check`, which installs into a temporary directory and validates the generated service, file/folder UTI coverage, and loopback handoff script without touching your real Finder services.
Grab a packaged build from [Releases](https://github.com/GordonBeeming/ide/releases), or build from source with the steps in [docs/development.md](docs/development.md).

Packaged builds also declare file associations for common editor-supported file types, so macOS and other platforms can offer ide from native `Open With` flows for those files. The packaged app uses one OS process with multiple workspace windows, so Dock and app-switcher grouping stays under one ide app icon. Folder opening is still handled through the native Open Folder menu, `./run.sh /path/to/folder`, and the macOS Finder Quick Action because OS file associations are file-oriented.

## Requirements

- Node.js 24 or newer
- npm 11 or newer
- Rust 1.95 or newer
- macOS, Linux, or Windows with the normal Tauri platform prerequisites

Known optional language-server tools:

- `rust-analyzer` for Rust
- `typescript-language-server` for TypeScript and React
- OmniSharp or another standalone C# LSP for C#

Claude Code can discover the running editor through `/ide` after the native app starts. The app writes a user-only lock file under `~/.claude/ide/` and exposes only read-only context tools in this first bridge.

Codex can consume editor context through the MCP endpoint shown from the native integration menu. Copy the Codex MCP config from the integrations panel and add it to `~/.codex/config.toml`:

```toml
[mcp_servers.ide]
url = "http://127.0.0.1:17877/mcp"
http_headers = { Authorization = "Bearer paste-token-from-ide" }
```

The public Codex docs describe `/ide` for Codex-owned IDE surfaces and `codex app-server` for rich clients, but do not currently document a Claude-style third-party lockfile protocol. The MCP endpoint remains the supported local context bridge for this app.

The loopback browser API is read-friendly for local terminal/browser views. Mutating routes, including file writes and editor-context updates, require the same persisted app-local bearer token.

## Verification
Once installed, the `ide` command opens or focuses a workspace without holding your terminal:

```bash
./run-tests.sh
ide . # open the current folder
ide src/App.tsx # open a file (its folder becomes the workspace)
```

`npm audit --audit-level=moderate` currently reports no known npm vulnerabilities.

`run-tests.sh` runs the npm audit automatically. It also validates the Finder Quick Action generator, local launch runners, native menu contract, Tauri bundle file associations, production bundle budgets for startup JavaScript, startup CSS, and the lazy editor chunk, then runs a browser smoke test against the real React/CSS app shell in light and dark mode. The smoke test uses local Chrome, Chromium, or Edge through `playwright-core`; set `IDE_SMOKE_BROWSER=/path/to/browser` if it cannot find a browser automatically.

`run-tests.sh` also runs `cargo fmt --check`, `cargo clippy --all-targets -- -D warnings`, `cargo test`, `cargo check`, and `cargo audit --deny warnings` when `cargo-audit` is installed. Current transitive Rust advisory warnings are reviewed in `src-tauri/.cargo/audit.toml`; new advisory warnings fail the local gate until reviewed.

## Design Constraints
On macOS you can also right-click any file or folder in Finder: Quick Actions → Open in ide.

- Avoid heavy editor/runtime dependencies.
- Keep editor and language support lazy-loaded.
- Prefer Rust-native filesystem and process work.
- Keep LSP optional and per-language.
- Do not add GitHub workflows yet.
## Learn more

More detail is in [docs/development.md](docs/development.md).
Security guardrails are tracked in [docs/security.md](docs/security.md).
Source-backed technology notes are in [docs/research.md](docs/research.md).
- [Development](docs/development.md) — running from source, building, testing, architecture, and the full capability inventory.
- [Security](docs/security.md) — the guardrails around local file access and the loopback API.
- [Research](docs/research.md) — source-backed notes on the protocols and technology choices.
57 changes: 27 additions & 30 deletions assets/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# ide — app icon assets

The **Stagger** mark. Charcoal `#1e1f24` + one blue `#0063B2` on a light "paper" squircle.
The **Leaf dot + caret** mark. A lowercase "ıde" wordmark with a teal xylem-leaf
dot and a caret bar, on a dark rounded-square tile.

---

Expand Down Expand Up @@ -29,56 +30,52 @@ generator tune each platform.
## 📁 What's in here

```
app-icon/ The full app icon (squircle tile + mark)
icon.svg vector master — SQUIRCLE background, macOS padding
icon-fullbleed.svg vector — squircle fills the frame (favicons, web)
icon-square.svg vector — SQUARE background to the edges (no rounding)
app-icon/ The full app icon (tile + wordmark)
icon.svg vector master — rounded-square background
icon-animated.svg README/web version — blinking caret, wordmark rasterised
(embeds icon-512.png so no font is needed in <img> use)
icon-square.svg vector — square background to the edges (web/marketing)
icon-square-*.png raster of the square version
icon-16…1024.png raster ladder (squircle)
icon-16…1024.png raster ladder (rounded-square tile)

mark/ The bare mark on transparency (no tile)
mark.svg vector, 2-colour
mark-mono.svg vector, single-colour (menu-bar / tray / stamps)
mark-32…1024.png raster, transparent
mark-mono-512.png
screenshots/ README app shots (light/dark pair for the <picture> swap)

src-tauri-icons/ ← drop straight into src-tauri/icons/
32x32.png 128x128.png 128x128@2x.png icon.png
icon.icns (macOS) icon.ico (Windows)
Square*Logo.png StoreLogo.png (Windows Store / MSIX)
```

There's no `mark/` pack (bare mark on transparency) in this drop. The
wordmark's ink colour (`#e8eef6`) only reads correctly on the dark tile, and
nothing in the app currently consumes a transparent or single-colour cutout
— there's no tray/menu-bar icon. Add one if a future use case needs it.

---

## 🔺 Three background forms (SVG)
## 🔺 Two background forms (SVG)

| File | Background |
|----------------------------|------------------------------------|
| `app-icon/icon.svg` | Squircle tile (macOS app-icon look)|
| `mark/mark.svg` | Transparent — bare mark only |
| `app-icon/icon-square.svg` | Square gradient, runs to the edges |
| File | Background |
|------------------------------|----------------------------------------------------------------|
| `app-icon/icon.svg` | Rounded-square tile (macOS app-icon look) |
| `app-icon/icon-square.svg` | Same mark, square background to the edges (web/marketing use) |

---

## 🎨 Tokens

| Role | Value |
|-----------------|-------------|
| Ink (mark) | `#1e1f24` |
| Accent (blue) | `#0063B2` (brand primary) |
| Tile gradient | `#ffffff` → `#eceae6` |
| Corner shape | Apple superellipse (squircle), n≈5 |
| Ink (wordmark) | `#e8eef6` |
| Accent (teal) | `#22d3ee` |
| Tile | `#0b1120` |
| Corner shape | Rounded square, `rx=115` on a 512 canvas (~22.5%) |

The tile is intentionally **light** — it stands out among the colourful icons
The tile is intentionally **dark** — it stands out among the colourful icons
in a dock while staying minimal. No drop-shadow is baked into the OS icons;
macOS/Windows add their own.

## 🧩 Using the bare mark
The mark in `mark/` sits on full transparency and inverts cleanly: use the
charcoal version on light surfaces and recolour to off-white on dark ones.
For a macOS menu-bar (tray) **template** image, use `mark-mono.svg` — the
system tints single-colour template icons automatically.

## ✏️ Editing
Every PNG is regenerated from the SVGs. To tweak the mark, edit the three
`<rect>`s in `mark.svg` (or the glyph inside `icon.svg`) and re-export.
Every PNG is regenerated from the SVGs. To tweak the mark, edit the `<text>`
wordmark, leaf `<path>`, or caret `<rect>` inside `icon.svg` and
`icon-square.svg` together, then re-export.
Binary file modified assets/app-icon/icon-1024.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/app-icon/icon-128.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/app-icon/icon-16.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/app-icon/icon-256.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/app-icon/icon-32.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/app-icon/icon-512.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified assets/app-icon/icon-64.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
12 changes: 12 additions & 0 deletions assets/app-icon/icon-animated.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading