{"id":50547360,"url":"https://github.com/kannarfr/glab-desktop-ui","last_synced_at":"2026-06-04T00:01:39.623Z","repository":{"id":362360695,"uuid":"1258458701","full_name":"KannarFr/glab-desktop-ui","owner":"KannarFr","description":"A glanceable desktop inbox for GitLab threads that need your reply — answer reviews, mentions and comments without opening GitLab. Built with Tauri + glab.","archived":false,"fork":false,"pushed_at":"2026-06-03T21:35:57.000Z","size":724,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-03T22:17:03.580Z","etag":null,"topics":["desktop-app","developer-tools","gitlab","glab","inbox","linux","merge-requests","notifications","productivity","rust","tauri","wayland"],"latest_commit_sha":null,"homepage":null,"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/KannarFr.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-03T15:44:04.000Z","updated_at":"2026-06-03T21:36:01.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/KannarFr/glab-desktop-ui","commit_stats":null,"previous_names":["kannarfr/glab-desktop-ui"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/KannarFr/glab-desktop-ui","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KannarFr%2Fglab-desktop-ui","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KannarFr%2Fglab-desktop-ui/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KannarFr%2Fglab-desktop-ui/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KannarFr%2Fglab-desktop-ui/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KannarFr","download_url":"https://codeload.github.com/KannarFr/glab-desktop-ui/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KannarFr%2Fglab-desktop-ui/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33884734,"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-03T02:00:06.370Z","response_time":59,"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":["desktop-app","developer-tools","gitlab","glab","inbox","linux","merge-requests","notifications","productivity","rust","tauri","wayland"],"created_at":"2026-06-04T00:01:39.023Z","updated_at":"2026-06-04T00:01:39.606Z","avatar_url":"https://github.com/KannarFr.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GitLab Inbox\n\nA small, glanceable desktop app that shows — **per project** — where you need to\nact on GitLab: review requests, mentions, and especially **comment threads\nwaiting on your reply**. It's built so you can answer right from the app and stop\ncontext-switching into the GitLab web UI all day.\n\n\u003e **It is _not_ a code-review tool.** It doesn't show diffs, suggest changes, or\n\u003e analyze your code. Its only job is to tell you *where a human is waiting on you*\n\u003e and let you **type a reply in two keystrokes**.\n\n![demo](docs/demo.gif)\n\nFilter to what needs you, open an item, and reply inline — the cursor is dropped\nstraight into the box you most likely need to answer:\n\n![inbox](docs/screenshot.png)\n![threads](docs/threads-modal.png)\n\nAnd when something new lands, you get a desktop notification (with the app icon).\nClick it — or hit your **Super+g** shortcut — and the window comes forward with\nthe reply box already focused:\n\n![notification](docs/notification.png)\n\n\u003e Screenshots use built-in **demo data** (`GITLAB_INBOX_DEMO=1`) — no real\n\u003e projects, people, or hosts.\n\n## What it does\n\n- **One inbox, grouped by project**, scoped entirely to *you*:\n  1. **GitLab Todos** — `review_requested`, `mentioned`, `directly_addressed`,\n     `assigned`, `approval_required`, `unmergeable`, `build_failed`.\n  2. **Deep thread scan** — for every open MR you authored / review / are\n     assigned to, it finds threads where **the last reply isn't you** and the\n     thread is still unresolved — even when no todo was created.\n- **Answer in place** — open an item to get its discussion threads in a modal:\n  reply, resolve/unresolve, or start a new comment. All writes go through `glab`.\n- **Notifications that take you to the answer** — new/changed items raise a\n  desktop notification; activating it focuses the window and opens that item with\n  the reply box ready.\n- **Keyboard-driven**, urgency-ranked, with `Needs reply` / `Reviews` /\n  `CI · blocked` filters.\n\nEverything is personal: the Todos API only returns *your* todos, and the thread\nscan only touches MRs where you are the author, a reviewer, or an assignee. No\nproject-wide or unrelated items are ever fetched.\n\n## How auth works (no credentials in this repo)\n\nEvery call shells out to [`glab`](https://gitlab.com/gitlab-org/cli). The app\n**never reads, stores, or passes a token** — `glab` uses whatever you set up with\n`glab auth login` (its own config/keyring, outside this repo). The only external\ncommands it runs are `glab` and `xdg-open`.\n\n## Install\n\n### Arch Linux (AUR)\n\n| Package | Builds from |\n| --- | --- |\n| [`gitlab-inbox-bin`](https://aur.archlinux.org/packages/gitlab-inbox-bin) | the prebuilt binary from the latest release — fast, no Rust toolchain |\n| [`gitlab-inbox-git`](https://aur.archlinux.org/packages/gitlab-inbox-git) | source at `HEAD` — compiles locally |\n\n```bash\nyay -S gitlab-inbox-bin     # or: paru -S gitlab-inbox-bin\n```\n\n`glab` and the GTK/WebKit runtime are pulled in automatically. After installing,\nrun `glab auth login` (if you haven't), then launch **GitLab Inbox** from your\napp launcher or with `gitlab-inbox`.\n\n### Build from source\n\nThe sections below cover building it yourself.\n\n## Requirements\n\n- Rust (built with 1.95)\n- [`glab`](https://gitlab.com/gitlab-org/cli) installed and logged in\n  (`glab auth status`)\n- Linux desktop with a WebKitGTK runtime (`webkit2gtk-4.1`)\n- A notification daemon (`swaync`, `mako`, `dunst`, …) for notifications and\n  click-to-open\n- Optional: `xdg-open` to open items in your browser\n\n## Run\n\n```bash\n# from the repo root — first build is slow, then it's instant\ncargo run --release\n```\n\nBy default it **auto-detects the host** `glab` is logged into (it tries each\nhost in your glab config and uses the first one with a valid token), so there's\nusually nothing to configure. To pin a specific instance, set `GITLAB_INBOX_HOST`:\n\n```bash\nGITLAB_INBOX_HOST=gitlab.example.com cargo run --release\n```\n\nIf `glab` isn't installed or you haven't signed in yet, the app still launches\nand shows a banner with the exact `glab auth login` command to run. It re-checks\nevery couple of seconds, so once you log in it connects on its own — no restart.\n\nInstall the binary somewhere on your `PATH` for daily use:\n\n```bash\ncargo build --release\ncp target/release/gitlab-inbox ~/.local/bin/\n```\n\n### Try it without a GitLab account\n\n```bash\nGITLAB_INBOX_DEMO=1 cargo run --release\n```\n\nDemo mode serves fake data and never calls `glab` — it's what the screenshots\nabove show.\n\n## The Super+g shortcut\n\nWayland compositors own global shortcuts, so bind one in your compositor to focus\nthe app. The app listens for window-focus and, if a notification is pending, opens\nthat item and focuses its reply box — so `Super+g` after a ping lands you straight\nin the answer field.\n\n**sway** (`~/.config/sway/config`):\n\n```\n# raise GitLab Inbox (and jump to the thing that pinged you)\nbindsym $mod+g [app_id=\"gitlab-inbox\"] focus\n```\n\n(Other compositors: bind `$mod+g` to focus the `gitlab-inbox` window however your\nsetup does it.) Clicking the notification itself does the same thing.\n\n## Using it\n\n- **Sidebar** — pick a project, or *All projects*.\n- **Filters** — `All`, `Needs reply`, `Reviews`, `CI / blocked` (live counts).\n- **Click an item** — opens its threads; the right reply box is auto-focused.\n- **Reply / Resolve / Comment** — inside a thread; `Ctrl`/`⌘`+`Enter` sends.\n- **Open** — opens the MR/issue in the browser.\n- **Done** — marks the backing GitLab todo(s) done and removes the item.\n\n### Keyboard\n\n| Key | Action |\n| --- | --- |\n| `j` / `k` | move selection down / up |\n| `Enter` | open the selected item's threads |\n| `o` | open the selected item in the browser |\n| `d` | mark the selected item done |\n| `r` | refresh now |\n| `1`–`4` | switch filter |\n| `Esc` | close the modal / clear selection |\n\n## Project layout\n\n```\nsrc-tauri/\n  src/\n    main.rs      # entry point\n    lib.rs       # Tauri builder, commands, 2-min poll loop, focus handling\n    gitlab.rs    # glab api wrapper (todos, MRs, discussions, reply/comment/resolve)\n    crawl.rs     # crawler: snapshot + thread detail, diffs, notifies, emits, demo data\n    model.rs     # Item / Snapshot / Detail data types + urgency scoring\n  tauri.conf.json\n  capabilities/  # Tauri v2 permissions (core only)\n  icons/         # app icon (logo.svg — duck + GitLab fountain — + rasterized PNGs)\nui/              # vanilla HTML/CSS/JS frontend (no bundler)\n  index.html\n  style.css\n  app.js\n```\n\nThe frontend is plain HTML/CSS/JS over the global `window.__TAURI__` API — no\nnpm/node build step. Backend commands: `get_snapshot`, `refresh`, `mark_done`,\n`open_url`, `get_detail`, `post_reply`, `post_comment`, `resolve_thread`. It emits\na `snapshot` event per crawl and an `open-item` event on notification activation.\n\n## Notes \u0026 limitations\n\n- It crawls every **2 minutes**; refresh on demand with `r`.\n- \"Needs reply\" thread detection runs on **merge requests** only (issues use the\n  Todos signal). Bot/system notes are ignored.\n- Notifications fire for items new or changed since the previous crawl (not on the\n  first crawl). Click-to-open needs a daemon that supports the freedesktop\n  `default` action (`swaync`/`mako`/`dunst` all do).\n- The thread scan only looks at MRs that already have comments, to bound API calls.\n- Comment bodies render as plain text with light formatting (inline `code`,\n  links); full GitLab markdown isn't rendered.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkannarfr%2Fglab-desktop-ui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkannarfr%2Fglab-desktop-ui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkannarfr%2Fglab-desktop-ui/lists"}