← All the guides

Step 3 of 6

Give it a memory

Learn to get your goals, to-dos and notes into one place your assistant can read. You copy a board that already exists, answer an interview, and upload what you already have. Eight short goes, an afternoon.

What it does

  • Holds what the assistant is allowed to know about you, in tables you own and edit on your phone
  • Learns who you are from an interview rather than a form, so its answers sound like they are for you
  • Takes in what you already have, your to-do app, your notes, your journal, without you retyping any of it

Why I built it

An assistant with no data is a chat window. What makes this one worth building is that it knows things. How you slept, what is owed, who has the kids on Thursday, what you decided back in March. All of it has to live somewhere that survives a redeploy.

Most builds fail at this step. The first instruction is usually design a database, and almost nobody knows what tables they want before they have used the thing. So you skip that part entirely and start from a board somebody else has already filled in.

Airtable is the store here, because you edit it on your phone in a queue at the school gate. A database nobody opens by hand stops getting corrected.

Build it

1.

Copy the starter board

Eight tables, already named and typed. Profile is who you are. Brain Context is what you decided and why. Then Projects, Tasks, Daily Habits, Commitments, Goals, and Voice Turns for later.

Open the link, hit Copy base, and it lands in your own Airtable. Nothing to design, nothing to name.

Look through it before moving on. Read the description on each table. You are about to fill it with your life, so it is worth knowing what is in there.

2.

Tell it who you are

This is the step that decides whether the assistant is useful or generic, and it is the one most builds skip.

About twenty questions, one at a time, out loud if you have voice typing. How you work, what you avoid, what a good week looks like, who is in your life. Answer messily. Tidy answers give it less to work with.

What lands in Profile shapes everything the assistant says later. Rush it and the profile stays thin, and so do the answers.

Paste this into Claude Code
Interview me about my life so my assistant knows who it is working for. Then write the answers into the Profile table in my Airtable base.

How to run this:
- One question at a time. Wait for my answer before asking the next.
- Follow up when an answer is vague. Ask "what does that look like on a normal Tuesday?"
- Do not tidy my answers into corporate language. Keep my words.
- If I contradict myself, say so and ask which is truer.
- Do not write anything to Airtable until the end.

Cover these, roughly in this order, about twenty questions total:
- Name, where I live, what I do for money
- What happened in the last few years that matters
- What I am good at, and what people come to me for
- What I avoid, and what it costs me
- How I want to be spoken to: blunt, warm, brief, patient
- When my brain works best, and when it does not
- What a good week looks like, concretely
- Who is in my week, and how
- What I currently keep in my head that I wish I did not
- What I would not want an AI touching

At the end:
1. Show me a draft of every Profile field before writing anything.
2. Let me correct it.
3. Then write it to the Profile table, one row.
4. Read it back to me and ask if that is a person you know how to be useful to.
3.

Bring the to-do list you already have

You keep tasks somewhere already. Todoist, Things, Notion, Apple Reminders, a Notes list, a spreadsheet, the back of an envelope you photographed.

Export it. Every one of those tools has an export, and Claude Code will find it with you if you say which one you use. Drop the file in the project folder.

Then it reads the lot and asks you about it, because half of what is in there is dead and only you know which half.

Paste this into Claude Code
I want to move my existing to-do list into my Airtable base.

Step 1. Ask me which app or file my tasks currently live in. If I am not sure how to export from it, tell me exactly where the export button is.

Step 2. Once I have put the file in this folder, read it and tell me what you found: how many items, how far back they go, and whether they look like tasks or projects.

Step 3. Interview me about it, one question at a time:
- Which of these are still live?
- Which of these are projects with several steps hiding inside them?
- Is there anything in here I have been avoiding for months? Name them back to me.
- Anything private in here you should not put in the database?

Step 4. Propose a split: which rows become Projects, which become Tasks, and which get archived. Show me the list. Do not write yet.

Step 5. After I approve, write them to Airtable. Give every active Project exactly one Next Action, and if the source data does not give you one, ask me for it rather than inventing it.

Rules: never invent a due date. If something has no date, leave it empty. Tell me anything you chose to drop and why.
4.

Feed it your notes

Apple Notes, a journal, old documents, a decade of half-thoughts. This is what turns an assistant that knows your schedule into one that knows your reasoning.

Dumping the lot in is the wrong move. A thousand raw notes in a database is a second landfill with better search. What you want is the facts pulled out, each with a date and a link back to where it came from.

There is one safety step that matters. Old notes are full of passwords, card numbers and other people's private business. A second pass reads the results and blocks anything like that before it lands anywhere.

Paste this into Claude Code
I want the facts pulled out of my old notes and into the Brain Context table, rather than a raw dump of the notes themselves.

Step 1. Ask me where my notes are and how many there are roughly. Apple Notes, Obsidian, a folder of documents, whatever it is. Help me get them into a folder as plain text or markdown.

