Realtime GitHub commit observability for repositories and organizations.
CommitScope turns raw commit traffic into a live visual workspace: graph topology, timeline intelligence, filters, exports, and webhook-driven realtime updates.
Most commit dashboards are either static or noisy. CommitScope is built for signal:
| Capability | What you get |
|---|---|
| History Loader | Load repository or organization commit history from GitHub REST API |
| Realtime Feed | Webhook -> serverless -> Ably channel -> live UI updates |
| Graph View | Force-directed graph with tuned readability and focus controls |
| Timeline View | Month buckets + expandable commit groups |
| Filters | Author, keyword, date range, and view mode switching |
| Export + Share | PNG/SVG snapshots and URL state sharing |
| Security Controls | Signature checks, rate limits, origin allowlist, delivery replay guard |
flowchart LR
GH["GitHub Push Event"] --> WH["/api/github-hook"]
WH --> AB[("Ably Channel")]
FE["Svelte Frontend"] -->|load history| GHA["GitHub REST API"]
FE -->|subscribe| AB
FE -->|token auth| TK["/api/ably-token"]
subgraph Hardening
H1[Signature verification]
H2[Rate limiting]
H3[Origin allowlist]
H4[Replay protection]
end
WH -.-> H1
WH -.-> H2
TK -.-> H2
TK -.-> H3
WH -.-> H4
npm install
cp .env.example .env
npm run dev
npm run dev:netlify
See .env.example for the exact template.
| Variable | Required | Purpose |
|---|---|---|
ABLY_API_KEY |
Yes | Publish/issue Ably tokens |
ABLY_CHANNEL |
No | Channel name (default: github-commits) |
GITHUB_WEBHOOK_SECRET |
Yes | Validate webhook signatures |
GITHUB_TOKEN |
No | Enrich commit details (stats/files) server-side |
GITHUB_BRANCH_FILTER |
No | Accept only one branch (example: main) |
GITHUB_REPOSITORY_ALLOWLIST |
No | Comma-separated owner/repo allowlist |
ALLOWED_ORIGINS |
No | Comma-separated allowed origins for /api/ably-token |
ABLY_TOKEN_RATE_LIMIT |
No | Requests per IP per minute for token endpoint |
ABLY_TOKEN_TTL_MS |
No | Token lifetime in milliseconds |
WEBHOOK_RATE_LIMIT |
No | Requests per IP per minute for webhook endpoint |
WEBHOOK_MAX_BODY_BYTES |
No | Max webhook payload bytes (default: 1048576) |
| Variable | Required | Purpose |
|---|---|---|
VITE_ABLY_AUTH_URL |
No | Token URL (default: /api/ably-token) |
VITE_ABLY_CHANNEL |
No | Frontend channel name (match server channel) |
VITE_ABLY_PUBLIC_KEY |
No | Optional direct browser key (prototype only) |
In GitHub repository settings:
https://<your-domain>/api/github-hook.application/json.GITHUB_WEBHOOK_SECRET.Just the push event.npm run build.dist.netlify/functions.netlify.toml already rewrites /api/* to Netlify Functions.
API routes included:
api/ably-token.jsapi/github-hook.jsSet environment variables in Project Settings, then redeploy.
Minimum recommended set:
ABLY_API_KEYGITHUB_WEBHOOK_SECRETVITE_ABLY_AUTH_URL=/api/ably-tokenVITE_ABLY_CHANNEL and ABLY_CHANNEL with the same valueBuilt-in controls:
x-github-delivery cache window.Operational recommendations:
VITE_* private tokens).ALLOWED_ORIGINS and GITHUB_REPOSITORY_ALLOWLIST in production.Check the following in order:
/api/ably-token exists and returns a token request.ABLY_API_KEY is present on deployed environment.VITE_ABLY_CHANNEL matches server channel.ALLOWED_ORIGINS includes your exact site origin.This value appears only after at least one webhook push event is accepted and published to the subscribed channel. If history loads but last event is empty, webhook delivery is not reaching publish stage yet.
npm run dev: Vite dev server (with local /api/ably-token middleware)npm run dev:netlify: Netlify dev modenpm run check: Svelte + TypeScript diagnosticsnpm run build: Production buildContributions are welcome. See CONTRIBUTING.md.
If CommitScope helps you, please star the project and share it.