Source: https://seerepo.com/r/gitbutlerapp/gitbutler/built
Markdown source: https://seerepo.com/r/gitbutlerapp/gitbutler/built.md
Description: gitbutler is a Rust repo built with Svelte, SvelteKit, @tauri-apps/api, Tauri, axum, and 7 more. It stores its data in SQLite and signs people in with keyring.

# What is gitbutler built with?

gitbutler is a Rust repo built with Svelte, SvelteKit, @tauri-apps/api, Tauri, axum, and 7 more. It stores its data in SQLite, signs people in with keyring, uses AI through ollama, Anthropic, OpenAI, and rmcp, measures its use with PostHog, watches its errors with Sentry, makes its content with marked, zip, image, infer, pulldown-cmark, and 3 more, validates its data with schemars, is tested with Vitest, Testing Library, @playwright/test, playwright, and @storybook/addon-vitest, deploys with tauri-apps, tracing, tracing-subscriber, tracing-appender, console-subscriber, and 1 more, and uses @tauri-apps/plugin-store, rusqlite, tauri-plugin-store, and MCP. It has 738,025 written lines, with 549 test files.

Read on November 5, 2026, at commit 88c5819.

Repository: https://github.com/gitbutlerapp/gitbutler

## Frontend (apps/desktop)

### The base

