Gratitude Field
Gratitude Field gives you one job: find something good today. That's it. Do it every day and your brain starts doing it automatically. Toby is your accountability partner. He's very serious about this.
Complete Logging Flow
One gratitude per day. One tag per day. Small actions, cosmic ripples.
Home: Ready to Log
The default landing state. Users can only log once per day -- on load the app reads lastGratitudeMillis to decide which state to show. If they haven't logged today, this is where they land.
Info Sheet
Triggered by tapping the (i) button. A purely informational overlay -- no data is read or written. Dismisses by tapping outside or dragging down.
Error: Empty Input
Client-side validation only. No data is written. The error clears as soon as the user starts typing.
Everything else stays the same. User can keep typing and resubmit.
Error: Too Short
Same as above. Minimum length is 3 characters. Two separate error states exist so the message can be specific.
Everything else stays the same. User can keep typing and resubmit.
Success: Just Logged
Shown immediately after a successful log. Streak increments, gratitude is written to Firestore. The milestone message rotates based on streak count.
| Streak | Message |
|---|---|
| Days 1-3 | Day [X]. Toby's watching. Keep it up. |
| Days 4-6 | You're on a roll. Toby tilts his head, curious. |
| Day 7 | Seven days. Toby does a slow barrel roll in approval. |
| Day 14 | Two weeks. Even Toby's raising an eyebrow now. |
| Day 30 | A full month. Toby removes his helmet in respect. (He puts it back on immediately.) |
| Day 100 | 100 days. Toby has no words. Just vibes. |
For the spec demo, streak starts at 1 and increments each time the demo is "logged."
Tag a Friend Sheet
One tag per day. The availability logic is real -- a user can only be tagged if they haven't logged today and have no pending chain. Jamie Lee is hardcoded as unavailable in this demo to show the logic.
Already Tagged
The resting state for the remainder of the day after tagging. No further actions available until midnight resets the clock.
Already Logged (Return State)
Shown when the user opens the app after already logging today. Input is hidden. Tag CTA shows if they haven't tagged yet, Already Tagged copy shows if they have.
Interaction Summary
Complete map of user actions, screen results, and database operations across the logging flow.
| User Action | Result | DB Operation |
|---|---|---|
| Open app, not logged today | Screen 1: Ready to log | read lastGratitudeMillis |
| Open app, already logged, not tagged | Screen 5 with Tag CTA | read lastGratitudeMillis, lastTaggedMillis |
| Open app, already logged + tagged | Screen 4: Already tagged | read lastGratitudeMillis, lastTaggedMillis |
| Tap i on home | Screen 0: Info sheet slides up | No DB |
| Dismiss info sheet | Returns to home | No DB |
| Tap Log it, empty field | Error 1a, stay on Screen 1 | No write |
| Tap Log it, 1-2 chars | Error 1b, stay on Screen 1 | No write |
| Tap Log it, 3+ chars | Screen 2: Success | write Gratitudes + Users |
| Tap Tag a Friend | Sheet opens (Screen 3) | read Users for search |
| Tap "Why not available?" | Inline tooltip appears | No DB |
| Tap Tag on available friend | Snackbar + Screen 4 | write Gratitudes, Chains, Users (x2) |
| State | When Used | Description |
|---|---|---|
| Idle / curious | Home, Tag sheet | Floating, blinking, looking around |
| Happy / celebrate | Success, Already logged | Subtle bounce or slow spin |
| Content / satisfied | Already tagged | Still, calm, done for the day |
Come back tomorrow.
Writing something new each day trains you to actively look for good moments. It's a small practice that changes how you see life.
Why fields?
Tag a friend to start a chain reaction. One logs, tags another, who logs and tags the next person.
Small actions, cosmic ripples.