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
4 changes: 2 additions & 2 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ or a screenshot. Use the guided tour's example wedding, or invent people.

| You have… | Do this |
| --- | --- |
| Ten minutes | Try the [hosted app](https://trousseau-suite.vercel.app), and open an issue for anything confusing. Confusion is a bug. |
| Ten minutes | Try the [hosted app](https://knotwork-suite.vercel.app), and open an issue for anything confusing. Confusion is a bug. |
| An hour | Pick an issue labelled `good first issue`, or fix a doc that was wrong for you. |
| A weekend | Take a tool proposal from [ROADMAP.md](ROADMAP.md). |
| A job nothing does | Build a tool. Read [docs/BUILDING-A-TOOL.md](docs/BUILDING-A-TOOL.md) first. |
Expand Down Expand Up @@ -71,7 +71,7 @@ that can browse weddings.
### Install and run

```sh
git clone https://github.com/JFrusher/Trousseau.git Knotwork
git clone https://github.com/JFrusher/Knotwork.git Knotwork
cd Knotwork

npm ci # installs the root package and the suite workspace
Expand Down
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,13 @@
<sub>Formerly Trousseau.</sub>

[![Licence: AGPL-3.0 app, MIT contract](https://img.shields.io/badge/licence-AGPL--3.0%20app%20%C2%B7%20MIT%20contract-5b4bd5)](LICENSE)
[![GitHub stars](https://img.shields.io/github/stars/JFrusher/Trousseau?style=flat&logo=github&label=stars)](https://github.com/JFrusher/Trousseau/stargazers)
[![CI](https://github.com/JFrusher/Trousseau/actions/workflows/ci.yml/badge.svg)](https://github.com/JFrusher/Trousseau/actions/workflows/ci.yml)
[![GitHub stars](https://img.shields.io/github/stars/JFrusher/Knotwork?style=flat&logo=github&label=stars)](https://github.com/JFrusher/Knotwork/stargazers)
[![CI](https://github.com/JFrusher/Knotwork/actions/workflows/ci.yml/badge.svg)](https://github.com/JFrusher/Knotwork/actions/workflows/ci.yml)
[![Self-hostable](https://img.shields.io/badge/self--hostable-Next.js%20%2B%20optional%20Supabase-2f855a)](docs/SELF-HOSTING.md)
[![No account needed](https://img.shields.io/badge/account-not%20needed-2f855a)](https://trousseau-suite.vercel.app)
[![No account needed](https://img.shields.io/badge/account-not%20needed-2f855a)](https://knotwork-suite.vercel.app)
[![PRs welcome](https://img.shields.io/badge/PRs-welcome-e05d44)](CONTRIBUTING.md)

[**Open Knotwork →**](https://trousseau-suite.vercel.app) &nbsp;·&nbsp;
[**Open Knotwork →**](https://knotwork-suite.vercel.app) &nbsp;·&nbsp;
[Run your own copy](#-run-your-own-copy) &nbsp;·&nbsp;
[How it works](#-how-it-works) &nbsp;·&nbsp;
[Roadmap](ROADMAP.md) &nbsp;·&nbsp;
Expand Down Expand Up @@ -123,7 +123,7 @@ More screenshots, framed images and clips for sharing are in

## 🚀 Get started in two minutes

1. Open **[trousseau-suite.vercel.app](https://trousseau-suite.vercel.app)**.
1. Open **[knotwork-suite.vercel.app](https://knotwork-suite.vercel.app)**.
There is no sign-up.
2. Press **Data**, and put in your names, your venue and the date.
3. Import your guest list as a CSV.
Expand All @@ -149,7 +149,7 @@ error reporting only runs if you set a Sentry DSN.
### Local only: no backend, no account

```sh
git clone https://github.com/JFrusher/Trousseau.git Knotwork
git clone https://github.com/JFrusher/Knotwork.git Knotwork
cd Knotwork
npm ci # installs the contract package and the suite together
npm run build # builds the shared contract package; do not skip this
Expand Down Expand Up @@ -193,7 +193,7 @@ how to check your instance actually works rather than merely starting.
- **No account, no upload.** The app saves to your browser, and nothing from
your wedding leaves the device. The hosted site counts visits to its pages,
with no cookie and nothing from the wedding in it. Every address is cut to
its route first. The [Privacy Policy](https://trousseau-suite.vercel.app/privacy)
its route first. The [Privacy Policy](https://knotwork-suite.vercel.app/privacy)
says exactly what is counted.
- **With an account**, your wedding syncs between you, your partner and your
planner. It is stored encrypted at rest, and database-level rules mean no
Expand Down
2 changes: 1 addition & 1 deletion docs/DATA.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ schema and exact bytes together.
## Setting up a new device

```sh
git clone https://github.com/JFrusher/Trousseau Knotwork && cd Knotwork
git clone https://github.com/JFrusher/Knotwork Knotwork && cd Knotwork
npm install

# The remote URL is per-device and deliberately not committed — it names a path
Expand Down
Binary file modified marketing/assets/images/hero-bar.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified marketing/assets/images/hero-boxes.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified marketing/assets/images/hero-ceremony.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified marketing/assets/images/hero-checklist.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified marketing/assets/images/hero-delegation.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified marketing/assets/images/hero-group-shots.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified marketing/assets/images/hero-guests.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified marketing/assets/images/hero-money.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified marketing/assets/images/hero-overview.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified marketing/assets/images/hero-place-cards.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified marketing/assets/images/hero-seating.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified marketing/assets/images/hero-timeline.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added marketing/assets/images/logo-120.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added marketing/assets/images/logo-512.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified marketing/assets/images/og-card.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified marketing/assets/images/social-preview.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified marketing/assets/images/square-ceremony.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified marketing/assets/images/square-money.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified marketing/assets/images/square-overview.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified marketing/assets/images/square-place-cards.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified marketing/assets/images/square-seating.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified marketing/assets/images/square-timeline.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified marketing/assets/images/story.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions marketing/assets/pipeline/compose.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ def window(src, x, y, w, path, crop=None):
inner = f"<img class=shot src='file://{RAW}/{src}.png'>"
return (f"<div class=window style='left:{x}px;top:{y}px;width:{w}px'><div class=chrome>"
f"<span class=dot style='background:#e9695e'></span><span class=dot style='background:#e8b650'></span><span class=dot style='background:#6cbf5f'></span>"
f"<span class=url>trousseau-suite.vercel.app{path}</span></div>{inner}</div>")
f"<span class=url>knotwork-suite.vercel.app{path}</span></div>{inner}</div>")

manifest = []
os.makedirs(OUT, exist_ok=True)
Expand Down Expand Up @@ -135,7 +135,7 @@ def phone(src, x, y, w):
f"<h1 style='font-size:104px;margin-top:40px'>Your wedding,<br>in one place.</h1>"
f"<p class=sub style='font-size:38px;margin-top:30px'>Free. Private. Open source.<br>No sign-up to start.</p></div>"
+ phone("binder-now", 276, 560, 500)
+ f"<div style='position:absolute;left:0;right:0;bottom:70px;text-align:center;font-size:34px'>trousseau-suite.vercel.app</div>")
+ f"<div style='position:absolute;left:0;right:0;bottom:70px;text-align:center;font-size:34px'>knotwork-suite.vercel.app</div>")
page("story", 1080, 1920, body, "#f3e3dc")

# ---------- The pledge, 1080x1080 ----------
Expand Down
6 changes: 3 additions & 3 deletions marketing/copy/hacker-news.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

**Post from:** the maintainer's own account.
**When:** Tuesday to Thursday, 8–10am US Eastern.
**Link to:** `https://github.com/JFrusher/Trousseau`. The hosted app needs no
**Link to:** `https://github.com/JFrusher/Knotwork`. The hosted app needs no
sign-up, so it satisfies Show HN's "something people can try" rule. Put the
app link in the first line of the text.
**Stay:** in the thread for at least three hours, and answer every technical
Expand Down Expand Up @@ -30,8 +30,8 @@ is what an HN reader will want to argue about.

## Body

> Try it (no sign-up, nothing leaves your browser): https://trousseau-suite.vercel.app
> Code: https://github.com/JFrusher/Trousseau
> Try it (no sign-up, nothing leaves your browser): https://knotwork-suite.vercel.app
> Code: https://github.com/JFrusher/Knotwork
>
> I built Knotwork for my own wedding, after two of the apps we were using
> disagreed about what day it was.
Expand Down
16 changes: 8 additions & 8 deletions marketing/copy/reddit-posts.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ Space them at least a day apart.
> **Setup, local-only:**
>
> ```
> git clone https://github.com/JFrusher/Trousseau.git Knotwork
> git clone https://github.com/JFrusher/Knotwork.git Knotwork
> cd Knotwork
> npm ci
> npm run build
Expand All @@ -76,10 +76,10 @@ Space them at least a day apart.
> clone. It lists every env var, the migration order, and the two mistakes
> that catch everyone out. It also ends with a section on checking that the
> instance actually works, not just that it starts:
> https://github.com/JFrusher/Trousseau/blob/main/docs/SELF-HOSTING.md
> https://github.com/JFrusher/Knotwork/blob/main/docs/SELF-HOSTING.md
>
> Repo: https://github.com/JFrusher/Trousseau
> Hosted, if you just want to click around (no sign-up): https://trousseau-suite.vercel.app
> Repo: https://github.com/JFrusher/Knotwork
> Hosted, if you just want to click around (no sign-up): https://knotwork-suite.vercel.app
>
> Happy to answer anything about the architecture or the RLS setup.

Expand Down Expand Up @@ -145,7 +145,7 @@ Space them at least a day apart.
> column is which and shows you a preview first.
>
> There's a guided tour with a pretend wedding if you just want to poke
> around: https://trousseau-suite.vercel.app
> around: https://knotwork-suite.vercel.app
>
> It doesn't do RSVPs or a wedding website. Joy is great for that and free,
> and Knotwork imports the RSVPs from it.
Expand Down Expand Up @@ -230,8 +230,8 @@ discourage recruiting):**
> budget. There's also a guide to building an entirely new tool, from "is
> this a tool?" to merged PR.
>
> - Repo: https://github.com/JFrusher/Trousseau
> - Roadmap: https://github.com/JFrusher/Trousseau/blob/main/ROADMAP.md
> - Try it (no sign-up): https://trousseau-suite.vercel.app
> - Repo: https://github.com/JFrusher/Knotwork
> - Roadmap: https://github.com/JFrusher/Knotwork/blob/main/ROADMAP.md
> - Try it (no sign-up): https://knotwork-suite.vercel.app
>
> Critique of the design is as welcome as PRs.
10 changes: 5 additions & 5 deletions marketing/copy/social-media.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,11 +72,11 @@ README). Use the example wedding, never real names.

**7/7**
> If you're planning a wedding: it's free, and your guest list never has to
> leave your laptop → trousseau-suite.vercel.app
> leave your laptop → knotwork-suite.vercel.app
>
> If you build things: the code, specs and a guide to adding your own tool
> are on GitHub. A ⭐ helps other couples find it →
> github.com/JFrusher/Trousseau
> github.com/JFrusher/Knotwork

---

Expand All @@ -95,7 +95,7 @@ Recording notes for all three:
- Use the guided tour's example wedding. **Never film a real guest list.**
- Captions burned in, because most people watch muted. Keep each caption
line under six words.
- End card: "Free · no sign-up · trousseau-suite.vercel.app".
- End card: "Free · no sign-up · knotwork-suite.vercel.app".
- Don't film on a phone: the planning tools are made for a laptop. Film the
Binder on the phone in script 3 only.

Expand Down Expand Up @@ -166,10 +166,10 @@ no ads. #weddingplanning #seatingchart #diywedding #weddingtok
> place cards; move the ceremony and the day moves with it. Local-first (IndexedDB, no account),
> self-hostable, and no analytics on your own instance.
>
> https://github.com/JFrusher/Trousseau
> https://github.com/JFrusher/Knotwork
>
> #selfhosted #opensource #localfirst

**Bluesky / X one-liner:**
> Wedding apps keep three copies of your guest list. Knotwork keeps one.
> Free, open source, no sign-up: trousseau-suite.vercel.app
> Free, open source, no sign-up: knotwork-suite.vercel.app
22 changes: 11 additions & 11 deletions marketing/landing-page/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@
<a href="#pledge" class="hover:text-sage">Privacy</a>
<a href="#self-host" class="hover:text-sage">Self-host</a>
</div>
<a href="https://github.com/JFrusher/Trousseau" class="rounded-full border border-ink/20 px-4 py-1.5 text-sm font-medium hover:border-ink dark:border-stone-600 dark:hover:border-stone-300">★ GitHub</a>
<a href="https://github.com/JFrusher/Knotwork" class="rounded-full border border-ink/20 px-4 py-1.5 text-sm font-medium hover:border-ink dark:border-stone-600 dark:hover:border-stone-300">★ GitHub</a>
</nav>
</header>

Expand All @@ -70,9 +70,9 @@ <h1 class="font-serif text-5xl font-semibold leading-[1.05] tracking-tight sm:te
Eleven planning tools, one wedding, and your guest list never has to leave your laptop.
</p>
<div class="mt-9 flex flex-col items-center justify-center gap-3 sm:flex-row">
<a href="https://trousseau-suite.vercel.app" class="w-full rounded-full bg-ink px-7 py-3.5 text-center font-semibold text-paper shadow-lg shadow-ink/20 transition hover:-translate-y-0.5 sm:w-auto dark:bg-paper dark:text-ink">Start planning, free →</a>
<a href="https://knotwork-suite.vercel.app" class="w-full rounded-full bg-ink px-7 py-3.5 text-center font-semibold text-paper shadow-lg shadow-ink/20 transition hover:-translate-y-0.5 sm:w-auto dark:bg-paper dark:text-ink">Start planning, free →</a>
<a href="#self-host" class="w-full rounded-full border-2 border-ink px-7 py-3 text-center font-semibold transition hover:bg-ink hover:text-paper sm:w-auto dark:border-stone-300 dark:hover:bg-stone-100 dark:hover:text-ink">Run your own copy</a>
<a href="https://github.com/JFrusher/Trousseau" class="w-full rounded-full px-5 py-3 text-center font-semibold text-sage underline-offset-4 hover:underline sm:w-auto dark:text-emerald-300">★ Star on GitHub</a>
<a href="https://github.com/JFrusher/Knotwork" class="w-full rounded-full px-5 py-3 text-center font-semibold text-sage underline-offset-4 hover:underline sm:w-auto dark:text-emerald-300">★ Star on GitHub</a>
</div>
<p class="mt-4 text-sm text-ink/60 dark:text-stone-400">No account, no password, no card. Open it and start.</p>
</div>
Expand Down Expand Up @@ -262,12 +262,12 @@ <h2 class="font-serif text-4xl font-semibold sm:text-5xl">Run your own copy</h2>
<li>✓ Next.js app, runs anywhere Node 20+ does</li>
<li>✓ Optional Supabase: Postgres with row-level security</li>
<li>✓ Every command tested on a fresh clone</li>
<li>✓ No Docker image yet. <a class="underline" href="https://github.com/JFrusher/Trousseau/discussions">Tell us if you'd use one</a></li>
<li>✓ No Docker image yet. <a class="underline" href="https://github.com/JFrusher/Knotwork/discussions">Tell us if you'd use one</a></li>
</ul>
<a href="https://github.com/JFrusher/Trousseau/blob/main/docs/SELF-HOSTING.md" class="mt-8 inline-block rounded-full bg-ink px-6 py-3 font-semibold text-paper dark:bg-paper dark:text-ink">Read the self-hosting guide →</a>
<a href="https://github.com/JFrusher/Knotwork/blob/main/docs/SELF-HOSTING.md" class="mt-8 inline-block rounded-full bg-ink px-6 py-3 font-semibold text-paper dark:bg-paper dark:text-ink">Read the self-hosting guide →</a>
</div>
<pre class="overflow-x-auto rounded-2xl bg-ink p-6 text-sm leading-relaxed text-emerald-200 shadow-xl"><code><span class="text-paper/40"># local-only: no backend, no account</span>
git clone https://github.com/JFrusher/Trousseau.git Knotwork
git clone https://github.com/JFrusher/Knotwork.git Knotwork
cd Knotwork
npm ci
npm run build
Expand All @@ -282,17 +282,17 @@ <h2 class="font-serif text-4xl font-semibold sm:text-5xl">Run your own copy</h2>
<h2 class="font-serif text-4xl font-semibold sm:text-5xl">Your wedding, in one place.</h2>
<p class="mt-4 text-ink/70 dark:text-stone-300">There's a guided tour with a full example wedding, if you'd like to look around first.</p>
<div class="mt-8 flex flex-col items-center justify-center gap-3 sm:flex-row">
<a href="https://trousseau-suite.vercel.app" class="w-full rounded-full bg-ink px-7 py-3.5 font-semibold text-paper sm:w-auto dark:bg-paper dark:text-ink">Start planning, free →</a>
<a href="https://github.com/JFrusher/Trousseau" class="w-full rounded-full border-2 border-ink px-7 py-3 font-semibold sm:w-auto dark:border-stone-300">★ Star on GitHub</a>
<a href="https://knotwork-suite.vercel.app" class="w-full rounded-full bg-ink px-7 py-3.5 font-semibold text-paper sm:w-auto dark:bg-paper dark:text-ink">Start planning, free →</a>
<a href="https://github.com/JFrusher/Knotwork" class="w-full rounded-full border-2 border-ink px-7 py-3 font-semibold sm:w-auto dark:border-stone-300">★ Star on GitHub</a>
</div>
</section>
</main>

<footer class="border-t border-stone-200 py-8 text-center text-sm text-ink/60 dark:border-stone-800 dark:text-stone-400">
<p>Knotwork: app AGPL-3.0-or-later · data contract MIT ·
<a class="underline" href="https://trousseau-suite.vercel.app/privacy">Privacy</a> ·
<a class="underline" href="https://github.com/JFrusher/Trousseau/blob/main/CONTRIBUTING.md">Contribute</a> ·
<a class="underline" href="https://github.com/JFrusher/Trousseau/blob/main/ROADMAP.md">Roadmap</a></p>
<a class="underline" href="https://knotwork-suite.vercel.app/privacy">Privacy</a> ·
<a class="underline" href="https://github.com/JFrusher/Knotwork/blob/main/CONTRIBUTING.md">Contribute</a> ·
<a class="underline" href="https://github.com/JFrusher/Knotwork/blob/main/ROADMAP.md">Roadmap</a></p>
</footer>

<script>
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"license": "MIT",
"repository": {
"type": "git",
"url": "git+https://github.com/JFrusher/Trousseau.git"
"url": "git+https://github.com/JFrusher/Knotwork.git"
},
"type": "module",
"main": "./dist/index.js",
Expand Down
6 changes: 3 additions & 3 deletions scratch/docs/SETUP.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ before moving on.
Roughly 40 minutes, most of it waiting for Vercel.

**Where things stand right now:** the suite is written, tested and building, on
branch `suite` in `JFrusher/Trousseau`, uncommitted. No Supabase project exists.
branch `suite` in `JFrusher/Knotwork`, uncommitted. No Supabase project exists.
Nothing is deployed.

---
Expand All @@ -17,7 +17,7 @@ Nothing is deployed.
|---|---|
| Node | **20 or newer** (`node -v`) — the sync handlers use `crypto.subtle`, which is stable from 19 |
| Python + DVC | Only on machines that **commit** to this repo — see §2 |
| A GitHub account | The repo is already at `JFrusher/Trousseau` |
| A GitHub account | The repo is already at `JFrusher/Knotwork` |
| A Vercel account | Free tier is enough |
| A Supabase account | Free tier is enough. **Only needed for sharing** — see §3 |

Expand Down Expand Up @@ -162,7 +162,7 @@ role. If any of them says RLS is disabled, the first migration did not finish.

### 4.1 Import

1. vercel.com → **Add New** → **Project** → import `JFrusher/Trousseau`
1. vercel.com → **Add New** → **Project** → import `JFrusher/Knotwork`
2. **Root Directory: `suite`** ← the one setting that matters most

Click **Edit** beside Root Directory and choose `suite`. Vercel cannot be
Expand Down
2 changes: 1 addition & 1 deletion suite/app/support/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ export default function Support() {
<p className="mt-3 text-slate">
Tell another couple about it. Report a bug on{" "}
<a
href="https://github.com/JFrusher/Trousseau/issues"
href="https://github.com/JFrusher/Knotwork/issues"
className="underline underline-offset-2 hover:text-charcoal"
>
GitHub
Expand Down
6 changes: 5 additions & 1 deletion suite/lib/accounts/migrations.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ const SYNC_MIGRATION = join(process.cwd(), "..", "supabase", "migrations", "2026
const ACCOUNTS_MIGRATION = join(process.cwd(), "..", "supabase", "migrations", "20260902000001_accounts.sql");
const DOCUMENTS_MIGRATION = join(process.cwd(), "..", "supabase", "migrations", "20260903000001_wedding_documents.sql");
const ROLES_MIGRATION = join(process.cwd(), "..", "supabase", "migrations", "20260928000001_roles.sql");
const PEOPLE_EMAIL_MIGRATION = join(process.cwd(), "..", "supabase", "migrations", "20261003142447_wedding_people_email.sql");

/**
* A minimal stand-in for Supabase's own `auth` schema: just enough for
Expand All @@ -19,7 +20,9 @@ const ROLES_MIGRATION = join(process.cwd(), "..", "supabase", "migrations", "202
async function authStub(db: PGlite): Promise<void> {
await db.exec(`
create schema if not exists auth;
create table auth.users (id uuid primary key, email text not null);
-- varchar(255), as Supabase declares it: a stand-in that is looser than
-- the real table hides exactly the type errors it exists to catch.
create table auth.users (id uuid primary key, email varchar(255) not null);
create or replace function auth.uid() returns uuid
language sql stable
as $$ select nullif(current_setting('request.jwt.claim.sub', true), '')::uuid $$;
Expand All @@ -39,6 +42,7 @@ async function databaseWith(): Promise<PGlite> {
// Every test here runs on the schema as it is now: the partner rules the
// tests above were written for must still hold with roles added.
await db.exec(readFileSync(ROLES_MIGRATION, "utf8"));
await db.exec(readFileSync(PEOPLE_EMAIL_MIGRATION, "utf8"));
return db;
}

Expand Down
2 changes: 1 addition & 1 deletion suite/lib/documents/migrations.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ const GUEST_LINK_MIGRATION = join(process.cwd(), "..", "supabase", "migrations",
async function authStub(db: PGlite): Promise<void> {
await db.exec(`
create schema if not exists auth;
create table auth.users (id uuid primary key, email text not null);
create table auth.users (id uuid primary key, email varchar(255) not null);
create or replace function auth.uid() returns uuid
language sql stable
as $$ select nullif(current_setting('request.jwt.claim.sub', true), '')::uuid $$;
Expand Down
Loading
Loading