Day 10, 11, and 12 of building Evengood — a 60-second journaling app — for the Build with MeDo $50K hackathon.
If you've read my previous posts, you know the spine of this project: every product decision is a fight to NOT add the thing every journaling app already has. No streaks. No gamification. No therapy voice. No human face in any generated image. No auto-play audio. No "you've been quiet for 3 days, are you okay?" notification.
This week the fight was about email.
The default email behavior of every wellness app
Open any journaling or wellness app and look at what lands in your inbox after a month. You'll find:
- A weekly digest you didn't ask for.
- A "your week in numbers" report with charts.
- Streak reminders ("don't lose your 14-day streak!").
- "We noticed you've been quiet" check-ins.
- Promotional emails for the premium tier.
- Affiliate emails for meditation apps.
- Surveys, NPS prompts, "how are we doing?".
The unsubscribe link is usually 9-point grey on grey at the bottom, behind a confirmation page that asks if you're sure, with a final "are you really sure?" modal.
Email is the unwell part of wellness apps.
What I shipped this week
Evengood now has exactly one email surface, and it's called The Pattern, by email.
Here's the entire copy on the home screen, verbatim:
The Pattern, by email.
One sentence about your week, every Sunday morning. Nothing else.
That's the feature. That's the whole feature.
If you opt in, you get one email per week. The email contains exactly one sentence — the same Pattern sentence the app generates for you on Sunday morning, the one that reads something like "there is a rhythm of late meetings leaving you drained, followed by quiet walks that steady you."
Header in Georgia italic. Body in a single Helvetica paragraph. The app's locked palette in a soft gradient. No subject-line cleverness. No "hey [first name]". No tracking pixel. No unsubscribe footer in 9-point grey.
52 sentences a year if you stay opted in for the full year. Most people won't. That's fine.
What I deliberately did NOT build
Here's the email-feature backlog I rejected this week, in the order it was tempting:
1. Streak reminders. Easy engagement win. Rejected because shame is not a habit loop I want to build for someone closing their laptop at midnight.
2. "You haven't reflected in 3 days" emails. Rejected because if someone stops using the app, the app should be okay with that. Notifications-as-guilt is the entire problem.
3. Weekly digest with multiple sentences, bullet points, and charts. Rejected because the Pattern is one sentence. The email is the same one sentence. Adding anything dilutes it.
4. A welcome email when you opt in. Rejected because every app does this and nobody wants it. If you opted in, you already know what the app is.
5. Tracking pixel for open-rate analytics. Rejected because I don't need to know if you read it.
6. An unsubscribe confirmation page. Rejected because if you click unsubscribe, you've unsubscribed. No confirmation. No "are you sure?". No survey about why.
The unsubscribe link is at the top of the email in the same font size as the body. One click via signed token and you're out. No login. No "sign in to manage your preferences."
What I did build
Four edge functions and one table:
-
subscribe-pattern— validates the email, stores it as unconfirmed, generates a confirmation token, sends the one-time confirmation email. -
confirm-pattern-subscription— verifies the token, flips the row to confirmed. That's the only thing it does. -
send-pattern-emails— runs Sunday morning. Pulls confirmed subscribers. Generates each person's Pattern from the most recent week of reflections. Sends one email per subscriber. -
unsubscribe-pattern— verifies the unsubscribe token, marks the row unsubscribed. Token is one-click, no auth required.
The table has row-level security so the anon key can write new subscriptions but can't read anyone else's email — not even its own row after insert. The server doesn't store your reflections. It only knows your email and a device ID, in separate tables that don't join.
Total bytes the server stores about you per year if you opt in: your email address, plus 52 timestamps of when emails went out. That's it.
Why this took a full week
It didn't take a week to build. The four edge functions are maybe 200 lines of TypeScript total. The email template is 60 lines of HTML.
It took a week to NOT build the seven other features I kept wanting to add. To delete the welcome email I wrote on Tuesday. To delete the digest format I prototyped on Wednesday. To delete the "you used the word 'tired' three times this week" insight email I wrote on Thursday and was very proud of.
Every deleted feature was a feature.
Where Evengood stands at Day 12
- Days 1–3: built the 60-second reflection loop and the watercolor keepsake.
- Days 4–7: shipped Pattern detection — heavier-day words in peach, lighter-day words in lavender, one quiet sentence about the rhythm of your week.
- Days 8–9: shipped Witness Mode (the once-a-week night the app refuses to reflect on your day).
- Days 10–12: shipped The Pattern, by email — one sentence, every Sunday, that's the whole feature.
18 days remain.
The list of things I'm not going to build is longer than the list of things I am.
That's still the whole product.
Live: https://app-b3tuv7opfegx.appmedo.com
Top comments (0)