Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -90,8 +90,8 @@ you add the tool again.
printed from the wedding as it stands.
- 🔗 **Guest and supplier links.** A guest sees their own seat and nothing
else. A supplier sees their part of the day and can confirm it.
- 🤝 **Plan together.** Two partners and a planner, with sign-in by magic link
(no passwords). Real-time sync, version history with restore, and conflicts
- 🤝 **Plan together.** Two partners and a planner, signing in with a
six-digit code by email, or with Google or Apple (no passwords). Real-time sync, version history with restore, and conflicts
are shown, never silently resolved.
- 🗂️ **Planner mode.** Many weddings per account, and a library of reusable
processionals, box sets and bar settings.
Expand Down Expand Up @@ -295,7 +295,7 @@ The front page runs its own version and shows what is left to do.

**Next.js 16** (App Router) · **React 19** · **TypeScript** · **Zustand** ·
**zod 4** · **Tailwind CSS 4** · **Supabase** (Postgres with row-level
security, magic-link auth) · **pdf-lib / jsPDF** for print · **Vitest**,
security, email-code auth) · **pdf-lib / jsPDF** for print · **Vitest**,
**Playwright** and **axe** for tests.

```text
Expand Down
3 changes: 2 additions & 1 deletion ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ is retyped and nothing disagrees.

## ✅ V1.1: planning together, and the toolbox (shipped)

- ✅ **Accounts.** Magic-link sign-in, two partners per wedding, and signing in
- ✅ **Accounts.** No passwords: a six-digit code by email, or Google or Apple.
Two partners per wedding, and signing in
never silently replaces a wedding.
- ✅ **One live document**, with real-time sync, presence, one undo history,
and version history with restore.
Expand Down
10 changes: 8 additions & 2 deletions docs/PRODUCT-ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,11 @@ against, not a discussion to reopen without a reason.
wedding, so it is as readable to the server's operator as the wedding is —
stated in the Privacy Policy, which no longer describes the passphrase
system.
- **2026-10-03** — Sign-in is a six-digit code sent by email (2026-10-02),
replacing the magic link, with **Continue with Google** and **Continue with
Apple** alongside it. Each provider shows only when it is switched on in
Supabase. Still no passwords. This supersedes "no social login for now"
from 2026-09-02.

## Subsystem H — Guided tour & example wedding

Expand Down Expand Up @@ -206,8 +211,9 @@ things to decide.

**Decided:** Supabase Auth; two accounts per wedding via partner invite (not
a shared login); couple-only roles for now (guests and vendors/crew stay
link-based, no logins); email + magic-link sign-in, no passwords, no social
login for now.
link-based, no logins); no passwords. Sign-in started as an email magic link
and is now a six-digit emailed code, with Google and Apple alongside it (see
the decisions log, 2026-10-03).

**Spec written:** [`2026-09-02-identity-accounts-design.md`](superpowers/specs/2026-09-02-identity-accounts-design.md)
— one-click invite via emailed link (locked to the invited email, rejects a
Expand Down
6 changes: 3 additions & 3 deletions docs/SELF-HOSTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -101,9 +101,9 @@ Two things that will catch you out:
local-only instance, and thoroughly confusing if you meant to enable them.

`VERCEL_PROJECT_PRODUCTION_URL` also appears in the schema. Vercel supplies it
automatically and it is used to build absolute URLs for magic links and guest
links. On another host you may need an equivalent — see `originOf()` in
`suite/lib/env.ts`.
automatically and it is used to build absolute URLs for canonical links, Open
Graph tags, the sitemap and `robots.txt`. On another host you may need an
equivalent — see `siteUrl()` in `suite/lib/env.ts`.

### Sign-in: email code, Google and Apple

Expand Down
2 changes: 1 addition & 1 deletion marketing/01_MARKETING_AUDIT_REPORT.md
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,7 @@ Stated so you can correct any of them. Each one changes something downstream.
| A2 | **One maintainer, evenings and weekends**, alongside a job and a degree. | Privacy policy: "a personal project, not a company". | The roadmap in `03` is sized for about 6–8 hours a week. |
| A3 | **Primary market is the UK**, with English-speaking developers worldwide as the launch amplifier. | £, UK units, `en_GB`, England-and-Wales blog posts, ICO named as regulator. | Swap r/UKweddings for US subs and rewrite the bar and money examples. |
| A4 | **Launch has not happened.** No post has gone out. | Unticked checklist; no baselines recorded. | Skip T-2 and go straight to the couple wave. |
| A5 | **A domain will be bought and the repo renamed before launch.** Copy uses `knotwork.app` as a **placeholder**. I did not check that it is available. | G4. | Replace the placeholder everywhere; the copy does not otherwise depend on it. |
| A5 | **A domain will be bought and the repo renamed before launch.** Copy uses `knotwork.app` as a **placeholder**. I did not check that it is available. | G4. | Replace the placeholder everywhere; the copy does not otherwise depend on it. **Decided 2026-10-04:** no new domain; the copy now uses `knotwork-suite.vercel.app`. |
| A6 | **Goal of the launch is weddings planned, not stars.** Stars are a means. | "Built for other couples" (README). | If the goal is contributors, reorder the ICPs. |
| A7 | **UK engagements cluster between Christmas and Valentine's Day**, so couple demand rises in January. | Widely reported in the wedding trade; **I did not verify it with a source in this session.** | The two-wave split still holds; only the date of wave two moves. |
| A8 | **The personal story in the copy is accurate** (married, two apps disagreed on the date, built for own wedding). | README, repeated in all copy. | Yours to confirm. `reddit-posts.md` already warns that one embellished detail undoes a post. |
Expand Down
2 changes: 1 addition & 1 deletion marketing/02_GTM_STRATEGY_FOUNDATION.md
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,7 @@ The honest answer to "what's the catch?", in order:
| # | Decision | My recommendation | Affects |
| --- | --- | --- | --- |
| D1 | Primary market: UK or US? | **UK** for couples; global for developers | Subreddits, examples, spelling, launch hours |
| D2 | Domain | Buy one that says Knotwork. `knotwork.app` is a placeholder I have **not** checked for availability. | Every asset |
| D2 | Domain | Buy one that says Knotwork. `knotwork.app` is a placeholder I have **not** checked for availability. **Decided 2026-10-04:** stay on `knotwork-suite.vercel.app`. | Every asset |
| D3 | Onboarding by email, or in the app? | **In the app** (audit, G7) | `email-sequences.md` Part B |
| D4 | Use the word "only"? | Not until LibreWeddingPlanner's repo has been read | USP, Product Hunt tagline |
| D5 | Is the personal story accurate as written? | Yours to confirm | All copy |
Expand Down
5 changes: 3 additions & 2 deletions marketing/STRATEGY.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,8 @@ Extracted from `suite/lib/tools.ts`, the app routes and the tool modules.
shots.
- 🔗 **Guest seat links.** One guest sees their own seat and nothing else.
**Supplier links** let a supplier see and confirm their part.
- 🤝 **Two partners and a planner.** Magic-link sign-in with no passwords.
- 🤝 **Two partners and a planner.** No passwords: a six-digit code by email,
or Google or Apple.
Real-time sync and presence. Conflicts are shown, never silently resolved.
Version history with restore.
- 🗂️ **Planner mode.** Many weddings per account, and a library of reusable
Expand Down Expand Up @@ -193,7 +194,7 @@ a real user base and a clear path to a first PR.

- Modern stack: Next.js 16, React 19, TypeScript, Zustand, zod 4, Tailwind 4,
Supabase (Postgres + RLS), Vitest, Playwright with axe.
- A test suite that means it: over 1,800 test cases across 230+ test files,
- A test suite that means it: 2,067 test cases across 239 test files (4 October 2026),
plus end-to-end runs against the production build. RLS is tested against
PGlite.
- Decisions written down. Every subsystem has a dated spec and plan in
Expand Down
20 changes: 10 additions & 10 deletions marketing/assets/email-sequences.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Two sequences: **A**, three outreach emails to people who can put Knotwork in fr

| # | Point |
| --- | --- |
| 1 | `knotwork.app` is a **placeholder domain**. |
| 1 | The site is `knotwork-suite.vercel.app` (decided 2026-10-04: no new domain for the launch). |
| 2 | **Sequence B cannot be sent today.** Knotwork has no way to email users and no permission to. See "Before Sequence B" below. It is written so each email also works as an in-app message. |
| 3 | Sequence A goes to people in a professional capacity, one at a time, from your own address. It is not a mail merge. Under UK rules, sole traders count as individuals, so keep it personal, relevant to their work, and stop at the first "no". I'm not a lawyer; if this grows beyond a few dozen hand-written emails, check the ICO's guidance on direct marketing. |
| 4 | Everything in square brackets is for you to fill in. If a bracket can't be filled honestly, cut the sentence. |
Expand Down Expand Up @@ -61,14 +61,14 @@ After email 3, stop. Do not send a fourth.
>
> It's called Knotwork. There's no paid version, no adverts and no sign-up: you open it and your guest list stays in your own browser. It's open source, so that can't change later.
>
> There's an example wedding already loaded if you'd like a look: knotwork.app
> There's an example wedding already loaded if you'd like a look: knotwork-suite.vercel.app
>
> I'm not asking for a review. If it seems like something your readers would use, I'd be glad of a mention, and I'm happy to write up anything useful for you: a short guide to doing a table plan, say, with no pitch in it.
>
> Either way, thank you for [the post / the newsletter].
>
> Jacob
> [knotwork.app · reply to this address]
> [knotwork-suite.vercel.app · reply to this address]

**Opener swap — A2, for planners and coordinators**

Expand Down Expand Up @@ -112,7 +112,7 @@ Sent on day 5, as a reply in the same thread. It gives something; it does not as
>
> [Choose one, and attach or link it:]
>
> **For bloggers:** I wrote a short guide to [how much drink to buy for a UK wedding / what a registrar will and won't allow for ceremony music / the four boxes to pack for the day]. No sign-up, no pitch: knotwork.app/blog/[slug]. You're welcome to link to it or borrow from it.
> **For bloggers:** I wrote a short guide to [how much drink to buy for a UK wedding / what a registrar will and won't allow for ceremony music / the four boxes to pack for the day]. No sign-up, no pitch: knotwork-suite.vercel.app/blog/[slug]. You're welcome to link to it or borrow from it.
>
> **For planners:** here's the PDF pack the example wedding produces: floor plan, run sheet, job list and photo list in one file. It's the quickest way to judge whether the output is good enough to put in front of a client. [attach]
>
Expand All @@ -136,7 +136,7 @@ Sent on day 12. Short. It makes it easy to say no.
>
> If Knotwork isn't right for [your readers / your business / the show], no problem at all, and you needn't reply.
>
> If it's just bad timing, it'll still be there, and still free: knotwork.app
> If it's just bad timing, it'll still be there, and still free: knotwork-suite.vercel.app
>
> And if you did take a look and something put you off, I'd honestly rather hear that than nothing. One line is plenty.
>
Expand Down Expand Up @@ -227,7 +227,7 @@ Each email below has an **in-app version**: one or two lines for the "Next" card
>
> Every other tool builds on that list, so it's the only thing you'll ever type once.
>
> → Open Guests: knotwork.app/guests
> → Open Guests: knotwork-suite.vercel.app/guests
>
> Not ready? The guided tour has a finished example wedding with 100 guests you can poke at instead.
>
Expand Down Expand Up @@ -266,7 +266,7 @@ Each email below has an **in-app version**: one or two lines for the "Next" card
>
> Start with one table. The rest goes quickly.
>
> → Open Seating: knotwork.app/seating
> → Open Seating: knotwork-suite.vercel.app/seating
>
> Jacob
>
Expand Down Expand Up @@ -303,7 +303,7 @@ Each email below has an **in-app version**: one or two lines for the "Next" card
>
> The same list also writes your **group photo list**, from who's related to whom.
>
> → Open Place cards: knotwork.app/place-cards
> → Open Place cards: knotwork-suite.vercel.app/place-cards
>
> If something here doesn't work the way you expected, just reply. It comes to me.
>
Expand Down Expand Up @@ -339,15 +339,15 @@ Each email below has an **in-app version**: one or two lines for the "Next" card
>
> **3. Share the load.** Invite your partner from the account page, and you'll both see changes as they're made. There's also one PDF with the floor plan, run sheet, jobs and photo list for whoever's helping.
>
> → Open Timeline: knotwork.app/timeline
> → Open Timeline: knotwork-suite.vercel.app/timeline
>
> That's all four. You won't hear from me again unless you write first, and I hope you do, especially if something's missing. Every tool in Knotwork started as someone's answer to "what are you still doing in a spreadsheet?"
>
> Have a wonderful day.
>
> Jacob
>
> P.S. Once it's all over, other couples would love to hear how it went: knotwork.app/blog/share
> P.S. Once it's all over, other couples would love to hear how it went: knotwork-suite.vercel.app/blog/share
>
> —
> 4 of 4. That's the lot. Unsubscribe anyway: [link].
Expand Down
5 changes: 2 additions & 3 deletions marketing/assets/landing-page-copy.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ A section-by-section blueprint for `marketing/landing-page/index.html`. It keeps

**Before using this:**

- `knotwork.app` is a **placeholder domain**. Replace it everywhere once a domain is bought.
- The site is `knotwork-suite.vercel.app` (decided 2026-10-04: no new domain for the launch).
- Every claim below was checked against the code or `marketing/STRATEGY.md`'s evidence table. The "claims deliberately left out" list there still applies.
- Voice: plain, British, first person where a person is speaking. No superlatives.

Expand All @@ -31,7 +31,7 @@ A section-by-section blueprint for `marketing/landing-page/index.html`. It keeps
| Meta description (152 chars) | Seating chart, place cards, timeline and more, sharing one guest list. Change it once and everything updates. Free, no sign-up, no adverts, open source. |
| `og:title` | Knotwork: free wedding planning tools that work together |
| `og:description` | Seat your guests once, and the place cards, dietary counts and run sheet already know. Free, no sign-up, open source. |
| `og:image` | `https://knotwork.app/assets/images/og-card.png` — **absolute URL**. The current relative path will not unfurl. |
| `og:image` | An **absolute URL**. The current relative path will not unfurl. The app already serves one at `https://knotwork-suite.vercel.app/opengraph-image`; where the page's own image lives depends on where the page is hosted (#49). |
| `og:locale` | `en_GB` |

