Cindy Zhu.
← all free guides
Building & apps Claude

Build a Jarvis that briefs you every morning

Hey, it's Cindy ๐ŸŒฑ I actually built my own Jarvis, a command center that reads me my whole day out loud in a British butler voice every morning, so this is the real, honest version, not a demo. You don't download Jarvis, you assemble it: Claude is the brain, MCP connectors are its hands, and Fish Audio is the voice. Everything below is what I did, generalised so you can point it at your life, your apps, and your own context. This guide covers both my reels: the quick morning-brief build and the fuller brain-and-hands build (comment JARVIS on either).
the mental model

What you're actually building ๐Ÿง 

Three pieces, that's the whole thing:

๐Ÿง  The brain: Claude Claude Code reads your context, decides what matters, and writes your brief. It runs in your terminal or at claude.ai/code.
๐Ÿ– The hands: MCP Connectors (Model Context Protocol) give Claude a direct line into your real apps: Gmail, Calendar, Notion, Slack. Add ONE at a time.
๐ŸŽ™ The voice: Fish Audio Turns the brief into speech in a custom voice you design or clone. This is what makes it feel like Jarvis.
๐Ÿ“‹ The glue: a skill A saved playbook (like "run my morning brief") that ties the sources together and runs the whole routine on command.
๐Ÿš€ Fastest path to a working Jarvis: do the build manual (ยง3), connect just your Calendar (ยง4), then add the voice (ยง6). That alone gets you a spoken brief. The dashboard in ยง1 is the pretty shell, add it whenever. Build one piece, get it working, then layer on the next.
๐Ÿ’ก The big idea: Jarvis is yours. It reads your CLAUDE.md, your calendar, your priorities, so no two people's Jarvis is the same, and it is never finished. You keep talking to Claude Code to reshape it. More on that at the end.

the wow layer (optional)

1. The dashboard (build this anytime) ๐Ÿ–ฅ

This is the cinematic shell from the reel. It's optional, the brief works without it, but it's the fun part. The move is to hand Claude Code a picture of the vibe you want and let it build the interface. Here's the kind of reference image to give it:

A cinematic blue heads-up-display interface: a glowing central sphere surrounded by orbital rings, HUD arcs, live gauges, activity bars and status readouts, the kind of Jarvis command-center look to use as a reference image.

Drag that image (or your own) onto the Claude Code terminal, paste it, or reference it with @reference.jpg, then use this prompt. It builds the interface, screenshots its own work, compares it to your reference, and fixes the gaps, which is Anthropic's own recommended build loop:

๐Ÿ–ฅ paste into Claude Code (with your reference image attached)
Here's a reference image of the dashboard vibe I want (attached). Build it as ONE self-contained dashboard.html file (Canvas plus CSS, no external libraries). Near-black navy background, a glowing central sphere or core, orbital rings, rotating dashed HUD arcs, and a heads-up layout: top-left a JARVIS title, subtitle and today's date; top-right a live ticking clock and a connector status list (green dot online, amber blinking offline); a streaming activity log down the left that reveals one line at a time; a stats panel on the right with thin glowing bars; big figures across the bottom; and a bottom bar with a glowing "BRIEF ME" button. Read ALL the numbers and text from a separate jarvis_data.js that sets window.JARVIS_DATA, so I only edit that file day to day. Add a hidden audio element for a brief.mp3; clicking BRIEF ME plays it and makes the sphere pulse while it speaks. Make it look expensive and responsive. Then take a screenshot of what you built, compare it to my reference image, list the differences, and fix them. Repeat until it matches.
โณ Honest bit: a simple version lands fast, but a dense one takes a couple of screenshot-and-fix passes, and the self-correction only works if Claude can actually see what it built. Give it a way to screenshot the page: connect Claude for Chrome or the Chrome DevTools MCP, use Claude Code's built-in browser, or let it drive a headless browser from the terminal. Without one of those, you're the one checking each pass. This is normal, not a failure. You keep going until it looks right.

before you start

