Inspiration

Important household dates rarely live in one place. A passport renewal is in a drawer, a warranty is in an email, a bill is on a kitchen counter, and a food date is printed in tiny type. Ordinary calendar reminders treat them alike even though the cost and preparation time are different. A passport can need months of lead time; a bill might need a few days; food may need a reminder tomorrow.

We built Custeva to make this kind of life admin feel quieter. The goal is not to demand more attention, but to hold the details privately and surface the right next action at the right time.

What it does

Custeva brings documents, bills, warranties, food, and other household deadlines into a single timeline. People can type an item manually or scan a document. Text recognition runs on the device and proposes dates for the person to confirm before anything is saved.

Each category starts with a practical reminder schedule. Documents can warn months ahead, while bills and food use shorter lead times. The schedule, daily reminder time, snooze duration, and a custom extra reminder can be adjusted. Notifications include useful actions such as Mark as Paid, Renewed, Used, Done, or Snooze. Completing a recurring item moves it to its next cycle and preserves a completion history.

Five Home Screen widgets on iOS and Android keep the next deadline, upcoming items, monthly overview, category view, and at-a-glance totals visible. iOS also supports Lock Screen widgets and quick Add Item and Scan controls on supported versions.

Custeva starts as a local, offline vault with no account required. Optional Pro backup can be protected with Apple or Google sign-in and restored on another device. People can decide whether scanned images join the backup. Pro can also mirror active deadlines into a dedicated device calendar and create a polished PDF summary for one item; including the current scan in that PDF is always an explicit choice.

How we built it

Custeva is a Flutter app for iOS and Android with shared product logic in Dart and focused native integrations where the platforms are strongest. Drift over SQLite is the local source of truth. Every item mutation passes through one repository path that updates the database and resynchronizes operating-system reminders together.

iOS scanning uses VisionKit and Vision through Swift; Android uses Google ML Kit through Kotlin. The date extraction and ranking logic is shared in Dart. Widgets are implemented with WidgetKit and App Intents on iOS and Android App Widgets on Android. Supabase provides optional authentication, private storage, and backup synchronization, but the core app does not depend on a network.

RevenueCat powers Custeva Pro through the Flutter SDK. One entitlement is attached to weekly, annual, and lifetime products. RevenueCat's hosted Paywalls present live store pricing, entitlement state gates Pro features, restore purchases is available in Settings, and Customer Center gives subscribers a native place to manage their purchases. An optional Supabase user ID is linked to the RevenueCat customer only when backup sign-in is enabled, so an anonymous purchase can later restore on another device.

Challenges we ran into

The hardest problem was keeping reminders honest. A bill marked as paid must not still alert tomorrow, and a changed date must replace rather than duplicate an existing notification. We created one write-and-reschedule path and stable notification identifiers so database state and the operating system move together.

iOS also limits the number of pending local notifications without failing loudly. Custeva keeps the complete schedule in SQLite, allocates the nearest 56 alerts to the operating system, and rolls that window forward as the vault changes. Calendar arithmetic is performed in local wall-clock time so daylight saving changes do not silently shift a 9:00 AM reminder.

Another challenge was combining a private, local-first experience with paid features and optional recovery. Purchases work anonymously, backup is opt-in, and identity is linked only when the person chooses to protect that backup.

Accomplishments that we are proud of

  • The useful core works offline and without an account.
  • Scanning and text recognition stay on the device.
  • Category-shaped schedules, recurring items, notification actions, and widgets form one complete reminder loop instead of isolated features.
  • RevenueCat Paywalls, entitlement refresh, restore purchases, identity linking, and Customer Center sit behind a testable purchase gateway.
  • The same product ships on iOS and Android while retaining native scanning, notifications, widgets, and platform conventions.

What we learned

Reliable reminder software is less about adding alarms than about removing ambiguity. A reminder must be derived from current data, be replaceable, and disappear as soon as the user acts. Treating the operating system as a limited cache over a complete local schedule made that model much easier to reason about and test.

We also learned that privacy can simplify the product. Starting without an account creates a faster first run and keeps the core promise available offline. RevenueCat lets Custeva monetize that local experience anonymously, then follow the user's choice if they later enable recoverable backup.

What's next for Custeva

The first priority after launch is to learn from real reminder and purchase behaviour without collecting the contents of people's vaults. We will evaluate store conversion and RevenueCat purchase data, improve onboarding and paywall explanations, and test the weekly, annual, and lifetime packaging without changing the free core unexpectedly.

Product work will focus on faster capture, better date recognition across more document formats and locales, accessibility, and clearer household workflows. Any future Pro promise will be added to the paywall only after it ships.

Built With

  • android-app-widgets
  • app-intents
  • dart
  • drift
  • flutter
  • google-ml-kit
  • kotlin
  • local-notifications
  • revenuecat
  • riverpod
  • sqlite
  • supabase
  • swift
  • visionkit
  • widgetkit
Share this project:

Updates