---
Expand Down Expand Up @@ -342,7 +342,6 @@ npm run dev -w suite

`[ Self-hosting guide ]` · `[ ★ Star on GitHub ]`

*(The clone URL assumes the repo has been renamed. Until then it is `JFrusher/Trousseau.git Knotwork`.)*

---

Expand Down
18 changes: 9 additions & 9 deletions marketing/assets/social-launch-pack.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Product Hunt, X, LinkedIn and Reddit. This adds to `marketing/copy/`; it does no

| # | Check |
| --- | --- |
| 1 | `knotwork.app` is a **placeholder**. Replace it with the real domain. Until the repo is renamed, the GitHub link is `github.com/JFrusher/Trousseau`. |
| 1 | The site is `knotwork-suite.vercel.app` (decided 2026-10-04: no new domain for the launch). The repo is `github.com/JFrusher/Knotwork`. |
| 2 | **Sign-in is a six-digit emailed code, or Google or Apple.** It is not a magic link. Fix this in `marketing/copy/hacker-news.md` and `reddit-posts.md` before they go out. |
| 3 | Every personal detail (your wedding, the two apps that disagreed about the date) must be exactly as it happened. Edit anything that isn't. |
| 4 | Screenshots and clips use the example wedding only. Never a real guest list. |
Expand All @@ -27,7 +27,7 @@ Product Hunt, X, LinkedIn and Reddit. This adds to `marketing/copy/`; it does no
| Tagline, alternative B | The open-source wedding planner with nothing to sell you | 56 |
| **Topics** | Wedding Planning · Open Source · Productivity | |
| **Pricing** | Free | |
| **Links** | Website: `knotwork.app` · GitHub: repo URL | |
| **Links** | Website: `knotwork-suite.vercel.app` · GitHub: repo URL | |
| **First comment** | Maker comment, below | |

