01 · The build
Your client memory, on a Mac mini in the office
they think you have an elephant memory. you have a Mac mini.
we've been running our entire client memory on a Mac mini in the office — OpenClaw + Hermes Agent + iMessage MCP + Apple Notes MCP + Calendar MCP — and it has fundamentally changed how we follow up with buyers and sellers. zero vendor lock-in. zero cloud. the conversations live where they already lived. the agent just learned how to read them.
the stack
OpenClaw + Hermes Agent + iMessage MCP + Apple Notes MCP + Calendar MCP, running on a Mac mini (M-series, 16GB)
how it runs
Phase 1: The Local Runtime
a Mac mini sitting on a shelf running OpenClaw as the agent host. no Zapier, no n8n, no $400/month CRM AI add-on. it's a process on a machine you own.
Phase 2: The Memory Spine
three MCP servers exposed to the agent. iMessage MCP reads chat.db. Apple Notes MCP reads the local SQLite store. Calendar MCP reads EventKit. every showing conversation, every voice-to-text from the car, every "remember they hated the cul-de-sac" note — indexed and queryable.
Phase 3: The Plain English Layer
ask the agent things like "what did the Johnsons say about schools back in March?" or "which buyers in my pipeline mentioned wanting a pool but not a HOA?" or "who did i tell i'd send a Winter Park list to and never followed up?" it answers in seconds. citations back to the actual iMessage thread.
Phase 4: The Closing Move
the real unlock isn't search. it's tone. when you call a buyer back, you open with: "you mentioned you weren't sold on the local high school back in March — i pulled three homes in the next zone for you."
what this replaces
- a CRM "notes" field nobody reads
- the panic of remembering what someone said six weeks ago
- ABSOLUTELY any subscription that wants to host your client data
your texts are already the best CRM you'll ever have. you just needed something that could read them.
where to start (real code)
- modelcontextprotocol/servers
Anthropic's official MCP server reference repo. filesystem, fetch, Postgres, SQLite, Brave Search all included. clone this first to understand how MCP works before wiring iMessage / Notes / Calendar.
- steipete/openclaw
OpenClaw daemon — the easiest local agent runtime to set up. search GitHub for the latest; the README plus the example skills folder will get you started.
- mcp-server-imessage
community-maintained iMessage MCP servers. search GitHub and pick one updated within the last 30 days. same approach for mcp-server-apple-notes.
how this helps
- for you
- no more "wait, what did they say last month?" the answer is one question away. 10-15 minutes saved per client re-engagement, multiplied across your book.
- for your business
- clients feel remembered, which is what they pay you for. referral rates lift because you're the agent who remembers everything — names, deal breakers, school preferences, the spouse's job change.
- for your clients
- they get the experience of working with someone who actually paid attention. the kid's name, the contractor estimate they mentioned, the price ceiling they walked back from. recalled accurately, every time.
the honest catch
your client data lives on your machine. turn on FileVault — three clicks in System Settings. don't sync the agent's memory to iCloud. if you ever sell or trash that Mac mini, wipe it like it's full of contracts. effectively it is.
people who actually build this
02 · The build
Lead webhook in, voicemail script out — under five minutes
speed-to-lead isn't a mindset problem. it's a UX problem. fix the UX.
we've been routing every new lead through a Cloudflare Worker → Telegram bot → Claude API loop, and the speed-to-lead is now under five minutes without anyone having to think about anything. no CRM dashboard. no "lead inbox." just a Telegram message on your phone with three buttons.
the stack
Cloudflare Worker + aiogram + Claude Opus 4.8 + your CRM's webhook output
how it runs
Phase 1: The Catch
lead form on the site (or Zillow webhook, or Follow Up Boss, or whatever you use) fires into a Cloudflare Worker. the Worker normalizes the payload — name, phone, address of interest, price band, source — and pushes it into Telegram.
Phase 2: The Triage Message
the message that hits your phone looks like: "new lead — Sarah K., 407 area, interested in 1234 Magnolia (asking $685k), came in from Zillow 47 seconds ago." with three inline buttons underneath: DRAFT VOICEMAIL / SCHEDULE TOMORROW / NOT NOW.
Phase 3: The Voicemail Generator
tap DRAFT VOICEMAIL. the Worker pings Claude with the lead context + your last 20 voicemail transcripts (so it talks like you, not like a script) + whatever notes the CRM has on this address. 30 seconds later you get back a voicemail in your voice, ready to record.
Phase 4: The Loop Back
the Worker writes the outcome back to the CRM so nothing falls through. the lead is now on the hook in under five minutes from form submission.
what this replaces
- decision fatigue on every single new lead
- the "i'll get to it after this showing" black hole
- generic ISA scripts that sound like a robot ate a real estate textbook
speed-to-lead isn't a mindset problem. it's a UX problem. fix the UX.
where to start (real code)
- python-telegram-bot/python-telegram-bot
the canonical Python Telegram bot library. inline keyboards (the DRAFT VOICEMAIL button pattern) are documented under InlineKeyboardMarkup. look at the examples folder first.
- aiogram/aiogram
async alternative if you want better performance or prefer async/await. same functionality as python-telegram-bot, different ergonomics.
- anthropics/anthropic-sdk-python
official Anthropic SDK for calling Claude. the README has the simplest possible example — send a prompt, get a response. build the voicemail-draft prompt around that.
how this helps
- for you
- 90 seconds per lead intake. first reply in under 5 minutes instead of "i'll call them back tonight" that turns into next week. decision fatigue drops because the bot did the cognitive work.
- for your business
- speed-to-lead is the killer conversion metric. leads that get a human voice within 5 minutes convert at multiples of leads that get "i'll get back to you."
- for your clients
- they get a real, voice-recorded response in minutes — not a chatbot, not silence. their first impression of you is responsiveness, which sets the entire relationship.
the honest catch
your voice has to be in the prompt. feed it 5-10 of your actual past first-replies to leads. without them the bot writes generic and the lead can smell it before the second sentence.
people who actually build this
03 · The build
A 7am Telegram that tells you every promise you've made this week
trust is just kept promises, stacked.
we've been running a 7am Telegram briefing every morning that surfaces exactly which promises got made to clients in the last seven days and which ones are about to come due. it quietly became the most important thing on the phone.
the stack
Claude Code skill + iMessage MCP + Slack MCP + Gmail MCP + macOS cron + Telegram Bot API
how it runs
Phase 1: The Sweep
cron fires at 6:45am. a Claude Code skill walks through the last 7 days of iMessage (via MCP into chat.db), the last 7 days of Slack DMs and team channels, and the last 7 days of Gmail (sent + received).
Phase 2: The Promise Extractor
Claude reads the corpus with one job: find every sentence where you committed to do something. "i'll send," "i'll pull," "let me get you," "by Tuesday," "before the weekend." it doesn't care about chitchat. it only cares about debt you owe people.
Phase 3: The Triage
each promise gets tagged: who, what, by when, and whether you already delivered it (cross-referenced against later messages and calendar events).
Phase 4: The 7am Telegram
at 7am sharp the phone buzzes. "three commitments open this morning: the Smiths — callback you promised by Thursday (today). the Johnsons — price comp you said you'd send tomorrow. the Wilsons — tour proposal, no deadline given, 6 days old."
Phase 5: The Trust Compound
you clear them before the first showing. nobody ever wonders if you forgot.
what this replaces
- the sticky note system
- the "did i text them back?" 2am spiral
- ABSOLUTELY any "follow-up reminders" feature in your CRM
trust is just kept promises, stacked.
where to start (real code)
- modelcontextprotocol/servers
has filesystem and Gmail integration patterns. the Gmail MCP server is what you wire up for the email side. read the auth patterns carefully — OAuth setup is the longest part.
- slackapi/bolt-python
Slack's official Python framework. you won't post anything — you're reading your own DMs and channels for commitments. the Bolt examples cover read-only usage cleanly.
- anthropics/anthropic-cookbook
the "extracting structured data" patterns are exactly what you want. the prompt that distinguishes "a real commitment" from "chat noise" lives in this style.
how this helps
- for you
- never drop a promise. the bot remembers when you forget, which is genuinely most of the time once your book gets past 30 active clients.
- for your business
- trust compounds when you always do what you said you'd do. the agents who win on referrals are the ones who never let a commitment slip. this is how you scale that without scaling your memory.
- for your clients
- they get the response when you said they'd get it. not "next week," not "remind me again," not silence. the single most uncommon trait in real estate is reliability. this is how you ship it.
the honest catch
distinguishing real commitments from chat noise needs prompt-engineering iteration. expect 2-3 weeks of tuning before false positives drop to acceptable. start by labeling 50 examples by hand — what counts, what doesn't — and feed them into the prompt as few-shot examples.
people who actually build this
04 · The build
Text an address. PDF back in 90 seconds.
a CMA shouldn't gate a listing appointment. ever.
we've been generating full CMAs by texting "CMA for 1234 Magnolia Way Winter Park" to a Telegram bot, and a PDF comes back in about 90 seconds. you can now run one during a listing appointment while the seller is still talking. before this, a CMA was a two-hour evening project. now it's a text message.
the stack
python-telegram-bot + crawl4ai + Playwright (fallback) + Claude Opus 4.8 + ReportLab, hosted on a cheap VPS
how it runs
Phase 1: The Text-In
text the bot an address. that's it. no form, no portal login, no MLS tab juggling. the bot parses the address, geocodes it, and kicks off the run.
Phase 2: The Public Data Pull
crawl4ai hits Zillow, Redfin, and Realtor.com for the subject property plus recent sales in a half-mile radius. Playwright is the fallback when one of them gets cranky about scraping. nothing private, nothing MLS-protected — just public listing data, same as any consumer sees.
Phase 3: The Comp Selection
Claude gets the raw pile and picks 5 comps using real comp logic: same beds/baths band, sold within 90 days, similar sqft, similar lot, adjusted for pool/garage/waterfront. it shows its work — "swapped out 1456 Oak because it's a short sale, doesn't reflect arm's length."
Phase 4: The Narrative
Claude writes the actual analysis. price range with confidence. days-on-market trend for the neighborhood. seasonal note if relevant. the "if we price at $X we likely move in Y days" paragraph that sellers actually want.
Phase 5: The PDF
ReportLab assembles the PDF — cover page with the subject, comp grid, map, narrative, your logo and contact info. Telegram delivers it back to your phone as an attachment. 90 seconds from text to PDF.
what this replaces
- the 2-hour evening CMA grind
- showing up to listing appointments under-prepped because you ran out of time
- the moment a seller asks "what would you list it at?" and you have to say "let me get back to you"
a CMA shouldn't gate a listing appointment. ever.
where to start (real code)
- unclecode/crawl4ai
AI-friendly web crawler. handles JavaScript-rendered pages (Zillow) better than plain BeautifulSoup. output is already structured for LLM consumption, saves you a parsing step.
- microsoft/playwright-python
if crawl4ai isn't enough, drop down to raw Playwright. slower to write, but bulletproof for sites that aggressively block scrapers.
- reportlab
the Python PDF generation library most CMA tools end up using. search GitHub for examples — the docs are dense but the patterns are well-documented.
how this helps
- for you
- 90 seconds vs 2 hours per CMA. "do you have comps for this?" no longer eats your afternoon. listing appointments stop being gated on prep time.
- for your business
- faster turnaround wins listing appointments. the seller interviewing three agents picks the one who shows up with comps ready, not the one who says "i'll send you something this weekend."
- for your clients
- get a real CMA when they ask, not a delay. the trust signal of "i can pull this in 90 seconds" tells them you're operating at a different level.
the honest catch
scrapers break when Zillow or Redfin change their HTML. budget 1-2 hours per month for maintenance. if you outgrow scraping (volume or fragility), graduate to a paid data API — RentCast, HomeJunction, or Realtors Property Resource if you have access via your MLS.
people who actually build this
05 · The build
Your entire pre-listing workflow is one command
your voice is the moat. keep it. just stop typing every word of it.
we built a custom Claude Code skill that lives at ~/.claude/skills/listing-prep/ and now the entire pre-listing workflow is one command: claude prep 1234 Magnolia Way. what used to take a full afternoon now takes about the length of a coffee refill.
the stack
Claude Code + a custom skill repo on GitHub + 10 past listings as voice examples + Keynote/PPTX template + a small Python helper for the social queue
how it runs
Phase 1: The Comp Sweep
skill pulls 5 comparable solds within the radius, same beds/baths band, last 90 days. nothing fancy — just the comp foundation any listing appointment needs.
Phase 2: The MLS Description (in YOUR Voice)
this is the part that actually matters. the skill has 10 of your past listing descriptions loaded as voice examples. when it drafts a new description it sounds like you — not like ChatGPT's idea of a luxury home. it uses your cadence, your words, the way you lean on porches and lanais and "morning light through the live oaks" instead of "luxurious entertainer's paradise."
Phase 3: The Listing Presentation
pre-fills your Keynote presentation template — subject address, comp grid, recommended price band, market-snapshot slide, marketing plan slide. you open it, tweak the recommended price, and it's ready for the appointment.
Phase 4: The Social Queue
drops three pieces of pre-listing social into a queue file. "coming soon" Instagram caption, neighborhood teaser for Stories, a LinkedIn post for the agent network. all in your voice. all referencing the actual property, not "stunning new listing!"
Phase 5: The Handoff
you review. you don't rewrite. you ship.
what this replaces
- the afternoon of comp-pulling, description-writing, deck-tweaking, caption-drafting
- the generic-template look that screams "i did this in 10 minutes"
- ChatGPT prompts that produce something nobody could mistake for YOUR writing
your voice is the moat. keep it. just stop typing every word of it.
where to start (real code)
- anthropics/anthropic-cookbook
has skill patterns and Claude API examples. read the "tool use" and "extended thinking" sections — they're the building blocks of any skill that does more than a single prompt.
- mvanhorn/last30days-skill
the skill we use to mine signals for our own blog (search GitHub for the latest version). it's a working example of a non-trivial Claude Code skill — read the SKILL.md and the scripts/ folder to see how a real skill is structured.
- your-name/listing-prep
the one you create. your repo, your voice examples, your team's prompts, versioned in git. share read access with your team so everyone on your brokerage runs the same workflow.
how this helps
- for you
- hours of repetitive prep collapse into minutes. cognitive load on routine listings drops to zero, which frees attention for the parts that actually matter — the seller conversation, the strategy call, the staging walkthrough.
- for your business
- more listing appointments per week because prep is no longer the bottleneck. your team can run the same skill, which means your operating standard is consistent across every agent in your office.
- for your clients
- their listing presentation feels more polished because you put energy into the parts AI can't do (the local-market storytelling, the pricing strategy nuance). the mechanical work was already done.
the honest catch
the voice examples ARE the skill. without 5-10 of YOUR actual past listings in the prompt, the output reads identical to every other agent using the same shape of skill. maintain a "voice examples" file religiously — add new ones, retire stale ones, version it in git.
people who actually build this