Most behavior systems split your day into separate buckets:
- habits live in a habit app
- tasks live in a task manager
- routines live in a calendar or a note
You become the integrator — figuring out how they relate, which one to open, why they keep falling out of sync.
Buffy uses a different model. Every behavior you want to change — whether it repeats daily, has a deadline, or bundles into a morning sequence — is an Activity. One model, one engine, one event history.
What is the Activity model?
The Activity model is Buffy's unified structure for habits, tasks, and routines. Every behavior you track lives as an Activity with:
- Type: habit, task, or routine
- Schedule: time window, interval, or due date
- Status log: what happened each time (done, skipped, snoozed, partial)
- Event history: the ground truth record the behavior engine learns from
The three types share this structure, which means the behavior engine can coordinate them — instead of treating them as three disconnected systems.
What you'll learn in this post:
- How each Activity type works and when to use it
- How routines bundle habits into sequences
- How the shared event history enables adaptation
- What this looks like in practice
The three Activity types
Habit
A habit is a repeated behavior with a time window and an interval.
- "Drink water" — weekdays, any time between 7:30–8:00
- "30-minute walk" — daily, 12:00–13:00
- "No social media" — weekdays, 09:00–17:00 (quit habit)
Key properties:
- Interval: daily, every N days, weekdays, specific days
- Time window: a range, not a fixed alarm — Buffy can nudge at any point within it
- Status per occurrence: done, skipped, snoozed, or no-reply
- Memory: completion rate, timing patterns, which channel you respond on
The window model is intentional. A fixed alarm at 7:30am fails if you wake up at 7:45. A window from 7:30–8:00 gives Buffy room to nudge you when the window opens and again if you haven't responded before it closes.
Task
A task is a one-off item with an outcome and usually a deadline.
- "Ship weekly metrics review" — due Friday 4pm
- "Reply to Alex's proposal" — due today
- "Set up Telegram with Buffy" — no deadline
Key properties:
- Due date (required or optional)
- Status: pending, done, deferred, cancelled
- No recurrence by default (though recurring tasks are possible)
- Memory: deadline adherence, how far in advance you typically complete vs. leave to the last hour
Tasks and habits use the same reminder engine. When you tell Buffy about a Friday deadline in Slack, it creates a task activity and the scheduler handles the rest — a light nudge on Thursday, a follow-up Friday morning if nothing's logged.
Routine
A routine is a container that bundles habits (and steps) into an ordered sequence with a single time window.
- "Morning startup" — water, 10-min planning, stretch — weekdays 7:30–8:00
- "Deep work block" — focus mode, check metrics after — Mon/Wed/Fri 10:00–12:00
- "Weekly review" — metrics review, task triage, next week planning — Fridays 16:00–17:00
Key properties:
- Ordered steps: each step is a habit activity (or a simple action)
- One nudge opens the routine — not three separate reminders for three habits
- Completion tracked at two levels: routine (did it happen?) and step (which parts were done?)
- Memory: which steps consistently get skipped, which channels work best for which steps
The difference between "three separate habits" and "one routine" is coordination. When water, planning, and stretching are a routine, Buffy opens them together, tracks them together, and can suggest "you almost always skip the stretch — want to move it to your afternoon?" — because it sees the pattern at the routine level.
How they work together
The Activity model becomes most useful when habit, task, and routine live in the same system.
Consider a Tuesday morning:
- The Morning startup routine nudges at 7:35 in Telegram: "Ready to start? Water, planning, stretch."
- You reply: "Done water and planning, skipping stretch."
- Buffy marks the routine as partial, logs the skip.
- At 10:00, the Deep work block routine opens. Buffy suppresses low-priority nudges during the window.
- At 11:00, a task reminder appears: "Metrics review is due Friday. Want to block time this afternoon?"
- At 17:30, a summary in Telegram: "Morning startup: 2/3. Deep work: complete. Metrics review: blocked for Thursday 14:00."
Three Activity types. One behavior engine. No app-switching required.
The event history
Every interaction with an Activity generates an event:
| Event | Triggered by | What it records |
|---|---|---|
completed |
"done" reply | Activity, timestamp, channel, response time |
skipped |
"skip" reply | Activity, timestamp, reason if given |
snoozed |
"snooze 20m" | Activity, snooze duration, new nudge time |
no-reply |
Window closes | Activity, window end, last nudge time |
partial |
Routine with some steps done | Routine, completed steps, skipped steps |
modified |
User changes schedule | Old config, new config, timestamp |
This event log is what makes adaptation possible. A habit tracker records whether you hit a streak. Buffy records what actually happened — which lets the reminder engine adjust timing, tone, and channel based on real patterns, not assumptions.
A streak breaks and you don't know why. An event log shows you skipped three Tuesdays in a row when late Monday Slack activity spiked — and Buffy can ask: "Want to shift your Tuesday morning window to 9am?"
From natural language to Activity model
You don't configure the Activity model directly. You describe what you want:
"Weekdays, remind me to drink water, do 10 minutes of planning, and stretch — between 7:30 and 8:00."
Buffy creates:
- A routine activity: "Morning startup", weekdays, window 7:30–8:00
- Three habit activities inside it: water, planning, stretch
- A reminder config: nudge at window open, follow-up near close
"Remind me to ship the metrics review by Friday 4pm."
Buffy creates:
- A task activity: "Ship metrics review", due Friday 16:00
- A reminder schedule: Thursday afternoon nudge + Friday morning follow-up
The model is the implementation layer. You interact with it through natural language.