Skip to content
MKMagnus Kaur

Magnus Kaur, full-stack developer in Helsinki

I build the booking, payment and back-office systems real businesses run on.

Role
Full-stack developer
Based
Helsinki, Finland
Mode
On-site, hybrid or remote
Speaks
English, Finnish

About

I'm Magnus, a developer in Helsinki. I build booking, payment and back-office systems for real businesses. Six are live, and three take real card payments. I put the rules in the database, test them against the real thing and check them in production. Now I want a team that pushes me harder than my clients can.

Now
Rebuilding FlagSales from scratch
Shipped
6 products live in production
Next
A junior role on your team
products and platforms I've built
7
of them live, three taking real card payments
6
automated tests and checks across two codebases
2,275
sellers log every sale in my system daily
~20

Selected work

Showroom

(06) live products

Five run real businesses, one I built to practise. Keep scrolling to walk through each one, live pages included.

01Booking platform + studio app

Defined PMU

A permanent makeup studio in Helsinki runs its whole business on this. It takes real payments.

  • Live availability, deposits through Stripe and a studio admin app
  • Double bookings blocked by PostgreSQL itself, not app checks
  • 1,568 automated checks across ten suites
  • Next.js
  • TypeScript
  • PostgreSQL
  • Supabase
  • Stripe
  • Resend
  • Vercel
02Product for beauty studios

Coded for Beauty

Website, online booking and a studio app for beauty studios, sold as one monthly product.

  • Clients book and pay their deposit themselves, at any hour
  • The Defined PMU booking stack, packaged for other studios
  • £99 a month, live within a week
  • Next.js
  • TypeScript
  • PostgreSQL
  • Supabase
  • Stripe
03Studio site + booking

Brow Ink

Website and online booking for a brow and lip artist in Nottingham, UK.

  • Ombré brows, lip blush and fine line, booked online in about a minute
  • Runs on Coded for Beauty, with the same deposit flow as Defined
  • Editorial design built around the artist's own work
  • Next.js
  • TypeScript
  • Supabase
  • Stripe
04Browser video editor

CreatorMission

Built to practise, then shipped anyway: a clip editor that keeps the campaign brief beside the edit.

  • Local-first: the video never leaves the creator's device
  • Checks duration, captions, mentions and CTA against the brief
  • OAuth with PKCE, signed sessions and paid-plan checks
  • Next.js
  • TypeScript
  • Vercel
05Booking + scheduling

Lumos Energia

Customer booking and an internal scheduling calendar for a solar and energy installer.

  • Customers book online; the team works from a shared calendar
  • Booking validation and overlap prevention on every slot
  • Finnish-language site for homes and businesses
  • Next.js
  • TypeScript
  • PostgreSQL
  • Supabase
06Sales system for a field-sales team

FlagSales

About 20 sellers counted their sales by reading a WhatsApp chat. I built the system that replaced it, and it got me promoted to COO.

  • Each seller signs in with a name and PIN and logs a sale from a product list
  • Counts who sold what, and when. In daily use for over a year
  • Now rebuilding my first version: roles enforced in the database, 707 tests
  • Next.js
  • TypeScript
  • PostgreSQL
  • Supabase

Also built

Not in the showroom, but real: a code sample anyone can read, and a product built design system first.

Case study

Defined PMU, under the hood

The flagship. I was the sole developer: requirements, business rules, architecture, tests, deployment and production checks. It's the system the rest of the beauty work grew out of.

  1. 01 Booking

    A booking flow that can't double-book

    Customers pick a treatment, then a day and time. Only times that fit the whole appointment are shown, read live from PostgreSQL. Two exclusion constraints decide whether a slot is free, so two people tapping the same time can't both win.

    • Live availability per request
    • Buffers and minimum notice
    • Short server-side checkout holds
    Choosing a treatment
    Choosing a day and time
  2. 02 Payments

    The server owns the money

    The browser asks for a booking; it never names a price. The server creates the Stripe payment from its own snapshot, and the booking only becomes real when a signed webhook says the deposit arrived. If the slot was lost mid-payment, the money goes back automatically.

    • Signed, verified webhooks
    • Idempotent payment intents
    • Automatic refunds on lost slots
    Customerasks for a slotServersets the priceStripetakes the depositPostgresconfirms on webhook
  3. 03 Testing

    1,568 checks before anything ships

    Ten suites run against a local PostgreSQL stack and Stripe's sandbox, alongside typecheck, lint and a production build. The payment suite makes real charges and refunds, and refuses to start against a live key.

    • Real Postgres, not mocks
    • Real Stripe sandbox charges
    • Typecheck, lint and build gate
    Checks per suite1,568
    • Lifecycle278
    • Admin246
    • Email224
    • Client card & referrals191
    • Payments134
    • Questionnaire127
    • Scheduling rules112
    • Booking engine94
    • Defined Credit90
    • Consent72