2. What you need โœ…

  • ๐Ÿ’ณ A Claude Pro ($20/mo) or Max ($100/mo) plan for Claude Code, sub-agents and scheduled routines. Pro is plenty for one daily brief (it allows several routine runs a day); Max is only worth it for heavier all-round use. The voice is separate, that's a Fish Audio account, free to start, not gated by your Claude plan.
  • ๐Ÿ’ป Claude Code: npm install -g @anthropic-ai/claude-code then run claude, or use claude.ai/code. Docs: code.claude.com/docs
  • ๐ŸŽ™ A Fish Audio account for the voice.
  • ๐Ÿ”Œ The apps you want Jarvis to see (Gmail, Google Calendar, Notion, Slack if you run a team), with accounts you can log into.
  • ๐Ÿ“ A simple priorities note or Notion page (even 5 ranked bullets). Your brief ranks what matters from this, so if you don't have one, make one first, or that part of the brief has nothing to pull.

How to add any connector: in Claude Code run claude mcp add --transport http NAME https://the-mcp-url/mcp, then /mcp to finish the login. On the web, add them at claude.ai/customize/connectors (do this too if you'll run a scheduled routine). Always confirm with /mcp and do one read-only test before you let it write anything.


the core, copy this

3. The Jarvis build manual ๐Ÿ“‹

This is the heart of it, the prompt that turns Claude from a chatbot into your assistant. It briefs you on your life, not a generic template. Two steps: first give Claude a CLAUDE.md so it knows who you are, then paste the build manual.

Step A, give it a CLAUDE.md (who you are). In your project folder, ask Claude Code to "create a CLAUDE.md" and fill it in. This one file is why your Jarvis is yours, not a clone, so make it specific. A good starter skeleton:

๐Ÿ“ your CLAUDE.md (fill in the brackets)
# Who I am
I'm [name], I [what you do]. I care most about [your #1 goal right now].

# What I'm working on this month
- [project 1], [project 2], [project 3]

# My priorities, ranked
1. [top priority]  2. [next]  3. [next]

# My tone
[e.g. warm, direct, no corporate filler]

# Hard rules
- Always draft, never send. Never take irreversible actions without asking.
- Only use the apps I've connected.

Step B, paste the build manual. This is the real architecture behind my Jarvis, a skill that gathers your day into one ranked, spoken brief that ends by asking what to do first:

๐Ÿ“‹ the build manual, paste into Claude Code
You are my personal assistant, my own Jarvis. First, read my CLAUDE.md so you know who I am, my projects, my priorities and my tone. From now on, act as a proactive chief of staff for me, not a generic chatbot.

Build me a "morning brief" routine, and save it as a reusable skill I can trigger by phrase (like "run my morning brief", "brief me", or "what's on my plate"). When I trigger it, do this:

1. CALENDAR: read today's events from my Google Calendar. Flag anything that needs prep, and any conflicts or gaps.
2. INBOX: scan my Gmail from the last 24 hours. Group it into needs-a-reply / FYI / ignore. For the needs-a-reply group, draft short replies in my tone and leave them in Drafts. Never send.
3. PRIORITIES + TASKS: read my priorities and task list (from my Notion or my priorities note), and pick the 3 things that actually matter most today, ranked, with a one-line why for each.
4. ONE THING TO KNOW: surface a single important signal, a deadline, a number that moved, a follow-up I'm forgetting.

Then write it as 6 to 8 short spoken lines, in my voice, warm and direct, no filler. END with the single most important question: "What should I handle first?"

