{"id":51594513,"url":"https://github.com/volnei/reviewly","last_synced_at":"2026-07-11T17:30:24.368Z","repository":{"id":366950085,"uuid":"1257325436","full_name":"volnei/reviewly","owner":"volnei","description":"Fast, local-first desktop app for reviewing GitHub pull requests — with AI that runs on your own machine. Built with Tauri 2 (Rust + React).","archived":false,"fork":false,"pushed_at":"2026-07-08T22:02:54.000Z","size":1723,"stargazers_count":11,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-07-09T00:06:10.466Z","etag":null,"topics":["ai","code-review","desktop-app","developer-tools","github","local-first","macos","pull-requests","react","rust","tauri","typescript"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/volnei.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"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":null,"dco":null,"cla":null}},"created_at":"2026-06-02T15:14:40.000Z","updated_at":"2026-07-08T22:02:41.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/volnei/reviewly","commit_stats":null,"previous_names":["volnei/reviewly"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/volnei/reviewly","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/volnei%2Freviewly","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/volnei%2Freviewly/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/volnei%2Freviewly/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/volnei%2Freviewly/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/volnei","download_url":"https://codeload.github.com/volnei/reviewly/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/volnei%2Freviewly/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35370428,"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-07-11T02:00:05.354Z","response_time":104,"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":["ai","code-review","desktop-app","developer-tools","github","local-first","macos","pull-requests","react","rust","tauri","typescript"],"created_at":"2026-07-11T17:30:20.018Z","updated_at":"2026-07-11T17:30:24.362Z","avatar_url":"https://github.com/volnei.png","language":"TypeScript","funding_links":["https://buymeacoffee.com/volnei"],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/logo.png\" alt=\"Reviewly\" width=\"128\" /\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003eReviewly\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cb\u003eA fast, local-first desktop app for reviewing GitHub pull requests — with AI that runs on your own machine.\u003c/b\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://github.com/volnei/reviewly/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/v/release/volnei/reviewly?label=release\u0026color=8b5cf6\" alt=\"Latest release\" /\u003e\u003c/a\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/github/license/volnei/reviewly?color=8b5cf6\" alt=\"License\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/volnei/reviewly/stargazers\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/volnei/reviewly?color=8b5cf6\" alt=\"Stars\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/volnei/reviewly/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/downloads/volnei/reviewly/total?color=8b5cf6\u0026label=downloads\" alt=\"Downloads\" /\u003e\u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/badge/macOS%20%C2%B7%20Windows%20%C2%B7%20Linux-1e1e1e\" alt=\"Platforms\" /\u003e\n  \u003ca href=\"https://buymeacoffee.com/volnei\"\u003e\u003cimg src=\"https://img.shields.io/badge/buy%20me%20a%20coffee-%E2%98%95-ffdd00?logoColor=black\" alt=\"Buy Me a Coffee\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\nReviewly is a native desktop console (macOS, Windows, Linux) that turns PR review from a dozen browser tabs into one focused workspace. It pulls the PRs that need *you*, lays out the diff the way a reviewer actually reads it, lets a local AI walk you through the change, and posts your review back to GitHub — without sending your code to any server but the one you choose.\n\nBuilt with **Tauri 2** (Rust + React). Free and open source under the [GPL-3.0](LICENSE).\n\n\u003e **Local-first by design.** Your GitHub token lives in the OS keychain. AI review runs through *your* local CLI (Claude, Codex, Gemini) or *your* own OpenAI-compatible endpoint — only the PR diff is ever sent, and there is no Reviewly server in the middle.\n\n---\n\n## Table of contents\n\n- [Why Reviewly](#why-reviewly)\n- [Features](#features)\n  - [The review inbox](#the-review-inbox)\n  - [Pull request list \u0026 search](#pull-request-list--search)\n  - [Reading the diff](#reading-the-diff)\n  - [Writing your review](#writing-your-review)\n  - [AI review](#ai-review)\n  - [Checks \u0026 CI](#checks--ci)\n  - [Dependabot](#dependabot)\n  - [Local repository integration](#local-repository-integration)\n  - [Notifications](#notifications)\n  - [Desktop niceties](#desktop-niceties)\n- [How it works](#how-it-works)\n- [Install](#install)\n- [Setting up AI review](#setting-up-ai-review)\n- [Keyboard shortcuts](#keyboard-shortcuts)\n- [Privacy \u0026 security](#privacy--security)\n- [Build from source](#build-from-source)\n- [Tech stack](#tech-stack)\n- [Support](#support)\n- [Contributing](#contributing)\n- [License](#license)\n\n---\n\n## Why Reviewly\n\nReviewing pull requests in the browser means juggling tabs, losing your place in long diffs, copy-pasting code into a chat window, and re-checking the same \"needs my review\" filter all day. Reviewly fixes that:\n\n- **One inbox for the work that's yours.** Review-requests, your own PRs, what's ready to merge, what's blocked — grouped and always fresh.\n- **A diff built for reviewers.** Unified or split, syntax-highlighted, with expandable context, per-file \"viewed\" tracking, and inline comments that batch into a single review.\n- **AI that's actually private.** A guided tour of the change or a back-and-forth chat, powered by the AI CLI you already have installed or any endpoint you point it at. Your diff never touches a Reviewly backend.\n- **Native, fast, offline-friendly.** PRs are cached locally in SQLite, so the list is instant and survives a flaky connection. A background poller keeps it current and pings you when a new review lands.\n\n---\n\n## Features\n\n### The review inbox\n\nThe **Dashboard** (`⌘1`) is the home screen — everything that needs your attention, grouped:\n\n- **Needs your review** — PRs that requested you, oldest first, with an \"aging\" badge once they pass a week.\n- **Needs your attention** — your open PRs with requested changes or failing CI.\n- **Ready to merge** — your approved PRs.\n- **Awaiting review** — your PRs still waiting on reviewers.\n- **Drafts** — your work in progress.\n\nSections are collapsible, refresh automatically, and show how long ago they synced. Each row carries the title, author, repo/number, approval state, and a live CI status dot.\n\n### Pull request list \u0026 search\n\nThe **Pull Requests** page (`⌘2`) is the full, filterable list:\n\n- **Filter** by state (open / draft / merged / closed), repository, labels (include → exclude → off), or CI status.\n- **Group** by repository or author; **sort** by updated, created, or title.\n- **Search** with `/` — matches title, author, or PR number. Active filters show as removable chips.\n- **Virtualized** rendering handles thousands of PRs without lag.\n- **Keyboard-driven:** `j` / `k` to move, `Enter` to open. Your scroll position is remembered per view.\n\nWhen you've picked repositories to watch, the list is served straight from the **local SQLite cache** — instant and available offline — and kept fresh by the background poller. Otherwise it falls back to GitHub search.\n\n### Reading the diff\n\nThe **PR detail** view organizes a pull request into four tabs — **Files**, **Conversation**, **Commits**, and **Checks** — with a file-tree sidebar on the Files tab.\n\nThe diff viewer is the centerpiece:\n\n- **Unified or split** view, toggled with `⌘B`.\n- **Syntax highlighting** per language (Prism).\n- **Expand context** — unfold the unchanged lines between hunks to see the full surrounding file.\n- **Hide whitespace-only** changes and **wrap long lines** on demand.\n- **Viewed-files tracking** — mark files reviewed as you go (auto-marks when you scroll to the end); the sidebar shows \"N of M reviewed\", keyed to the current head commit so a force-push resets it.\n\nThe **file-tree sidebar** decorates each file with its git status, the `+`/`−` change counts, a change-frequency heatmap, and **CODEOWNERS** hints when a local clone is available.\n\n### Writing your review\n\nReviewly batches your feedback into a single GitHub review, just like the web UI — but faster:\n\n- **Inline comments** — select one or more lines in the diff to open a composer. Comments are saved to a **per-PR draft** that survives navigation, refresh, and app restarts.\n- **Review submit** — choose **Comment**, **Approve**, or **Request changes**; write a summary in Markdown; review your pending inline comments (jump to any of them) and submit with `⌘↵`. Reviewly remembers your last verdict and confirms the review actually landed on GitHub before clearing the draft.\n- **Threads, replies, reactions** — read and reply to existing review threads, resolve/unresolve them, and add emoji reactions.\n- **Labels \u0026 title** — apply labels inline; edit the PR title in place if you're the author.\n- An **unsaved-draft guard** warns you before you navigate away with pending comments.\n\n### AI review\n\nReviewly drives an AI you control — a local CLI or your own endpoint — to help you understand a change. Two modes:\n\n**Guided tour.** One click and the AI reads the whole PR and walks you through it in a sensible order: the core change first, then what depends on it. Each step is one of *orientation*, *worth a comment*, *question*, or *praise*, and can jump you to the relevant file/line or pre-fill a suggested inline comment. The tour is generated in the background (so it survives navigation), saved per-PR, and knows to offer a regenerate when the PR's head commit changes.\n\n**Ask AI.** A floating chat panel for a back-and-forth about the PR. Responses **stream token-by-token**. Conversations are kept per-PR, and if you have the repo cloned locally the AI runs *inside the clone* so it can read the real files, not just the diff. The AI's replies can propose actions — add a review comment, apply a label, request a reviewer — that you apply with one click.\n\n**Providers** (configure in Settings):\n\n| Provider | How it runs | Needs |\n| --- | --- | --- |\n| **Claude** | the `claude` CLI on your `PATH` | [Claude Code](https://claude.com/claude-code) installed \u0026 signed in |\n| **Codex** | the `codex` CLI on your `PATH` | OpenAI Codex CLI installed |\n| **Gemini** | the `gemini` CLI on your `PATH` | Gemini CLI installed |\n| **OpenAI-compatible** | an HTTP endpoint you provide | base URL + model (+ optional API key) |\n\nThe OpenAI-compatible option works with OpenAI, Ollama, LM Studio, OpenRouter, and anything else that speaks the same API. A **custom instructions** field in Settings is prepended to every prompt, so you can encode your team's review standards once.\n\n### Checks \u0026 CI\n\nThe **Checks** tab shows every check run on the PR's head commit — GitHub Actions and third-party status checks alike — with status, timing, and expandable failure annotations (file, line, message). The tab color is **required-aware**: optional failures won't turn it red.\n\nEach check has a **Re-run** button that picks the narrowest possible scope — re-running just that Actions job (or, when the job can't be pinned down, only the failed jobs of that run), never the whole suite.\n\n### Dependabot\n\nThe **Dependabot** page lists security alerts for a repo, sorted by severity, with dismiss/reopen actions and clear messaging when the feature is disabled or your token lacks access.\n\n### Local repository integration\n\nPoint Reviewly at your local clones and it adds a layer of git intelligence:\n\n- **Repo browser** — a file tree decorated with git status, staged/unstaged markers, change counts, a churn heatmap, and CODEOWNERS; plus a syntax-highlighted file viewer, a **Changes** (branch-vs-base) view, and a **History** (recent commits with per-commit diffs) view.\n- **Quick-open** any file with `⌘P`.\n- **Branch switcher** and worktree list.\n- **Check out a PR** into the clone in one action.\n- **Open a new PR** straight from the app.\n\nWhen a PR's repo is cloned, **Ask AI** runs in that working directory automatically.\n\n### Notifications\n\nThe **Notifications** page (`⌘3`) mirrors your GitHub notifications — All, Reviews \u0026 comments, or Mentions — with `j`/`k`/`Enter` navigation, `e` to mark read, \"Mark all read\", and an undo toast.\n\n### Desktop niceties\n\n- **Menu-bar tray** showing your pending-review count; click to bring the app forward.\n- **Command palette** (`⌘K`) — jump to any loaded PR, paste a PR URL (full or `owner/repo#123`) to open it, navigate anywhere, or check for updates.\n- **Pinboard** — pin PRs, commits, or files to a bar for quick return.\n- **Clipboard sniff** — copy a GitHub PR link anywhere and Reviewly offers to open it.\n- **Native window vibrancy** on macOS and **Mica** on Windows 11.\n- **Auto-update** — silent check on launch, one-click \"Restart \u0026 install\".\n- **OS notifications** when a new review request arrives.\n\n---\n\n## How it works\n\nReviewly is a **Tauri 2** application: a Rust core with a React front end, shipping as a single native binary per platform.\n\n```\n┌──────────────────────── Desktop window (WebView) ────────────────────────┐\n│  React 18 · TanStack Router/Query · Zustand · Tailwind v4                 │\n│  diff viewer · review composer · AI chat \u0026 guided tour · command palette  │\n└───────────────▲───────────────────────────────────────────▲──────────────┘\n                │ Tauri commands (invoke)          events ────┘ (pr:new, ai:chunk, …)\n┌───────────────┴──────────────────────────────────────────────────────────┐\n│  Rust core                                                                │\n│   • reqwest → GitHub REST + GraphQL                                        │\n│   • keyring → OAuth token in the OS keychain                              │\n│   • tauri-plugin-sql (SQLite) → PR cache, review drafts, settings         │\n│   • background poller (60 s) → tray count, new-PR notifications, sync      │\n│   • AI bridge → spawns your local CLI or calls your HTTP endpoint,         │\n│                 streaming output back over a Tauri Channel                 │\n└──────────────────────────────────────────────────────────────────────────┘\n```\n\n- **Data flow.** The front end calls typed Rust commands; the Rust core talks to GitHub and persists to a local SQLite database. PRs you've chosen to watch are cached so the list is instant and offline-capable.\n- **Staying fresh.** A Rust poller runs every 60 seconds: it updates the tray count, fires an OS notification for newly-requested reviews, and nudges the front end to reconcile. The UI also syncs on launch, on window focus, and on a periodic tick.\n- **AI bridge.** When you ask for a tour or a chat turn, the core builds a prompt from the PR diff (and conversation, and your custom instructions) and either spawns your chosen CLI or calls your endpoint, streaming the output back token-by-token. Nothing is sent anywhere except the backend you configured.\n- **Auth.** Sign-in uses GitHub's **OAuth Device Flow**; the token is stored in the platform keychain (Keychain / Credential Manager / Secret Service), never on disk in plaintext.\n\n---\n\n## Install\n\nDownload the latest installer for your platform from the [**Releases**](https://github.com/volnei/reviewly/releases) page:\n\n- **macOS** — `Reviewly_\u003cversion\u003e_universal.dmg` (Apple Silicon + Intel, signed \u0026 notarized)\n- **Windows** — `Reviewly_\u003cversion\u003e_x64-setup.exe` or `.msi`\n- **Linux** — `.AppImage`, `.deb`, or `.rpm`\n\nOn first launch, Reviewly walks you through a short setup: connect your GitHub account (a device code you approve in the browser), pick the repositories to watch, and you're in. The app updates itself from then on.\n\n\u003e No account, no subscription, no telemetry. Reviewly is free and open source.\n\n## Setting up AI review\n\nAI features are optional — Reviewly is a great review client without them. To turn them on, open **Settings → AI review** and pick a provider:\n\n- **Already have an AI CLI?** Select **Claude**, **Codex**, or **Gemini** — Reviewly detects whether the binary is on your `PATH` and signed in. (For Claude, install [Claude Code](https://claude.com/claude-code) and run `claude` once to log in.)\n- **Prefer your own endpoint?** Choose **OpenAI-compatible** and enter a base URL, model, and optional API key — point it at OpenAI, a local Ollama/LM Studio server, OpenRouter, or anything that speaks the OpenAI API.\n\nAdd **custom review instructions** in the same panel to bake your team's standards into every tour and chat.\n\n## Keyboard shortcuts\n\nPress `?` anywhere for the in-app cheatsheet. (`⌘` is `Ctrl` on Windows/Linux.)\n\n| Key | Action |\n| --- | --- |\n| `⌘K` | Command palette |\n| `⌘B` | Toggle unified ↔ split diff |\n| `⌘1` … `⌘5` | Dashboard · PRs · Repos · Notifications · Dependabot |\n| `⌘,` | Settings |\n| `⌘=` / `⌘-` / `⌘0` | Zoom in / out / reset |\n| `?` | Keyboard shortcuts cheatsheet |\n| `g` then `d`/`r`/`l`/`n`/`a`/`s` | Go to Dashboard / PRs / Repos / Notifications / Dependabot / Settings |\n| `/` | Focus the filter (lists) |\n| `j` / `k` | Move cursor down / up (lists) |\n| `Enter` | Open the highlighted item |\n| `e` | Mark notification read |\n| `⌘↵` | Submit review / comment |\n| `⌘P` | Quick-open a file (repo view) |\n\n## Privacy \u0026 security\n\n- **Your token stays local.** The GitHub OAuth token is held in the OS keychain, not in a config file. The OAuth client ID is public (as GitHub intends) — there is no client secret.\n- **Your code stays yours.** Reviewly has no backend. The only outbound calls are to **GitHub** (to do your review) and to **the AI backend you explicitly configure** (which receives only the PR diff and conversation, never your whole repo). If you use a local CLI or local model, nothing leaves your machine at all.\n- **No telemetry.** Reviewly doesn't phone home, track usage, or collect analytics.\n\n## Build from source\n\n**Prerequisites**\n\n1. **Bun** ≥ 1.3 — `curl -fsSL https://bun.sh/install | bash`\n2. **Rust** (stable) — `curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh`\n3. Platform toolchain for Tauri: Xcode Command Line Tools (macOS), the [Tauri Linux deps](https://tauri.app/start/prerequisites/) (Linux), or the MSVC build tools (Windows).\n\n**Run**\n\n```bash\nbun install\nbun run tauri dev       # launch the desktop app with hot reload\n```\n\n**Other scripts**\n\n```bash\nbun run typecheck       # tsc --noEmit\nbun run lint            # biome check\nbun run build           # build the front end only (Vite)\nbun run tauri build     # produce installers in src-tauri/target/release/bundle\n```\n\nThe GitHub OAuth client ID ships in [`src-tauri/.cargo/config.toml`](src-tauri/.cargo/config.toml) (`REVIEWLY_GITHUB_CLIENT_ID`) — it's public, so the app builds and signs in out of the box. To use your own OAuth app instead, register one with **Device Flow enabled** and the `repo`, `read:user`, `notifications`, and `workflow` scopes, then replace the value there.\n\n**Releases.** Pushing a `vX.Y.Z` tag runs the [release workflow](.github/workflows/release.yml), which builds, signs, and notarizes installers for all three platforms and drafts a GitHub Release. macOS code-signing/notarization and the updater signing key are read from repository secrets, so forks build unsigned until those are configured.\n\n## Tech stack\n\n**Front end** — React 18, TypeScript, [TanStack Router](https://tanstack.com/router) \u0026 [Query](https://tanstack.com/query), [Zustand](https://github.com/pmndrs/zustand) (persisted to SQLite), Tailwind CSS v4, Base UI components, Prism syntax highlighting, TanStack Virtual, Sonner, Vite.\n\n**Desktop shell** — [Tauri 2](https://tauri.app): SQL (SQLite), global-shortcut, notification, clipboard-manager, dialog, opener, process, os, updater, and window-state plugins, plus `window-vibrancy` for the macOS/Windows backdrop.\n\n**Rust core** — Tokio, reqwest (GitHub REST + GraphQL over rustls), serde, chrono, the `keyring` crate for the OS keychain, and `tracing` for logs.\n\n**Tooling** — [Bun](https://bun.sh) for installs/scripts, [Biome](https://biomejs.dev) for lint/format.\n\n## Support\n\nReviewly is free and open source, and built in the open. If it saves you time on reviews, consider [**buying me a coffee** ☕](https://buymeacoffee.com/volnei) — it keeps Reviewly free, maintained, and with no ads or paywalls. A ⭐ on the repo helps too, and so does telling another reviewer about it.\n\n## Contributing\n\nIssues and pull requests are welcome. Before opening a PR, please run `bun run typecheck`, `bun run lint`, and (for Rust changes) `cargo check` in `src-tauri/`. The CI workflow runs the same checks on every push.\n\n## License\n\nReviewly is free software, licensed under the **[GNU General Public License v3.0 or later](LICENSE)**. You're free to use, study, share, and modify it; derivative works must remain under the GPL.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvolnei%2Freviewly","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvolnei%2Freviewly","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvolnei%2Freviewly/lists"}