Romain Caille

Frontend engineer, building interfaces that feel like software rather than documents.

I care about the parts of an interface most people never name: how a panel settles when it opens, whether a list keeps its place when you come back to it, how the thing behaves on a bad connection.

This site is built the way I like to work — a small set of primitives, strict boundaries between them, and no shortcuts on the details that decide whether something feels finished.

Based in
France
Focus
Product engineering
Currently
Open to opportunities
Elsewhere
GitHub, LinkedIn

Wakey Wakey

The alarm you cannot dismiss — the ringtone returns until the mission is done.

An iPhone alarm built against the one gesture that ruins every other alarm: dismissing it half asleep, without ever waking up.

The rule

Silencing the alarm does not stop it. It comes back ten seconds later, and it keeps coming back — whether you used the slider, the side button, or force-quit the app. The only way out is to finish the mission you chose when you set the alarm.

Four missions

  • Arithmetic — solve one or more operations.
  • Shake — shake the phone until it reaches the threshold you set.
  • Memory — reproduce a sequence on a grid.
  • Scan — scan a specific QR or barcode. Pick one that lives far from the bed: the cereal box in the kitchen is the whole point.

It rings when the phone says no

Silent mode, Focus, app closed — it rings anyway, because it uses the system alarm rather than a notification. That is also why the ringtone cannot be changed yet: it is the only sound iOS lets through.

Nothing leaves the phone

The app has no network code at all — no account, no analytics, no third-party SDK. Alarms, missions and settings live on the device and nowhere else, so deleting the app deletes everything it ever knew. That is a design decision before it is a privacy policy: a bedside alarm has no reason to talk to a server.

romain-os

The portfolio you are looking at, built as an operating system.

Visit romain-os

A portfolio built as an operating system — a desktop with windows on a wide screen, a mobile OS on a small one.

Two shells, one core

macOS and iOS do not differ in size, they differ in navigation model: one is spatial, the other is a stack. So there are two shells over a single app registry. An app is declared once and each shell knows how to present it — a draggable window here, a full-screen view there — and the content itself never knows which one it landed in.

It reads on a phone, and to a crawler

Every route is rendered to HTML at build time, so the text is there before any JavaScript runs — social crawlers do not execute scripts, and a portfolio link without a preview card is a portfolio link nobody opens. The boot screen is an opaque overlay on top of that HTML, which turns the hydration gap into a design element instead of a flash.

Try it here

Drag this window narrower than 896 pixels and the sidebar folds into a tab bar. Take it under 1024 and the whole system switches shells. The shell is picked from the size of your window, never from a user agent string.

Spotime

Time tracking and geolocated check-in for companies with teams spread across many worksites.

Romain Caille / Projects / Spotime

Visit Spotime

A time-tracking SaaS for companies whose teams never sit at a desk — security firms, home care providers, construction crews, seasonal farms.

The problem

When your workforce is spread across a dozen sites, two questions eat the week: where is everyone right now, and how many hours does each person get paid for. Most small companies answer both by phone, then rebuild the timesheet by hand at the end of the month. It is slow, and it is the kind of slow that quietly produces payroll errors.

What it does

  • Three-second check-in. A worker opens the app and punches in. Location is captured at that instant and only then.
  • Works without signal. Punches are stored locally and sync when connectivity returns — a basement or a field is not an edge case in these trades, it is Tuesday.
  • Unlimited sites, each with its own geofence radius.
  • One-click payroll export to Excel or CSV, in formats PayFit, Sage and Silae accept without rework.
  • Kiosk mode, turning a tablet or PC into a fixed time clock for teams that share a single entry point.

The constraint that shaped it

Geolocation is the feature that sells the product and the feature that makes people uneasy. The design answer was to make the boundary explicit: position is read at the moment of the punch, never continuously. Nothing about the product would work if employees felt followed, so the restraint is not a compliance checkbox — it is what makes adoption possible at all.

The same logic drove French-only data hosting and GDPR alignment: for a buyer signing on behalf of thirty employees, that is the objection that has to be answered before any feature matters.

Business model

Freemium SaaS, priced per employee per month and degressive with team size — €7 up to ten employees, €6 up to thirty, €5 beyond. One subscription covers unlimited sites and SIRET numbers, with a thirty-day trial that does not ask for a card.