
Made for Me: a native mobile companion that grows with every woman
A Czech-first native app for women across every life stage — pregnancy, postpartum, breastfeeding, motherhood, perimenopause, menopause, or simply wanting to feel good. The user picks a life stage and the whole app retunes: a personalized feed, curated products, editorial content, and a community forum. Together with the client we built a rich product on top of an existing Shoptet store — fast, from one modern TypeScript codebase.



Delivery snapshot
A broad product surface, one small team
What QuantumSpring delivered as the engineering partner: a compiled native app spanning a personalized feed, shop, editorial content, a community forum, passwordless identity and order history — fronting an existing Shoptet store rather than rebuilding commerce. The full story is below.
Want a rich native app on top of the platform you already run? We can show you how we did it.
19 screens
Native mobile app, one codebase
7 life stages
The app retunes itself to each
cs / en
Bilingual, Czech-first
Shoptet-fronted
No commerce platform rebuilt
The Client & the Opportunity We Partnered to Build
A woman's needs change dramatically across life stages, yet generic commerce and content apps treat everyone the same. The client's vision for Made for Me made life stage the organizing idea: an app that grows with you, tuning its content and its care to exactly where you are — from pregnancy through menopause and beyond.
The catch: the client already runs an e-commerce business on Shoptet, a popular Czech hosted store platform. Shoptet is great at being a storefront, but it cannot deliver a personalized native app experience — there is no rich product API, the blog is only HTML, and orders come out as XML. QuantumSpring joined as the delivery partner to build that native experience around the platform, not to replace it.
The Core Challenge: a rich native product on a constrained platform
The hard part was the gap between ambition and platform. The product had to feel like a first-class native app — personalized feed, community, editorial content, identity, order history, saved items, referrals — while every piece of commerce data lived inside Shoptet and could only be reached through the seams it exposes: a scrapeable blog, an XML order export, a catalog export, and a web checkout that has to stay on the store. Designing rich features around those limitations, without a fragile integration, was the central engineering problem.
Platform reality
Design around the seams
Shoptet exposes commerce through a blog, an XML order feed, a catalog export and a web cart. The app had to turn those into a personalized, native experience.
The right answer was an anti-corruption layer: front the store, isolate its quirks, and keep the app talking only to clean, owned contracts.
Shoptet
Existing storefront to build around
No product API
Blog as HTML, orders as XML export
Web checkout
Cart has to stay on the store
Rich UX
Far beyond what the platform offers
Our Approach: a modern stack built for speed
The bet was to build genuinely native on a modern, uniform TypeScript stack running on Bun — one language end to end — so a tiny team could ship a broad product surface quickly and safely. The mobile app, backend, content service, admin SPA and a mock backend all live in one Bun workspace monorepo; a single install links them, and a single command runs every workspace's typecheck and tests. CI mirrors the exact same recipes, so “green locally” means “green in CI.”
Client and server never drift because they share one source of truth: TypeBox schemas in a shared workspace, consumed by every app at once. Change a field and everything re-types — a mistake fails typecheck, not production. Deterministic end-to-end tests run against a mock backend that fakes every route the app hits, and Maestro captures screens that are pixel-diffed against committed baselines. That guardrail stack is what turns a small team into a fast one.
Delivery model
Velocity without drift
One language, one install, one command, shared contracts, and mock-backed E2E — the setup exists so features ship fast and safely.
Hot reload everywhere and OTA updates keep the loop tight from first keystroke to shipped fix.
Bun
One TypeScript language, end to end
Contracts-first
Shared schemas kill client/server drift
One command
Same checks locally and in CI
Mock-backed E2E
Deterministic, zero external deps
What We Built: a rich feature set from one codebase
For its size, the product surface is broad and real: 19 native screens backed by 10 backend route groups over 12 Postgres tables, all typed against the shared contracts.
Personalized “For You” feed
A server-ranked, multi-section feed — editorial tips, product-of-the-week, product carousels, articles, community threads, routines, and expert quotes — assembled per life stage and re-ranked as the user marks content read.
Shop & product detail
Product grid with search and merchandising chips, NEW / SALE badges, per-variant pricing, and a product detail with a swipeable gallery and variant selection. Buy hands off cleanly to the Shoptet web store.
Content & community
Life-stage-filtered editorial articles plus a full community forum: threads with categories, pins, locks and reply counts, a composer, and reporting/moderation. Public reads, member writes gated by identity.
Passwordless identity & orders
Email OTP sign-in (request → 6-digit code → Bearer JWT), no passwords and no cookies. Signed-in members see their orders — synced from Shoptet — with line items, tracking, shipping and totals.
Personalization engine
Life stage is the organizing primitive across feed, catalog and content, and it is re-tunable anytime. Curation is stored as data (section order, pins, editorial), bound by a database constraint to the shared contract.
Saved, referral & share
A client-side wishlist and saved reading that also inform feed ranking, plus a referral code surfaced through the OS-native share sheet — real device integration, not a web modal.
Push notifications
Timely, segmented push built on Expo notifications over APNs and FCM: replenishment reminders when a favorite is due to run low, the weekly product-of-the-week, fresh life-stage content, and wishlist price drops — targeted by life stage so every message lands relevant.
Admin console
A staff-only web app on the same shared contracts: moderate community threads, curate the feed (section order, pins, editorial), review orders, and compose and schedule push campaigns — all without a developer in the loop.
Inside the App
Every screen is bespoke — editorial serif headings, a navy-and-paper palette with a single hot-pink accent, and hand-drawn illustrations. A tour of the surface:









