Back to Blog

I Built a Personal AI Assistant That Lives in Slack

· 7 min read
I Built a Personal AI Assistant That Lives in Slack

I recently spent a few hours playing with OpenClaw (Clawdbot) — an autonomous AI agent you let loose on your machine. The concept is compelling: give an AI full access to your computer and let it do real work for you.

But it does too much. It gets out of control. Their own recommendation is to run it on an isolated machine and keep it away from your personal data.

Here's the problem with that advice: without access to your personal data, an autonomous assistant is essentially useless. The whole point is that it knows who you are, what tools you use, and how you like things done.

"I don't need an unbounded agent. I need a scoped assistant that knows exactly how I operate."

So I built my own. I call it Autumn.

Here's a quick demo of Autumn in action (rough screen capture — but it shows the flow):


What Is Autumn?

Autumn is a personal AI assistant that lives in a dedicated Slack channel. It's a Go application that listens for messages, forks an isolated Claude Code session for each one, and returns the response right in the Slack thread.

Every message gets its own session. Follow-ups in the same thread resume that session, preserving full conversational context. It's like having a hyper-capable assistant on call 24/7 — one that already knows my email addresses, my family's iMessage contacts, my calendar setup, and exactly how I want information formatted.


The Key Insight: Claude Code Is the Engine

I'm not building an agent framework. I'm not writing complex orchestration logic. The entire intelligence layer is Claude Code running as a subprocess.

What makes it work is a file called CLAUDE.md — a detailed instruction document that teaches Claude how I want everything done. Think of it as a playbook. Mine is about 13KB and covers:

  • How to format messages for Slack (mrkdwn, not markdown)
  • How to query my Apple Calendar SQLite database
  • My family's iMessage contacts and group chat IDs
  • How to create, view, and complete Apple Reminders
  • My three email addresses and when to use each one
  • How to interact with Google Sheets, Gmail, and Google Calendar

Claude just follows the playbook. No custom NLP. No fine-tuning. Just a well-written instruction file and a capable model.


What Autumn Can Do

The capabilities grew quickly once the foundation was in place. Here's what Autumn handles today:

Email & Messaging

Read and send emails via gog CLI for Gmail. Send and search iMessages via AppleScript.

Calendar & Reminders

Query Apple Calendar's SQLite database directly. Create, view, and complete reminders in Apple Reminders.

Scheduled Briefings

Daily weather reports, pre-market and post-market recaps, and email summaries — all on a cron schedule.

Browser Automation

Full web browsing via Playwright MCP. I dropped the Claude in Chrome extension for this — Playwright is much easier and faster.

It also handles images in both directions — I can attach screenshots to Slack messages and Claude will analyze them, or Claude can generate images and upload them back to the thread.


The Architecture Is Dead Simple

The entire flow looks like this:

Slack message → Go bot → fork Claude Code CLI → return response to thread

That's it. The Go application connects to Slack via Socket Mode (WebSocket), listens for messages in a dedicated channel, and spawns a Claude Code subprocess for each one. The response gets posted back as a threaded reply.

There's no agent framework. No vector database. No external services. The entire state layer is JSON files on disk:

  • sessions.json — Maps Slack threads to Claude session IDs
  • apple_reminders.json — Cached reminders refreshed every 10 minutes
  • cron_jobs.json — Scheduled job definitions (hot-reloadable)
  • cron_state.json — Last execution time for each job
  • logs/ — Per-session JSONL conversation logs with cost tracking

It's a single Go binary with zero external dependencies beyond the Claude CLI itself.


The Cron System

This is my favorite part. I defined scheduled jobs in a JSON file, and the bot checks every 60 seconds to see if any are due. When one fires, it spins up a fresh Claude session with a prompt and posts the result to Slack.

Here's what runs automatically:

🌤 Daily Weather

Every morning at 8 AM — current conditions, high/low, and weekly outlook.

📈 Pre-Market Briefing

Weekdays at 8 AM — index levels, overnight moves, earnings, and key economic data.

📉 Post-Market Recap

Weekdays at 4 PM — closes, sector performance, biggest movers, macro developments.

📧 Email Summaries

Four times daily — unread emails organized into "Action Required" and "FYI."

The best part: it's hot-reloadable. I edit the JSON file, and the next 60-second tick picks up the changes. No restarts required.


Why Playwright Instead of the Chrome Extension

For browser automation, I use Playwright via the Model Context Protocol (MCP) instead of the Claude in Chrome extension. It's much easier and faster.

Playwright runs headlessly with a persistent browser profile, so it maintains cookies and sessions across invocations. Claude can navigate pages, click buttons, fill forms, take screenshots, and interact with any website — all from the same Slack interface.

I use this for things like posting to social media, searching the web for real-time information, and interacting with services that don't have APIs.


Logging, Persistence, and Cost Tracking

Every conversation gets logged to per-session JSONL files. Each entry captures the timestamp, prompt, response, cost in USD, and whether the session was new or resumed.

Sessions persist across bot restarts — the thread-to-session mapping is saved to disk, so you can pick up a conversation days later and Claude still has full context from the thread.

Background goroutines handle the rest:

  • Reminder notifications — checks every 60 seconds for overdue reminders and posts them to Slack
  • Overdue digest — every 4 hours, posts a summary of all overdue items (with quiet hours from 1-7 AM)
  • Session cleanup — hourly purge of sessions unused for 24+ hours
  • Cache refresh — syncs Apple Reminders every 10 minutes

The Real Unlock: CLAUDE.md

If there's one takeaway from this project, it's the power of CLAUDE.md.

This single file is what transforms a generic AI model into a personal assistant that knows exactly how to operate in your world. Mine includes:

  • Slack formatting rules (mrkdwn syntax, emoji conventions, no markdown tables)
  • The exact SQLite query to read Apple Calendar events (with CoreData epoch conversion)
  • My family members' iMessage identifiers and known group chat GUIDs
  • AppleScript templates for creating and completing reminders
  • My three Gmail addresses and which to use for which context
  • How to display calendar events, reminders, and email summaries in rich Slack format

Claude reads this file at the start of every session and follows it precisely. The more detailed and specific your instructions, the better the results.

You don't need to fine-tune a model. You need to write a thorough playbook.


The Concept Matters More Than the Code

I haven't open-sourced Autumn (yet?), but the concept is straightforward enough that anyone could build their own version. The recipe is:

Give Claude Code a messaging interface
Write a thorough CLAUDE.md
Connect it to your real tools

The messaging interface could be Slack, Discord, Telegram, or anything with an API. The tools could be AppleScript, CLI utilities, REST APIs, or browser automation. The key is the CLAUDE.md file that ties it all together — the detailed personal context that makes the assistant actually useful.


Focused Scope Beats Unbounded Autonomy

The fundamental difference between Autumn and something like OpenClaw is scope.

OpenClaw tries to be a general-purpose autonomous agent that can do anything. That's impressive, but it's also why it gets out of control and why they recommend isolating it from your personal data.

Autumn is the opposite: a scoped personal assistant that knows exactly who I am, what tools I use, and how I like things done. It doesn't try to do everything. It does the specific things I need, reliably and consistently.

Focused scope + rich personal context

beats unbounded autonomy every time.

If you're on a Claude Code plan and have been looking for a way to put it to work beyond your IDE, this is the pattern. Write the playbook. Wire up the interface. Let Claude do the rest.

Spicer Matthews

Spicer Matthews

Developer, entrepreneur, and options trader based in Oregon.

@spicermatthews

Join My Newsletter

1,000+ people have joined to follow along as I share on software and business.


Share this post