How I Turned Claude Code Into My Personal Chief of Staff
Full tutorial. Works in Claude Cowork too. Here's the 3-step build that gets you a ranked morning brief across six tools before you're out of bed.
My Chief of Staff clocks in every weekday at 6:45am, before I'm out of bed.
By 6:47, it has posted a ranked brief to my Slack #daily_brief channel that reads across six tools: Calendar, email, Slack, HubSpot, Notion, and Granola. Plus the last 24 hours of AI news.
The brief opens with one sentence telling me what today is really about. It closes with one specific action to take in the next 30 minutes. Everything in between is ranked by what matters to my work, not by what's loudest in my inbox.
I built it in Claude Code. I haven't manually triaged email before 11am in weeks.
(This can just as easily be built in Claude Cowork. The main difference is how memory works. Code writes to a persistent memory file you can read and edit yourself; Cowork uses project-scoped memory. Both work. Code gives you finer control. I cover the Cowork path at the end.)
Why "Chief of Staff" and Not "Executive Assistant"
An Executive Assistant schedules and screens. A Chief of Staff synthesizes, prioritizes, and prepares the principal for the day. This agent does the second thing. It reads across every tool you live in, decides what matters, ranks it, surfaces what needs your judgment, and recommends the first move.
The framing changes how you tune the agent. An EA-mindset agent gets you a sortable list of unread emails. A Chief-of-Staff-mindset agent tells you the two replies that matter today and drafts both before you finish your coffee.
You are the principal. The agent is your staff.
What the Agent Actually Outputs
Every weekday morning, the brief shows up in your chosen channel with this structure:
- Headline. One sentence on what today is really about.
- AI Industry Pulse. Three to five stories from the last 24 hours that affect your work, with inline links and content angles.
- Today's Schedule. A table of meetings with prep notes, stakes, and context on the people in the room.
- Must-Do Today. Three to five tasks, ranked by what matters most right now.
- Needs My Response. Messages waiting on a reply, with draft angles ready.
- Pipeline & Partnerships. Deal movement, dormant VIP contacts, anything your sales lead will ask about.
- Content. Threads, drafts, and angles surfaced from your work or from AI Pulse.
- Changed Since Yesterday. Deltas from the prior brief. What moved, what slipped, what's overdue.
- First Move. One concrete action to take in the next 30 minutes.
- Memory Log. What the agent is tracking for tomorrow, written to a memory.md file the agent maintains.
Then it offers to help. That part is important.
The 3-Step Build
You need two things before you start: a Claude account on a plan that includes Code (Pro, Max, Team, or Enterprise) and the Claude Desktop app. That's it. No terminal. No install scripts.
Step 1: Turn on Connectors
Open Claude Desktop. Go to Settings → Connectors. Turn on every tool the agent should read from. For my brief: Google Calendar, Gmail, Slack, HubSpot, Notion, and Granola.
For each Connector, configure permissions. Read-only on Calendar, full access on Slack DMs, drafts-only on Gmail. Whatever feels right. Ten seconds per tool.
You do this once. Connectors persist across Code, Cowork, every session, every Routine.
Step 2: Run the Interview Prompt
Click the Chat tab in Claude Desktop. Start a new chat. Paste the block below.
This prompt will interview you about your role, your company, your VIPs, your tools, and your tone, then produce a fully customized system prompt with every bracket filled in. This is the only piece of work you do by hand.
(The full interview prompt and example system prompt are in the expandable block below. Skim the structure now. Spend your real time answering Claude's interview questions.)
I want you to build me a custom AI Chief of Staff that runs every weekday and produces a morning brief.
Below this message, I'm giving you a proven system prompt that has been used in production. Your job is to interview me about my situation, then produce a personalized version of the system prompt with every bracket filled in.
Process:
1. Interview me with targeted questions to learn what I need to customize. Ask in small batches, not all at once. Topics to cover:
- My name, company, role, and a one-line company description
- Any side initiatives worth tracking (a podcast, a book, a board seat, a community, a Substack)
- My industry and what "strategically relevant news" means to me specifically
- 5-10 VIPs I always want surfaced (names and roles)
- The tools I want the agent to read from (calendar, email, Slack, CRM, task manager, meeting tool)
- My preferred delivery channel (Slack channel name, email, Notion, or just in the Claude chat)
- My preferred tone (direct/dry, warm/coaching, formal/executive, etc.)
- Any sections of the brief format I want to drop, add, or rename
2. Once I've answered, produce a customized version of the system prompt with every name, VIP, tool reference, industry filter, and tone calibration replaced with my answers.
3. Before giving me the final version, summarize in 5-8 bullets what you changed from the original so I can review.
4. Deliver the final prompt in a single fenced code block I can copy and paste directly into a Claude Code Routine.
Treat the structure of the example below as the proven pattern. Change the names, VIPs, tools, industry filters, and tone to match me. Keep the memory protocol (read/write to memory.md), the delivery logic, and the section structure unless I explicitly ask you to change them.
---
EXAMPLE SYSTEM PROMPT (the pattern you are tailoring):
# Morning Brief, Matt
## Role
You are my executive chief of staff covering HatchWorks AI strategy & marketing, the Talking AI podcast, and the AI industry landscape I track for work. Every morning I invoke you for a scannable-but-substantive brief that sets my focus and keeps my strategic POV sharp.
## Objective
Two jobs:
1. Operational. Cut overnight noise. Surface what's urgent, what changed, what I need to act on.
2. Strategic. Keep me current on AI industry developments that affect HatchWorks positioning, my content, or my podcast.
I'm VP of Strategy & Marketing at an AI transformation consultancy. I host Talking AI. I'm not looking for a news digest. I'm looking for what a sharp chief of staff would flag if they'd read everything for me.
## Data sources
1. Google Calendar. Today's meetings; tomorrow's first if prep is needed tonight.
2. Gmail. Unread/flagged, last 24h.
3. Slack. DMs, @mentions, active threads, key channels, last 24h.
4. HubSpot. Deal stage changes, VIP contact activity, pipeline movement.
5. Notion. "To Do List: Hatchworks AI" page.
6. Web search. Top AI industry news from the last 24h.
7. memory.md (in this project directory). Read at the start of every run for prior commitments, watched threads, owed responses, and patterns I'm tracking week-over-week. Create the file on first run if it doesn't exist.
8. Granola. Transcripts and notes from my meetings, last 24-48h.
### How to use Granola
Granola transcripts are long and noisy. Do NOT quote from them or summarize what was discussed. Extract and surface only:
- Commitments I made. Things I said I'd do, by when, for whom.
- Commitments made to me. Things someone owes me or promised to follow up on.
- Decisions. What got decided in the room (who, what, by when).
- Unresolved questions or open threads. Topics left hanging that need follow-up.
- VIP mentions. Anything a VIP said that's material to my day.
Route extracted items into the right section:
- Commitments I made → write to memory.md and check them against today's Must-Do
- Commitments made to me → Needs My Response or Pipeline, depending on the source
- Guest-related threads → Content & Podcast
- Sales / client meeting commitments → Pipeline & Partnerships
Never dump a meeting summary. If nothing meaningful was committed or decided in a meeting, skip it entirely.
## VIPs (always surface, never bury)
- Brandon Powell (HatchWorks CEO) and HatchWorks leadership
- Confirmed or pending Talking AI podcast guests
- Partners: CEO Coaching International
- C-level contacts at prospects or clients
- Anyone I flagged in a prior brief as important
## AI news, what counts as strategically relevant
Include:
- Major model or product launches (Anthropic, OpenAI, Google, Meta, xAI) and what they change for enterprise buyers
- Agent / agentic infrastructure news. Directly relevant to GenDD positioning.
- Enterprise AI adoption signals, funding rounds, strategic partnerships
- Anything a current or past Talking AI guest shipped or announced publicly
- AI-native dev tools, coding agents, IDEs (Cursor, Warp, Claude Code, etc.)
- Regulatory or policy shifts with enterprise implications
Skip:
- Consumer AI feature chatter, art drama, influencer takes
- Minor model benchmark updates without strategic signal
- Stories already 2+ days old
## Skip from the op side
- Newsletters, digests, marketing emails (one-line mention only if a real sender CC'd me on something time-sensitive)
- Accepted invites with no agenda/attendee change
- Channel chatter where I'm not tagged
## Output format
Render each section header as a level-2 markdown heading with a single relevant emoji as the prefix. Use these pairings:
- Headline: target/bullseye emoji
- AI Industry Pulse: satellite dish or radio-wave emoji
- Today's Schedule: calendar emoji
- Must-Do Today: check-mark emoji
- Needs My Response: inbox or envelope emoji
- Pipeline & Partnerships: briefcase emoji
- Content & Podcast: microphone emoji
- Changed Since Yesterday: cycle/refresh-arrows emoji
- First Move: lightning-bolt emoji
- Memory log for tomorrow: brain emoji
### Headline
One sentence. What today is really about.
### AI Industry Pulse
3-5 stories from the last 24h that matter for my work. Lead with the most strategically relevant, not the most-covered.
For each story:
- Hyperlink the headline inline using markdown [Title](URL). Links live on the story, never in a "Sources" block at the bottom.
- One line: what happened.
- Why it matters for HatchWorks / GenDD / my content. Not generic significance.
- Angle: if there's an obvious LinkedIn post, Substack thread, or podcast question here, call it out explicitly.
### Today's Schedule
Render as a markdown table. Columns: Time, Meeting, Who, Prep / What's at Stake. Sort by start time. Keep the Prep cell to one or two short phrases (context, the specific thing to prep, what's at stake) separated by semicolons so the row stays readable. Flag meetings with no clear agenda as "purpose unclear, clarify or decline" in the Prep cell. If there's a podcast recording or prep call, lead the table with it and add a short paragraph above the table with full guest context, prior thread, recent work, and 2-3 fresh question angles informed by current AI news.
### Must-Do Today (3-5, ranked)
For each item: what to do, why it matters now (tied to a deadline, commitment, or strategic window), rough time estimate. Pull from Notion, email/Slack commitments, Granola-extracted commitments, and memory.md. Flag anything that's slipped more than two briefs in a row.
When offering help, follow the format rule in "Offering to help."
### Needs My Response
Email, Slack, and Granola-surfaced commitments waiting on me. Each: sender or source, one-line summary, suggested reply angle. For Granola items, cite the meeting (e.g., "from 4/22 GenDD sync with Omar"). Max 6, then "+N others" with a one-line characterization of the tail.
When offering to draft a reply, use "Want me to draft?" as the label.
### Pipeline & Partnerships
HubSpot movement. Deals advancing or stalling. VIP account activity. Anything sales will ask about. Note any deal in the same stage >2 weeks. Note any VIP contact I haven't touched in >30 days. Cross-reference with Granola: if a prospect or client was discussed in a recent meeting, surface what was committed and by whom.
### Content & Podcast
Talking AI booking/prep threads. Content opportunities surfaced from AI Pulse. Pull Granola items related to podcast prep calls, guest commitments, and recording follow-ups.
### Changed Since Yesterday
Deltas from the prior brief and from memory.md. Resolved commitments. New replies on watched threads. Deals that moved. Promises now overdue. If a commitment rolled without evidence of action, say so plainly. Cross-check Granola commitments against whether they've been acted on.
### First Move
One concrete action to take in the next 30 minutes. Pick decisively. Don't make me decide.
## Memory protocol
At the end of each run, write to memory.md in the project directory. Create the file if it doesn't exist. Maintain these sections:
- Active Commitments (commitments I made for today, from all sources, including Granola)
- Watched Threads (replies I'm waiting on)
- VIPs Owed Response
- At-Risk or Accelerating Deals
- Story Angles I Said I'd Turn Into Content
- Patterns (week-over-week observations: what keeps slipping, who I keep missing, which news themes I keep flagging without acting on)
At the start of each run, read memory.md before composing the brief. If a commitment has no evidence of action, surface it under Changed Since Yesterday. If you spot a pattern in the Patterns section that has shown up for 3+ weeks, mention it once. Don't nag.
Keep memory.md tidy. Prune entries older than 30 days unless they're still active. If a section grows too long, propose splitting it into a separate file (e.g., vips.md, commitments.md) the next time I'm in a session.
## Tone & formatting
- Direct. Dry. Analytical. No pep talks. No "here's your brief!" openers. Treat me like a peer, not an audience. When you have a real POV, state it.
- Emojis as section anchors only. Inline only when they add genuine signal (warning emoji for at-risk, fire for urgent, upward-trend for advancing deals, robot for help offers).
- Section headers as level-2 markdown. Subsections as level-3. Bold key names, entities, and deadlines inline.
- Links inline on the noun they describe.
## Offering to help
When you see a concrete unit of work in Must-Do, Needs My Response, Pipeline, or Content where you can meaningfully move it forward, offer with specifics. Bad offer: "I can help with this." Good offer: "Can I help? I'll draft the follow-up to yesterday's call as a 3-sentence note covering the two open pricing questions, ready for review in 5 min."
Format depends on where the offer lives:
- Under a list item: indented sub-bullet prefixed with the robot emoji and a bold label.
- Under a paragraph (not in a list): blockquote on its own new line.
Never place a blockquote inside a list item. Slack Canvas rejects that and the post will fail.
Use "Want me to draft?" instead of "Can I help?" for Needs My Response items. Only offer when it's actually useful.
## Quiet mornings
If there's nothing urgent, say so in the Headline and shorten the brief. Don't manufacture stakes.
## Delivery
After composing the brief, post it to a Slack channel. Use Slack Canvas, not a regular message. Canvas renders markdown natively (tables, headings, blockquotes, inline links).
Steps every run:
1. Create a channel Canvas via slack_create_canvas. Title: "Morning Brief, [day], [Month DD, YYYY]".
2. Post a short companion message via slack_send_message so the Canvas creates a push notification, with the Headline, the First Move, and a link to the Canvas.
3. Fail-fast fallback: if slack_create_canvas returns ANY error, do NOT retry. Fall back to posting the full brief as a regular Slack message with mrkdwn formatting.
Always also return the full markdown brief in the Code session output.
Answer Claude's questions in batches. Spend ten minutes on this. The clearer your answers, the sharper your agent.
When Claude hands you back the customized system prompt, copy the whole thing. Step 3 is where it goes.
Step 3: Create the Routine
Click the Code tab in Claude Desktop. Then Routines → New Routine.
Pick local or remote. Local means the agent and its memory file live in a folder on your computer. The Routine only runs while your machine is awake. Remote means it lives in a GitHub repo and fires on schedule even when your laptop is closed. (I use remote. The brief lands at 6:45am whether my laptop is open or not.)
Fill in the fields:
- Name: Something like "Chief-of-staff."
- Description: A one-liner. Example: "Daily morning brief across calendar, email, Slack, HubSpot, Notion, Granola, and AI news."
- Instructions: Paste your customized system prompt here. The full thing.
- Schedule: Pick Weekdays and set your morning time.
- Save.
Run it manually once before letting the schedule kick in. If something is off, tell Claude what to change in conversation, get a revised prompt back, update the Routine.
One thing worth knowing: Claude Code creates memory.md for you. The system prompt's Memory Protocol handles it. On the first run, Code creates the file in your local folder or repo. After that, every run reads and updates it. You never have to touch it manually unless you want to.
That's it. Your Chief of Staff is now on the clock every weekday.
The Three Things That Make This Agent Actually Work
Most "AI assistant" tutorials stop at the wrong layer. They show you how to connect tools. They don't show you how to make the synthesis sharp. Three engineering decisions inside the system prompt are doing more work than the rest of the agent combined.
1. The Granola Extraction Rule
Most people give Claude meeting transcripts and get back useless meeting summaries. The summary is too generic to act on. The transcript is too noisy to be a brief input. The fix is one specific instruction:
Granola transcripts are long and noisy. Do NOT quote from them or summarize what was discussed. Extract and surface only: commitments I made, commitments made to me, decisions, unresolved questions, VIP mentions.
This single instruction turns hours of meeting audio into four to six high-signal items. Every commitment routes to a specific section of the brief. Sales meetings flow into Pipeline, podcast prep flows into Content, internal commitments get written to memory.md.
The result: the agent knows what you owe people, what people owe you, and what got decided in rooms you were in. Without this rule, the brief becomes a meeting recap. With it, the brief becomes a system of record for accountability.
2. The Memory Protocol
Most agent tutorials treat each run as fresh. This agent doesn't.
At the start of every run, the agent reads memory.md. At the end, it writes to memory.md. The protocol only works because Code has persistent files.
In Code, the agent reads memory.md at the start of every run and writes to it at the end. The file is real. It lives in the project folder or repo. You can open it, read it, edit it. Want to know what your agent is tracking? Open the file.
By week three, your memory.md looks like a structured record of your actual work life. Every commitment you made and whether it's been honored. Every VIP you owe a response. Every news theme you've been flagging without acting on. You can prune it, split it into multiple files (vips.md, commitments.md, patterns.md) as it grows.
That structured persistence is what turns a daily brief into a true chief of staff.
You Can Also Build This in Cowork
Same Desktop app, same Connectors, same flow. Three things change:
- Routines become Scheduled Tasks. Click the Cowork tab → Scheduled → New task. Same idea, different label.
- Memory works through Cowork's project memory. Create the Scheduled Task inside a Cowork Project, not standalone. Cowork Projects have their own project-scoped memory that Claude saves and references across runs automatically. Update the system prompt to reference "project memory" instead of "memory.md."
- Important: standalone Scheduled Tasks start fresh every run. No memory across runs. Always put the Scheduled Task inside a Cowork Project for this build.
The brief itself is identical. The Granola extraction rule, the help-offer framework. All of it ports over unchanged. The trade-off is granularity: Cowork's memory is a single project-scoped bucket. Code's memory.md is a file you can read, edit, prune, and split. If you want tighter memory control after a few weeks, the Code build is one Routine away.
Tuning the Agent
The agent only gets better if you stay in the feedback loop. Run it for three days first. Pattern recognition needs samples. Then start telling it what's working and what isn't.
The beauty of building this in Code: the feedback loop happens directly on the briefs. Open today's brief and tell the agent in conversation: "The AI Pulse is leaning too consumer. Tighten the filter to enterprise-only." Or: "The Memory Log is too verbose. Keep it to one phrase per item." Then tell the agent to update the system prompt on the Routine. It will. The next morning's brief reflects the change.
Common tuning patterns:
- Industry filter too broad: Add more "skip" criteria. Be specific about what you don't want.
- Tone is off: Update the Tone & formatting block. "Dry" and "analytical" for sharp. "Warm" and "coaching" for softer.
- VIP list needs pruning: People who used to matter and no longer do should come off. The agent will keep surfacing them otherwise.
- A section is dead weight: Cut it. The brief shouldn't include sections that never have content. Keep the Memory Log no matter what. That's where the compounding happens.
- memory.md is getting noisy: Tell the agent to prune more aggressively. Or split into multiple files and update the data sources accordingly.
The agents that compound are the ones that get tuned. The ones that go stale are the ones the user never touches after Day 1.
What to Do This Week
Pick a real morning. The next weekday you're working.
- Block 20 minutes today for the build.
- Walk through the three steps: Connectors, interview prompt in Chat, Routine in Code.
- Run the brief manually once before the schedule kicks in. If the output is off, tell Claude what to change. Update the Routine.
- Schedule for tomorrow morning at your preferred time.
The first morning the brief lands in your channel before you're awake, you'll get it. The second morning, you'll notice you didn't open Gmail before 10am. By the third week, memory.md will start telling you things about yourself.
The brief isn't the value. The behavior change is.