# Frenday plans — the one-page index (2026-09-11)

> Renamed **เฟรนเดย์ / Frenday** on 2026-09-18, public host `frenday.xyz`; "Paiduay" below is the legacy name and stays as the internal identifier, so decision 2's "flip `paiduay.` alone" and the `@paiduay` OA read as the identifiers they are, not as copy.

Ten plans (no `public-flip.md`; the flip is decision 2), ordered for first revenue, hours from their work orders.

## Verdict

Nothing earns a baht until a real seller has a live card she trusts and a request that reaches her phone. So: **truthful copy and a report path** (the policy page promises checks that do not exist), **one card record** (three plans propose three tables), the **photo pipeline core**, **notifications** (an unseen request never becomes a meetup), then **payments (b)** — paid extras over PromptPay, no licence exposure. Analytics next, so the pitch carries a number. The rest widen the funnel; they do not open it. All ten ≈ 254 h; first revenue ≈ 76 h.

## The plans

| Plan | Buys | Hours | Depends on | Decision first | Risk |
|---|---|---|---|---|---|
| Trust & safety | no false promises; "no deposit, ever"; report path | 15 first, 29 full | — | support email + SLA hours | policy lies today |
| Card as module | sellers are rows, not commits | 12 now, 21 full | — | where the table lives | three plans, three tables |
| Photo pipeline | real photos in lawfully | 24; 30 with cut-out | card record, volume | photo may leave the box for one vision call | uploads die on redeploy |
| Notifications | her request reaches a phone | ≈9 (+4 LINE), my estimate | — | your webhook as the channel | none |
| Payments | ฿149 refresh, ฿299/mo advanced; later ฿150 fee ≈ ฿25k/mo | 16 for (b), +18 for (c) | notifications for (c) | own fee, or deposit held for her | licence line |
| Analytics | tap rate per seller; Monday digest | 14 | public DNS | Umami, no banner | zero on the tailnet |
| Card editor | she edits her own card, no login | 34 | card record, photo | edits live on save | overlaps claim flow |
| Claim flow | cold DM → "yes it's me" via LINE | 23 | domain, entity, LINE Login | who is the data controller | draft before consent |
| Video kit | three clips per seller | 22 (+4) | kit engine, ffmpeg | silent by default | 20–30 s CPU a clip |
| Matchmaking (refreshed 2026-09-17) | the board: a customer posts a moment (when, where, budget, vibe); owners of a published card see it on `/me` and answer ไปได้; he picks; his LINE shows to her only then. Two record types `moment` + `answer`, zero DDL; three new `NotifyEvent`s; no matcher, no receptionist tool | ≈ 20 est. (was 34) | ≥ 10 real cards + one Pro sale (§5.1) | build trigger; age floor; who sees the board (all owners vs Pro) | still no revenue until fee (c); the customer gets no push in v1 |
| Launch runbook | day 0, the tweet, DM playbook, operator loop, money, metrics, risks — the week to the first ฿499 | — | Wave 1 (§9.58) | domain + Clerk production before the tweet | Wave 1 not yet live; no rate limit at `/c/new` |
| LINE channel | the three LINE things kept apart: Login as a Clerk social connection, OA push via James's n8n, the seller's own LINE as the card's button | 8 (1 of it before the tweet) | domain + Clerk production for Login; a real seller for push | new `@paiduay` OA or his own; ฿1,280/mo line past 300 push | the card's LINE button is broken for `@oa` ids and bare `lin.ee` links; `audience` never leaves the outbox |
| Next sprint menu | what blocks first revenue (domain → Clerk production → PromptPay id → demos → the daily loop), eight candidates ranked by leverage ÷ hours, week-1 numbers, James's decisions with defaults | — | Waves 1–3 (§9.58–§9.60); Wave 4 in flight | pick one; domain + Clerk production before the tweet | tweeting on the dev Clerk instance re-issues every seller's id |
| Module schedules seam (`module-schedules-seam.md`, kernel proposal) | modules declare crons (`ModuleDef.schedules`) instead of `ensureSchedule` from hot paths, admin pages and scripts; `recordHit` stops starting pg-boss in web processes | ≈7 (Opus) | §9.61 pool caps; pg-boss 12.25 | none — deployment-wide only, `key = job` keeps today's rows | first-boot key mismatch would double a cron; nil-tenant RLS cast and `singleton` semantics UNVERIFIED |
| Card as module — refreshed 2026-09-17 (`card-as-module.md`, supersedes the 2026-09-10 table plan) | record + lifecycle + erasure + retention + photo transform (`sharp`) to `packages/modules/cards` behind a `PhotoStore` seam; page, editor, Clerk, Pro, kit drawings stay in the app | PR1 3–4, PR2 ~3, PR3 4–5, PR4 ~4 (est.) | PR1 pairs with the schedules seam; PR3–4 wait for a named second vertical | file-store seam (module option / core / documents-files); owner principal; `sharp` in a module | a barber gets a card record with a photo in an afternoon, not a product; `fixtureSlug()` shares a prefix per checkout (§9.61) |

## Sharp edges shared across plans

- **One card, three tables.** `kernel.records` (claim), `paiduay.cards` (editor), `kernel.person_cards` (module). Pick once; the module shape inside `apps/paiduay` serves all three.
- **Identity before outreach.** A number-domain in a cold DM reads as a scam; analytics counts nothing until `paiduay.` resolves publicly; LINE Login shares `BETTER_AUTH_URL` with the wellness demo; OA and Login must share one LINE provider.
- **The box.** One CPU shared with Luna and TuaTon; no persistent file volume yet; five plans each want a PDPA notice — write `/policy` once, under a named controller.

## When

- **This week (≈60 h, parallel sessions):** trust 1–3 and 5; card module half; photo pipeline, no cut-out; notifications.
- **This month (≈74 h):** payments (b); analytics; card editor; LINE link; trust tiers + privacy page.
- **Later (≈120 h):** fee (c) past ~30 bookings/mo; claim flow once OA and domain exist; matchmaking; video; package cut; cut-out; LINE binding.

## Decisions for James (default if you say "you choose")

1. **Controller + support email.** Your own name until a company exists; SLA "one working day, Mon–Fri 09–18".
2. **Domain + public flip.** A real domain before any cold DM; flip `paiduay.` alone once truthful copy ships.
3. **Revenue model.** (b) now; (c) as a ฿150 flat fee, Frenday's own, never credited against her rate; no courtesy payment.
4. **Age floor.** 20; birth year at intake; no age-estimation tech.
5. **Card table.** Module shape inside `apps/paiduay` via `MODULE_MIGRATION_DIRS`; claim and editor build on it.
6. **Photo.** One transient vision call may leave the box; cut-out off; 90-day retention; LINE screenshot as consent.
7. **Self-serve door.** Editor link first (no auth, fits the brief); claim flow when the OA exists.
8. **Notifications.** Your webhook now; `@paiduay` OA next; nudge at 4 h; contact stays out of the payload.
9. **Logomark + cast.** Demo label only until you pick a mark (only video asks). Edna, Troy, Milhouse, Itchy accepted; matchmaking's three named at build. Other parameters as proposed.
