<p align="center">
  <picture>
    <source media="(prefers-color-scheme: dark)" srcset="web/public/gitna-logo-dark.png">
    <source media="(prefers-color-scheme: light)" srcset="web/public/gitna-logo-light.png">
    <img src="web/public/gitna-logo-light.png" alt="Gitna" width="112" height="112">
  </picture>
</p>

<h1 align="center">Gitna</h1>

<p align="center">A local Git workbench that runs in your browser.</p>

<p align="center">
  <a href="https://www.npmjs.com/package/gitna"><img src="https://img.shields.io/npm/v/gitna?style=flat-square&color=cb3837" alt="npm version"></a>
  <a href="https://github.com/roie/gitna/actions/workflows/ci.yml"><img src="https://img.shields.io/github/actions/workflow/status/roie/gitna/ci.yml?branch=main&style=flat-square&label=CI" alt="CI status"></a>
  <a href="LICENSE"><img src="https://img.shields.io/github/license/roie/gitna?style=flat-square" alt="Apache-2.0 license"></a>
</p>

Gitna brings fast local-folder browsing, source control, visual diffs, repository history, and everyday Git operations into one focused interface. It runs on your machine, uses your installed Git when a folder is a repository, and keeps folder data local.

![Gitna reviewing, staging, editing, and browsing repository history](assets/gitna-demo.gif)

> [!WARNING]
> Gitna is in early development. Expect bugs, rough edges, and breaking changes.

## Quick start

Install with npm:

```sh
npm install -g gitna
```

Open any local folder:

```sh
cd your-folder
gitna
```

Gitna starts a local server and opens an authenticated session in your default browser. You can also pass a folder explicitly:

```sh
gitna /path/to/folder
```

Folders backed by Git automatically gain source control, history, branches, stashes, tags, and Git operations. Ordinary folders retain Gitna’s Explorer, tabs, editing, search, and file tools.

## What you can do

- Start from Home, reopen recent folders, and switch folders without restarting Gitna
- Explore huge ordinary folders through lazy directory loading and bounded watching
- Press `Cmd/Ctrl+K` to search every indexed file, or type `>` to run commands from the unified command palette
- Review staged and unstaged changes with Pierre-powered split or unified diffs
- Preview PNG, JPEG, WebP, and GIF changes alongside text diffs
- Preview PDFs and play supported audio and video with browser-native controls and a download fallback
- Browse and edit working-tree files in repository tabs
- Select two Explorer files with `Cmd/Ctrl`-click, then right-click and choose **Compare Selected**
- Stage and unstage files, folders, or individual hunks
- Commit and amend while preserving normal Git hook behavior
- Scroll continuously through a virtualized commit Graph with an exact HEAD-reachable count
- Browse branches, tags, stashes, and commit history
- Fetch, pull, push, compare, merge, rebase, cherry-pick, and revert
- Resolve conflicts with explicit ours, theirs, or combined content

PDF previews retain the browser's normal document scripts and forms. Preview support depends on your browser; downloading remains available.

## Install

### npm

```sh
npm install -g gitna
```

The single npm package downloads the matching native binary from GitHub Releases, verifies its SHA-256 checksum, and caches it locally. Node.js is required only for npm installations.

### mise

```sh
mise use -g github:roie/gitna
```

Mise installs the native GitHub Release asset directly; Node.js is not required at runtime.

### Direct download

Download the archive for your platform from [GitHub Releases](https://github.com/roie/gitna/releases), extract it, and place `gitna` (`gitna.exe` on Windows) on your `PATH`.

Supported release targets:

- macOS Apple silicon (arm64)
- macOS Intel (x64)
- Linux x64
- Linux arm64
- Windows x64
- WSL using the Linux binary and your normal Windows browser

Gitna requires an installed `git` executable and a modern browser.

## Local by design

Gitna binds only to a random loopback port. Every process creates a high-entropy capability URL, and mutating requests are protected by Host, Origin, content-type, and size checks.

Repository reads and mutations go through the system Git executable. Gitna does not upload repository data or replace Git's storage, configuration, credentials, or hooks.

See [SECURITY.md](SECURITY.md) for the complete security model and vulnerability reporting instructions.

## Development

Development setup, validation commands, packaging, and release instructions are documented in [CONTRIBUTING.md](CONTRIBUTING.md).

## License

Gitna is licensed under [Apache-2.0](LICENSE). Bundled dependency notices are available in [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md) and [THIRD_PARTY_LICENSES.txt](THIRD_PARTY_LICENSES.txt).
