From 22ef849ccbdcf741bd9330f635fe34948d54c49c Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 4 Oct 2026 19:44:46 +0000 Subject: [PATCH 1/3] =?UTF-8?q?docs:=20say=20how=20sign-in=20really=20work?= =?UTF-8?q?s=20=E2=80=94=20a=20six-digit=20code,=20or=20Google=20or=20Appl?= =?UTF-8?q?e?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The README, roadmap and launch copy still described a magic link. The login page emails a six-digit code and offers Google and Apple. The decisions log gets a new dated entry rather than a rewritten old one. Also: the test count in the launch copy is the one measured on 4 October (2,067 cases in 239 files), and SELF-HOSTING.md now names siteUrl(), the function that actually exists, and what it really builds. Closes #47 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01VhFp1PtVBwgmxST9ZrRTEs --- README.md | 6 +++--- ROADMAP.md | 3 ++- docs/PRODUCT-ROADMAP.md | 10 ++++++++-- docs/SELF-HOSTING.md | 6 +++--- marketing/STRATEGY.md | 5 +++-- marketing/copy/hacker-news.md | 2 +- marketing/copy/reddit-posts.md | 8 ++++---- 7 files changed, 24 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 1e16c87f..1a2481c5 100644 --- a/README.md +++ b/README.md @@ -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. @@ -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 diff --git a/ROADMAP.md b/ROADMAP.md index ddbc17cf..e13eee3e 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -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. diff --git a/docs/PRODUCT-ROADMAP.md b/docs/PRODUCT-ROADMAP.md index 92875df2..f78c2f9d 100644 --- a/docs/PRODUCT-ROADMAP.md +++ b/docs/PRODUCT-ROADMAP.md @@ -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 @@ -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 diff --git a/docs/SELF-HOSTING.md b/docs/SELF-HOSTING.md index 2d6fe0ca..5f63c1d8 100644 --- a/docs/SELF-HOSTING.md +++ b/docs/SELF-HOSTING.md @@ -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 diff --git a/marketing/STRATEGY.md b/marketing/STRATEGY.md index f1698990..16df9ed5 100644 --- a/marketing/STRATEGY.md +++ b/marketing/STRATEGY.md @@ -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 @@ -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 diff --git a/marketing/copy/hacker-news.md b/marketing/copy/hacker-news.md index 96d3124e..cd960402 100644 --- a/marketing/copy/hacker-news.md +++ b/marketing/copy/hacker-news.md @@ -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. > diff --git a/marketing/copy/reddit-posts.md b/marketing/copy/reddit-posts.md index 6777b6ca..2bf58109 100644 --- a/marketing/copy/reddit-posts.md +++ b/marketing/copy/reddit-posts.md @@ -85,8 +85,8 @@ Space them at least a day apart. **Replies to have ready:** -- *"Why Supabase and not plain Postgres?"* Auth by magic link, row-level - security and the realtime channel all come from it. The data is plain +- *"Why Supabase and not plain Postgres?"* Auth (a six-digit email code, or + Google or Apple), row-level security and the realtime channel all come from it. The data is plain Postgres JSONB, and the migrations are plain SQL. - *"Can I run it without Supabase at all?"* Yes. Everything but accounts, sync and share links works with no backend. Set nothing, and the account @@ -199,11 +199,11 @@ discourage recruiting):** > > - Next.js 16 (App Router), React 19, TypeScript, Zustand, zod 4, > Tailwind 4 -> - Supabase: Postgres JSONB, RLS, magic-link auth, realtime, bounded history +> - Supabase: Postgres JSONB, RLS, email-code auth, realtime, bounded history > - An MIT npm package (`@jfrusher/knotwork`) holding the schemas and file > format, separate from the AGPL app, so third-party tools can read the > file -> - 1,800+ Vitest cases, RLS tested against PGlite, and Playwright with axe +> - 2,000+ Vitest cases, RLS tested against PGlite, and Playwright with axe > against the production build > - Dated design specs and implementation plans for every subsystem in > `docs/superpowers/`, written before code, including where the plan turned From e707f2449ec696d67053728fffbbf96726e13564 Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 4 Oct 2026 19:44:46 +0000 Subject: [PATCH 2/3] docs(marketing): launch copy links to knotwork-suite.vercel.app, not a placeholder The copy was written against knotwork.app, a domain nobody has bought. The launch stays on knotwork-suite.vercel.app, so every link now uses it and the audit and strategy record the decision. The obsolete note about the repo still being called Trousseau goes too. Closes #50 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01VhFp1PtVBwgmxST9ZrRTEs --- marketing/01_MARKETING_AUDIT_REPORT.md | 2 +- marketing/02_GTM_STRATEGY_FOUNDATION.md | 2 +- marketing/assets/email-sequences.md | 20 ++++++++++---------- marketing/assets/landing-page-copy.md | 5 ++--- marketing/assets/social-launch-pack.md | 18 +++++++++--------- 5 files changed, 23 insertions(+), 24 deletions(-) diff --git a/marketing/01_MARKETING_AUDIT_REPORT.md b/marketing/01_MARKETING_AUDIT_REPORT.md index e1db3c9a..4d58542e 100644 --- a/marketing/01_MARKETING_AUDIT_REPORT.md +++ b/marketing/01_MARKETING_AUDIT_REPORT.md @@ -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. | diff --git a/marketing/02_GTM_STRATEGY_FOUNDATION.md b/marketing/02_GTM_STRATEGY_FOUNDATION.md index fb4dd4e8..8c7edd82 100644 --- a/marketing/02_GTM_STRATEGY_FOUNDATION.md +++ b/marketing/02_GTM_STRATEGY_FOUNDATION.md @@ -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 | diff --git a/marketing/assets/email-sequences.md b/marketing/assets/email-sequences.md index abf36922..44d437b5 100644 --- a/marketing/assets/email-sequences.md +++ b/marketing/assets/email-sequences.md @@ -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. | @@ -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** @@ -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] > @@ -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. > @@ -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. > @@ -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 > @@ -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. > @@ -339,7 +339,7 @@ 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?" > @@ -347,7 +347,7 @@ Each email below has an **in-app version**: one or two lines for the "Next" card > > 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]. diff --git a/marketing/assets/landing-page-copy.md b/marketing/assets/landing-page-copy.md index f1c4b2cd..6d98fd61 100644 --- a/marketing/assets/landing-page-copy.md +++ b/marketing/assets/landing-page-copy.md @@ -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. @@ -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` | --- @@ -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`.)* --- diff --git a/marketing/assets/social-launch-pack.md b/marketing/assets/social-launch-pack.md index 527d387d..1dab43ac 100644 --- a/marketing/assets/social-launch-pack.md +++ b/marketing/assets/social-launch-pack.md @@ -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. | @@ -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) @@ -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 @@ -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`] @@ -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 @@ -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`] @@ -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`. @@ -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. @@ -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. From 8e6b662b36c96b51e8b68c8c2bdd8e0caf4bfeff Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 4 Oct 2026 19:44:46 +0000 Subject: [PATCH 3/3] Link previews and the footer stop saying the wedding never leaves the device The meta description, the Open Graph image and the footer all predated accounts: they said everything stayed on your own device, and the preview image still said four tools. Each now says what is true either way: free, open source, and no account needed. Closes #48 Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01VhFp1PtVBwgmxST9ZrRTEs --- suite/app/layout.tsx | 2 +- suite/app/opengraph-image.tsx | 6 +++--- suite/components/shell/Footer.tsx | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/suite/app/layout.tsx b/suite/app/layout.tsx index 74d64e15..bcae4a92 100644 --- a/suite/app/layout.tsx +++ b/suite/app/layout.tsx @@ -23,7 +23,7 @@ const lato = Lato({ }); const description = - "Seating, stationery, timeline and crew for one wedding. Free, open source, and entirely on your own device."; + "Free wedding planning tools that agree with each other: guests, seating, place cards, the day's timeline and more. Open source, no account needed."; export const metadata: Metadata = { // Absolute URLs for canonical links and OpenGraph tags are built from this. diff --git a/suite/app/opengraph-image.tsx b/suite/app/opengraph-image.tsx index 733bead3..49c35eda 100644 --- a/suite/app/opengraph-image.tsx +++ b/suite/app/opengraph-image.tsx @@ -1,6 +1,6 @@ import { ImageResponse } from "next/og"; -export const alt = "Knotwork โ€” seating, stationery, timeline and crew for one wedding"; +export const alt = "Knotwork โ€” free wedding planning tools that agree with each other"; export const size = { width: 1200, height: 630 }; export const contentType = "image/png"; @@ -30,10 +30,10 @@ export default function OpengraphImage() { >
Knotwork
- One wedding. Four tools. One document. + One wedding. Every tool. One document.
- Yours, on your own device. + Free and open source. No account needed.
), diff --git a/suite/components/shell/Footer.tsx b/suite/components/shell/Footer.tsx index b4ca0ea9..5961d8c8 100644 --- a/suite/components/shell/Footer.tsx +++ b/suite/components/shell/Footer.tsx @@ -13,7 +13,7 @@ export function Footer() { return (