Save the finished brief to a file (brief.txt) and to a Notion page so I can see it. If I've built the dashboard, also refresh its jarvis_data.js with today's key numbers and a one-line activity log. Then read the brief out loud through my Fish Audio voice (once it's wired up, see section 6). Keep the whole skill self-contained: list every source to pull and exactly how to format the brief, because when it runs on a schedule it has no memory of our chats.

Rules, always: you draft, I approve. Never send email, post, delete, or take any irreversible action on your own. Only pull from the apps I've connected. Keep everything tailored to me. If a source is empty or a connector is down, say so plainly instead of guessing.

give it hands

4. Connect your apps (one at a time) ๐Ÿ”Œ

Add these in order, and do a read-only test after each before moving on:

  1. ๐Ÿ“… Google Calendar so it can see your day. Add the connector, then test: "What's on my calendar today?"
  2. ๐Ÿ“ฅ Gmail so it can triage and draft. The official Gmail connector can read, label and DRAFT, but it cannot send, by design, so drafts land in your Drafts and you hit send. Test: "Group my unread email from the last 2 days into needs-a-reply, FYI, ignore, and draft replies for the first group."
  3. ๐Ÿ“ Notion so it can read your tasks and write your brief to a page. Test: "Read my tasks page and list my top 3 for today."
  4. ๐Ÿ’ฌ Slack so it can message your team (draft-first, same as email). Add the Slack connector, then test: "Read my last 10 mentions and draft replies, don't send." Skip this one if you don't run a team.
  5. โž• Optional, for founders and marketers connect more, like RevenueCat to pull your revenue charts, or your ad-platform data for spend. Keep these read-only.
๐Ÿ”‘ Golden rule: read-only before write, one connector before two, verified before trusted. Email can carry prompt-injection too, so only connect a mailbox you trust.

saved playbooks

5. Skills: trigger it by phrase ๐ŸŽฏ

A skill is a saved playbook Claude runs when you name it. Your morning brief is one. Add more the same way, each is a small markdown file in ~/.claude/skills/, and the easiest way to make one is to ask Claude Code to write it. Good ones to add next:

๐ŸŒ… "run my morning brief" The full routine above.
โœ๏ธ "draft my replies" Triages the inbox and drafts responses in your tone.
๐Ÿ’ฌ "answer customer queries" Reads your FAQs and drafts support replies, escalates anything not covered.
๐Ÿ“Š "how are my numbers" Pulls your revenue or content stats into a quick read.

In Claude Code you can fire a skill by name or slash command, and Claude will also reach for one automatically when your request matches what it does.


make it talk

6. Give it a voice with Fish Audio ๐ŸŽ™

This is the part that makes it feel like Jarvis. Sign up at Fish Audio. Its free S2.1 Pro model (model string s2.1-pro-free) is the best voice quality for the price (the top open-weight voice model, a fraction of ElevenLabs' cost), and it's free via the API right now.

  1. ๐Ÿ‡ฌ๐Ÿ‡ง Pick or design a voice Use a ready voice from the Voice Library (there's a "Butler" and calm British voices), design a brand-new one from a text prompt ("calm British butler, warm, measured"), or clone your own from about 10 seconds of clean audio. Don't clone a real celebrity.
  2. ๐Ÿ†” Copy your voice's reference ID Open your chosen or cloned voice on Fish Audio and copy its reference ID (the string on the voice's page, in its URL like fish.audio/m/<id>). That ID is what tells the API which voice to speak in, you'll paste it into the prompts below.
  3. ๐Ÿ”‘ Grab your API key, store it safely Copy your key, then in Claude Code add it as an environment variable (an env secret) named FISH_API_KEY. That keeps your key out of your code so it can't leak. Never paste a key straight into a file you'd share.
  4. ๐ŸŽญ Add emotion so it doesn't sound flat On the S2.1 model you drop tags right into the text, like [calm] Your 3pm is confirmed. [amused] Shall I cancel the 4pm as well?
  5. ๐Ÿ”ง Wire it up Have Claude Code write the little script that sends your brief to Fish Audio and plays it (prompt below).
๐Ÿ”ง paste into Claude Code, wire up the voice
Write a small script that sends my brief text to the Fish Audio API and plays the resulting MP3. Endpoint: POST https://api.fish.audio/v1/tts. Send the model as an HTTP header (model: s2.1-pro-free), and put my voice's reference_id and the text in the request body. Read my API key from the FISH_API_KEY environment variable. Save the audio as brief.mp3 and play it.

Want to actually talk to it? This is the localhost bridge that turns the dashboard into a Jarvis you speak to, exactly how I built mine. Paste this into Claude Code, then open it at localhost (not the file) so the mic works:

๐Ÿ—ฃ paste into Claude Code, build the talk-to-it bridge
Build a small local server that serves my dashboard at localhost, exposes an /ask endpoint that runs my request through Claude Code and returns the reply, converts that reply to speech with the Fish Audio API in my British voice, and add a mic button to the dashboard that records me, sends it to /ask, and plays the answer. Open it at localhost, not the file, so the microphone works.
๐Ÿ’ธ Cost: the s2.1-pro-free model is free via the API through 31 August 2026 (check the current status, Fish has extended this window before). After that it's pay-as-you-go, about $15 per million characters, or paid plans from about $11/mo, pennies per spoken brief either way. Note for non-English: scripts like Chinese cost roughly 3x per character.

before you wake up

7. Run it on a schedule โฐ

Two ways to run it every morning, pick based on whether you want it to actually speak:

๐Ÿ”• Silent but reliable (laptop closed) A cloud routine that writes your brief to a Notion page. In Claude Code: /schedule daily brief at 9am, or set it at claude.ai/code/routines. It runs on Anthropic's cloud even with your laptop shut, but it can't play audio or reach local files, so you get a text brief waiting in Notion.
๐Ÿ”Š Actually speaks (laptop on) A local scheduled task on your Mac that runs the skill, makes the Fish Audio MP3, and plays it. Ask Claude Code: "Set up a launchd job that runs my Jarvis brief script every morning at 9am and plays the audio." Your Mac has to be awake, but you wake up to it talking.
โš ๏ธ Two things that bite people here: (1) A cloud routine runs with NO approval prompts and can write through any connector you include, so include only what it needs (Calendar, Gmail, Notion), tell it to draft and never send, and keep the prompt fully self-contained (it has no memory of your chats). Read the first week of runs before you trust it. (2) For the local task, the script cannot live in your iCloud folder (scheduled jobs can't reliably run from iCloud), put it in ~/Scripts/.

this is the real secret

8. Make it yours, and keep making it yours ๐Ÿ”ง

Here's the honest truth, and the best part. Your Jarvis will not be perfect on day one. Sometimes the voice lags a second. Sometimes the brief pulls the wrong thing or misses a priority. That is completely normal, and it is not a wall, it's the starting point.

Because the whole thing is built in plain English, you fix it by just telling Claude Code. Everything is adjustable, editable, improvable:

๐Ÿ—ฃ "The brief is too long" Say it. It trims to 5 lines.
๐Ÿ—ฃ "Add my top sponsor's status" It adds it to the routine.
๐Ÿ—ฃ "The voice sounds too formal" It re-tunes the emotion tags or swaps the voice.
๐Ÿ—ฃ "Brief me at 7am, not 9" It changes the schedule.

You're not locked into anything. Talk to it, watch what it gets wrong, describe the fix, repeat. That back-and-forth is how it slowly becomes something that fits your mornings perfectly, not a generic assistant.

๐Ÿ”ง If something breaks, it's usually one of these three: (1) a connector stuck on "needs auth" even after you logged in, clear Claude's MCP auth cache and restart. (2) the voice erroring out, double-check your reference_id and that the model is exactly s2.1-pro-free. (3) no sound, browsers block autoplay, so trigger audio with a click, and always open the dashboard at localhost (not the file) so the mic and audio both work.

the one rule

โš ๏ธ Keep a human in the loop

Jarvis proposes, you approve. Email stays drafts-only (never auto-send), anything that spends money or acts on the web stays read-only until you fully trust it, and you cap the risk before you hand over control. It's your assistant, not your replacement.

The links ๐Ÿ”—

๐ŸŽฉ Fish Audio (the voice): fish.audio
๐Ÿค– Claude + Claude Code: claude.com and code.claude.com/docs
๐Ÿ“ฅ Gmail, ๐Ÿ“… Google Calendar and ๐Ÿ“ Notion connectors: add them at claude.ai/customize/connectors

Follow @cindiezhu for more AI you can actually use ๐ŸŒฑ
Want more like this? Follow @cindiezhu for daily AI you can actually use.