Automating Life: CRM, Calendar, Canvas & Cron
The flashy parts of an AI agent system are the dashboard and the chat interface. But the real value — the stuff that saves hours every week — is the automation layer. Cron jobs that fire at 7 AM. Alert agents that catch problems before you notice them. A CRM that builds itself.
This is the story of how we automated the boring stuff.
The Morning Briefing: 9 Sources in 60 Seconds
Section titled “The Morning Briefing: 9 Sources in 60 Seconds”Every morning at 7:05 AM, a cron job fires morning-briefing.sh. It pulls from nine data sources and delivers a formatted digest to Telegram:
- Google Calendar — today’s schedule
- Email — unread count and priority messages
- Canvas LMS — upcoming assignments and grade alerts
- Task logs — yesterday’s accomplishments and today’s priorities
- Crypto portfolio — overnight price changes
- Weather — local forecast
- Nutrition — yesterday’s calorie and macro summary
- Goals — cross-domain goal progress
- System health — agent status, MCP server health, cron results
By the time you’ve poured your coffee, you know exactly what your day looks like. No app-hopping. No checking five dashboards. One message.
CRM: When Every Name Becomes a Contact
Section titled “CRM: When Every Name Becomes a Contact”The CRM didn’t start as a planned feature. It started as a rule in CLAUDE.md:
“CRM Everything: whenever a person’s name comes up, check or create their entry.”
That’s it. One sentence. But because the AI agent follows this rule in every conversation, contacts accumulate automatically. After a week, we had 132 contacts — each as a markdown file with YAML frontmatter:
---name: "Jane Smith"slug: jane-smithdomain: consultingtags: [vip, investor]email: jane@example.comcompany: "Acme Corp"role: "VP Engineering"relationship: clientlast_contact: 2026-04-10---
## Notes- Met at startup meetup on April 8- Interested in AI agent consulting
## Interaction Log- 2026-04-10: Follow-up email sent- 2026-04-08: Initial conversation at meetupThe format is deliberately simple. Markdown is human-readable, git-trackable, and searchable. The YAML frontmatter makes it machine-parseable for the dashboard and search tools.
A VIP contacts list separately tracks high-priority people for email triage — ensuring important messages surface in the morning briefing.
CRM on the Dashboard
Section titled “CRM on the Dashboard”The Nerve Center’s /crm page reads all 132 contacts, parses both simple .md files and rich directory structures (with PROFILE.md, summary.md, and items.json), and presents them as searchable, filterable cards. Filter by domain, search by name or company, expand for full details.
Canvas LMS: Academic Data Pipeline
Section titled “Canvas LMS: Academic Data Pipeline”School is one of the six life domains, and Canvas LMS is its primary data source. The integration runs deep:
Daily Sync (7 AM)
Section titled “Daily Sync (7 AM)”canvas_sync.py pulls all assignments across 10 courses and saves them to local JSON cache. It runs with a 120-second timeout (via a perl alarm wrapper) to prevent hanging on slow Canvas API responses.
Grade Tracking
Section titled “Grade Tracking”Per-course grades are tracked in YAML with current grade, letter, trend, and alert flags. A critical threshold at C- triggers an immediate Telegram alert. Any grade change — up or down — fires a notification.
Deadline Watcher (8 AM, 2 PM, 8 PM)
Section titled “Deadline Watcher (8 AM, 2 PM, 8 PM)”Three times a day, deadline-watcher.sh scans for assignments due within 48 hours and sends Telegram alerts. This has saved several near-misses on assignment deadlines.
RAG Pipeline
Section titled “RAG Pipeline”Course content from Canvas pages feeds into a ChromaDB vector store via recursive chunking (512 tokens, 100 overlap). The embedding model is Ollama’s nomic-embed-text, running locally at zero cost. Lecture recordings go through Whisper transcription and auto-ingest into the same vector store.
Currently: 88 chunks across 3 courses, with semantic search returning results at 0.24 distance accuracy.
The 14 Cron Jobs
Section titled “The 14 Cron Jobs”Here’s the full cron schedule that runs our life:
| Time | Job | What It Does |
|---|---|---|
| 7:00 AM | Canvas sync | Pull assignments and grades |
| 7:05 AM | Morning briefing | 9-source digest to Telegram |
| 8 AM, 2 PM, 8 PM | Deadline watcher | 48h assignment alerts |
| Every 15 min | Telegram watchdog | Bot health check + auto-restart |
| Every 15 min | Domain sync | Generate domain state JSON |
| Every 4 hours | Dashboard sync | Snapshot state + Vercel redeploy |
| 7 AM daily | News scanner | AI/tech news scan |
| Every 6 hours | GitHub enrichment | Query 23 repos for status |
| 11 PM | Cost tracker | Daily spend summary |
| Sunday 8 PM | Weekly review | Week summary + next week plan |
| Monday 7 AM | Week ahead | Study plan for the week |
| Every 3 hours | Plaud sync | Audio recording transcription |
| Nightly | CEO aggregate | Executive summary from all domains |
| 9 PM | Habit check-in | Family habit tracking |
The Watchdog Layer
Section titled “The Watchdog Layer”The most critical cron isn’t any of the above — it’s the Telegram watchdog that runs every 15 minutes. It checks three things:
- Is the launchd service loaded?
- Does the daemon PID exist?
- Is the tmux session alive?
If any check fails, it auto-restarts via launchctl kickstart and sends a Telegram alert (rate-limited to one per hour to prevent spam). This was built after the 56-hour outage on day 0.
A separate system watchdog monitors disk space, process health, and provides alert escalation.
Alert Agents: Proactive, Not Reactive
Section titled “Alert Agents: Proactive, Not Reactive”Beyond scheduled cron jobs, four alert agents fire on specific conditions:
| Agent | Trigger | Action |
|---|---|---|
| Grade Alerts | Canvas grade change detected | Immediate Telegram notification |
| Follow-up Alerts | Consulting deal inactive >7 days | Telegram reminder to follow up |
| Birthday Alerts | Birthday at 7, 3, 1, 0 days out | Telegram alert + gift reminder |
| Deadline Watcher | Assignment due within 48 hours | Telegram alert with details |
These agents are proactive. They don’t wait for you to check — they find problems and surface them. The birthday alerts at graduated intervals (7/3/1/0 days) give you enough time to actually buy a gift.
EOD Compiler: Turning Chaos Into Journal Entries
Section titled “EOD Compiler: Turning Chaos Into Journal Entries”At the end of each day, the EOD compiler aggregates:
- Task logs from all agent sessions
- Telegram session logs
- Cron output logs
- Domain reports
It transforms raw tool-call logs into a narrative daily journal entry stored in the Obsidian vault. This becomes the input for the next morning’s briefing and the weekly review.
The weekly review (Sunday 8 PM) aggregates an entire week of these daily entries into accomplishments, blockers, and priorities for the next week.
The Deck Architect: AI-Powered Presentations
Section titled “The Deck Architect: AI-Powered Presentations”Not strictly “automation,” but the Deck Architect deserves mention because it automated something deeply painful: building presentation decks.
Version 2 (production) uses a pptxgenjs engine. The LLM generates full JavaScript code per slide batch, guided by a design system with 9 golden layout patterns (Anchor Left, Split Contrast, Card Grid, Stat Spotlight, etc.). A visual QA step screenshots each slide and scores it, regenerating any that fall below an 8.0 threshold.
Cost: ~$0.60 per deck. Speed: ~200 seconds for 11 slides.
Version 3 (experimental) uses pre-built .pptx templates. The LLM outputs structured JSON content only — never layout code. It’s 2.6x faster and 4x cheaper ($0.15 per deck) but quality needs refinement.
Lessons Learned
Section titled “Lessons Learned”1. The morning briefing is the killer app. Everything else is nice. The morning briefing is essential. Build it first.
2. Passive CRM beats active CRM. Making contacts automatic (“CRM Everything”) means you never forget to log an interaction. The CRM builds itself.
3. Graduated alerts prevent noise fatigue. Birthday alerts at 7/3/1/0 days work because they escalate. A single “birthday tomorrow” alert is either too late or forgotten. Four alerts at decreasing intervals ensure action.
4. Watchdogs are non-negotiable. Every critical process needs a watchdog. Not “should have” — must have. The 56-hour silent outage proved this.
5. File-based state scales further than you’d think. 132 CRM contacts in markdown files. 14 cron configs. 6 domain configs. All in flat files, all git-tracked, all searchable. No database needed.
For technical details on each subsystem, see the full Architecture References.