Step 2. Sort them before reading them properly. Split into:
- Signal: 30 words or more, contains a decision, a fact, something that worked or failed
- Scraps: short reminders and shopping lists. Archive, do not process
- Sensitive: anything with a password, key, card number, or another person's private information

Tell me the counts. Sensitive stays on this machine and goes nowhere near the database. Confirm that back to me.

Step 3. Read the signal notes and pull out one claim at a time rather than a summary. Each claim carries the date it was written and which note it came from.

Step 4. Before anything is written, run a second pass over your own output whose only job is to find credentials, personal data or anything about another person that they would not want stored. If it finds any, stop and show me. Do not proceed until that pass is clean.

Step 5. Show me the first twenty facts for approval. Then write the approved set to Brain Context, keeping the date and source on every row.

Rules: never write a fact you cannot trace to a source note. If you are unsure whether something is a fact or my speculation, ask.
5.

Let the app read your board

Right now your app and your data are two separate things that have never met. This step introduces them.

Everything goes through one function. When something changes later, and it will, you fix it in one file instead of forty.

One detail in here looks fussy and is not. Ask for your columns by their permanent ID rather than their name. Rename a column on your phone and a name-based app breaks silently, with no error and no crash. There is a second detail of the same kind, and it is the next step.

Paste this into Claude Code
Connect this app to my Airtable base so it reads and writes my data.

Explain what you are doing as you go. I want to understand this bit.

1. Show me where to find my Airtable personal access token and which permissions to give it. Put it in an environment variable, never in a file that goes to GitHub.
2. Ask me for my base ID and find it with me if I do not know where it is.
3. Build one function that every call to Airtable goes through. It should:
   - Always ask for fields by their field ID rather than their name, and explain to me why that matters
   - Never use a cached response
   - Throw a clear error if Airtable says no
4. Store the table IDs and field IDs in one file, with a comment above each explaining what it holds.
5. Prove it works: fetch today's row from Daily Habits and print it in the terminal.

Rule: before writing the code, tell me in three sentences what would break if we asked for fields by name instead of ID.
6.

Stop it showing you yesterday

Two lines at the top of every route that talks to your data. Without them the app quietly serves you an old answer.

This one is worth knowing about because of how it fails. There is no error. Nothing crashes. You see last Tuesday's sleep, you log a habit twice, and you spend a day convinced Airtable is broken. It is not.

Add them as a reflex from now on, before you write the handler.

Paste this into Claude Code
Explain caching to me in the context of this app, then fix it.

1. In plain English, tell me what Next.js caches by default, why that is usually a good thing, and why it is wrong for an app reading a database that changes every day.
2. Show me what the symptom looks like, so I recognise it if it happens again.
3. Add the two lines to every API route in this project that reads or writes Airtable.
4. Add a rule to my project notes so you do not forget this in a future session.

Then quiz me: ask me what would happen if I logged the same habit twice without this fix. Correct me if I get it wrong.

top of every route that reads or writes your data

export const dynamic = "force-dynamic";
export const fetchCache = "force-no-store";
7.

See your own life on screen

One page. Your name from Profile, today's row from Daily Habits, today's commitment. Nothing clever.

This is the moment the build stops being abstract. Something you made, on your own web address, showing you your own week back.

Open it on your phone. That is where you will use it.

Paste this into Claude Code
Build me a simple home page for this app.

Before you build it, ask me two things:
1. What are the three things I would want to see the second I open this on my phone?
2. Should it show me what is missing, for example a day with no sleep logged, or stay quiet about it?

Then build it:
- My name and one line from my Profile
- Today's row from Daily Habits, with anything unlogged shown as a gap rather than a zero
- Today's commitment from Commitments, or a prompt to set one
- Plain and readable on a phone. No charts, no icons, no colour scheme

Deploy it and give me the URL.

Rule: if a table is empty, say so on the page in plain words. Never show me a zero that is a missing value.
8.

Write down the rules so it stops forgetting them

Every new Claude Code session starts fresh. Without notes it will reintroduce the caching bug and the field-name bug you fixed a moment ago, and it will do it confidently.

So you leave it a file at the top of the project. What the app is, where things live, and the rules that are not up for debate. It reads that file at the start of every session.

About eighty lines. It is the shortest job in this guide and the one that pays back most.

Paste this into Claude Code
Write a CLAUDE.md at the root of this project so future sessions do not undo what we have built.

Interview me first, one question at a time:
1. How would I describe this app in one sentence to a friend?
2. What have we already decided that I would be annoyed to have to decide again?
3. Is there anything you did in this session that I asked you to change? Those are rules.

Then write the file, covering:
- What the app is, the stack, and where it deploys
- The rule about field IDs rather than field names, and what breaks without it
- The two caching lines every data route needs, and what breaks without them
- Credentials live only in environment variables
- Where the table and field IDs live

Keep it under a hundred lines. Every rule gets one line saying what goes wrong if it is ignored, because a rule with no consequence attached is a rule the next session talks itself out of.

Next

Step 4: Give it a voice

Read it →