And underneath

  • Health data kept apart

    Questionnaire answers live in their own table, read by exactly one database function, opened through revocable 256-bit links. No customer account needed.

  • Emails that send once

    Eight lifecycle emails come from a database outbox with deterministic keys, so retries and duplicate webhooks can't send twice.

  • Credit as a ledger

    Referral credit is an append-only ledger behind a per-customer lock, so two browser tabs can't spend the same €25.

Read the full engineering case study

The engine

Try to
double‑book

Every booking system I build rests on one rule: two bookings can't overlap, and the database refuses an overlap at the moment it's written, not after a check that can go stale. Drag across a row, or race two requests, and watch it hold.

Saturday 5 September

Drag across a row to book. Click a green booking to cancel it.

  • Sending
  • Confirmed
  • Refused
  • Cancelled

Chair 1

Chair 2

Two requests are about to arrive for the same slot.

The real code

Client code is private, so here's a public sample: a small Next.js app where PostgreSQL, not app code, guarantees bookings never overlap. Its tests reproduce the race itself.

Open the repository

Two active bookings for the same resource can't overlap. Postgres checks this inside the write, so two requests arriving at the same moment can't both get in. Cancelled rows drop out of the check, which frees the slot without deleting history.

migrations/0002_enforce_booking_invariants.sqlView on GitHub
-- Invariant 1: two active bookings for the same resource may never overlap.
--
-- An exclusion constraint is checked by the index itself while the row is being
-- written, under the same locks that protect a unique index. Two concurrent
-- transactions inserting the same slot cannot both pass: the second one blocks
-- until the first commits, then fails with SQLSTATE 23P01.
ALTER TABLE bookings
  ADD CONSTRAINT bookings_no_overlap
  EXCLUDE USING gist (
    resource_id WITH =,
    tstzrange(start_at, end_at, '[)') WITH &&
  )
  WHERE (cancelled_at IS NULL);

What I can do

Things I build well

Each one is backed by something I've shipped. Hover a row to see where.

  1. 01

    Booking & scheduling

    Live availability, buffers between appointments, checkout holds, and slots that can't be double-booked even when two people click at once.

    Shipped in: Defined PMU, Lumos Energia, Booking Conflict Engine

  2. 02

    Payments

    Stripe deposits, signed webhooks, idempotent payment intents, automatic refunds and paid-plan checks. The server sets every price.

    Shipped in: Defined PMU, Coded for Beauty, Brow Ink

  3. 03

    Auth & roles

    Sign-in, sessions, role-based access, PIN sign-in for shared phones, OAuth with PKCE and revocable links that need no account.

    Shipped in: FlagSales, CreatorMission, Defined PMU

  4. 04

    Admin & internal tools

    Back-office apps the people running the business use every day: calendars, queues, client records, operations dashboards.

    Shipped in: Defined studio app, FlagSales, Lumos calendar

  5. 05

    Databases that enforce the rules

    PostgreSQL schemas, migrations, exclusion constraints, append-only ledgers and functions, so bad data can't get in at all.

    Shipped in: Defined PMU, FlagSales, Booking Conflict Engine

  6. 06

    Sites people remember

    Designed, fast marketing sites with booking built in, and motion that serves the content. Like this one.

    Shipped in: Defined PMU, Brow Ink, Coded for Beauty

Stack

What I code with

Sorted by how much I actually use it. TypeScript, Next.js and PostgreSQL are in everything I've shipped.

Every day

What every project I've shipped is built on.

  • TypeScript

    Strict mode, end to end

  • Next.js

    App Router, server actions

  • React

    Server and client components

  • PostgreSQL

    Constraints, functions, migrations

  • Supabase

    Hosted Postgres, auth, storage

  • Tailwind CSS

    With design tokens

  • Git & GitHub

    Branches, PRs, Actions

  • Claude Code

    Directed, reviewed, tested

Most projects

