How to build a personal AI assistant that actually knows you — with persistent memory across sessions, morning briefings, meeting prep, and knowledge capture workflows. Costs about $5/month with Claude Haiku.
The reason most AI assistants feel shallow after a week is not model quality. The problem is memory. You tell ChatGPT something important on Monday. By Wednesday, it has no idea who you are, what you are working on, or why you were asking about Kubernetes networking. You start every conversation from zero.
Building a useful personal AI assistant is fundamentally a context management problem. You need the assistant to accumulate knowledge about your work, preferences, and ongoing projects — and have that knowledge available every time it responds. This post covers how to build exactly that using AACFlow's memory block and a set of three interconnected workflows that cost about $5 per month to run.
There are two naive approaches to AI memory. The first is stuffing everything into the system prompt. This works up to about 10,000 tokens, then becomes expensive and eventually hits context limits. It also degrades response quality — an LLM with 50,000 tokens of "context" in the system prompt spends most of its attention on the context, not on your actual question.
The second naive approach is vector search: store everything, retrieve the most similar chunks. This works well for factual recall but poorly for relational knowledge. "What did I decide about the pricing model last month?" needs reasoning about your decision history, not just semantic similarity to the query.
AACFlow's memory block takes a different approach. It maintains a structured key-value store per workspace. You write facts explicitly: project_x_status: "In beta, launch target Q3", preferred_llm_provider: "Anthropic", . The assistant reads these facts at the start of each conversation and has them as grounded context.
The key insight: most of what makes an assistant useful is not the ability to recall arbitrary text — it is knowing a specific set of facts about you and your work. Those facts fit in a few hundred keys. A few hundred keys fit in a few thousand tokens. A few thousand tokens of structured context, loaded fresh at the start of every conversation, gives you an assistant that consistently behaves as if it knows you.
This runs every weekday at 7:30 AM via a schedule trigger. It does five things:
Fetch your calendar. A Google Calendar block pulls today's events and tomorrow's events. It extracts attendee names, meeting titles, and durations.
Scan your email. A Gmail block fetches unread messages from the last 18 hours, filtered to exclude newsletters and automated notifications. It pulls sender, subject, and a snippet.
Check project status. The workflow reads from your AACFlow memory store — the keys that track active projects, blockers, and decisions from the last 30 days.
Generate the briefing. A Claude Haiku block synthesizes everything into a morning briefing. The prompt is specific:
1
You are a personal assistant for a senior software engineer and founder.
2
Given today's calendar, recent emails, and current project context,
3
generate a morning briefing that:
4
1. Lists today's meetings with attendee context(who are these people?)
5
2. Flags any emails requiring action before end of day
6
3. Notes any project context that's relevant to today's meetings
7
4. Suggests one thing to tackle first thing, based on urgency and importance
8
9
Memory context:[MEMORY_STORE_SNAPSHOT]
10
Calendar:[TODAY_EVENTS]
11
Emails:[RECENT_EMAILS]
Deliver it. The briefing goes to Telegram via the Telegram block. It arrives before you open your laptop, so you can read it over coffee. No app switching. No inbox zero anxiety.
Cost per briefing: approximately $0.003 with Claude Haiku. Twenty working days per month: $0.06. This is not a rounding error — it is genuinely free at Haiku pricing.
This triggers 30 minutes before any calendar event that includes external attendees. It is triggered by a schedule trigger that checks the calendar every 15 minutes and looks for meetings starting in 30–45 minutes.
Research attendees. For each external attendee, the workflow uses a web search block to find their recent public activity — LinkedIn role, any recent talks or writing, company news. This is public information synthesis, not surveillance.
Pull relevant context. The memory store is queried for any stored facts about these attendees: previous meeting notes, agreements made, follow-up items that were never resolved.
Check your project state. If the meeting title matches a project name in your memory store (fuzzy match via a function block), the workflow pulls the full project context.
Generate a briefing. Claude synthesizes this into a one-page meeting prep document: who these people are, what context you have from previous interactions, what you should know about the company, and a suggested agenda based on the meeting title and your stored project state.
Deliver it. Sent to Telegram, 30 minutes before the meeting starts.
This workflow is where the persistent memory pays off most. "Last time we spoke, you agreed to send them the API docs by March" — that kind of recall changes a meeting from a catch-up to a continuation of an ongoing relationship.
This is the workflow that feeds the memory store. It runs on demand, triggered by a message to a dedicated Telegram bot.
After a meeting, you send the bot a voice note or text: "Met with the Acme team. They want a custom connector for their ERP. Timeline is 6 weeks. Main contact is Sarah K., she's the CTO. They have budget but need a proof of concept first."
The workflow:
Transcribes if needed. If it is a voice note, the STT (speech-to-text) block transcribes it using Whisper via the OpenAI API.
Extracts structured facts. Claude analyzes the transcription and extracts key-value pairs:
1
{
2
"acme_crm_status":"Interested in custom ERP connector",
3
"acme_crm_contact":"Sarah K., CTO",
4
"acme_crm_timeline":"6 weeks, POC first",
5
"acme_crm_budget":"Confirmed, amount TBD"
6
}
Writes to memory. The AACFlow memory block writes these keys to your workspace memory store. The keys are structured with a prefix pattern (acme_crm_) so they can be retrieved together when needed.
Confirms. The bot replies with a summary of what was stored and asks if anything needs correction.
This creates a flywheel: the more you capture, the more useful the morning briefing becomes, the more context the meeting prep pulls, the more you want to capture.
The AACFlow memory block stores key-value data in the database tied to your workspace. It is not session memory — it is workspace memory. Every workflow running in your workspace has access to the same memory store.
When the morning briefing workflow runs, it reads the current state of all memory keys. When you update a key through the knowledge capture workflow, that update is immediately available to the next run of any workflow in the workspace. The memory store is effectively a shared, persistent context layer for all your AI workflows.
A few practical patterns that matter:
Use structured key naming. Flat keys like meeting_notes become unmanageable. Use prefixes: project_x_, client_acme_, preference_. You can then pull all keys for a topic with a prefix query.
Date-stamp time-sensitive facts. Store project_x_status_20260701: "In beta" rather than overwriting project_x_status. You get a history without needing a separate logging system.
Expire stale facts. A weekly cleanup workflow reads all keys and passes them to Claude with the question: "Based on these stored facts, which ones are likely stale or superseded?" Delete the ones Claude flags. This keeps the context store from growing into noise.
All memory data is stored in your AACFlow workspace database. It does not leave your workspace. The LLM calls — Claude Haiku for briefings, Claude Sonnet for analysis — receive the relevant subset of your memory store as part of the prompt, but no memory data is stored by Anthropic or used for training.
If you are running AACFlow self-hosted, the memory store is in your own Postgres instance. You have full control over the data and can inspect, export, or delete any key at any time.
The Telegram bot uses a webhook trigger with a secret token. Only messages from your authenticated Telegram account trigger the knowledge capture workflow. If you are more privacy-conscious, replace Telegram with a local webhook trigger and a simple web form.
Here is the full cost breakdown for a typical month of active use:
Morning briefing (20 days × $0.003): $0.06
Meeting prep (average 3 external meetings per week × $0.02 per prep): $2.40
Knowledge capture (average 2 captures per day × $0.01 per capture): $0.60
AACFlow execution overhead (workflow runs × compute): approximately $1.50
Total: approximately $4.56 per month, rounded up to $5 for buffer.
This assumes Claude Haiku for briefings and knowledge capture, Claude Sonnet for meeting prep (where quality matters more). If you switch everything to Haiku, the monthly cost drops below $2.
The three workflows are available as a bundle in the AACFlow template library under "Personal AI Assistant." The setup checklist:
Connect Google Calendar
Connect Gmail (or Outlook — the Outlook block works the same way)
Create a Telegram bot via BotFather, add the token to AACFlow credentials
Set your schedule for the morning briefing (default: weekdays at 7:30 AM in your timezone)
Add five to ten seed memory keys to give the assistant initial context about who you are and what you work on
The hardest part is not the technical setup — it takes about twenty minutes. The hardest part is building the habit of capturing after meetings. Once you have a month of captures in memory, the assistant starts feeling genuinely useful rather than generically helpful.
An AI assistant that does not know you is a search engine with a chat interface. An AI assistant with a week of your context is a knowledgeable colleague. An AI assistant with six months of your context is the best executive assistant you have ever had, available at 2 AM, and it costs about the same as a cup of coffee per month.