Inspiration
The inspiration for Papyr came from a very real, very painful modern problem: the invisible subscription bleed. We sign up for free trials, forget them, and suddenly lose hundreds of dollars a year to services we don't use. I realized that the reason most personal finance apps fail to solve this is friction. Manual data entry kills user retention.
Visually, I was tired of the sterile, overly safe iOS and Material Design guidelines that dominate the fintech space. I wanted the app to feel like a physical, tactile ledger, hence the name "Papyr." I adopted a strict neo-brutalist design language: cream backgrounds, bold black strokes, and muted primary colors. When you open the app, a massive red card screams your "30-Day Burn Rate" at you, triggering a psychological reaction that motivates you to take control of your spending.
What it does
Papyr is an AI-powered spend intelligence app that eliminates the friction of manual expense tracking. Users scan a receipt, and Papyr instantly extracts the merchant, cost, and billing cycle, plotting it against their active dashboard. By immediately identifying forgotten subscriptions, the "Papyr Pro" tier essentially pays for itself on day one.
How we built it
I engineered Papyr using Flutter to maintain a single, high-performance cross-platform codebase without compromising on a native feel.
The AI Engine: Instead of sending heavy images to a server, I used Google ML Kit for on-device optical character recognition (OCR). The localized text is then passed to a serverless LLM to instantly extract the subscription metrics.
Offline-First Architecture: Financial data needs to be available instantly in dead zones. I implemented an offline-first architecture using a local SQLite database, utilizing Conflict-Free Replicated Data Types (CRDTs) to guarantee zero-conflict state synchronizations.
Monetization & RevenueCat: To handle the Freemium-to-Pro conversion, I integrated the RevenueCat SDK for Flutter. This completely abstracted the nightmare of receipt validation and cross-platform subscriber state management.
Challenges we ran into
The biggest technical hurdle was balancing AI extraction latency with accuracy. Relying purely on cloud-based multimodal LLMs was too slow for a consumer mobile experience. By offloading the visual processing to on-device ML Kit and only sending the resulting lightweight text array to the LLM, I managed to bring the extraction time down to under 420ms while maintaining extremely high accuracy.
On the design front, Flutter aggressively defaults to Material Design components. Forcing the framework to respect the harsh, flat, heavy-bordered constraints of neo-brutalism required custom view modifiers, strict custom widget trees, and deep canvas rendering discipline to ensure the UI didn't break across different aspect ratios.
Accomplishments that we're proud of
I am incredibly proud of achieving a sub-500ms AI pipeline while keeping the heavy visual processing on-device to respect user privacy. I am also proud of the uncompromising neo-brutalist UI; executing that aesthetic cleanly in Flutter takes real effort, but the result is a cohesive app that genuinely feels like a printed financial ledger.
What we learned
Building Papyr reinforced my belief that an LLM is a feature, not a product. The magic of this app isn't just that it uses AI; it's that the AI is entirely invisible to the user.
Additionally, implementing RevenueCat taught me how crucial it is to outsource the heavy lifting of subscription logic. By letting RevenueCat handle the backend entitlement plumbing, I regained weeks of development time that I poured directly into refining the empty states and optimizing the app's 120 FPS scrolling performance.
What's next for Papyr
Next, I plan to expand the analytics engine to cross-reference historical data and warn users of upcoming price hikes on their active subscriptions before they happen.
Log in or sign up for Devpost to join the conversation.