1. Guests and wishes
Have the list in a spreadsheet? Paste the rows here, or . Columns named Name (or First and Last), Household or Party, Side or Group, Meal and RSVP are recognised; declined RSVPs are left out. Read in your browser, never uploaded.
A + B sit together · A ++ B really together · A ! B keep apart · A !! B never at one table · A @ 3 pin to table 3 · group Kids @ 5 pin everyone whose group (third column) is Kids to table 5
2. Tables
A head table of 12 and a kids table of 6? Write 1: 12, 5: 6 (table number, then seats). Every other table keeps the seats-per-table figure above.
Tables with step-free access (near the door, room for a wheelchair). Then add a rule line such as Grandma Rose @ accessible: she is only ever seated at one of these tables. Without a rule line this box does nothing.
Add your guests and wishes, then click Seat my guests.
Your guests, wishes and settings are remembered on this device only (browser local storage), so you can come back as RSVPs arrive.
Seating plan
Wishes it could not meet
Ways to fix a missed wish
Groups by table
Meals by table
Would a different number of tables seat better?
What if I move someone?
Your mother-in-law wants a different table? Check it before you touch the cards: it says whether the table has room, which wishes the move would break or fix, and the score change. Nothing changes until you press Apply, and Undo takes it back.
3. Someone dropped out or RSVP'd late?
Edit the guest and wish boxes above, paste the CSV you downloaded last time, and re-seat. Guests who are still coming stay at their table unless moving them is worth it, so you do not have to redo place cards or tell forty people they moved.
How it works
Scoring: every pair of guests that shares a table adds to a score. Members of the same party add 6, a + adds 3, a ++ adds 12, a ! takes away 6 and a !! takes away 200. The plan with the highest total wins, so a feud is separated even if it splits a friendship.
Search: simulated annealing moves and swaps guests between tables, accepting some worse moves early so it does not get stuck, restarted six times; a hill-climbing pass then applies any move or swap that still helps. Table capacity and pinned tables are never broken. The same list gives the same plan until you ask for another arrangement. On small events the answer is checked against trying every possible arrangement.
Seat order: each table's guests are listed in order around the table (the last seat touches the first), so a party and wanted pairs sit side by side and avoided pairs do not touch; it assumes a round table. Not modelled: a head table's row, couples at a head table sitting in a row, wheelchair access or room layout, grouping guests by dietary need (a fourth column only tallies meals for the caterer), which tables are near the stage or the door, children's tables as a row of seats (a whole group can be pinned to one table with group Kids @ 5), and how much one person dislikes another beyond the four strengths. Unverified against a real event: tested against exhaustive search on hundreds of small random lists and on a 200-guest list.
Common questions
How do I make a wedding seating chart?
List every guest, mark who comes together as a party, add the pairs who must or should sit together and the pairs who should be kept apart, then fix anyone who has to be at a particular table, such as the couple or a parent. The optimizer then assigns everyone to tables so the most wishes are met within each table's capacity. You can rerun it for a different arrangement and edit by hand afterwards.
How does the seating optimizer decide who sits where?
Every pair of guests gets a score: parties and wanted pairs add points, avoided pairs subtract points, and a never-together pair subtracts a very large number. It searches for the assignment with the highest total, using simulated annealing followed by a hill-climbing polish, within table capacity and pinned tables. On small events its answer is checked against trying every possible arrangement.
What do + ++ ! !! and @ mean?
Write one rule per line. A + B means they should sit together. A ++ B means they really should. A ! B means keep them apart if you can. A !! B means never at the same table. A @ 3 pins a guest to table 3.
Can I keep families together?
Yes. Put the same party name after a bar on each family member's line, such as Maya Okafor | Okafor family, and the optimizer treats every pair in that party as a wish to sit together. If a party is larger than a table it says so and shows which tables it was split across.
What if there are more guests than seats?
The tool tells you how many seats you are short and does not produce a plan. Raise the seats per table or the number of tables. Leave the number of tables blank and it uses the fewest that fit.
Does it spread guests evenly across tables?
By default yes: each table is filled to about the same level so you do not end up with one packed table and one nearly empty. Untick the option to let tables fill up to their full capacity instead.
What if a guest drops out after I have sent the seating plan?
Edit the guest list, paste the CSV you downloaded last time into the re-seat box and click Re-seat. Guests who are still coming stay at their table unless moving them is worth it, so only a few people move and the rest of your place cards stay valid.
Is the guest list uploaded or stored?
It is never uploaded. Everything runs in your browser, nothing is sent to a server and there are no accounts. So you can come back as RSVPs arrive, your guest list, wishes and settings are remembered on this device only (browser local storage); click Forget saved data to remove them, or save a setup file to move to another device. Download the plan as a CSV to keep the result.
Is the plan guaranteed to be the best possible?
No. It is a search, so on a large event there may be a slightly better arrangement, and it only knows the wishes you typed. It is a starting point to review with your family or planner, not a substitute for judgement about people. Check the table-by-table list before printing place cards.