# Plan de Tables Mariage A seating planner I built for my own wedding, then cleaned up and released under the [[MIT License]]. One HTML file, no build step, no server, no account. You open it in a browser and everything stays on your machine. The interface is in French. The code and the docs are not tied to a wedding: it works just as well for a banquet, a seminar, or a large family dinner. ## Why a spreadsheet doesn't cut it Making a seating plan is not a data-entry problem. It's an iteration problem. You try a layout, you see that table 3 is all cousins and nobody will talk, you start over, and then you want to compare that version with the one from yesterday. Spreadsheets fail at all three: - They split couples. Move one person, forget the other. - They make you recount seats by hand every time something moves. - They give you one version at a time. Comparing means duplicating a sheet and losing track of which one is current. ## The three design decisions Everything the tool does comes from three choices. They are the part worth remembering, more than the code. **The atom of placement is the unit, not the person.** A couple is one indivisible block that always moves together, shown with a `×2` badge. This one decision removes an entire class of mistakes. You cannot half-move a couple because there is no operation that would let you. **Layouts are first-class and parallel.** The tool calls them "options". Each is a complete, independent seating plan drawing from the same guest list. You duplicate one, change three tables, and keep both. Comparison is the normal mode of work, not something you improvise with copies. **Settled tables get locked.** A table marked as validated turns green and becomes read-only. It stops being a moving part while you shuffle the rest. Progress becomes visible instead of theoretical. Everything else (colored groups, live counts per table, gender balance) exists to answer questions you actually ask out loud while placing people: how many at this table, is it all men, who is left. ## Local by construction No account, no server, no analytics, no network call after the page loads. A guest list is a list of real people with their names and their relationships, and that data has no business leaving the machine. This is [[Local-First Software]] applied to something small enough that the constraint costs nothing. State is kept in the browser's `localStorage`, and there are two separate JSON exports: - The **guest list**: groups, couples, genders. Short enough to write or fix by hand in a text editor, which is often faster than clicking for a hundred people. - The **full plan**: everything, including layouts, tables, placements, and locks. Importing a list keeps the placements you already made by matching on names. That detail is what makes the round trip usable: you can bulk-edit the JSON, reimport, and not lose an afternoon of work. ## What building it taught me The tool started as a throwaway artifact from a conversation with [[Claude]], with my actual guest list hardcoded in the source. Turning it into something publishable was less about polish than about a specific kind of discipline: removing the data forced every implicit assumption into the open. With the list hardcoded, there was no way to create a group, no way to delete a person you mistyped, and a page reload silently restored the original data instead of destroying your work. None of those gaps were visible while the tool had my wedding baked into it. Deleting the data is what surfaced them. That generalizes well beyond this project. The fastest way to find out what a personal tool is missing is to try to give it to someone else. Keep in mind that this is [[Vibe Coding]] in the honest sense: a small, single-purpose tool with a real deadline, written fast, reviewed carefully before shipping. The scope is the reason it works, not a limitation to apologize for. ## Trade-offs I accepted - Names are the identity key, so duplicates are refused at input time. You add a precision (`Marie Dupont`, `Marie (cousin)`) instead of the tool inventing invisible identifiers. ## References - App: https://dsebastien.github.io/plan-de-tables-mariage/ - Source code: https://github.com/dsebastien/plan-de-tables-mariage - Guest list format example: https://github.com/dsebastien/plan-de-tables-mariage/blob/main/examples/liste-invites-exemple.json ## Related - [[Local-First Software]] - [[Open Source]] - [[MIT License]] - [[Vibe Coding]] - [[Claude]] - [[JavaScript]]