Three pieces, that's the whole thing:
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:
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:
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.
npm install -g @anthropic-ai/claude-code then run claude, or use claude.ai/code. Docs: code.claude.com/docsHow 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.
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:
# 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:
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.
Add these in order, and do a read-only test after each before moving on:
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:
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.
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.
fish.audio/m/<id>). That ID is what tells the API which voice to speak in, you'll paste it into the prompts below.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.[calm] Your 3pm is confirmed. [amused] Shall I cancel the 4pm as well?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:
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.
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.Two ways to run it every morning, pick based on whether you want it to actually speak:
/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.~/Scripts/.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:
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.
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.๐ฉ 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