Chief of Staff
My personal chief of staff that is used for daily briefings and new cross-project features and tools.
Vote to see the stats!
Chief of Staff
Marko's unified project monitoring, analytics, and morning briefing system.
Overview
This project provides a /gm skill for Claude Code that delivers an interactive morning briefing covering analytics, project status, reminders, and news -- replacing 5+ manual dashboard checks with one command.
Key Components
/gmskill (~/.claude/skills/gm/SKILL.md) -- The core deliverable. Interactive morning briefing.config/projects.yaml-- Master registry of all projects with tiers, paths, URLs, and Umami site IDs.config/umami.env-- Umami API credentials (gitignored).scripts/notify.sh-- macOS notification helper with severity-based sounds.ARCHITECTURE.md-- Agent orchestration design (Phase 4, deferred).
Project Tiers
- daily: Checked every
/gminvocation (Eternity) - weekly: Checked on Mondays or with
/gm all(Markos Universe, AI Psychosis) - alert-only: Only checked with
/gm allor/gm <name>(Praxis, Rovinj, RateMyClaudemd, Oktoberfestbot)
Data Sources
| Source | Method | Scope |
|---|---|---|
| Umami Analytics | REST API (curl) | All websites |
| Git status | git -C <path> | All projects |
| Linear | Linear MCP | Eternity only |
| macOS Reminders | osascript | All |
| News | WebSearch | Optional |
Umami
Self-hosted on Railway. Credentials in config/umami.env. All 6 websites report to this single Umami instance, replacing previous Vercel Analytics and Matomo setups.
Scripts
scripts/notify.sh <severity> <title> <message>-- Send macOS notifications- Severities:
critical(Sosumi sound, persistent),warning(Purr sound),info(Pop sound)
- Severities:
Development
This is a local-only project. No GitHub remote. Git is used for local version control only.
Brain skills (built 2026-04-13, /gm integration pending)
Four /brain-* skills exist at ~/.claude/skills/brain-*/SKILL.md — brain-ingest, brain-dump, brain-lint, brain-sync. They manage Marko's personal knowledge base at ~/Documents/Obsidian/brain/. Each auto-triggers on natural language matching its description field. See ~/Documents/Obsidian/brain/CLAUDE.md "Brain verbs" section for full details.
/gm integration is planned for the next session — replace the Linear + Reminders checks with a brain/inbox/ review and offer /brain-ingest inbox inline, and add an export-regeneration nudge (re-run ~/Documents/Obsidian/brain/scripts/generate-export.sh + re-upload to Claude Projects). Full plan in ~/.claude/plans/lexical-dreaming-kernighan.md.
/brain-lint cadence in /gm (decided 2026-04-14): instead of "Monday only," /gm checks the most recent brain-lint entry in ~/Documents/Obsidian/brain/log.md and runs lint only if the last lint is > 7 days ago or no prior lint exists. This is self-throttling regardless of how often /gm is invoked. Concrete check:
last_lint=$(grep -E "^## \[[0-9]{4}-[0-9]{2}-[0-9]{2}\] session \| brain-lint" ~/Documents/Obsidian/brain/log.md | head -1 | grep -oE "[0-9]{4}-[0-9]{2}-[0-9]{2}")
if [[ -z "$last_lint" ]]; then
run_lint=true
else
age_days=$(( ( $(date +%s) - $(date -j -f "%Y-%m-%d" "$last_lint" +%s) ) / 86400 ))
[[ $age_days -gt 7 ]] && run_lint=true
fi
Newest log entries are at the top of log.md, so head -1 gets the most recent. brain-lint writes its own log entry in the format ## [YYYY-MM-DD] session | brain-lint, confirmed working.