**Description** (252 / 260 characters)
Expand Down Expand Up @@ -73,7 +73,7 @@ Product Hunt's gallery is 1270×760. The hero images are 1600×1000, a slightly
>
> I'd love to know: **what job did you end up doing in a spreadsheet?** That question is how every tool in it got built.
>
> Try it (no sign-up): knotwork.app
> Try it (no sign-up): knotwork-suite.vercel.app

### Product Hunt notes

Expand All @@ -100,7 +100,7 @@ Three launch posts for three audiences. Post them on different days. Each is wri
>
> Free. No sign-up. No adverts. I built it for our wedding.
>
> knotwork.app
> knotwork-suite.vercel.app
>
> [Attach: `motion/seat-to-card.mp4`]

Expand Down Expand Up @@ -142,7 +142,7 @@ Three launch posts for three audiences. Post them on different days. Each is wri
> What it is: local-first, no account needed, AGPL, and self-hostable with no analytics.

**6/6**
> Planning a wedding, or know someone who is? It's free, and the guest list never has to leave their laptop → knotwork.app
> Planning a wedding, or know someone who is? It's free, and the guest list never has to leave their laptop → knotwork-suite.vercel.app
>
> If you build things, the code and every design spec are here → github.com/JFrusher/Knotwork

Expand All @@ -158,7 +158,7 @@ Three launch posts for three audiences. Post them on different days. Each is wri
>
> It exists because I needed it.
>
> knotwork.app
> knotwork-suite.vercel.app
>
> [Attach: `images/pledge.png`]

