What inspired us

We were inspired by a simple, familiar problem: we want to stay in contact with our family and closest friends, but we don’t have the bandwidth to call every single one of them every day. Life gets busy, time zones get in the way, and “we should talk more” never quite happens.

On top of that, it’s hard to remember everything you did over the last week or two. When you do get on a call, you draw a blank—What did I even do?—and the conversation never gets the richness it deserves. We wanted a way to prime ourselves: a short, honest recap of our recent life (calendar, emails, messages) so we could share it with the people we love, or use it to jump-start a real conversation.

So we built Scrap: a way to turn your last 7 days into a brief digest and optional video reflection, then share it with the people who matter. Not a replacement for calling—a way to close the gap. If you have (n) people you care about and only so much time (t) per week, Scrap helps you stay in touch without (n \times \text{daily calls}).

What we learned

  • Pulling many data sources into one story. We learned how to combine Google Calendar, Gmail, and (optionally) Messages via a local Python CLI into a single timeline, then hand it to Gemini for a concise summary. Designing prompts so the model stays short and signal-rich (no fluff, no intros) took real iteration.
  • OAuth and API ergonomics. Gmail and Calendar require OAuth2 and careful scoping; we got comfortable with refresh tokens, consent screens, and keeping secrets out of the repo.
  • Priming as a product. “Priming” isn’t just a backend feature—it’s the core UX. We learned to expose it clearly in the app (e.g. usePriming, journal screen) so the user sees here’s what happened before they record or share.

How we built it

  • Backend (Node/Express): Gmail API for recent emails, optional Mac Messages via a Python CLI (get_messages_cli.py), and a Gemini-based summarizer to turn raw calendar + email (+ optional messages) into a short bullet recap. No Poke—we moved away from Poke and its MCP integration because it became too much of a hassle; our own Gemini pipeline is simpler and fully under our control.
  • Priming pipeline: The app requests priming for a time window (e.g. last 7 days). The backend fetches calendar, Gmail, and optionally Messages, then uses the Gemini summarizer to produce priming text. The mobile app displays this so you’re “primed” before you journal or share.
  • Weekly summary (Python): A standalone script in weekly_summary/ uses Google Calendar + Gmail OAuth and Gemini to print a 7-day summary—useful for local use or scripting.
  • Mobile (Expo/React Native): Journal flow, priming hook (usePriming), and Convex for auth and storing scraps (videos). The app is built so backend/data (API, services, hooks) stay separate from UI.
  • Data & auth: Convex for user accounts (including email/phone verification), and for storing scraps (video refs and timestamps). Auth is wired so the app can securely request priming and store what you share.

Challenges we faced

  • Unifying calendar, email, and messages. Each source has different APIs, rate limits, and formats. We had to normalize time ranges (e.g. “last 7 days” in Gmail after: vs Calendar timeMin/timeMax) and design a single prompt that works whether we have one or all of these.
  • Keeping summaries short and useful. Default LLM output is often long and generic. We spent time on prompt design (bullet-only, no intros, under ~15 lines) and sometimes on post-processing so the primer actually fits on a phone screen and feels scannable.
  • Latency and fallbacks. Fetching Gmail + Calendar + Messages and then calling Gemini can be slow. We added mock priming in the app when the backend isn’t available, and we considered (and in some paths implemented) timeouts and partial results so the app never blocks forever.
  • Dropping Poke and MCP. We initially explored Poke for AI summaries and notifications, but the MCP setup (tunnels, proxies, wiring Mac Messages into Poke’s agent) was a big hassle. We decided to own the pipeline ourselves: Gmail + Calendar (+ optional Messages CLI) → Gemini → priming. Fewer moving parts, no third-party agent in the loop.
  • OAuth and env sprawl. Multiple services (Gmail, Calendar, Convex, Gemini) meant many env vars and one-time setup steps. We documented everything in READMEs and used a single .env at the repo root where possible to keep the “run the backend and app” story simple.

Next Steps

  • Dog Feeding users in college to test sustainable approach to journaling with less friction
  • Creating a compact cinematic mini-movie from each user’s scrap that is easily exportable to close contacts
  • Integrating multi-source tools like Open Claw to automatically condense all information instead of doing the pre-processing ourselves
Share this project:

Updates