Reached for whenever the product needs it.

  • Stripe

    PaymentIntents, webhooks, refunds

  • Vercel

    Deploys, cron, previews

  • Node.js

    Scripts and server code

  • Zod

    Validation at the boundary

  • Resend

    Transactional email

When needed

Used for real, in specific places.

  • Vitest

    Unit and integration tests

  • PGlite

    Real Postgres in tests

  • MapLibre

    Self-hosted maps

  • GSAP

    The motion on this site

Honestly

Good at. Getting better at.

You'll find out anyway, so here it is up front. The left column is where I can carry real weight on day one. The right is what I want a team to help me grow into.

Strong

Confirmed
  • Shipping end to end

    From the first talk with a business owner to a live product with real payments. Six of my projects are in production.

  • Rules that can't break

    I put the important rules in the database: no double bookings, no double spending, no duplicate emails. Then I test that they hold.

  • Payments without surprises

    Server-side prices, signed webhooks, idempotency keys and refunds for the edge cases most people forget.

  • Testing against the real thing

    Over 2,000 checks run against real Postgres and Stripe's sandbox, not mocks, because a mock can't prove a database rule.

  • Design sense

    Clients get sites they're proud to send people to. I care how things look and move, not only whether they work.

  • Production debugging

    I've traced failures that only happened in production, and I write down what broke and why.

Still learning

In progress
  • Working in a team codebase

    I've mostly built alone, with clients. I want code review, shared conventions and people who'll tell me when my approach is wrong.

  • Writing more by hand

    AI agents make me fast. I'm practising writing more without them, so I can explain every line, not just check that it works.

  • CS fundamentals

    Algorithms and data structures beyond what my products have needed so far.

  • Infrastructure beyond Vercel

    Docker, cloud providers and CI at scale. I've deployed plenty, but always on managed platforms.

  • Native mobile

    Everything I've shipped runs on the web. Native iOS and Android are new to me.

Process

How I work with AI

I build with coding agents and I'm open about it. They write a lot of the code. Deciding what the system must do, and proving it does, stays with me.

  1. 01

    Understand the business

    Talk to the owner. Write down the rules that must never break, like one client per slot or a deposit before a booking is real.

  2. 02

    Model the data first

    Design the schema and its constraints before any screens, so the database refuses what shouldn't happen.

  3. 03

    Direct the agents

    Claude Code and ChatGPT write a lot of the code, from precise specs I write. They speed me up; they don't decide.

  4. 04

    Review everything

    Read every diff. Reject what doesn't satisfy the rules, however plausible it looks.

  5. 05

    Test against the real thing

    Run the real migrations on real Postgres, make real charges in Stripe's sandbox, and reproduce the race conditions.

  6. 06

    Ship and check it live

    Deploy, then check the real flows on the live domain. When something breaks, find out why and write it down.

For hiring teams

Straight answers

The questions I'd ask if I were hiring me. Anything else, just email.

  • A junior developer role: full-stack, front-end or back-end. I'm in Helsinki, happy on-site, hybrid or remote, and I work in English and Finnish.

  • Right away. I'm in Helsinki and free now.

  • Sales and operations. At a Helsinki field-sales company I went from seller to team lead to COO in six months, running a team of about 20: hiring, scheduling and day-to-day operations. The sales system I built for that team is still in use. Before that I trained and worked as a vehicle mechanic and drove delivery routes.

  • Because almost all of it was solo. I haven't had code review, senior engineers to learn from, or a big shared codebase. That's exactly what I'm after, and I'd rather be honest about it.

  • Yes. Booking Conflict Engine is public, the Defined PMU case study documents the architecture in depth, and this site's source is on GitHub. Client code is private, but I'm happy to walk you through it.

  • A lot of it is typed by agents. The requirements, the data model, the rules, the review, the tests and the production checks are mine. I'm upfront about it because it's how I work, and I'm building more hand-coding fluency too.

  • Rebuilding FlagSales from scratch. The team has used my first version every day for over a year, but when I audited it I found security and correctness problems. The new one puts the business rules in the database, with 707 tests against real Postgres. And sending this site to teams I'd like to join.

  • Systems where mistakes cost money: bookings, payments, credit and anything where two requests at once must not both win.

  • Working inside a team's codebase and process, CS fundamentals, and infrastructure beyond managed platforms. The full list is above.

Available now for junior roles

Let's talk

Hiring a junior developer, or curious how something here was built? Email me.

magnuskaur.dev@gmail.com