← Back to projects
Work in progress

Premi

Take control of your subscriptions

MobileReact NativeTypeScript
296
Tests
18
Services
79 SEK/mo
Premium
6
Family seats

Premi is the answer to subscription creep, the small monthly fees that quietly add up to thousands of SEK a year. Most subscription trackers ask you to enter every service by hand. Nobody actually keeps that up. Premi connects to your bank instead, detects recurring charges automatically, and surfaces cheaper alternatives the moment you're paying too much.

What it does

Auto-detect recurring payments

A confidence-scored matcher reads bank transactions and identifies subscriptions by amount, interval, description and merchant keywords, no manual entry.

Smart alternatives engine

API-backed catalog of cheaper Swedish equivalents per category. Surfaces annual savings and lets you swap without leaving the app.

Bank integration via Tink

BankID auth, transaction sync, ten Swedish banks supported. Mock mode for dev; production credentials in flight.

Analytics & forecasting

Twelve-month spend trends, category breakdowns, renewal clustering, and a six-month forecast model so you see what's coming.

Family sharing

Owner-based groups with invite codes, member avatars, shared subscription view. Decoupled from auth, codes travel via any messenger.

Native home-screen widgets

Three Android widget sizes (MonthlySpend, RenewalCalendar, SpendTrend) plus iOS WidgetKit, refreshing every two hours.

Why automatic detection

The hardest part of subscription management isn't displaying data, it's getting people to enter it. Every existing app asks you to remember every service you've signed up for, then update it as prices change. That's the wrong job to give a user.

Premi shifts the work to a confidence scorer that runs over the user's actual transaction history. It looks at amount stability, interval consistency, description patterns, and merchant keywords. Each candidate gets a score; high-confidence matches show up automatically, ambiguous ones become suggestions.

Architecture

Eighteen services in a clean layer above context-based state (AppContext, AuthContext, I18nContext). The detector, alternatives engine, Tink adapter, Stripe client, family sharing and notifications are each isolated and individually tested.

Lists use FlatList virtualization, expensive computed values are memoised, and every screen ships with a skeleton state. Caching is in-memory with a 24-hour TTL on the alternatives catalog so the network is only hit when something actually changed.

Swedish-first

Currency, dates, banks, merchants and copy are Swedish by default and English is a toggle, not the other way around. The alternatives catalog is curated for the Swedish market: Netflix, Spotify, SATS, Adobe, NordVPN, Viaplay, C More. Bank connection UI lists the ten banks people actually use.

Built with

Mobile

React Native 0.81Expo 54TypeScriptReact Navigation 7ReanimatedStripe React Native

Backend

Node + ExpressPrismaStripe webhooksTink API

Build & test

EAS (Expo Application Services)Jest (296 tests, 14 suites)TypeScript strict

UX

Skeleton loadingHaptic feedbackDark mode (token-based theme)97 accessibility labels44pt minimum touch targets

Where it stands

Probably lauching sometime in the summer. Core app and backend complete; Stripe integration tested on physical devices; Tink integration in mock mode awaiting production credentials. Pending: production EAS builds, App Store + Play submission, push setup, security audit.