Bikkel
Bikkel is our own strength-training tracker, live at bikkel.app. Lifters build reusable routines, log workouts set by set, and watch their progress over months. One person built every part of it (design, two clients, backend, auth, billing, email, localisation, deployment) and runs it as a single Cloudflare Worker. It shows two things a buyer can have in their own product: two interfaces kept in sync from one codebase, and a built-in MCP server that lets an AI assistant work with a user's own data, safely scoped to that user.
Our own product. Built and run by the studio on the same method we use for clients.
A complete consumer app with two clients, billing and an AI-ready MCP server, built and operated by one person as a single deploy.
What it is, and what it proves
Bikkel is a strength-training tracker. Lifters build routines (reusable plans of exercises, sets and targets), log the workouts they actually do one set at a time with a rest timer running, and get back what they want from the log: body measurements, per-lift trends, estimated one-rep-max, and volume over months. The name is Dutch: bikkel means a tough one, someone who does the hard work.
One person built all of it: the design, the two clients, the backend, auth, billing, email, localisation and deployment. For a buyer, it shows the full scope of a consumer product delivered by a very small team, and two decisions worth copying: running everything as one Cloudflare Worker, and giving the app a built-in MCP server so an AI assistant can work directly with a user's data.
Two apps, maintained once
Bikkel is two apps on one core. The phone app (/app) is where you train: a thumb-friendly column with a bottom tab bar, from onboarding through routines into a live workout logger with rest timer, a session recap and a shareable "Bikkel card". The desktop hub (/hub) is where you plan: a dashboard, a routine editor, the exercise library, and deeper progress and history views. It leaves out live logging and the rest timer on purpose, because those belong on the phone in your hand.
The landing page routes each visitor to the right surface by screen size, with plain links as a fallback so nothing breaks without JavaScript. Both surfaces share one route tree and one data layer, so a change to how routines or workouts work lands in both at once instead of being maintained twice.
An AI assistant that can use the user's own data, safely
Bikkel ships its own MCP (Model Context Protocol) server at /mcp. A user can connect an AI assistant to their account and have it read their body measurements and workout history, and read and manage their routines, working from real data rather than a copy pasted into a chat.
It is safe by construction rather than by policy. Each user issues a personal connect key from their settings; everything the assistant can do is scoped to that key's owner, so no tool can reach another user's data, and a key can be rotated or revoked at any time. The server is stateless per request, which suits a serverless runtime. The tools also respect the domain: a routine is a plan and a workout is a session that happened, so reading history and editing a plan are separate operations with different stakes. The same approach applies to any product whose customers want to bring their own AI tools.
One deploy keeps it cheap to run
The whole application (server-rendered pages, API routes, auth, billing webhooks, image serving) deploys as a single Cloudflare Worker. It is built on TanStack Start (React 19), and the same codebase builds a plain Node server for local development or the Worker bundle for production.
Data lives in Postgres through Drizzle, reached in production through Hyperdrive for pooled connections from the edge. Exercise images live in R2 and are served through the Worker, and signup and password-reset email goes out over Cloudflare's Email Service. One thing to ship, one place for secrets, one runtime to reason about: that is what makes it maintainable by one person.
The details paying users notice
Accounts use better-auth with email/password and passkeys. Billing runs through Polar, with a Pro subscription and a lifetime option, and a webhook back into the Worker keeps entitlements in sync without a separate payments service.
The exercise catalogue is seeded from an open exercise database and mirrored into our own storage, so it does not depend on anyone else's uptime. Share cards and social preview images are rendered on the edge as real images. Every button that starts a save shows an in-flight state, because on a phone in a gym a tap that looks dead is a bug. The interface is localised into English and Dutch, with copy compiled at build time.
A distinct look, held across every surface
Bikkel has a deliberate "cast iron" look, an industrial training logbook: charcoal and chalk, an acid-lime accent with a signal-orange spark, poster display type and monospace data readouts. It is meant to feel like gym equipment, not a wellness app, and to be read at a glance mid-set. Holding that character across the phone app, the desktop hub and the marketing pages is what makes Bikkel one product rather than a stack of features.
MandarinAI
Read it →Tell us the one thing it has to do.
Send a few lines. Within one business day you get a scope, a fixed price and a date, or the smaller first version we would build instead.