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.
Group repos into named categories in the Project Breakdown section. Categories are resolved at generation time and embedded in activity-data.json, so they persist through deploys without needing a separate file at runtime.
Three ways to configure (checked in this order):
categories.jsonfile — standalone file in repo root (gitignored, see categories.json.example)CATEGORIES_CONFIGenv var — JSON string, useful in CI (set as a repo variable for the workflow)categorieskey inconfig.json— inline in your config (see config.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 are configured, 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 - Loads categories config (if any) and embeds them in the output
- Outputs
activity-data.json(self-contained: data + categories) 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