{"id":51075107,"url":"https://github.com/akunzai/gistui","last_synced_at":"2026-06-23T13:30:50.592Z","repository":{"id":363518608,"uuid":"1263074662","full_name":"akunzai/gistui","owner":"akunzai","description":"A terminal UI for managing GitHub Gists","archived":false,"fork":false,"pushed_at":"2026-06-17T10:14:31.000Z","size":6344,"stargazers_count":5,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-06-17T10:15:17.996Z","etag":null,"topics":["cli","gist","github-cli","rust","terminal-ui","tui"],"latest_commit_sha":null,"homepage":"https://akunzai.github.io/gistui/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/akunzai.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-06-08T15:42:34.000Z","updated_at":"2026-06-17T10:10:30.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/akunzai/gistui","commit_stats":null,"previous_names":["akunzai/gistui"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/akunzai/gistui","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akunzai%2Fgistui","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akunzai%2Fgistui/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akunzai%2Fgistui/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akunzai%2Fgistui/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/akunzai","download_url":"https://codeload.github.com/akunzai/gistui/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/akunzai%2Fgistui/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34691609,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-23T02:00:07.161Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","gist","github-cli","rust","terminal-ui","tui"],"created_at":"2026-06-23T13:30:44.886Z","updated_at":"2026-06-23T13:30:50.587Z","avatar_url":"https://github.com/akunzai.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# gistui\n\n[![CI](https://github.com/akunzai/gistui/actions/workflows/ci.yml/badge.svg)](https://github.com/akunzai/gistui/actions/workflows/ci.yml)\n[![crates.io](https://badgen.net/crates/v/gistui)](https://crates.io/crates/gistui)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n\nA terminal UI for managing GitHub Gists. Browse, diff, download, upload, create, edit, and\npin your gists — and pair them with files in your working directory — all through the\nGitHub CLI (`gh`).\n\n![gistui demo](https://raw.githubusercontent.com/akunzai/gistui/main/docs/demo.gif)\n\n## Why gistui?\n\n- **vs. `gh gist`** — the official CLI is non-interactive and text-only. `gistui` adds a\n  full TUI: visual word-level diffs, anchor-driven ranking of gists against your working\n  directory, and one-key pinned sync.\n- **vs. the web UI** — never leave the terminal, work directly against your local files, and\n  pair gists with the directory you launched from.\n- **Safe by default** — an existing file is never overwritten without first showing the diff\n  and a `y/n` confirmation; no tokens are stored (auth is delegated to `gh`).\n\n## Requirements\n\n- The GitHub CLI: [`gh`](https://cli.github.com), installed and on your `PATH`\n- An authenticated `gh` session: `gh auth login`\n- A Rust toolchain — **only if building from source** — \u003chttps://rustup.rs\u003e\n- _Optional, for `y`/`Y` clipboard copy:_ a clipboard tool on your `PATH` — `pbcopy` (macOS,\n  built in), `clip` (Windows, built in), or `wl-copy` / `xclip` / `xsel` (Linux). Without one,\n  copy reports a clear status instead of failing.\n\n`gistui` shells out to `gh` at runtime (it stores no GitHub token of its own), so `gh` must\nbe installed and authenticated wherever you run `gistui`.\n\n## Installation\n\n**Recommended** — download a checksummed prebuilt binary (no Rust toolchain):\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/akunzai/gistui/main/install.sh | bash\n```\n\nOn Windows, use the [PowerShell installer](reference/INSTALL.md#windows-powershell) instead of\npiping `install.sh` into `bash`.\n\nHomebrew, Scoop, crates.io, manual download, build-from-source, and self-upgrade\n(`gistui --upgrade`) are documented in **[reference/INSTALL.md](reference/INSTALL.md)**.\n\n## Usage\n\n```bash\ngistui            # launch the TUI in the current directory (needs a TTY)\ngistui ~/dotfiles # launch against a specific working directory\ngistui --check    # print gh readiness, then exit (no TUI)\ngistui --upgrade  # upgrade a pre-built release binary (see reference/INSTALL.md)\n```\n\nRun from the directory whose files you want to pair with gists (or pass that path as an\nargument). The left pane lists local files; the right pane lists your gists. Ranking is\n**anchor-driven**: one pane drives the match order (`⚓` in its title) — press `a` to flip\nwhich pane anchors; this is independent of focus, so you can `Tab` to the ranked pane\nwithout resetting order. Pinned pairs show `📌`; same-filename candidates are **bold**.\n\n**Essential keys** (main list):\n\n| Key | Action |\n|-----|--------|\n| `Tab` / `1`/`2` | switch or jump panes · `↑`/`↓` or `j`/`k` move · `PgUp`/`PgDn` or `Ctrl+b`/`Ctrl+f` page · `←`/`→` or `h`/`l` scroll a long row |\n| `Enter` | diff local ↔ gist (then `d` download / `u` upload) |\n| `Space` | preview gist content (syntax-highlighted; binary blocked) |\n| `d` / `u` | download gist file / upload local file into gist |\n| `n` | create a new gist from the selected local file |\n| `p` / `P` | pin pair / open Pins view |\n| `g` | gist manager (per-gist view; `Enter` for detail, `v` visibility, `*` star) |\n| `a` | flip anchor pane · `/` filter focused pane · `?` help |\n\nPress **`?`** anytime for the **full, contextual keymap** — it opens the current screen's\ntopic; `Tab` browses all topics (List, Pins, Gist manager, Gist detail, Diff, Preview, …).\nThe footer also shows keys for the focused pane.\n\n**Mouse** (on by default; disable with `mouse = false` in config or `--no-mouse`):\n\n| Action | Effect |\n|--------|--------|\n| Wheel up/down | scroll the focused list or content pane |\n| Click a row | select it (List panes also switch focus) |\n| Double-click a row | open it — List diff, gist detail, pin diff, revision diff, or file preview (same as `Enter`) |\n| Click a tab (Gist details) | switch between Files / Comments (newest 30 comments load first; `m` or clicking the top line loads 30 older comments) |\n| Click `[✕]` button (pop-up screens) | close / go back |\n\n## Safety\n\ngistui is conservative about writes: downloads land only in `./\u003cgist-filename\u003e`; an existing\nfile is never overwritten without a diff and `y/n` confirmation (a difference that is *only* a\nfile-final newline counts as no change — disable with `ignore_trailing_newline = false`);\ndestructive remote actions\neach get their own confirm. Others' gists (e.g. starred) are read-only for pin/upload/delete\n— fork with `F` in gist detail. No GitHub token is stored; gist content is never written to\nconfig. Mouse is on by default and can be disabled with `mouse = false` in the config file or\nthe `--no-mouse` flag. On startup gistui checks GitHub once a day for a newer release and shows\na footer hint if one exists (no telemetry; fails silently offline) — disable with\n`check_updates = false` or `--no-update-check`.\n\nFull rules: **[reference/SAFETY.md](reference/SAFETY.md)**.\n\n## Configuration\n\nThe config file lives at `~/.config/gistui/config.toml` (or\n`$XDG_CONFIG_HOME/gistui/config.toml` if that variable is set). It is created\nautomatically the first time you pin a file. All fields are optional.\n\n| Field | Type | Description |\n|-------|------|-------------|\n| `scan_depth` | `integer` | Maximum directory depth for recursive discovery (`r` key). Default `2`. |\n| `diff_context` | `integer` | Unchanged context lines kept around each change in the diff view; `c` toggles between this radius and the full file. Default `3`. |\n| `diff_show_full` | `bool` | Remembered state of the diff `c` toggle: `true` shows the full file, `false` collapses to `diff_context` lines. Rewritten when you press `c`. Default `false`. |\n| `theme` | `string` | Built-in colour theme: `\"dark\"` (default) or `\"light\"` (for light-background terminals). |\n| `mouse` | `bool` | Enable mouse support (wheel scroll, click/double-click, close button). Default `true`; `--no-mouse` forces it off for one session. |\n| `check_updates` | `bool` | Check GitHub once a day on startup for a newer release and show a footer hint. Default `true`; `--no-update-check` forces it off for one session. |\n| `ignore_trailing_newline` | `bool` | Treat a difference that is *only* a file-final newline as no change in the diff view and the overwrite-confirm gate. Default `true`; set `false` for strict, byte-exact diffs. |\n| `skip_dirs` | `[string]` | Directory names skipped during recursive discovery (`r` key). Defaults to common build/dependency dirs (`node_modules`, `target`, …). Hidden dirs (`.`-prefix) are always skipped. |\n| `[[pinned]]` | `table array` | Local-file ↔ gist mappings managed by the `p`/`P` keys. Can also be edited by hand. |\n\nCopy [`config.example.toml`](config.example.toml) from the repo for an annotated\nstarting point:\n\n```bash\nmkdir -p ~/.config/gistui\ncp config.example.toml ~/.config/gistui/config.toml\n```\n\nSyntax highlighting in the preview and diff views honours the conventional\n[`NO_COLOR`](https://no-color.org) environment variable: set `NO_COLOR=1` to render content\nplain (the semantic diff `-`/`+` colours and other UI colours are unaffected).\n\nContributing? See **[CONTRIBUTING.md](CONTRIBUTING.md)**.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fakunzai%2Fgistui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fakunzai%2Fgistui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fakunzai%2Fgistui/lists"}