Architecture & Tech Stack
A modern, all-TypeScript stack on Bun, with a deliberate anti-corruption layer isolating Shoptet so the app only ever talks to clean, owned contracts.
- Native mobile
- Expo SDK 55, React Native 0.83.4 and React 19.2.0 — a compiled app with typed native routing and OTA updates, not a webview wrapper.
- Design system
- NativeWind (Tailwind), custom brand fonts and hand-drawn per-life-stage illustrations for an editorial, bespoke feel.
- Backend & data
- Hono on Bun with Drizzle over Postgres 16 and passwordless HS256 JWT auth — 10 route groups over 12 tables.
- Shared contracts
- TypeBox schemas shared across mobile, backend and admin, so one edit re-types every app and drift fails typecheck.
- Platform & infra
- Shoptet blog, orders and catalog fronted behind owned contracts; three config-as-code services on Railway, with Maestro visual-regression E2E.
Working Around the Platform: Shoptet, fronted not fought
The most interesting engineering is in how the app coexists with Shoptet. Rather than a brittle direct dependency, each platform limitation is turned into a clean seam:
- Blog with no API → a dedicated content service scrapes the Shoptet blog into a standard JSON Feed with a TTL cache and last-good fallback; the backend proxies it, and the app consumes a swappable content interface that never touches the scraper directly.
- Orders as XML → a sync job ingests the Shoptet order export into owned, typed tables, so signed-in members get a clean native order history with line items and tracking.
- Catalog as an export → products, variants, VAT and sale flags are imported and served through owned contracts, powering the grid, search and product detail.
- Checkout on the web → buying opens the Shoptet store in an in-app browser, so the client keeps their proven, PCI-handled checkout while the app owns discovery and identity.
Results & Outcomes: a shipped native product
We frame results as delivered capability. The app is a compiled native product — not a webview wrapper — spanning 19 screens, with the personalization, content, community, identity and order features above, deployed as three config-as-code services behind health checks.
- Broad surface, small team: a personalized feed, shop, content, forum, OTP identity and order sync, bilingual (cs/en), from one codebase.
- Safe integration:Shoptet is isolated behind an anti-corruption layer, so the platform's quirks never leak into the app.
- Engagement built in: push notifications — replenishment reminders, product-of-the-week, and life-stage content — are composed and scheduled from the same admin console the team uses for moderation and feed curation.
Results snapshot
Delivered capability
A native app with a broad, personalized surface, shipped fast and deployed as config-as-code services.
Adoption and commercial metrics will be confirmed with the client.
19 screens
Feed, shop, content, forum, account
12 tables
10 backend route groups behind them
OTA updates
Ship fixes without app-store waits
3 services
Config-as-code, deployed on Railway

"The fun of this build was giving the client a rich native app without asking them to leave the platform they already run. We fronted Shoptet instead of fighting it, and a modern Bun/TypeScript stack with shared contracts let a very small team ship a genuinely broad product surface, fast."
Ondřej Šťastný, Co-founder & CEO, QuantumSpring
What Made This Work
Key takeaways
Three things that mattered most
Shipping a rich native product on a constrained platform, fast, came down to three principles.
Front the platform
Build around Shoptet, don’t rebuild it.Instead of replacing commerce, the app fronts the existing store — scraping its blog, syncing its orders, importing its catalog, and handing off checkout — so the client keeps their storefront and gains a rich native product.
Contracts-first velocity
One schema edit re-types everything.Shared TypeBox contracts, a one-command CI mirror, hot reload and mock-backed E2E let a very small team ship a broad surface fast, without client/server drift reaching production.
Native where it counts
Real device capabilities.Compiled native with secure storage, the OS-native share sheet, push notifications and OTA updates — while commerce stays on the client’s proven Shoptet checkout.
Next step
Want a native app on top of your platform?
Speak directly with Ondřej Šťastný
A short expert call to map what your existing platform can and can't expose, and the fastest path to a rich native product on top of it.
Clear guidance. Senior expertise. No sales talk.
