A developer activity dashboard that scans your local git repos and displays commits, PRs, and stats as a static site. Run it locally, deploy to GitHub Pages, or host on Cloudflare Pages.
Preview: https://pulse.automem.ai
# Generate the report (scans ~/Projects and ~/Local Sites by default)
node generate-rich-report.mjs --paths ~/Projects --no-prs
# View it
npx http-server -p 8080
# Open http://localhost:8080That's it. You should see your commit activity for the last 7 days.
- Node.js v18+
- git
- Optional: GitHub CLI (
gh) for PR details
node generate-rich-report.mjs \
--paths ~/Projects,~/code \ # Comma-separated scan roots
--hours 48 \ # Time window (default: 168 = 7 days)
--max-depth 4 \ # Repo scan depth
--author you@example.com \ # Filter commits by email
--gh-author someuser \ # GitHub PR author filter
--exclude "vendor,archive" \ # Exclude repos matching patterns
--no-prs # Skip PR fetching (no gh CLI needed)Create a config.json in the repo root for persistent settings (see config.json.example):
{
"paths": ["~/Projects", "~/code"],
"author": "you@example.com",
"ghAuthor": "your-github-username",
"exclude": ["node_modules", "vendor"],
"hours": 168
}CLI flags override config.json values.
These also work as alternatives to CLI flags:
ACTIVITY_REPORT_AUTHOR_EMAIL— commit author filterACTIVITY_REPORT_GH_AUTHOR— GitHub PR author filterGH_TOKEN— GitHub token for PR fetching
If no author is specified, it falls back to your git config user.email.
Create a categories.json to group repos in the dashboard (see categories.json.example):
{
"Frontend": { "icon": "🖥️", "class": "frontend", "repos": ["my-app", "website"] },
"Backend": { "icon": "⚙️", "class": "backend", "repos": ["api", "worker"] }
}Repos not in any category appear in an "Other" group. If no categories.json exists, all repos are shown ungrouped.
If you want PRs included in the report:
- Install GitHub CLI:
brew install gh - Authenticate:
gh auth login(or setGH_TOKEN) - Run without
--no-prs
By default it searches PRs authored by @me. Override with --gh-author yourname.
npm run generate # Generate the report
npm start # Serve at http://localhost:8080Use npm run generate:cached for faster re-renders from cached data.
The included .github/workflows/github-pages.yml workflow deploys to GitHub Pages. It runs on GitHub-hosted runners (no self-hosted runner needed), but can only scan commits in the repo itself.
- Go to repo Settings > Pages > Source: GitHub Actions
- Run the workflow manually (Actions > Activity Report (GitHub Pages) > Run workflow)
- To automate: uncomment the
scheduletrigger in the workflow file
For scanning local repos on your machine, use .github/workflows/daily-update.yml with a self-hosted runner.
- Set up a self-hosted runner on your machine
- Configure repository variables (Settings > Variables):
SCAN_PATHS— paths to scan (e.g.~/Projects,~/code)GH_AUTHOR— your GitHub usernameGIT_EMAIL— email for automated commitsGIT_NAME— name for automated commitsCLOUDFLARE_DEPLOY— set totrueto enable Cloudflare deploymentCLOUDFLARE_PROJECT— Cloudflare Pages project name
- Add secrets:
CLOUDFLARE_API_TOKEN,CLOUDFLARE_ACCOUNT_ID
generate-rich-report.mjsrecursively scans directories for.gitrepos- Extracts commits via
git logwith author filtering - Optionally fetches PR details via
ghCLI - Outputs
activity-data.json(cached data) index.htmlloadsactivity-data.jsonat runtime — it's a static vanilla JS dashboard, no build step
npm run generate # Generate fresh report
npm run generate:cached # Use cached activity-data.json
npm start # Serve locally on port 8080
npm test # Smoke test (generates into temp dir, cleans up)MIT