diff --git a/CLAUDE.md b/CLAUDE.md
new file mode 100644
index 0000000..5be4657
--- /dev/null
+++ b/CLAUDE.md
@@ -0,0 +1,75 @@
+# gigit
+
+A desktop git GUI client. Tauri 2 + Solid, with a colourful commit graph whose layout is
+computed in Rust and streamed to the frontend.
+
+## Stack
+
+| Layer | Choice |
+|---|---|
+| Shell | Tauri 2 |
+| Frontend | Solid 2 (beta), TypeScript 7, Vite |
+| Styling | Tailwind CSS v4 (CSS-first config) + `@claas.dev/material-tailwind` |
+| Lint / format | Oxc — `oxlint` and `oxfmt`. **Not** ESLint or Prettier. |
+| Git access | `gix` (gitoxide), reads only for now |
+| Async | tokio |
+
+`crates/gigit-git` holds git access and the graph layout engine and knows nothing about
+Tauri, so it can be tested and benchmarked with plain `cargo test`. `src-tauri` holds the
+actors, commands and channels.
+
+## Architecture rules
+
+- **Logic goes in Rust.** The frontend renders and handles input; it does not compute.
+- **Actors, not mutexes.** Shared state gets an owning actor (handle + `tokio::sync::mpsc`
+ + `oneshot`, per ). No `Mutex`/`RwLock` without a
+ stated reason the actor pattern doesn't fit. A `gix::Repository` is blocking and
+ thread-affine, so its actor runs on a dedicated `std::thread` draining its receiver with
+ `blocking_recv()`.
+- **Stream anything large.** List-shaped data crosses IPC as pull-based chunks over
+ `tauri::ipc::Channel`, driven by the frontend asking for more — never one big response.
+- **Rule of least power** (): semantic HTML
+ first, then CSS, then JavaScript. A CSS solution beats a JS one.
+- **Accessibility is a requirement.** Keyboard operability and correct AT semantics are part
+ of the work, not a follow-up. Decorative graphics are `aria-hidden` over content that
+ already reads correctly without them.
+
+## Browser support policy
+
+The only targets are Tauri's webviews: WKWebView (Safari) on macOS, WebView2 (Chromium) on
+Windows, WebKitGTK on Linux. Baseline Newly available features are fine where they degrade
+gracefully. No polyfills. Hand-written fallbacks only when under ~20 lines and dependency-free.
+
+Use the `modern-web-guidance` skill before starting frontend work.
+
+## Dependencies
+
+**Ask before adding any npm or cargo dependency**, and list notable transitive ones. Prefer a
+platform feature over a library.
+
+## Licence and attribution
+
+gigit is MIT. Adapted or copied code must carry attribution including its licence, in
+`NOTICE.md`.
+
+Specifically: the commit graph is implemented from the algorithm *described* in
+. Its reference
+implementation, [gitamine](https://github.com/pvigier/gitamine), is **GPL-3.0** — do not read
+or port its source.
+
+## Commands
+
+```
+pnpm tauri dev # run the app
+pnpm typecheck # tsc --noEmit
+pnpm lint # oxlint
+pnpm format # oxfmt .
+pnpm format:check # oxfmt --check .
+cargo test --workspace
+cargo clippy --workspace
+```
+
+## Workflow
+
+Work ships as stacked PRs using the `gh-stack` skill — small, reviewable layers where
+foundational changes sit below dependent ones.