- Rust 98.9%
- Nix 1.1%
Dependency-free --help/-h and --version/-V handling via a pure parse_args() -> CliAction enum, dispatched in main after the panic hook and before config load / ratatui::init() so the terminal is never touched on the flag paths. Unknown flags print an error + USAGE to stderr and exit 2. Includes unit tests for parse_args precedence and help-text content. Closes #4 |
||
|---|---|---|
| .forgejo | ||
| src | ||
| .gitignore | ||
| .woodpecker.yaml | ||
| Cargo.lock | ||
| Cargo.toml | ||
| CHANGELOG.md | ||
| CONTRIBUTING.md | ||
| flake.nix | ||
| LICENSE | ||
| README.md | ||
| screenshot.png | ||
| SECURITY.md | ||
fj-dash
Terminal dashboard for monitoring pull requests across Forgejo instances. Built with ratatui, tokio, and forgejo-api.
Installation
cargo install --path .
Requires a terminal at least 80x24 characters.
Configuration
Create ~/.config/fj-dash/config.toml:
[[instance]]
name = "my-forgejo"
url = "https://forgejo.example.com"
token = "your-api-token"
repos = ["owner/repo1", "owner/repo2"]
name— Tab label shown in the UIurl— Base URL of your Forgejo instancetoken— API token (Settings → Applications → Generate Token). Recommended scopes: repository (read/write), user (read), and issue (read/write). Read-only dashboards only need read:repository and read:user. Write scopes are recommended so you won't need to regenerate the token when future features (approve, merge, comment) landrepos— Optional. Omit to auto-discover repos you have push access to (excludes archived repos, mirrors, and repos without pull request support)
Multiple instances are supported; each gets its own tab:
[[instance]]
name = "work"
url = "https://git.work.com"
token = "token-a"
repos = ["team/backend", "team/frontend"]
[[instance]]
name = "personal"
url = "https://codeberg.org"
token = "token-b"
tea CLI Fallback
If no config.toml exists, fj-dash reads credentials from the
tea CLI config (~/.config/tea/config.yml).
All logins become instance tabs with automatic repo discovery.
Keybindings
| Key | Action |
|---|---|
j / Down |
Move selection down |
k / Up |
Move selection up |
p |
Toggle preview pane |
h / Left |
Previous preview tab (Description / Comments) |
l / Right |
Next preview tab |
PgDn |
Scroll preview down |
PgUp |
Scroll preview up |
Tab |
Next instance tab |
Shift-Tab |
Previous instance tab |
Enter |
Open PR in browser |
r |
Refresh all instances |
Ctrl-c |
Quit |
q |
Quit |
Preview Pane
Press p to open a split preview showing the selected PR's description
(rendered from Markdown) and comments. Use h/l to switch tabs and
PgDn/PgUp to scroll.
The preview pane can be configured in config.toml:
[preview]
open = true # start with preview open (default: false)
width = 50 # pane width as % of terminal (default: 45, range: 20-80)
CI & Review Status
The PR table includes CI and Rev columns showing build and review status at a glance:
| Symbol | Meaning |
|---|---|
✓ |
Success / Approved |
✗ |
Failure / Changes requested |
● |
Pending |
! |
Warning (CI only) |
— |
No status |
CI status is fetched from commit statuses; review status from pull request reviews. Both load progressively after the PR list appears.
Pagination
PR fetching is limited to 50 PRs per repository (single API page). When a repo hits this limit, a footer indicator appears in the table. Full pagination is not yet implemented.
Commit Integrity
All commits are GPG signed. PRs are merged locally to ensure every commit in the history is cryptographically verified.
Development
A Nix flake provides the full toolchain (rustc, cargo, clippy,
rustfmt, rust-analyzer). With direnv you can
direnv allow and everything is ready.
cargo test
cargo clippy -- -D warnings
cargo fmt --check
CI runs these same checks via Woodpecker on every pull
request and on pushes to main.
See CONTRIBUTING.md for the full contribution guide and SECURITY.md for the vulnerability disclosure policy.
Acknowledgments
Inspired by gh-dash, a beautiful GitHub dashboard for the terminal.
