Lepo is a single-page dashboard that monitors the status of multiple GitHub repositories at once — open issues, pull requests, CI status, and recent activity — in one easy-to-read view. Click any item to jump straight to the real issue/PR on github.com.
v1 is read-only. No writes back to GitHub (no creating issues, commenting, or merging). See AGENTS.md for the full scope.
| Feature | Description |
|---|---|
| Repo Watchlist | Add repos manually in owner/repo form; stored in localStorage |
| Dashboard | One card per repo with open-issue / open-PR counts and star/fork stats |
| Repo Detail | Issues / PR tabs with state filters; rows open github.com in a new tab |
| Rate-Limit Awareness | Live badge from GitHub's x-ratelimit-* headers |
| Auto-refresh | Configurable interval (manual / 1 / 5 / 15 min) |
| Theme | Light / dark, persisted to localStorage |
- Language: Rust (edition 2024, stable toolchain)
- Framework: Leptos 0.8 (CSR,
wasm32-unknown-unknown) - Build: Trunk (WASM bundler / dev server)
- HTTP:
gloo-net(browserfetch) - Storage:
gloo-storage(localStorage) - Styling: Pure CSS with design tokens (no UI framework)
- Deployment: Vercel (with CSP headers + SPA fallback)
- AGENTS.md — architecture, data flow, and agent guidelines
- DESIGN.md — UI/UX design system and tokens
- CONTRIBUTING.md — setup, conventions, and PR guide
- SECURITY.md — vulnerability reporting policy
crates/
├── app/ # Leptos CSR UI (the only crate aware of Trunk/wasm)
├── github-api/ # GitHub REST client (wasm + native, no Leptos)
└── models/ # Shared serde domain structs
- Rust — stable toolchain (see
rust-toolchain.toml) wasm32-unknown-unknowntarget:rustup target add wasm32-unknown-unknown
- Trunk:
cargo install trunk
trunk serve --port 3000 --opentrunk build --releaseOutput is in dist/ — deploy the folder to any static host.
| Command | Description |
|---|---|
cargo check --workspace --target wasm32-unknown-unknown |
Type-check |
cargo clippy --workspace --target wasm32-unknown-unknown -- -D clippy::correctness -D clippy::suspicious |
Lint |
cargo fmt --all --check |
Format check (2-space indent, edition 2024) |
cargo test --workspace --exclude app |
Run library unit tests |
trunk serve --port 3000 --open |
Dev server with HMR |
trunk build --release |
Production build |
- CSP via
Content-Security-Policyheader invercel.json(allows onlyhttps://api.github.comfor fetches) - X-Frame-Options: DENY — clickjacking protection
- X-Content-Type-Options: nosniff — MIME-sniffing protection
- No
unsafecode —unsafe_codedenied at the workspace level - Token stays local — the GitHub PAT lives only in the browser's
localStorage; it is never sent to any server of ours
To report a vulnerability privately, see SECURITY.md.
- Semantic HTML + ARIA
:focus-visibleoutlinesaria-labelon icon-only buttonsprefers-reduced-motionsupport
- Connect the repository to Vercel.
- Set build command:
trunk build --release - Set output directory:
dist - The app calls
api.github.comdirectly from the browser (CORS-enabled), so no backend or proxy is required.
Lepo is released under the MIT License.