The problem
A chalet week for ten friends runs on a group chat and one person’s spreadsheet. Dates change, people arrive a day late, someone books the cheese twice, and nobody can say who owes what on the last evening.
The context makes it harder. On the mountain the phone is in a glove, in glare, on lift-line signal. In the chalet it is passed around a table.
The product
Après-Ski answers the questions a chalet group asks on repeat, in French, from one link. There are no accounts: a visitor picks their name from the roster, or adds the whole group in one go, and is in.
Before the trip exists, Repérage (scouting) collects candidate chalets. Paste a listing link and the card fills itself with photo, price as quoted, beds, distance to the lifts. Everyone votes oui, bof or non, and choosing a chalet seeds the trip.
During the trip, the Hub shows the countdown, weather and snow depth. Équipe is a per-day attendance timeline, Repas assigns a cook and a menu to each evening, and Courses merges every meal’s shopping into one list with quantities summed. Comptes logs shared purchases and settles who owes whom.
How it’s made
The app is a Next.js 16 and React 19 PWA with PocketBase as the store. The browser never talks to the database; everything goes through the app’s own API routes. Shared state is polled every 4 seconds, pauses when the tab is hidden, and refreshes when it returns.
Three optional server-side features call Claude: quantity estimates for the shopping list, a multilingual merge that groups items by aisle, and the listing reader. Food calls run on Haiku; the listing reader needs a model that supports domain-filtered web tools. Every endpoint is rate-limited, validates the model’s JSON, and degrades to a plain manual flow.
The project was built with Claude Code agents against written specs: a functional spec, a product strategy and a design system. Unit tests cover the expense maths and URL safety, and Playwright specs cover onboarding, attendance, offline and the repérage board.
Details
The visual system is deliberately not a SaaS dashboard. Navy is the structure, orange is the single celebratory accent, and ice blue is reserved for snow and weather. Headings use Bricolage Grotesque; body text uses the native system stack.
Trust is the model: anyone with the link can edit, and the only friction is a confirmation before actions that affect others, such as marking someone else absent. Removing a member cascades to their attendance and votes, so no orphan row skews a headcount.
The app holds a real group’s trip, so the live instance is not linked here.