- **[Svelte](https://seerepo.com/uses/svelte)**: 118 files
- **SvelteKit**: 1 file · [in apps/web/package.json](https://github.com/gitbutlerapp/gitbutler/blob/88c5819c7e24127fd5a4a5f9f5aa9cd859500206/apps/web/package.json)

## Backend (apps/desktop)

### Data

- **@tauri-apps/plugin-store**: 1 file

### AI

- **ollama**: 1 file

### Services

- **[Sentry](https://seerepo.com/uses/sentry)**: 5 files · [apps/desktop/src/components/onboarding/CloneForm.svelte, line 16](https://github.com/gitbutlerapp/gitbutler/blob/88c5819c7e24127fd5a4a5f9f5aa9cd859500206/apps/desktop/src/components/onboarding/CloneForm.svelte#L16)
- **[PostHog](https://seerepo.com/uses/posthog)**: 3 files · [apps/desktop/src/lib/error/showError.ts, line 5](https://github.com/gitbutlerapp/gitbutler/blob/88c5819c7e24127fd5a4a5f9f5aa9cd859500206/apps/desktop/src/lib/error/showError.ts#L5)
- **[Anthropic](https://seerepo.com/uses/anthropic)**: 1 file · [apps/desktop/src/lib/ai/anthropicClient.ts, line 9](https://github.com/gitbutlerapp/gitbutler/blob/88c5819c7e24127fd5a4a5f9f5aa9cd859500206/apps/desktop/src/lib/ai/anthropicClient.ts#L9)
- **[OpenAI](https://seerepo.com/uses/openai)**: 1 file · [apps/desktop/src/lib/ai/openAIClient.ts, line 6](https://github.com/gitbutlerapp/gitbutler/blob/88c5819c7e24127fd5a4a5f9f5aa9cd859500206/apps/desktop/src/lib/ai/openAIClient.ts#L6)

## Support (apps/desktop)

### The base

- **[@tauri-apps/api](https://seerepo.com/uses/tauri-apps-api)**: 3 files

### Testing

- **Vitest**: 75 files
- **Testing Library**: 18 files

### Deploy

- **tauri-apps**: 1 file

### Other

- **@reduxjs/toolkit**: 27 files
- **dayjs**: 1 file
- **fuse.js**: 1 file
- **git-url-parse**: 1 file
- **reconnecting-websocket**: 1 file
- **rxjs**: 1 file
- **tauri-apps**: 1 file
- **tinykeys**: 1 file

## Frontend (apps/web)

### The base

- **[Svelte](https://seerepo.com/uses/svelte)**: 41 files
- **SvelteKit**: 1 file · [in apps/web/package.json](https://github.com/gitbutlerapp/gitbutler/blob/88c5819c7e24127fd5a4a5f9f5aa9cd859500206/apps/web/package.json)

## Backend (apps/web)

### Services

- **[Sentry](https://seerepo.com/uses/sentry)**: 4 files · [apps/desktop/src/components/onboarding/CloneForm.svelte, line 16](https://github.com/gitbutlerapp/gitbutler/blob/88c5819c7e24127fd5a4a5f9f5aa9cd859500206/apps/desktop/src/components/onboarding/CloneForm.svelte#L16)
- **[PostHog](https://seerepo.com/uses/posthog)**: 1 file · [apps/desktop/src/lib/error/showError.ts, line 5](https://github.com/gitbutlerapp/gitbutler/blob/88c5819c7e24127fd5a4a5f9f5aa9cd859500206/apps/desktop/src/lib/error/showError.ts#L5)

## Support (apps/web)

### Content

- **[marked](https://seerepo.com/uses/marked)**: 2 files

### Testing

- **@playwright/test**: 3 files
- **Vitest**: 2 files
- **Testing Library**: 1 file

### Other

- **dayjs**: 5 files
- **@reduxjs/toolkit**: 2 files

## Frontend (crates)

### The base

- **[Tauri](https://seerepo.com/uses/tauri)**: 11 files

### Styles

- **two-face**: 2 files

### Interface

- **[Ratatui](https://seerepo.com/uses/ratatui)**: 36 files
- **[crossterm](https://seerepo.com/uses/crossterm)**: 15 files
- **ratatui-textarea**: 6 files
- **gpui_platform**: 2 files
- **ansi-to-tui**: 1 file
- **[tauri-plugin-dialog](https://seerepo.com/uses/tauri-plugin-dialog)**: 1 file
- **tauri-plugin-window-state**: 1 file

## Backend (crates)

### The base

- **[axum](https://seerepo.com/uses/axum)**: 1 file
- **[tower](https://seerepo.com/uses/tower)**: 1 file

### Data

- **[rusqlite](https://seerepo.com/uses/rusqlite)**
- **[SQLite](https://seerepo.com/uses/sqlite)**: 23 files · [crates/but-db/src/cache/mod.rs, line 3](https://github.com/gitbutlerapp/gitbutler/blob/88c5819c7e24127fd5a4a5f9f5aa9cd859500206/crates/but-db/src/cache/mod.rs#L3)
- **tauri-plugin-store**: 1 file

### Sign-in

- **keyring**: 1 file

### AI

- **rmcp**: 2 files

### Services

- **[OpenAI](https://seerepo.com/uses/openai)**: 5 files · [apps/desktop/src/lib/ai/openAIClient.ts, line 6](https://github.com/gitbutlerapp/gitbutler/blob/88c5819c7e24127fd5a4a5f9f5aa9cd859500206/apps/desktop/src/lib/ai/openAIClient.ts#L6)
- **[PostHog](https://seerepo.com/uses/posthog)**: 2 files · [apps/desktop/src/lib/error/showError.ts, line 5](https://github.com/gitbutlerapp/gitbutler/blob/88c5819c7e24127fd5a4a5f9f5aa9cd859500206/apps/desktop/src/lib/error/showError.ts#L5)

## Support (crates)

### The base

- **gpui**: 120 files
- **[Tokio](https://seerepo.com/uses/tokio)**: 32 files
- **[objc2-foundation](https://seerepo.com/uses/objc2-foundation)**: 4 files
- **[objc2-app-kit](https://seerepo.com/uses/objc2-app-kit)**: 1 file

### Content

- **[zip](https://seerepo.com/uses/zip)**: 4 files
- **[image](https://seerepo.com/uses/image)**: 3 files
- **infer**: 1 file
- **[pulldown-cmark](https://seerepo.com/uses/pulldown-cmark)**: 1 file

### Validation

- **[schemars](https://seerepo.com/uses/schemars)**: 86 files

### Deploy

- **[tracing](https://seerepo.com/uses/tracing)**: 187 files
- **[tracing-subscriber](https://seerepo.com/uses/tracing-subscriber)**: 5 files
- **tracing-appender**: 3 files
- **console-subscriber**: 1 file
- **tauri-plugin-log**: 1 file

### Tools

- **clap**: 48 files
- **clap_complete**: 2 files
- **document-features**: 1 file
- **proc-macro2**: 1 file
- **quote**: 1 file
- **syn**: 1 file

### Other

- **anyhow**: 496 files
- **gix**: 345 files
- **serde**: 207 files
- **bstr**: 174 files
- **serde_json**: 78 files
- **tempfile**: 41 files
- **chrono**: 32 files
- **petgraph**: 26 files
- **itertools**: 25 files
- **futures**: 20 files
- **reqwest**: 20 files
- **strum**: 16 files
- **parking_lot**: 15 files
- **uuid**: 12 files
- **url**: 11 files
- **toml**: 10 files
- **sha2**: 9 files
- **thiserror**: 8 files
- **md5**: 7 files
- **shell-words**: 7 files
- **git2**: 6 files
- **hex**: 6 files
- **indexmap**: 6 files
- **unicode-width**: 6 files
- **base64**: 5 files
- **open**: 5 files
- **rand**: 5 files
- **libc**: 4 files
- **serde_json_lenient**: 4 files
- **syntect**: 4 files
- **urlencoding**: 4 files
- **windows**: 4 files
- **colored**: 3 files
- **dirs**: 3 files
- **fuzzy-matcher**: 3 files
- **notify**: 3 files
- **bitflags**: 2 files
- **cfg-if**: 2 files
- **inventory**: 2 files
- **nix**: 2 files
- **objc2**: 2 files
- **regex**: 2 files
- **smallvec**: 2 files
- **unicode-segmentation**: 2 files
- **walkdir**: 2 files
- **which**: 2 files
- **arboard**: 1 file
- **backtrace**: 1 file
- **block2**: 1 file
- **chardetng**: 1 file
- **convert_case**: 1 file
- **curl**: 1 file
- **flate2**: 1 file
- **flume**: 1 file
- **fslock**: 1 file
- **futures-util**: 1 file
- **lazy_static**: 1 file
- **minisign-verify**: 1 file
- **opener**: 1 file
- **owo-colors**: 1 file
- **raw-window-handle**: 1 file
- **scopeguard**: 1 file
- **sysinfo**: 1 file
- **tar**: 1 file
- **tauri-plugin-clipboard-manager**: 1 file
- **tauri-plugin-deep-link**: 1 file
- **tauri-plugin-fs**: 1 file
- **tauri-plugin-os**: 1 file
- **tauri-plugin-process**: 1 file
- **tauri-plugin-shell**: 1 file
- **tauri-plugin-single-instance**: 1 file
- **tauri-plugin-updater**: 1 file
- **terminal_size**: 1 file
- **textwrap**: 1 file
- **tokio-util**: 1 file
- **tower-http**: 1 file
- **xattr**: 1 file

## Frontend (packages/but-mcp-app)

### The base

- **[Vite](https://seerepo.com/uses/vite)**: [in packages/but-mcp-app/package.json](https://github.com/gitbutlerapp/gitbutler/blob/88c5819c7e24127fd5a4a5f9f5aa9cd859500206/packages/but-mcp-app/package.json)
- **[React](https://seerepo.com/uses/react)**: 5 files · [in packages/but-mcp-app/package.json](https://github.com/gitbutlerapp/gitbutler/blob/88c5819c7e24127fd5a4a5f9f5aa9cd859500206/packages/but-mcp-app/package.json)

## Backend (packages/but-mcp-app)

### Services

- **[MCP](https://seerepo.com/uses/mcp)**: 2 files · [packages/but-mcp-app/src/ReviewApp.tsx, line 6](https://github.com/gitbutlerapp/gitbutler/blob/88c5819c7e24127fd5a4a5f9f5aa9cd859500206/packages/but-mcp-app/src/ReviewApp.tsx#L6)

## Frontend (packages/core)

### The base

- **[Svelte](https://seerepo.com/uses/svelte)**: 1 file

## Support (packages/no-cross-domain-imports)

### Testing

- **Vitest**: 1 file

### Tools

- **ESLint**: 1 file

## Support (packages/no-relative-imports)

### Testing

- **Vitest**: 2 files

### Tools

- **ESLint**: 1 file

### Other

- **comment-json**: 1 file

## Frontend (packages/shared)

### The base

- **[Svelte](https://seerepo.com/uses/svelte)**: 7 files

## Support (packages/shared)

### Testing

- **Vitest**: 4 files

### Tools

- **esm-env**: 1 file

### Other

- **@reduxjs/toolkit**: 10 files

## Support (packages/svelte-comment-injector)

### Other

- **path**: 1 file

## Frontend (packages/ui-react)

### The base

- **[React](https://seerepo.com/uses/react)**: 68 files · [in packages/but-mcp-app/package.json](https://github.com/gitbutlerapp/gitbutler/blob/88c5819c7e24127fd5a4a5f9f5aa9cd859500206/packages/but-mcp-app/package.json)

### Interface

- **[Base UI](https://seerepo.com/uses/base-ui)**: 21 files
- **[TanStack](https://seerepo.com/uses/tanstack)**: 10 files
- **[react-resizable-panels](https://seerepo.com/uses/react-resizable-panels)**: 1 file

## Support (packages/ui-react)

### Content

- **markdown-to-jsx**: 1 file

### Testing

- **Vitest**: 7 files

### Other

- **Effect**: 6 files

## Frontend (packages/ui-svelte)

### The base

- **[Svelte](https://seerepo.com/uses/svelte)**: 62 files

### Interface

- **lexical**: 27 files

### Icons

- **emojibase-data**: 1 file

## Support (packages/ui-svelte)

### Content

- **[marked](https://seerepo.com/uses/marked)**: 2 files
- **isomorphic-dompurify**: 1 file
- **[shiki](https://seerepo.com/uses/shiki)**: 1 file

### Testing

- **Vitest**: 9 files
- **playwright**: 2 files
- **@storybook/addon-vitest**: 1 file

### Other

- **dayjs**: 1 file
- **diff-match-patch**: 1 file
- **emojibase**: 1 file

## Other repos with a similar stack

- [openinterpreter/openinterpreter](https://seerepo.com/r/openinterpreter/openinterpreter/built): Sentry, axum, tower, Tokio, objc2-foundation, objc2-app-kit, two-face, Ratatui, crossterm, ansi-to-tui, keyring, rmcp, zip, image, pulldown-cmark, schemars, tracing, tracing-subscriber, tracing-appender · [Compare](https://seerepo.com/compare/gitbutlerapp/gitbutler/vs/openinterpreter/openinterpreter)
- [openai/codex](https://seerepo.com/r/openai/codex/built): Sentry, axum, tower, SQLite, Tokio, objc2-foundation, objc2-app-kit, Ratatui, crossterm, keyring, rmcp, zip, image, pulldown-cmark, schemars, tracing, tracing-subscriber, tracing-appender · [Compare](https://seerepo.com/compare/gitbutlerapp/gitbutler/vs/openai/codex)
- [farion1231/cc-switch](https://seerepo.com/r/farion1231/cc-switch/built): @tauri-apps/api, Tauri, axum, rusqlite, SQLite, Tokio, objc2-foundation, objc2-app-kit, Vite, React, tauri-apps, tauri-plugin-dialog, tauri-plugin-window-state, rmcp, zip, tauri-plugin-log · [Compare](https://seerepo.com/compare/farion1231/cc-switch/vs/gitbutlerapp/gitbutler)
- [hoppscotch/hoppscotch](https://seerepo.com/r/hoppscotch/hoppscotch/built): PostHog, @tauri-apps/api, Tauri, axum, tauri-plugin-store, Tokio, Vite, tauri-apps, tauri-plugin-dialog, tauri-plugin-window-state, zip, infer, tracing, tracing-subscriber, tracing-appender · [Compare](https://seerepo.com/compare/gitbutlerapp/gitbutler/vs/hoppscotch/hoppscotch)
- [BerriAI/litellm](https://seerepo.com/r/BerriAI/litellm/built): Anthropic, OpenAI, axum, tower, rusqlite, SQLite, Tokio, React, rmcp, zip, schemars, tracing, tracing-subscriber, Base UI, react-resizable-panels · [Compare](https://seerepo.com/compare/BerriAI/litellm/vs/gitbutlerapp/gitbutler)
- [unslothai/unsloth](https://seerepo.com/r/unslothai/unsloth/built): OpenAI, @tauri-apps/api, Tauri, Tokio, objc2-foundation, objc2-app-kit, Vite, React, marked, tauri-plugin-dialog, tauri-plugin-window-state, Base UI, TanStack, react-resizable-panels · [Compare](https://seerepo.com/compare/gitbutlerapp/gitbutler/vs/unslothai/unsloth)

## Frequently asked questions

### What language is gitbutler written in?

gitbutler is written in Rust, with 738,025 written lines.

### What framework does gitbutler use?

gitbutler is built with Svelte, SvelteKit, @tauri-apps/api, Tauri, axum, tower, gpui, Tokio, objc2-foundation, objc2-app-kit, Vite, and React.

### What database does gitbutler use?

gitbutler stores its data in SQLite.

The proof: [crates/but-db/src/cache/mod.rs, line 3](https://github.com/gitbutlerapp/gitbutler/blob/88c5819c7e24127fd5a4a5f9f5aa9cd859500206/crates/but-db/src/cache/mod.rs#L3)

### What does gitbutler sign people in with?

gitbutler signs people in with keyring.

### Does gitbutler use AI?

Yes. gitbutler uses AI through ollama, Anthropic, OpenAI, and rmcp.

### What services does gitbutler use?

gitbutler measures its use with PostHog, watches its errors with Sentry, and uses @tauri-apps/plugin-store, rusqlite, tauri-plugin-store, and MCP.

The proof: [apps/desktop/src/lib/error/showError.ts, line 5](https://github.com/gitbutlerapp/gitbutler/blob/88c5819c7e24127fd5a4a5f9f5aa9cd859500206/apps/desktop/src/lib/error/showError.ts#L5)

### Does gitbutler have tests?

Yes. gitbutler has 549 test files and is tested with Vitest, Testing Library, @playwright/test, playwright, and @storybook/addon-vitest.

### Which repos have a stack like gitbutler's?

The ones that share most of its stack: openinterpreter/openinterpreter, openai/codex, and farion1231/cc-switch.

## What is your repo built with?

Any public repo, with no account: https://seerepo.com/r/owner/repo/built, with the owner and name it has on GitHub.