Expand Down Expand Up @@ -206,7 +206,7 @@ Two posts, written for LinkedIn, not adapted from X. No numbering, short paragra
> #OpenSource #SoftwareEngineering #ProductDevelopment

**First comment:**
> Try it, no sign-up: knotwork.app
> Try it, no sign-up: knotwork-suite.vercel.app
> Code, specs and plans: github.com/JFrusher/Knotwork

**Attach:** `images/hero-overview.png`, or a document carousel of `square-overview`, `square-seating`, `square-place-cards`, `square-timeline`, `pledge`.
Expand Down Expand Up @@ -244,7 +244,7 @@ Two posts, written for LinkedIn, not adapted from X. No numbering, short paragra
> #WeddingPlanner #WeddingIndustry #EventPlanning

**First comment:**
> knotwork.app — no sign-up needed to look around. There's an example wedding with 100 guests and a full day already in it.
> knotwork-suite.vercel.app — no sign-up needed to look around. There's an example wedding with 100 guests and a full day already in it.

**Attach:** `images/hero-timeline.png`, or `motion/ceremony-moves.mp4` uploaded natively.

Expand Down Expand Up @@ -302,7 +302,7 @@ Alternatives:
>
> It's free, properly: no premium version, no ads, no supplier adverts. You don't need to make an account. It saves in your browser, so your guest list doesn't go anywhere unless you choose to sync with your partner. The code's public if that sort of thing matters to you.
>
> There's an example wedding in it if you just want a look round: knotwork.app
> There's an example wedding in it if you just want a look round: knotwork-suite.vercel.app
>
> Mostly I'd like to know **what's missing**. What did you end up doing in a spreadsheet or on paper that you wish something had just done for you? Every tool in it started as an answer to that.

Expand Down
2 changes: 1 addition & 1 deletion marketing/copy/hacker-news.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ is what an HN reader will want to argue about.
> sends no analytics at all.
>
> **Stack:** Next.js 16, React 19, TypeScript, Zustand, zod 4, Tailwind 4,
> Supabase, pdf-lib and jsPDF for print. Vitest has 1,800+ cases, including
> Supabase, pdf-lib and jsPDF for print. Vitest has 2,000+ cases, including
> RLS policies tested against PGlite. Playwright with axe runs against the
> production build.
>
Expand Down
Loading
Loading