Inspiration

We're building our own agency to publish apps. While digging into the usual questions (what to build, where to ship it, how to get paid) we ran into a bunch of payment vendors. RevenueCat stood out. Solid docs, the features we needed, fees that made sense. We dug deeper, discovered Shipyard. Hackathon had already kicked off but the prize and format were too good to pass up. We picked two app ideas we actually wanted to build. One of them was Sam Beckman's cross-platform power reminder app which is the one we present here.

What it does

It does what Sam asked for, and then some. Reminders sync across every device on your account. On top of that we added a sync chain. Share reminders with other accounts: coworkers, family, friends. You choose which reminders are in the chain and which stay private.

You get full control: colors, priorities, labels, and custom recurrence. You can optionally set an alarm that rings before the reminder (or right at the time), and snooze/dismiss syncs everywhere. Snooze on your phone → snoozed on your tablet and laptop too.

How we built it

One of us handled design and the backend (needed for cross-platform anyway). The other built the native iOS app in Swift. We leaned hard on Apple Push Notifications, Sign in with Apple, and the RevenueCat REST API, but kept the design cross-platform so we can plug in Google push, Google auth, and others later. We went through the docs carefully and followed best practices, especially for RevenueCat.

Tech-wise we kept things production-ready and consistent:

  • Backend: Bun, Elysia.js, Drizzle, Postgres, Redis
  • Infra: Cloudflare, Cloudflare R2 for storage
  • Observability: Axiom for event logging (with GDPR-friendly redaction of personal data and tokens)
  • API: OpenAPI docs generated from TypeScript types and TypeBox schemas. Every request and response is typed and documented.

Example: our API types drive both runtime validation and the docs. No drift.

// Request/response shapes are TypeBox schemas → OpenAPI + validation
const ReminderSchema = Type.Object({
  id: Type.String(),
  title: Type.String(),
  at: Type.Number(), // howid (time-sortable bigint)
  chainId: Type.Optional(Type.String()),
});

Challenges we ran into

The hardest part was the sync model. The math, the data structures, making it work for current and future platforms. We wanted this MVP to be a real foundation for our agency: general, legally sound, scalable. This was harder than we expected. Still happy with where we landed.

Then there was time. Classic story: we joined the hackathon in the middle, the iOS app wasn't where we wanted it, and estimates kept slipping. As I write this there are a few hours left and one of us is still checking last tweaks on the iOS client. Wouldn't have it any other way.

Accomplishments that we're proud of

We're really proud of the foundation we built. We'll reuse most of it. The patterns, the learnings around Apple, Google, RevenueCat. This project is what officially kicked off our agency.

We have also created an AI-Generated music for our app which is quite fun to listen to. You can listen it at our website by clicking the play button on the bottom right.

On the technical side we needed time-sortable, unique IDs for sync. Nothing off the shelf (UUIDs, Snowflake-style IDs, etc.) fit. We wanted collision-resistant IDs where creation order = sort order in Postgres, i.e. \( t_1 < t_2 \Rightarrow \text{id}(t_1) < \text{id}(t_2) \), stored as bigint for fast indexing. So we built howid, our own time-sortable bigint ID format. After the hackathon we plan to open-source this and proof-of-work module as well.

What we learned

We've integrated plenty of payment systems before. None as smooth and full-featured as RevenueCat. Entitlements and cross-platform product management from the dashboard were better than we expected. Turns out we'd been doing payments the hard way.

We also learned that jumping into a hackathon halfway through is a real time squeeze, but it was worth it. We had fun, and our partnership came out stronger. Win or lose, we're only going up from here.

What's next for RemindNow

Ship the rest of the clients: Web, desktop, and Android. Keep improving the Apple and keep building on this stack for the next apps for our new venture.

Share this project:

Updates