# 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 — a handle plus `tokio::sync::mpsc` and `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. ## Testing the UI The frontend is an ordinary web page, so it is tested in real browsers with the IPC boundary mocked — no native build, no app window, and no system permissions. Rendering, keyboard behaviour and accessibility are all checked this way rather than by looking at screenshots. - `tests/unit` — Vitest with `@solidjs/testing-library`, for components and stores. - `tests/e2e` — Playwright against **WebKit and Chromium**. WebKit is the important one: it is what WKWebView on macOS actually is, so it is the only way to find out whether something works in the shipped app. It has already caught two behaviours Chromium does not have. - `tests/e2e/tauri.ts` is the only file that knows about `window.__TAURI_INTERNALS__`, so a Tauri upgrade that moves it breaks in one place. - `tests/fixtures/rows.ts` builds graph rows typed as the real `GraphRow`, so a change to the Rust types stops the tests compiling instead of letting them drift. No screenshot baselines: they differ by operating system and font rendering, so they fail for reasons unrelated to the change. Assert computed styles and the accessibility tree. ## Commands ``` pnpm tauri dev # run the app pnpm typecheck # tsc --noEmit pnpm lint # oxlint pnpm format # oxfmt . pnpm format:check # oxfmt --check . pnpm test # vitest run pnpm test:e2e # playwright test (webkit + chromium) cargo test --workspace cargo clippy --workspace ``` Playwright needs its browsers once: `pnpm exec playwright install webkit chromium`. ## Workflow Work ships as stacked PRs using the `gh-stack` skill — small, reviewable layers where foundational changes sit below dependent ones.