Chief of Staff

My personal chief of staff that is used for daily briefings and new cross-project features and tools.

@stoicma--4/24/2026

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

  • /gm skill (~/.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 /gm invocation (Eternity)
  • weekly: Checked on Mondays or with /gm all (Markos Universe, AI Psychosis)
  • alert-only: Only checked with /gm all or /gm <name> (Praxis, Rovinj, RateMyClaudemd, Oktoberfestbot)

Data Sources

SourceMethodScope
Umami AnalyticsREST API (curl)All websites
Git statusgit -C <path>All projects
LinearLinear MCPEternity only
macOS RemindersosascriptAll
NewsWebSearchOptional

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)

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.mdbrain-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.

Share on X

Comments (0)