NepWalk MVP — Build Tasks (v2)
Technical delivery history and backlog. The founder assigns current work. Business scheduling and superseded build plans are kept outside this workspace.
Build window: Thu 17 – Wed 30 Sep 2026. Saturdays off. Created 17 Sep 2026.
- Scope:
requirements.md, with supporting architecture inscope.md - Why:
decisions.md
Rules
- Tick
[x]when the done-when line is true, not when code is written. - Tags:
[docs]nepwalk-docs ·[be]nepwalk-be ·[fe]nepwalk-fe ·[ops]deploy/infra. - TDD for auth, planning rules and money.
- Record incomplete work in the Slip log; the founder decides priority and reassignment. Historical dates below are not a current schedule.
- Follow the accepted requirements and current feature card. The original F-series cut-line was superseded by P19; never reintroduce it from historical notes.
Review follow-ups — 23 Sep 2026
Owner: Prakash (with AI support). This is the progress source for the 23 Sep code review. Detailed evidence and acceptance criteria are kept outside this repo (ask Prakash). Keep reproduction details out of published docs.
Security gate: SEC-01–SEC-04 must be fixed and regression-tested before real traveller data or external use; review again at the Thu 1 Oct share-link milestone and verify the deployed fixes before launch. These are existing MVP privacy/access guarantees, not optional post-launch polish. Review progress Fri 25 Sep and at the Wed 30 Sep cut-line; log a slip if added work changes the schedule.
- [x] SEC-01 · High ·
[be]Safe public/traveller response projections across trips, days and templates. Regression tests with every contact field populated; legitimate owner access and private/cross-organisation protections still pass. Due: security gate. Progress 24 Sep: day and template reads now return public trip fields only — nepwalk-bed701954(branchfeat/stop-places); 25 Sep: trip list, detail and public-slug reads now show outsiders an allowlist of public fields (no contacts, emails, leader's basics, headcount or rooms) — nepwalk-be08f512e(branchfix/sec-01-trip-reads), 7 tests + 4 mutation checks, 164/164 e2e. Deployed check 25 Sep ✅: anonymous production trip list has no private fields. ✅ Closed 1 Oct: the share link reads through theshareTripViewallowlist with switch-off and replace tests — nepwalk-be #26 (d7ef7d7,aac59c8) + #27 (aad91e5,50ec2f6); templates on one read rule (9853b28, P44). 356/356 e2e, 31 mutation checks. Deployed check 1 Oct ✅ (production, synthetic accounts and trip, leader contacts filled): anonymous read of the share link shows the plan and none of the private fields; unknown token, sub-paths and a changed trip id → 404 / same trip; creator endpoints 401 without login and 404 for another user; the share token is refused as a login (401); off → 404, on → the same link works, replace → old 404. Re-check at the release gate. - [x] SEC-02 · High ·
[be]/[fe]Browser-bound OAuth login transaction. Tests reject missing, mismatched, expired, replayed and wrong-browser callbacks, and prove a valid login. Due: security gate. ✅ 25 Sep — fixed by Sign in with Google (T18): nepwalk-be7d02ba0+ nepwalk-fe0ae2083(branchfix/sec-02-03-google-sign-in). Redirect + callback removed (nothing to force, no tokens in URLs); ID token verified server-side. 14 e2e tests with real signed tokens, 4 + 3 mutation checks, 206/206 e2e, 55/55 Vitest; founder tested locally (Chrome, Brave; new user created, repeat logins reuse it). Deployed check 25 Sep ✅ (production: fake token 401, old routes 404, no tokens in URLs, real Google login works). Re-check at the release gate. - [x] SEC-03 · High ·
[be]/[fe]Credential-safe login handoff and logging. Tests verify no access/refresh tokens in redirect URLs and reject invalid or replayed exchanges. Due: security gate. ✅ 25 Sep — fixed by Sign in with Google (T18): nepwalk-be7d02ba0+ nepwalk-fe0ae2083(branchfix/sec-02-03-google-sign-in). Redirect + callback removed (nothing to force, no tokens in URLs); ID token verified server-side. 14 e2e tests with real signed tokens, 4 + 3 mutation checks, 206/206 e2e, 55/55 Vitest; founder tested locally (Chrome, Brave; new user created, repeat logins reuse it). Deployed check 25 Sep ✅ (production: fake token 401, old routes 404, no tokens in URLs, real Google login works). Re-check at the release gate. - [x] SEC-04 · Medium ·
[be]Runtime-validated request bodies and safe error responses. Bad input returns 400; unexpected failures return a generic 500 without implementation details or private input. Due: security gate. ✅ 25 Sep — nepwalk-beab94fc7(branchfix/sec-04-safe-errors): DTOs for trip archive/visibility and template create/rename;KeepRaw/StrictBooleanstop implicit conversion ("false"was saved astrue, also on trip create/updateisPublic); generic 500 with details in the server log only. 28 tests, 6 mutation checks, 185/185 e2e. Deployed check 25 Sep ✅ (production: bad body → clean 400). Re-check at the release gate. - [x] DATA-01 · Medium ·
[be]Acyclic Place hierarchy and defensive base traversal. Test self-, two-place and longer cycles, reparenting and valid chains; cover seed/import paths. Due: before resolver/base traversal and Thu 24 Sep base-rule integration. ✅ 23 Sep — nepwalk-be PR #9 (feat/place-model)203c25e(DB trigger: 2/3/6-place cycles, imports, concurrent reparenting) +72bce8d(findBaseTownstops on a repeated id); protection-removed checks caught. - [x] DATA-02 · Medium ·
[be]Template copies preserve typed itinerary fields and place references, shift dates correctly, and create the trip atomically without copying traveller contacts. Due: Sun 27 Sep Paila/create-trip work. Progress 24 Sep: typed fields and place links copied, one transaction, no contacts — nepwalk-be9a32d72; date shifting still open (needs the 3-click start date). ✅ 27 Sep — nepwalk-bec30f86b: trips made from a template move every date to their start date; test with a mixed typed template (flight, stay, place, meal, notes, place links) proves every field survives and contacts are not copied. - [x] DATA-03 · Low / preventive ·
[be]Reject blank place names/aliases; normalize matching and handle unknown/ambiguous input explicitly. Allow legitimate duplicate names. Due: resolver/seed work, Wed 23–Thu 24 Sep; before any place-writing API. ✅ 23 Sep —203c25e(blank names/aliases rejected in the DB) +72bce8d(resolver: case/space/NFKC matching; found / ambiguous with all candidates / unknown); protection-removed checks caught. - [x] QUAL-01 · Engineering ·
[be]Include e2e files in standard lint; triage existing errors and establish a reviewed clean result or explicit baseline/no-new-errors check. Due: triage Fri 25 Sep; verification plan settled before launch. ✅ 25 Sep — nepwalk-be79f1683(branchchore/qual-01-lint-baseline): e2e files linted and type-checked (tsconfig includestest/);npm run lintchecks only,lint:fixrewrites; reviewed test-only exception forno-unsafe-*+unbound-method; typedAuthUser; dead cookie guard removed. 0 errors, 0 warnings (was 395 with e2e included); tsc, build, 112 unit + 206 e2e pass. Next: backend CI on PRs so it stays clean.
Close only with evidence: record the fix commit/PR and passing regression checks beside its ID after review. A passing old suite or this tracking entry does not close a finding. Security items also require deployed verification before external real-data use.
Schedule
Re-planned 21 Sep (A7, P19): two days of product definition, then the build against requirements.md. Launch ~Wed 7 Oct. Saturdays off.
| Build day | Date | Focus |
|---|---|---|
| 1–4 | Thu 17 – Sun 20 | ✅ Foundations, security, schema, builder fields (merged) |
| 5 | Mon 21 | ✅ R1/R2 · vision · requirements · prototype starts |
| 6 | Tue 22 | Prototype + sign-off · mentor meeting 2:30 pm |
| 7 | Wed 23 | Place model + resolver |
| 8 | Thu 24 | 30 places seeded, founder review · R1/R2 on bases |
| 9 | Fri 25 | Stops linked to places · leader's basics |
| 9b | Fri 25 | ✅ SEC-02/03 login flow + QUAL-01 (done in one day) |
| 10 | Sun 27 | Three Pailas · create trip from a Paila |
| 11 | Mon 28 | Day plan (Visitacity pattern) |
| 12 | Tue 29 | Place page · culture |
| 13 | Wed 30 | Overview map · plan revisit + cut-line |
| 14 | Thu 1 Oct | Share link + access tests |
| 15 | Fri 2 Oct | Confirmation line · PWA |
| 16 | Sun 4 Oct | Setup drawer · stop editor · warnings |
| 17 | Mon 5 Oct | Church trip built · phone walkthrough · e2e |
| 18 | Tue 6 Oct | Backups · cold starts · bug bash · inquiry form |
| 19 | Wed 7 Oct | Launch → live Tue 13 Oct (slip log) |
---|---|---| | 1 | Thu 17 (first half) | Docs + FE auth + merge decision | | 2 | Thu 17 (second half) | BE security fixes | | 3 | Sat 19 (from Fri 18) | Schema: optional organisations + item types + trip pax | | 4 | Sun 20 | F1 itinerary builder UI | | 5 | Mon 21 | F2 rules R1–R5 | | 6 | Tue 22 | F2 rules R6–R10 · F3 questions panel | | 7 | Wed 23 | F4 vendors · F5 places · cut-line checkpoint | | 8 | Thu 24 | F6 services + booking tracker | | 9 | Fri 25 | F7 WhatsApp drafts + group summary | | 10 | Sun 27 | F8 commission ledger | | 11 | Mon 28 | F9 traveller day view + share tokens | | 12 | Tue 29 | Example request end-to-end · fixes · missed rules | | 13 | Wed 30 | Bug bash on phone · backup restore · inquiry form · launch |
Build day 1 — Thu 17 Sep, first half
- [x]
[docs]Writescope.md(authoritative MVP scope) - [x]
[docs]Writetasks.md(this file) - [x]
[fe]Expandnepwalk-fe/CLAUDE.md(approved 17 Sep): stack, commands, design-system rules, design brief pointer, known issues - [x]
[fe]Merge vs rebuild (timebox 1 h): (17 Sep: merged → branchfeat/mvp-base, build passes; decision P11) try mergingorigin/feat/trip_managementinto the working branch. - Done when: merged and building, or a decision is recorded in
decisions.mdto rebuild the pages on existing components. - [x]
[fe]Fix auth: ~~store the access token and sendAuthorization: Bearer~~ ✅ (already ondev) · ~~redirect to/login~~ ✅ · ~~AuthCallbackreadsdata~~ ✅ · remaining: storerefreshTokenand send{ refreshToken }to/auth/refresh, save the new tokens, retry; logout clears both. (17 Sep: done onfeat/mvp-base, commit e66befe; founder-tested) - Done when: login → trips list loads the user's own trips with no 401.
Extra fixes found during day 2 testing (17 Sep, founder-tested):
- [x]
[be]Update itinerary accepted nocategory(400) → fixed - [x]
[fe]Edit/delete/reorder activity and delete day called non-existent routes → fixed to nested routes
Extra fixes found during day 1 testing (17 Sep, founder-tested):
- [x]
[be]Local DB created (decision P12) · CORS allows PUT/PATCH/DELETE (c72a56e) · 3 dead seed photos → Wikimedia (52a1c8d) - [x]
[fe]CoverImagefallback for missing/broken photos (6ec2d68)
✅ Build day 1 done — 17 Sep.
Build day 2 — Thu 17 Sep, second half
Chunk A done 17 Sep (founder-tested): read access, templates, reorder + itinerary edit fixes — BE 5c5e391, FE da77fab, 23 e2e tests; both repos pushed as feat/mvp-base. Chunk B done 17 Sep (founder-tested): required JWT secrets, refresh-token jti, CORS allowlist — BE 3c6ab4b, 30 e2e tests.
- [x]
[be]Auth guard onGET /trips/:id,/days/:id,/itineraries/:id. Only members (or later a valid share token) can read. - [x]
[be]GET /trips/public/:slugreturns 404 unlessisPublic - [x]
[be]Templates list/get/apply scoped to owner - [x]
[be]Itinerary reorder rejects IDs that don't belong to the day - [x]
[be]Fail at startup ifJWT_SECRETis missing (no'default-secret') - [x]
[be]CORS: restrictoriginto the frontend URL from env (currentlyorigin: truereflects any site with credentials). (17 Sep: done; PUT/PATCH/DELETE allowed too.) - [x]
[be]Refresh tokens: add a uniquejtiso two tokens issued in the same second differ (today an old refresh token can be reused after rotation);JWT_REFRESH_SECRETrequired at startup (no'refresh-secret'fallback) - [x]
[be]Tests for all of the above. - Done when:
npm testpasses, and tests prove 401/404 for non-members and private trips.
✅ Build day 2 done — 17 Sep.
Build day 3 — Sat 19 Sep (moved from Fri 18; P16)
-
[x]
[docs]Decisions B8, P15, P16, T13 (T6 superseded) (19 Sep) -
[x]
[be]One migration: (19 Sep:20260919090000_optional_orgs_itinerary_types, BEd1fcdb4) Organization+OrganizationMember(roleOWNER/ADMIN/MEMBER); users need no organisation (T13)Trip.orgIdnullable (empty = personal trip)Itinerary.typeenum (STAY,FLIGHT,TRANSFER,VEHICLE,PLACE,MEAL,FREE,CUSTOM)STAYcheck-in/check-outcity;FLIGHT/TRANSFERfrom/to/mode (start/end time = departure/arrival)- existing itinerary rows →
CUSTOM - (placeId/vendorId → build day 7, P16)
Trippax enrolled / expected max / lock date, rooms double/twin/single/triple, leader name/phone/email- [x]
[be]Read rule + org: organisation members can read organisation trips; creating an org trip requires membership. (19 Sep: BE5a0fbbe, organizations e2e spec) - Done when: tests prove a second organisation and a non-member can't read or edit an organisation's private trip, and personal trips work as before.
- [x]
[be]Times: validateHH:MMformat and end ≠ start only (P15) (19 Sep: itinerary-times e2e spec; 64 e2e tests passing) - [x]
[ops]Backend live on Render: https://nepwalk-be.onrender.com (Docker;prisma migrate deployruns on start). (17 Sep) - [x]
[ops]Frontend live on Vercel: https://nepwalk-fe.vercel.app (NEXT_PUBLIC_API_URL=https://nepwalk-be.onrender.com/api/v1); connected to the backend. Database: Neon. Vercel's Next.js CVE PR (15.3.8) merged. (17 Sep) - [x]
[fe]Upgradenextto 15.5.25 (+eslint-config-next),axios, andnpm audit fix: 15.3.8 still has 29 advisories (2 critical) (17 Sep: FE PR #12 →main9f77896/8795f85; 3 accepted advisories, decision T12) - [x]
[ops]Render env:FRONTEND_URL= Vercel URL, new randomJWT_SECRET+JWT_REFRESH_SECRET,GOOGLE_CALLBACK_URL=https://nepwalk-be.onrender.com/api/v1/auth/google/callback→ then merge the chunk B PR (17 Sep: set by founder; backend chunk B merged, CORS verified live) - [x]
[ops]Database backups (Neon): Free plan, 6 h restore window, Singapore. Decided 20 Sep: no backup work while the data is dummy; hard gate — nightlypg_dump+ restore test before any real traveller data (target Fri 13 Nov) - [ ]
[ops]Cold starts (~50 s on the free plan): upgrade or keep-warm before the group leader uses the link (deferred to Oct; needed before the traveller link is shared) - [x]
[fe]Remove the Render deploy job from.github/workflows/deploy.ymlandrender.yamlif the frontend moves to Vercel (17 Sep: FE PR #12 —ci.ymlruns lint + build on PRs) - [ ] Fri 6–7 pm: weekly review (founder)
✅ Build day 3 done — Sat 19 Sep (strict TDD; RED shown for the right reason, guards mutation-checked).
Build day 4 — Sun 20 Sep
- [x]
[fe]Trip basics form: pax (enrolled / expected max / lock date), leader contact, room mix — on the trip Settings page, with bed-count warnings - [x]
[fe]Nights strip: whole trip on one line; city blocks fromSTAYitems; empty nights flagged amber - [x]
[fe]Moves: one tap ✈ flight / 🚐 road on a city change with no move item - [x]
[fe]Day list showing typed items; add/edit/delete items — item modal now has a type selector with stay / move fields; end-time picker fixed (unset shows--, nothing is sent) - [x]
[fe]Colour typo fixed:theme.tserror.700#86291→#86291f - [x]
[fe]Automated test suite (extra, 20 Sep): Playwrightapi(5) +ui(8) journeys covering login, group details, nights strip, one-tap flight and the item modal; own-user-per-test over the API (decision T15) - [x]
[fe]Bug found by the new suite and fixed: the modal had no max height or scroll, soSavefell off the screen on short viewports - [x]
[fe]Frontend unit tests: Vitest added (npm test), 44 tests over the trip-basics, nights and item-form rules - [x]
[fe]Time fields show what is sent: an unset end time shows--and sends nothing; backend validation messages surfaced (HH:MM, end ≠ start) (found 19 Sep, fixed 20 Sep) - Done when: the reference case can be entered by hand in under 10 minutes.
21 Sep 2026: re-planned to
requirements.md(P19). Launch ~Wed 7 Oct. The v2 days 5–13 are kept below under Superseded for history.
Build day 5 — Mon 21 Sep
- [x]
[be]R1 night coverage + R2 city continuity as pure functions, reference-case fixture, 16 tests, 5 mutation checks (branchfeat/planning-rules, committed 22 Sep as0600270; unmerged until R1/R2 use bases — build day 8) - [x] Product vision written (
../../vision.md) - [x] MVP requirements v3 (
requirements.md); decisions A7, P19–P22, T16 - [x] Clickable prototype started — hero screens first (day plan, overview, place page)
Build day 6 — Tue 22 Sep
- [x] Prototype finished (21 Sep, one day early, v1–v5): traveller overview · day plan · place page · day and trip maps · share sheet; team trips list · 3-click trip · editor (add / edit / remove) · setup drawer · vendor choice · place library. Live at
nepwalk-fe.vercel.app/prototype.html; sources inprototype/ - [x] Flyer (
nepwalk-fe.vercel.app/about.html) and a one-page strategy brief for the mentor meeting - [ ] Mentor meeting (US serial entrepreneur, moved to 3:30 pm, joint with Biplab): prototype on the phone; ask for 15–30 min every month or two
- [x] Founder signs off the prototype — signed off 21 Sep ("represented beautifully what I wanted")
- Done when: the founder is proud to show it.
Build day 7 — Wed 23 Sep
Review dependencies: DATA-01 and DATA-03 above belong with the Place/resolver work; satisfy them before base traversal is used.
- [x]
[be]Placemodel (P20): type (base town / area / sight / experience / airport / hotel), lat/long, parent, aliases, story, tip, typical duration, photo + credit. Additive migration —203c25e - [x]
[be]Resolver: free text → place via name and aliases (AI fallback designed in, not built) —72bce8d. Same name/alias on two places → asks "which one?", never guesses (founder, 23 Sep)
Build day 8 — Thu 24 Sep
Seed and base-rule work depends on DATA-01 / DATA-03 being verified.
- [x]
[be]Seed ~30 places and experiences (Kathmandu, Pokhara, Chitwan); photos from Wikimedia Commons with credits. Clear, distinct names ("Patan Durbar Square", not "Patan") so the resolver rarely has to ask — ✅ 23 Sep,116a2e6(feat/place-seed): 28 places, no experiences (P31);npm run db:seed:places - [x] Founder reviews every story and tip (~2 h) — ✅ 23 Sep: 17 drafts reviewed with sources (cave rainy-season closure, crocodile safety, 25-min Bharatpur flight); prototype text kept, "best-preserved" → "well-preserved"
- [x]
[be]R1/R2 compare bases, not typed city; mergefeat/planning-rules— ✅ 23 Sep,e7600c2, nepwalk-be PR #11 (Thamel = KTM = Kathmandu; PKR = Pokhara; rules take the place list)
Build day 9 — Fri 25 Sep
- [ ] Review checkpoint: triage SEC-01–SEC-04 and QUAL-01; confirm remaining effort against the security gate, record fix evidence or a slip, and keep unfinished items visible.
- [x]
[be]Itinerary stops linked to places (placeId) — ✅ 24 Sep, nepwalk-be4d5c616(feat/stop-places): optional link, unknown place → 400, every stop read carries the place's public details; manual steps run live on dev - [x]
[be]Resolver uses the day's base town: when a name matches several places, pick the one in that day's base town; still ask if none or several fit — ✅ 24 Sep, nepwalk-be1a13d99(feat/resolver-base-town); a single match is kept even outside the base; no caller yet — the stop editor (build day 16) supplies the day's base - [x]
[be]Leader's basics completed (M10): arrival/departure flights, interests, pace, budget level — ✅ 24 Sep, nepwalk-bee9685d6(feat/resolver-base-town, P33): trip fields + migration, validation, hidden from outsiders; frontend form on build day 16 - [ ] Fri 6–7 pm: weekly review
Build day 9b — Fri 25 Sep (done the same day)
Added 25 Sep (slip log): the last security-gate items before the share link.
- [x]
[be]/[fe]SEC-02 + SEC-03 via Sign in with Google (T18): Google button → ID token →POST /auth/google; backend verifies signature, audience, issuer, expiry and verified email, returns tokens in the body; old redirect + callback removed (no tokens in URLs, no callback to force). Tests: fake, expired, wrong-audience and unverified-email tokens rejected; valid token signs in and creates or links the user (S16, S17, S22) — ✅ 25 Sep, be7d02ba0, fe0ae2083. Works in Chrome and Brave; Firefox: button does nothing (backlog). - [x] Founder: Google Cloud Console → OAuth client → Authorized JavaScript origins
https://nepwalk-fe.vercel.appandhttp://localhost:3000— ✅ 25 Sep: new client in the NepWalk project (Testing mode is enough: basic scopes are exempt from the test-user list). At merge: VercelNEXT_PUBLIC_GOOGLE_CLIENT_IDbefore merging; RenderGOOGLE_CLIENT_ID= new ID after, then deleteGOOGLE_CLIENT_SECRET+GOOGLE_CALLBACK_URLand the old redirect URI. - [x] QUAL-01 triage (Fri 25): e2e files in lint, error count recorded, baseline plan — ✅ went further: full lint clean (be
79f1683)
Build day 10 — Sun 27 Sep (back on its original day, 25 Sep)
Include DATA-02 in the Paila/create-trip work; verify a mixed typed itinerary survives copying and date shifting.
- [x]
[be]Three Pailas as templates (P22): Kathmandu 3 days · Kathmandu + Pokhara 7 days · Kathmandu + Pokhara + Chitwan 10 days — ✅ 27 Sep, nepwalk-beded2df9(feat/pailas): public templates owned by a NepWalk user that cannot sign in; every stop linked to a place; checked against R1/R2; day 1 = 2000-01-01 until the 3-click trip shifts dates;npm run db:seed:pailas. 9 data tests + 6 e2e, 6 mutation checks, 212/212 e2e. Founder to review the content (titles, times, order) - [x]
[be]3-click trip (P24): parse "N days in" (days + town aliases, no AI) → matching Pailas ranked by popularity and preferences → create with days, people, preferences and included services; every date shifts to the start date; reuses the templatesmodule — ✅ 27 Sep, nepwalk-bec30f86b(feat/three-click-trip, on top offeat/pailas):GET /templates/match?q=(days / nights / weeks + towns by name or alias; unplaced text returned asunknown, never guessed) lists templates that visit every town and can be fitted to the length;POST /templates/:id/tripsfits the length (trims sightseeing days from the longest stay, or adds free days in the last town; R1/R2 hold for every length up to 14 days), moves every date to the start date, stores people + preferences, renames "in 7 days" titles. 18 mutation checks, 152 unit + 236 e2e. Not yet: included services (next item, slots); ranking by popularity and preferences (no usage data; Pailas get interest tags after O21) - [x]
[be]Automatic slots and sizes: hotel nights + rooms from people, vehicle class from people + luggage (R5), flight seats; skipped services leave no slot — ✅ 27 Sep, nepwalk-be7f6e6ca(feat/build-day-10):ServiceSlottable (additive migration) + tripbagsandincludedServices; hotel per stay (nights, rooms twin-share, odd one single), flight per flight, guide per sightseeing day, one vehicle per road stretch (P35); meals and activities get no slot (P34); class from people + bags (limits under review, O22). 11 mutation checks, 173 unit + 246 e2e. Not yet: re-sizing when people or bags change (R10) - [x]
[be]/[fe]Minimal vendor list (P27): admin adds vendors (type, area, capacity, verification); each service slot shows its vendor with "Choose" — the first fitting one is the NepWalk pick — ✅ 27 Sep, nepwalk-be1fe6129+ nepwalk-fed5b74a8(feat/build-day-10):Vendortable (additive migration; the database refuses a verified vendor without proof); admin-only add / edit / verify with proof (who + when) / block (removed from every slot); each slot lists verified vendors of the same service and town with enough rooms or seats, smallest first = NepWalk pick; only a fitting verified vendor can be chosen. Frontend:/vendorsand/trips/[id]/services, admin links. 15 mutation checks, 179 unit + 274 e2e (be), 65 Vitest + build (fe). Playwright not written: tests can't make an admin over the API yet
Build day 11 — Mon 28 Sep
- [x]
[fe]Day plan, Visitacity pattern (M1): day tabs, photo cards (time, duration, story, tip), tonight's stay inline (P17), travel connectors — time from lat/long plus a small table for long hops (KTM–PKR) — ✅ 28 Sep, nepwalk-fe #19 (night shift 27 Sep:src/lib/travel-time.ts, day tabs + photo cards, tonight's stay inline, travel connectors)
M1 revision (feature card features/M1-day-plan.md, A13 — from the 27 Sep prototype review):
- [x]
[fe]Web / tablet day list "Day N · title · date" + "Night:", top tabs mobile only; pagination footer → edge arrows (web) / swipe (mobile) — ✅ 28 Sep, nepwalk-fe #19 - [x]
[fe]Web row cards (photo left), full main width until M13; transport items as travel lines — ✅ 28 Sep, nepwalk-fe #19 - [x]
[fe]Floating "+" → drawer (web) / bottom sheet (mobile) replaces the "Add new activity" bar — ✅ 28 Sep, nepwalk-fe #19 - [x]
[fe]Link a stop to a library place from the edit form (photo, credit, story, tip) — ✅ 28 Sep, nepwalk-fe #19 + nepwalk-be #20 (GET /places?q=) - [x]
[fe]Leader / traveller view hides edit controls and helper warnings; empty-day, loading, error states — ✅ 28 Sep, nepwalk-fe #19 (editor = trip creator, P36) - [x]
[fe]Notes label → "Notes for travellers — everyone on this trip sees them" (28 Sep) — ✅ 28 Sep, nepwalk-fe517caaf(feat/build-day-11b) - [x]
[fe]"+ Add hotel" opens the add form with type "Stay" preset (defaultType) (28 Sep) — ✅ 28 Sep, nepwalk-fe0c9bbcd - [x]
[fe]Rewrite stale Playwright specs for the new day plan:tests/ui/nights-strip.spec.ts(strip removed, P17 → tonight's stay + day-move connector) andtests/ui/itinerary-item.spec.ts("Add New Activity" → floating "+",data-testid="add-stop"); run just these two by hand next day (28 Sep) — ✅ 28 Sep, nepwalk-fec7e955e:itinerary-item+ newtonight-and-moves(replacesnights-strip), 7/7 passed - [x] Discuss (next M1 session): tonight's stay at the top of the day vs last; the floating "+" button — ✅ 28 Sep: top line (nepwalk-fe
c22990d); "+ Add stop" in the web header, floating "+" on phones (d1504ac)
Build day 12 — Tue 29 Sep
- [x]
[be]/[fe]Place page (M3) — spec:features/M3-place-page.md(agreed 28 Sep; 3 tasks, access tiers P37) — ✅ 29 Sep, founder-tested. nepwalk-be8488ab8:GET /places/:slugin three tiers (public teaser · trip insider · admin), 404 / 400, 30 requests a minute per visitor; 11 e2e tests, 10 mutation checks. nepwalk-fed0163bf+70aa017+2cb6b80+a56fcda(feat/build-day-12):/places/[slug]page with all states; linked stops on the day plan open it and "Back to Day N" returns to that day (?day=); founder review: header on the place page (landing header when signed out), "Oops!" not-found with a link to the main page, signed-in users skip the sign-in pages (except the password-reset link). 16 + 7 + 9 Vitest tests, 19 mutation checks; Playwright spec written, not run. Merged 29 Sep (be #22, fe #21);TRUST_PROXY_HOPS=2set on Render — rate limit still loose, see build day 18 - [x] Open (founder, 29 Sep): should the trip page use the app header too ("header on every page")? Today it keeps its own top bar (M1) — ✅ yes, done 29 Sep (
e624363) - [x]
[be]/[fe]Culture (M2): word of the day, festivals on the trip dates, experiences as stops — card agreed 29 Sep:features/M2-culture.md— ✅ 29 Sep (built the same evening), founder-tested. nepwalk-be6f546dc(words + festivals data,wordsForTrip/festivalsForTrip; 18 unit tests, 15 mutation checks) +dd07134(GET /trips/:id/culture, same read rule as the trip; 8 e2e, 10 mutation checks); nepwalk-fe8e2f271…76532d5(word line in the prototype's style above tonight's hotel, "Learn more >" drawer with the words so far, crimson festival line and "On your dates" cards, goodbye on the last day; tokenssaffron/crimson). Playwright spec written, not run - [x]
[fe]Trip page layout from founder review (29 Sep): app header on trip pages; trip title + Private chip head the day list; "← Back" beside the day; green icon actions by "Add stop"; day list "Day 1: title - Wed, 30 Sep"; no "Active Plan" — nepwalk-fee624363,8a5b4f7,f953724 - [x] Design talk (founder, Wed 30 Sep): app header and trip page look, against the SVG designs in
NepWalk/docs/design-reference/nepwalk-svg-designs/(landing, signed-in home, trip overview, daily itinerary; outside the repos). Card first (A13), then build — ✅ 30 Sep: day plan picks from the UX review (M1 Revision 2); header nav "My trips · Pailas", no Explore; design 03 becomes the share link's public preview (M5 card, later the members' Overview tab, M4); design 02 is the target for Sunday's trips list
Build day 13 — Wed 30 Sep
- [x] Review all eight follow-ups above at the cut-line; preserve the security gate and log any schedule impact. — ✅ 30 Sep: 7 of 8 closed with evidence, and every fix commit is on nepwalk-be / nepwalk-fe
main. SEC-01 is still open (the share link must reusepublicTripView, with revocation tests) and stays on build day 14; the security gate holds. QUAL-01's verification plan is not yet settled: there is no backend CI on PRs, so the lint baseline is kept by hand until then. Decide by the release gate. SEC-02/03/04 get their deployed re-check at the release gate. No schedule impact, no slip. - [x]
[fe]Maps (P25): whole-trip map on the overview + a map per day (numbered stops, tonight's hotel, "Open in Google Maps"), OpenStreetMap tiles — spec:features/M13-maps.md(agreed 28 Sep; 5 tasks there) — ✅ 30 Sep, nepwalk-fefeat/build-day-13:376a4c7+f183bc0(day map: numbered pins matching the cards, 🏨 last, route line; sticky right column from 1024 px, full-screen "Map" button below; pin tap scrolls to and highlights the card),b8c48f1(minimal MapLibre + OpenFreeMap map, T19),d1ccd09("Open day in Google Maps", first 9 stops + hotel; per-stop link),6d6e530(whole-trip map from "Trip map" in the sidebar: one pin per overnight town with nights, flights dashed; town position from the library's base town, never guessed),b933f89(states: empty day message, loading, tiles unavailable). 30 new Vitest tests, 19 mutation checks; security S13, S14, S15. Playwright spectests/ui/day-map.spec.ts(5 journeys) written, not run. Not on phones: the trip map link lives in the sidebar (web/tablet only) -
[x] Formal plan revisit + cut-line. If behind, cut in this order: overview map (→ list) · festivals and word of the day · install prompt (keep the manifest). Never cut: day plan, place data, share link, access tests, backups — ✅ 30 Sep (founder): no cut, launch stays Wed 7 Oct; maps done by midday. Keep-warm ping and backup script → after the MVP with no-code stand-ins (A14). Church trip built Mon 5 with defaults; leader reminded Mon 5 or Wed 7. Vendor research brief → after the MVP (team not ready). Afternoon: design talk + share link card (M5)
-
[x]
[fe]/[be]Day plan polish from the UX review (founder, 30 Sep) — M1 card, Revision 2 — ✅ 30 Sep, nepwalk-fefeat/build-day-13b:0287fe8("1 day", My trips),fe4c0c4(Directions, Nepal time),93a2bc0(hotel → stops → hotel flow),9e0098d(meal not included),d6e543c(Tomorrow card + firm scroll),ecb260f(phone header, ⋯ menu); nepwalk-be453073e(place stories free of trip timing; re-runnpm run db:seed:placesafter merge). Each rule test-first with mutation checks. Not seen in a browser yet: the local dev server was down
Build day 14 — Thu 1 Oct
- [x] Security checkpoint: SEC-01–SEC-04 fixed and regression-tested before real-data/external sharing; apply the same privacy boundary to the new share routes. — ✅ 1 Oct: SEC-01 closed with a deployed check (see Review follow-ups); SEC-02/03/04 closed 25 Sep. All four get a re-check at the release gate
- [x]
[be]Share link (M5): revocable token, view-only, no private data — responses go throughpublicTripView(SEC-01) — ✅ 1 Oct, nepwalk-be #26 (d7ef7d7,aac59c8):ShareLinktable, creator-only get / create / replace,GET /share/:tokenthrough theshareTripViewallowlist, one 404 for unknown and replaced links, 30 requests a minute, token masked in logs. 14 e2e + 7 unit tests, 25 mutation checks; founder-tested locally - One link, one step (P45, 1 Oct): Share makes the link on first use; no Publish, no public preview page. Card:
features/M5-share.md - [x]
[fe]Share sheet (M5 task 3, P45): outlined Share button → the link, Copy, Share… on phones; heading chip "Private" / "Shared by link" — ✅ 1 Oct, nepwalk-feea0e4b2(feat/build-day-14); 9 Vitest tests, 12 mutation checks - [x]
[fe]Shared trip page/s/[token](M5 task 4): view-only day plan,?day=N, credit footer, "no longer active" state — ✅ 1 Oct, nepwalk-fe43af527. Not in the shared page yet: word of the day and festivals (their endpoint needs a signed-in member), the whole-trip map (needs the place library), tapping a stop through to its place page - [x]
[be]/[fe]Share popup with one switch (P45): on = anyone with the link can view, off = private; the same link comes back when switched on again — ✅ 1 Oct, nepwalk-beaad91e5+50ec2f6(DELETE /trips/:id/share-link; 8 e2e, 6 mutation checks, 356/356 e2e), nepwalk-fede38525,ed47198. Also: "Print day" removed, "Save as my Paila" is an icon by Share, header row aligned (7fab0bc,fb86910,3cc4432) - [x]
[fe]Copy day as text (P42): the leader's Messenger format, ending "Full plan and map: · made with NepWalk" — ✅ 1 Oct (back on its day, see slip log), nepwalk-feb94b2d3(feat/build-day-14c): "Copy day" in the day header on the trip page and the shared page; heading with date, day and town, tonight's hotel, times as H:MM, travel as "Leave for …", meals "(pay locally)" except breakfast, assumed to come with the hotel (founder, 1 Oct; to revisit), the link opened on that day (only once the trip is shared). nepwalk-fe7f7666dapplies the breakfast rule to the stop card too. 19 Vitest tests, 12 mutation checks - [x]
[be]Access tests: no token = no trip; revoked token fails; changed IDs fail; no leader contact or emails in the share view — ✅ 1 Oct, nepwalk-be #26 (test/share-read.e2e-spec.ts,test/share-link.e2e-spec.ts) - [x]
[be]Templates use the one read rule (S1) (found 27 Sep):TemplatesService.findById,matchandfindAllcheck "owner or public" themselves instead ofcanViewTrip. Safe today (same result), but a second access check can drift. Move them tocanViewTripwith anonymous / outsider / owner tests (~45 min) — ✅ 1 Oct, nepwalk-be9853b28(feat/build-day-14), decided differently (P44): the note above was wrong,canViewTripalso admits trip members and organisation members. Templates keep owner-or-public; the rule now lives in one helper (template-access.ts) used by list, detail, match, apply and create-trip. 6 unit + 19 e2e tests (anonymous, stranger, trip member, organisation member, creator), 8 mutation checks, 218 unit + 348 e2e
Build day 15 — Fri 2 Oct
- [x]
[fe]Time range easy to see on every stop (founder, 1 Oct): a traveller should read "7:00–8:00 Breakfast" at a glance, the way the leader writes the day in Messenger. Our cards put the photo and story first, so the time is hard to find. Decide the layout (card first, A13), then build — day plan and shared page. Reference: Visit A City puts the start time in a chip on the card's photo — screens 14–15 and 35–36 inNepWalk/docs/design-reference/visitacity-screenshots-2026-10-01/(outside the repos) — ✅ 1 Oct evening, nepwalk-fefeat/build-day-15: "7:00–8:00" in a white chip on the card's photo, or first on the title line when the stop has no photo; travel lines lead with the leaving time; times as H:MM. Ranges are spaced, "9:00 – 10:30". Travel lines name the mode first like the connectors (Drive / Flight / Walk); a drive from the airport is "Pick Up", one to it "Drop". One rule (time-range.ts) shared with "Copy day as text". 9 new Vitest tests, 9 mutation checks. Applies to the day plan and the shared page - [x]
[be]/[fe]Confirmation (P21, M12): team marks items confirmed → the leader's one line — card:features/M12-confirmation.md(agreed 2 Oct) — ✅ 2 Oct,feat/build-day-15. nepwalk-be2cff65b:confirmedAt+ who on each service slot (additive migration),PUT/DELETE /service-slots/:id/confirmation, admin only; a vendor is required; changing, clearing or blocking the vendor removes the confirmation; the share link carries no status. 13 e2e tests, 10 mutation checks, 369/369 e2e; checked on the local server. nepwalk-fe10bf757(Services page: "Mark confirmed" / "Confirmed 2 Oct · Undo") +082507b(trip page, team only: "All set ✓" / "N things still being confirmed", tap for the list — waiting first — with "Copy for the leader" and "Open services"; no line when the trip has nothing to book). 16 Vitest tests, 12 mutation checks. The leader gets the line as text on WhatsApp: the leader opens the same link as the travellers, who never see bookings (P28). Playwright spec not written: tests cannot make an admin over the API yet - [ ]
[fe]Services page look and feel (founder, 2 Oct): the confirm row works but the page's UI / UX is poor. Fix in a design slot (D7), card first if the layout changes - [ ]
[be]Slot routes check the admin role only (S5): a slot id is not checked against a trip, so any admin reaches any slot. Fine with one admin at launch; scope to the trip's organisation at the agency onboarding (P36). The creator's access (P46) is checked against the trip - [x]
[be]/[fe]The trip creator chooses vendors (P46, founder 2 Oct) — ✅ 2 Oct,feat/build-day-15. nepwalk-be15801f5: the creator reads the service slots of their own trip and chooses from the verified vendors that fit, through an allowlist view (vendor name and town only; no phone, proof, capacity or who confirmed); anyone else gets 404; a confirmed service is locked for the creator (409); confirming stays admin-only. 15 e2e tests, 9 mutation checks, 383/383 e2e; checked on the local server with a creator, a stranger and an admin. nepwalk-fe07c19db: "Hotels and services" opens to the creator from the trip's menu, each option as "name · town — NepWalk pick"; the creator sees "NepWalk is confirming this" / "Confirmed" and cannot change a confirmed service; the confirmation line shows to the creator too ("Copy for the leader" stays with admins); a trip made from a Paila opens on "Choose your hotels and services" with "Continue to your trip". 16 Vitest tests, 9 mutation checks. Not seen in a browser by the builder; Playwright spec not written. Same afternoon (founder): vendors are chosen, and confirmed by the team, in the trip page's drawer too (P38) — nepwalk-fe d592f54, one shared row component for the drawer and the Services page; then tabs by kind of service (Hotels · Vehicle · Flights · Guide, always all four, with a line where there is nothing to choose) — nepwalk-fecd9d0d4; then choices instead of slots and tabs (P47): one hotel per town, one vehicle per town, one airline, one guide for the whole trip, "Use NepWalk picks" in one click — nepwalk-befac84de(PUT /trips/:tripId/service-slots/vendor, all or nothing; each slot carries its town; a guide serves every town; 397/397 e2e, 10 mutation checks) + nepwalk-fe87cd7d0(the per-slot row removed); then, from founder review: the tabs are back, every NepWalk pick is pre-selected and one "OK" saves it all — nepwalk-feb465cfd; final shape: an "All" tab first with every choice in brief, a dropdown per choice in the other tabs, the button "Save selection" as an outline button (drawer rule added todesign-system.md) — nepwalk-fe899f112(47 Vitest tests for the choices; 31 mutation checks in all). Not seen in a browser by the builder - [ ]
[fe]PWA (T16): manifest, icons, install prompt → moved to Sun 4 Oct (slip log) - [ ] Fri 6–7 pm: weekly review
Build day 16 — Sun 4 Oct
Merged Mon 5 Oct: nepwalk-be #29, nepwalk-fe #30, nepwalk-docs #45. Decision P48 came out of the review.
- [x]
[fe]Trip setup drawer, creator only (P18), with the leader's basics — ✅ 4 Oct, nepwalk-fe9a2ed48+847a071: trip page → ⋯ → "Trip setup": start date, people, rooms, flights in and out (Nepal time), interests, pace, budget level, the leader's contact; saving keeps the drawer open; warnings for beds short and for landing after the trip starts; the "Group & rooms" card left the trip's Settings page. 21 Vitest tests, 7 mutation checks. nepwalk-be06f8c49: an empty leader email clears it (it returned 400, so the form could not be saved without one). A start date, a flight time, a pace or a budget level can be changed but not cleared yet - [x]
[fe]Trips list (many trips, many leaders) · 3-click new-trip flow (P24) · stop editor: add from the library, edit, remove with undo (P26); helper warnings inline (M11) — ✅ 4–5 Oct. Trips list (design 02), nepwalk-fe26d0177+07197d2: "Up next" card with dates, the first day and one button; a trip that is on today reads "Happening now" and opens on today's day; Upcoming / Past tabs; "Plan a new trip" tile; the Invitations tab shows only while an invitation waits (P40); no search. 29 Vitest tests, 10 mutation checks. 3-click flow: already built (build day 10 and M7); "Start from scratch" moved above the Pailas (founder, 5 Oct). Stop editor: add from the library, edit and both warnings (no hotel tonight, a move with no travel) were already built; remove with undo is new — nepwalk-fee2f8bc8+847a071: the stop is hidden at once and deleted after 6 seconds, so an undo keeps the stop and the services chosen for it. 16 Vitest tests, 7 mutation checks. Playwright specs written or updated (trip-basics,dashboard,stop-remove-undo), not run - [x]
[be]Service slots for every trip (found 27 Sep) — ✅ 4 Oct (night run + founder review), nepwalk-bece8d24c+2417c9c+5ea57c0+26f780e: the slots are planned again in the same transaction as every change to stops, days, start date or people; a vendor stays while it still fits; a confirmation stays only when nothing it was made for changed; a moved start date clears every confirmation (P48) and moves the end date with it;POST /tripssaves all four services when none are given. 423 e2e tests; every rule and call site mutation-checked. Bags and included services cannot be changed after the trip is made — October backlog (P48) - [x]
[fe]PWA (T16): manifest, icons, install prompt (from Fri 2 Oct) — ✅ 4–5 Oct, nepwalk-fee4d3bee+07197d2:app/manifest.ts, icons 192 / 512 / maskable / Apple touch, theme colour; an install offer on the trips list and an "Install NepWalk" section on Settings (button, or the steps on an iPhone and in other browsers); the browser's install prompt is caught at the app root. No service worker: offline comes later. The icon is a placeholder (white route mark on green). 13 Vitest tests, 7 mutation checks - [x]
[be]Slot order on a travel day — ✅ 4 Oct (night run), nepwalk-bee92f71a: one comparator, by date, then flight · vehicle · hotel · guide, used by the planner and every slot read
Build day 17 — Mon 5 Oct
- [ ] Church trip built from the 7-day Paila with what we know; the leader's answers are filled in when they come (reminder Mon 5 or Wed 7, founder 30 Sep); walkthrough on a real phone
- 5 Oct: built first on the local server from the 7-day Paila: 10 days, 29 Dec – 7 Jan, 1 night Kathmandu + 5 Pokhara + 3 Kathmandu; NepWalk sized it at 8 rooms and a coaster. Finding: the 7-day Paila stretched to 10 days keeps 3 nights in Kathmandu and 6 in Pokhara and flies back on the departure day, so this shape took about 50 edits. Founder's way forward: he makes Pailas that fit this kind of group (from the existing ones), and the group chooses from them; the trip on the deployed site is made from those, by him
- [x]
[be]/[fe]Word of the day on the shared link (founder, 5 Oct): the shared page showed none — ✅ 5 Oct, nepwalk-be959dab7(the share read returns the trip's culture with the plan: one read, one token check, one rate limit; 1 e2e test, 1 mutation check, 424/424 e2e) + nepwalk-fe43c519d(the word, the day's festival and "Learn more" above tonight's hotel, as on the trip page) - [ ] Vendors: no vehicle with 15 seats in the list, so the coaster has no NepWalk pick. Add a coaster vendor for Kathmandu and for Pokhara (P29)
- [x]
[be]No prayer or mantra of a faith as a word of the day (founder, 5 Oct): a church group must get none, on any day — ✅ 5 Oct, nepwalk-be88b8105: "Om mani padme hum" (Boudhanath) and "Aarati" (Pashupatinath) left the word library for everyone; both places stay in the plan and take the day's everyday word. 1 data test, the culture e2e moved to a neutral place word, 424/424 e2e. "Chaitya" (stupa / shrine, Swayambhunath) is still there: a word for a building, not a prayer — to check with the founder - [x]
[fe]Playwright journeys for the share view — ✅ 5 Oct, nepwalk-fe2139d8c(share-view.spec.ts: open the link with no account; find a day and its time; find tonight's hotel; copy the day; a link turned off and a wrong link say the same). First Playwright run since 2 Oct: the whole ui suite 36 of 36 after six older specs were brought up to date; one real gap found and fixed (the "Up next" card's title did not open the trip). Chromium for Playwright had to be installed on the build machine
Build day 18 — Tue 6 Oct
- [ ]
[ops]Neon restore check (A14, ~10 min, no code): confirm Neon's built-in restore history covers the real trip data before it goes live. The nightlypg_dump+ restore test (A8) → after the MVP - [x]
[ops]npm audit(S26): nepwalk-be production dependencies have 13 high + 5 moderate advisories onmain(fastify, prisma, nodemailer, …; found 25 Sep). Fix or record as accepted risk indecisions.mdbefore launch — ✅ 6 Oct: each advisory checked against the code and accepted for launch (A15); the upgrade is in the October backlog. API docs switched off on deployed servers (nepwalk-be93bdcae) - [ ]
[be]/[ops]Place page rate limit counts one visitor 2–3 times (found 29 Sep, deployed check): production sits behind Cloudflare + Render's proxy.TRUST_PROXY_HOPS=1→ ~3 counters per visitor;=2(set on Render 29 Sep) → 2 counters (two reset times seen, IPv4 only), so a visitor gets ~60 requests a minute instead of 30. FakeX-Forwarded-Forgot 200, but no counter was full, so spoofing is not yet proven safe. Not a launch blocker (real visitors are never blocked). Next: temporary log of the chosen IP,X-Forwarded-ForandCF-Connecting-IPonGET /places/:slug, 5 requests, read Render logs, remove the log; then fix by hop count or byCF-Connecting-IP. Also check Render instance count (two instances = two in-memory counters). Don't try3blindly: too high lets visitors pick their own address - [ ]
[be]/[ops]Sign-up hangs on production (found 1 Oct, deployed check):POST /auth/registercreates the account but the response never arrives (over 60 s, no status); login then works. Likely the welcome email waiting on the mail server. Check Render logs; send the email without making the response wait, or with a short timeout. Google sign-in is not affected - [ ] Bug bash on a real phone · inquiry form (F11)
- [x]
[fe]Trip page as clean as the shared page (founder, 5 Oct) — ✅ 5 Oct, done a day early with the founder, nepwalk-fe #32: slim header inside a trip, one-row day header, equal gaps on one grid, the day list as "Day N: title" with a small rail, the hotel and the airport as waypoints at the day's ends, word of the day beside the map, the status as an alert chip left of Share; on phones only the day tabs stay fixed and four bottom tabs; a simple "Add a stop" form (type first, the stop names itself, a hotel's town fills itself in — nepwalk-be #31); the landing search opens the planner; a trip from a Paila opens with its services drawer open
Build day 19 — Wed 7 Oct — launch
MVP live on Tue 13 Oct 2026 (founder's call): nepwalk-fe #35 and nepwalk-be #35 merged and deployed. Planned for Wed 7 Oct; see the slip log. The open items below stay open.
From the founder's phone test on the deployed site (6 Oct, evening). Details to confirm with him before fixing:
- [x]
[fe]The page zooms in by itself on a phone and no longer fits the screen. Likely a field with text under 16 px (iOS zooms on focus) or a part wider than the screen. Find which screen and which tap — ✅ 7 Oct, nepwalk-fe #35: iPhone Safari zooms on a field with text under 16 px and stays zoomed; about 20 fields used 14 px. Every field is 16 px on touch screens; pinch zoom stays allowed. Founder checked on his iPhone - [x]
[fe]The day map closes or disappears when zooming in and out on a phone — ✅ fixed 7 Oct in nepwalk-fe #35; founder checked on his iPhone and merged 13 Oct: the full-screen map sat inside the day's swipe area, so a drag or a pinch on it changed the day and the map closed. Touches inside a map or a sheet no longer swipe the day; the map is drawn on the page's body and keeps the reader's zoom. Seen and fixed on the trip page with a simulated touch; the shared page showed no fault in that test - [x]
[fe]Tonight's hotel on a phone still has the old look: show it as the waypoint on the line, as on the web (5 Oct) — ✅ night of 6 Oct, nepwalk-fe #34; founder checked on his phone 7 Oct - [ ]
[fe]Confirming as an admin is not easy to use: walk through it with him, then simplify
Added by the founder on the day (7 Oct):
- [x]
[be]A Paila's last day ends at the international airport (P23): a domestic flight on the last day is followed by a drop from the domestic terminal to the international one — ✅ nepwalk-be #35. Pailas only; runnpm run db:seed:pailason the deployed database after the merge (✅ run 13 Oct by the founder; checked on the deployed API: the two Pailas with a domestic flight on the last day end with the drop at the international terminal). Trips already made keep their last day - [x]
[fe]Phones: the header and the bottom tabs leave while scrolling down and come back when scrolling up — ✅ nepwalk-fe #35; founder checked on his phone and merged 13 Oct. Phones only (below 768 px); kept on the web on purpose - [x]
[fe]A running trip opens on today, with a quiet line at the present time ("Now · 14:20", "Now" on the stop in progress, "Next" on the coming one; Nepal time; trip page and shared page, phone and web) — ✅ nepwalk-fe #35, merged 13 Oct. The line at the present time was removed on the founder's review (93876f3): the stop is marked with a chip, without the line -
[x]
[fe]Phone pass over every page at 320, 375 and 390 px: no page wider than the screen; sheets and trip pages use the visible height on an iPhone (dvh); the landing page's email wraps at 320 px — ✅ nepwalk-fe #35 -
[x] Release gate: verify SEC-01–SEC-04 on the deployed version using synthetic data before sending real traveller links; confirm DATA-01–DATA-03 and the QUAL-01 verification plan have evidence. Do not ship with unresolved security-gate items. — 🔧 13 Oct, deployed check without an account: SEC-01 (trip list, trip, public slug, days, templates carry no contact fields), SEC-02/03 (fake Google token 401, old routes 404) and SEC-04 (bad body and broken JSON give a clean 400) pass; API docs 404. ✅ Closed 14 Oct: signed-in checks on the deployed version with two synthetic accounts in different organisations, 57/57 pass. A stranger gets 404 on every read and write of a private trip (trip, days, stops, service slots, culture, share link, edit, visibility, archive, invite, delete) and never sees it in any list; a trip in a foreign organisation and the admin vendor routes answer 403; public reads (signed in, anonymous, slug) and the share link carry no private fields while the owner sees them all; share token refused as a login, link off → 404, tampered token 401, refresh works. Synthetic trips deleted afterwards. DATA-01–DATA-03 and QUAL-01 evidence reviewed above; backend lint on
main(7383855) clean, 0 errors. Still open: backend CI on PRs (QUAL-01 next step); a stranger's edit of a public trip answers 403, not 404 (October backlog) - [ ] Deploy; every acceptance item in
requirements.mdchecked — 🔧 deployed 13 Oct (nepwalk-fe33668b1in production); the acceptance items are not yet walked through - [ ] Founder opens the share link, waits for it to load (wakes the server, A14), then sends it to the leader — moved 14 Oct (slip log): the church group's trip is made from the mission-trip Paila first (October backlog), so their link shows their real day
- [ ] Send the mentor the 5-line launch update
Build day 20 — Wed 14 Oct (adding a stop in two taps)
Card: M1 revision 3 (founder, 14 Oct). Comes before the mission-trip Paila.
- [x]
[fe]Kind chips instead of the dropdown; times suggested from the stop above + the place's typical duration; one-line time with "Change"; "Save & add another" starts where the last stop ended — ✅ 14 Oct, nepwalk-fefeat/build-day-20; founder tested. Every kind times itself: a meal by which meal (breakfast 45 min · lunch 60 · dinner 90 · snack 30), a move by the towns it joins, a hotel as one check-in line; an end set by hand is never replaced - [x]
[fe]"+" between stops in edit mode, opening the sheet for that slot — ✅ 14 Oct: above the first stop, between stops and below the last, on the day's line; a tooltip on hover - [x]
[be]/[fe]Shift the rest of the day when a stop's time changes or a stop is added in the middle (one backend call, one transaction) — ✅ nepwalk-be PR #37, nepwalk-fe PR #37
Added by the founder on the day (14 Oct), done in nepwalk-fe feat/build-day-20:
- [x]
[fe]Food: which meal is asked apart from the kind (smaller chips), picked by the time (before 10:30 breakfast, before 15:00 lunch, else dinner); "Where?" is a field that takes a library place or keeps the typed text - [x]
[fe]Hotel: one "Which hotel?" field (a NepWalk hotel from the list, or a typed name that shows as not confirmed); the town comes from that night; nights as chips 1–4 set the check-out, dates one tap away - [x]
[fe]Travel: "From" fills itself from where the stop above ends (or last night's hotel) and shows as one line; "To" takes a library place or typed text - [x]
[fe]Tapping the start / end hotel row opens the hotel's card in the side sheet; the "Tonight" toggle is gone - [x]
[fe]Header: Copy day, Share and Edit / Done are icons with a tooltip (on hover only, gone on click, gone by itself after a few seconds); no "Add stop" button (the "+" adds stops); the ⋯ menu only holds "Make private" - [x]
[fe]Day list (web), edit mode: rename and delete on each day's row (always on the selected day, on hover elsewhere); tapping the selected day's name edits it. Phones keep both in the header - [x]
[fe]Trip settings page: tabs "General" (save as my Paila, visibility, archive, delete trip) and "Trip setup" (moved from the drawer) - [x]
[fe]"To confirm" chip with the count as a badge
Night part, finished on the day (15 Oct), nepwalk-be feat/build-day-20:
- [x]
[be]Restaurants are a kind of place: 10 in Thamel, Lakeside and Sauraha, pins from OpenStreetMap;GET /places?types=RESTAURANTreturns only restaurants. A chain's branches (OR2K, Roadhouse Cafe) share a name and the day's town picks the branch — ✅ 15 Oct - [x]
[be]Hotels come from NepWalk's verified hotel vendors:GET /vendors/hotels?q=&town=for any signed-in user (id, name, town only); a stay links to its hotel (vendorId), never shown to outsiders or on the shared link. Sample hotels for local testing:npm run db:seed:sample-hotels— ✅ 15 Oct - [x]
[be]npm run db:migrate:testapplies migrations to the_testdatabase only, so night runs can run the e2e gate after a migration — ✅ 15 Oct - [x]
[fe]The stop sheet searches each kind's own things: Food → restaurants and areas in the day's town, Hotel → verified hotels in that night's town (a typed name stays "not confirmed"), Travel "To" → towns, areas and airports — ✅ 15 Oct, nepwalk-fefeat/build-day-20; picking a hotel saves itsvendorId, editing the stay shows it picked
Build day 21 — Mon 19 – Tue 20 Oct (find, fit, then edit all days on one page)
Card: M7 revision 2 (founder, 19 Oct). The founder's UI/UX and journey fixes before the team AI setup (A16).
- [x]
[be]Trip statusPREVIEW/DRAFT/FINALandchildren; create-from-Paila takes from–to, adults, children, rooms and makes aPREVIEW; status moves forward only; lists, public and share link useFINALonly;GET /trips/drafts— ✅ 19 Oct, nepwalk-be1077ccf,0fffb81(previews open in another tab are kept) - [x]
[fe]Create page: filter chips (days, cities, budget, pace, interests); start from scratch as a quiet link — ✅ 19 Oct, nepwalk-fe9b18daa. Days and cities rank Pailas; pace, budget and interests are carried into the trip only (Pailas carry no such tags yet) - [x]
[fe]Drawer: date range, adults, children, rooms → Continue opens the one-page edit — ✅ 19 Oct, nepwalk-fe9343701 - [x]
[fe]One-page edit: name (memorable default), dates line with what changed, all days as lines, services summary, preferences row; first change → draft; leave → silent delete or Keep as draft / Discard / Keep editing; Create trip → final → day plan — ✅ 19 Oct, nepwalk-fe9343701(/trips/:id/plan); Playwright specs updated ina63ff54, not run - [x]
[fe]Trips page: Drafts tab, Continue, delete with undo; "Continue your draft" on the create page — ✅ 19 Oct, nepwalk-fe9343701
After the founder's check (19 Oct, afternoon; card):
- [x]
[be]A preview without dates; a range of another length onPATCHadds empty days at the end or removes the last ones; a flight slot keeps an approximate time — ✅ 19 Oct, nepwalk-be5d5bebe. Also: hotel nights now move with a new start date (they stayed on the old dates before);PATCHtakeschildren - [x]
[fe]One calendar for the date range — ✅ 19 Oct, nepwalk-fe5804e43 - [x]
[fe]Picking a Paila opens the one-page edit at once; dates, group and rooms at the top; Create trip locked until filled; the drawer goes — ✅ 19 Oct, nepwalk-fe0cb31c6. The days can be changed once the dates are picked - [x]
[fe]Services on the right with Send to NepWalk; a flight's approximate time — ✅ 19 Oct, nepwalk-fe35592fc - [x]
[fe]"Edit all days" on the trip page — ✅ 19 Oct, nepwalk-fe888d82c(icon in the trip header, creator only) - [x]
[fe]Search page: one Filters button (days, cities); pace, budget and interests on the edit page only — ✅ 19 Oct, nepwalk-fe994d33f; Playwright specs updated in28705aa, not run - [x]
[fe]Founder's third check: a small calendar under the Dates field, steppers for the group and rooms, vendor choice as a search field, Stays and travel in tabs with confirmation badges, a visual pass over the one-page edit — ✅ 19 Oct, nepwalk-fe0465259…684ef54,589870f,ac15482 - [ ]
[be]/[fe]Leave a service out of a trip (19 Oct): the Stays and travel switch is a preview only today and blocks saving while off. Needs an API that marks a service as not wanted (a traveller who books their own hotel), then the switch saves
October backlog (after launch)
- [x]
[fe]/[be]Smart hotel nights and check-in (founder, 14 Oct): suggest the nights from how long the trip stays in that town, not always one; suggest the check-in time (the hotel's, or after the last stop) instead of the next free time. The nights chips stay for a wrong guess — ✅ 15 Oct (fe only): nights run until a night with a hotel, a day the group travels to another town, or the trip's end; check-in 14:00 or after the day's last stop; one line with Change; a hotel never keeps an end time - [ ]
[be]/[fe]A hotel link fills the hotel (founder, 14 Oct): pasting a hotel's web or map link into "Which hotel?" reads its name, town and map point - [ ]
[fe]A typed hotel shows as not confirmed beyond the form (14 Oct): the stop card and the "To confirm" line say so, until NepWalk checks it. Today only the form says it - [ ]
[be]/[fe]The stop's hotel and "Hotels and services" stay one choice (founder, 14 Oct): the system picks the hotel vendor when the trip is made; picking another hotel in the stop form changes that night's hotel slot too (and clears its confirmation, P46). Tonight's night run only links the stay to the vendor - [ ]
[be]A place holds many hotels (founder, 14 Oct): keep places and hotels apart, and record which hotels are at which place (Thamel, Lakeside…), so a search by place lists its hotels - [ ]
[be]Knowledge base for the AI (founder, 14 Oct): places, hotels, restaurants and their relations in one shape the AI assist (F10) can read - [ ]
[be]Live hotel availability (founder, 14 Oct, later): rooms and prices from hotel APIs, so everyone sees real-time information - [ ]
[fe]/[be]Validation pass on adding a stop (founder, 14 Oct: "many things, later"): one card first, then one pass. Known so far: each kind searches only its own kind of place (food → restaurants, travel → towns, airports and areas); a time that does not fit the kind (breakfast at 14:00, P15 time profiles); a stop overlapping the next one until "shift the rest of the day" is built; a hotel's nights past the trip's last day; a travel whose "From" and "To" are the same; typed names that are only spaces or very long - [ ]
[be]/[fe]Food's "Where?" searches restaurants, not sights (founder, 14 Oct): today it searches the whole library, so "boud" offers Boudhanath Stupa (a sight) for lunch. Needs a restaurant place type and restaurants in the library (see "The church group's restaurants as library places" below); then food searches restaurants and areas only, like a hotel searches towns and areas. Until then a typed name is kept - [ ]
[be]/[fe]Restaurants near the traveller (founder, 15 Oct: "make their travel easy and simple"): we know where they are on the itinerary, so a traveller in Pokhara never sees Kathmandu restaurants. Opening Food's "Where?" with no text lists restaurants nearest them (phone location if on, else the day's town, best ones first); typing searches near the stop before and the next stop, closest first. Groundwork done on build day 20: restaurant pins from OpenStreetMap, chain branches per town (OR2K, Roadhouse) told apart by the day's town. Builds towards the knowledge base above - [ ]
[be]Outsiders' stop reads through an allowlist (S3) (found 15 Oct): a public trip's days and stops (publicTripView, the day and stop reads) still send whole stop rows, with only the place narrowed andvendorIdremoved. Use one allowlist of stop fields, like the shared link's, so a new stop field never leaks by default - [ ]
[fe]/[be]Getting to the airport on time (founder, 15 Oct, later): a flight has its fixed flying time (Kathmandu–Pokhara 25 min); before it, the plan leaves the hotel early enough to reach the airport (about 2 hours for a domestic flight, more from far hotels), as a suggested transfer stop - [ ]
[fe]Tooltips on phones (14 Oct): touch has no hover; decide whether a long press shows the icon's name - [ ]
[be]Mission-trip Paila, public (founder, 14 Oct; after the founder's fix-up, not before): a Paila from a real faith group's past trip — Pokhara first (4 nights), morning domestic flight, Kathmandu last (3 nights), evening international flight. The same rhythm every day: breakfast window at the hotel, walk to a café for the morning devotion, the main visit, lunch in town, free time, an evening visit, dessert in Lakeside (Pokhara nights). Generic places only (hotel, café, Lakeside, Thamel); ministry sites become private stops on the group's own trip (P41), never in the Paila. Then: the church group's Dec trip is made from it (leader's follow-up answers filled in), then the share link goes to the leader - [ ]
[fe]Focus the stop you rest on while scrolling (founder, 6 Oct; to discuss before any build): when a stop stays in place for about 2 seconds it grows and comes into focus; the stops below stay soft at normal size; scrolling returns it to normal. The focused stop is where reviews and more information go later. Open questions: phone only or web too, how it behaves with reduced motion, what the focused card adds - [ ]
[be]Upgrade to NestJS 12 and@fastify/swagger-ui6, first week after launch (A15): clears the Fastify, find-my-way and@fastify/staticadvisories; then nodemailer 10 and the Prisma major on their own, each with the full gate. Re-runnpm audit --omit=devand record what is left - [ ]
[be]A stranger's edit or delete answers 403, a read answers 404 (found 6 Oct, deployed gate): 403 confirms the trip exists. Answer 404 for both, with access tests - [ ]
[be]Security headers on the API (found 6 Oct): noStrict-Transport-Security, noX-Content-Type-Options. Add@fastify/helmetwith a JSON-API setting; check the site's headers at the same time (it sends HSTS only) - [ ]
[be]A day's routes check that the day belongs to the trip in the address (S5; found by the night run, 6 Oct):PATCHandDELETE /trips/:tripId/days/:idlook at the day id only. Rights are checked on the day's own trip, so no other trip's data is reached; the address should still be honest - [ ]
[be]The last day ends at the international airport for every trip, not only Pailas (founder, 7 Oct): a trip built by hand can still end on a domestic flight. A soft rule beside R11, or part of "Arrival and departure, done properly" - [ ]
[be]/[fe]Arrival and departure, done properly (founder, 1 Oct): today a drive is called "Pick Up" or "Drop" only because its from / to text contains the word "airport" — a stand-in. To fix: the arrival and departure as real parts of the day (international flight number and time from the leader's basics, M10; airport pick-up timed from the landing; drop timed back from the flight, with the R11 buffer, P43); hotel and other pick-ups that are not at an airport; the same wording in "Copy day as text". Card first (A13) - [ ]
[fe]Borrow proven design from the big travel apps (founder, 1 Oct): 39 Visit A City screenshots with an index and a "take / do not take" list inNepWalk/docs/design-reference/visitacity-screenshots-2026-10-01/README.md(outside the repos). As soon as there is time: one line per card, fixed action row, hotel as a card, one edit sheet, times on map pins, "Day N" badge, filter chips, empty states, accordions. Placement and cleanliness, not a copy; no redesign before launch. Same treatment later for MakeMyTrip and Priceline. Seevisitacity.md§7 - [ ]
[be]Notice to the admin when a creator chooses or changes a vendor (P46, founder 2 Oct); later, booking through hotel APIs and portals instead of WhatsApp - [ ]
[be]/[fe]Change bags and the included services after the trip is made (P48, founder 4 Oct):PATCH /trips/:idtakes neither today; add both fields with validation, then offer them in the setup drawer. The slots follow by themselves (the re-plan runs after every trip update). Until then a wrong service list means making the trip again - [ ]
[be]Store "chose no service" (P48): today an empty list means all four. Only if a leader asks; needs a schema change - [ ]
[be]/[fe]Pick the real hotel in the stop form (founder, 5 Oct; needs a decision first): the place library holds no hotels; hotels are vendors, chosen under "Hotels and services" (P46, P47). Searching NepWalk's verified hotels in "Add a stop" must also set that town's hotel choice, or the stop and the services would name two hotels for one night. Needs: a hotel search the trip creator may use (name and town only), the stay linked to the vendor, and the same idea for vehicle, guide and airline. About half a day. Done 5 Oct as the small step: the stop's type decides what is searched (a hotel: towns and areas; a visit: sights and areas) and the hotel's town fills itself in - [ ]
[be]/[fe]Count who opens their day on the shared trip — before Tue 29 Dec (founder, 5 Oct): the first group trip is measured by how many travellers open that day's plan, per trip day. Today nothing is recorded (one link for everyone, nobody signs in). Count opens per day per device, anonymous: a random id kept on the device, no name, no IP stored; the team sees a number per day for the trip. Check the security rulebook (S3, S16, S21/S22) and say on the shared page that visits are counted. About half a build day - [ ]
[fe]Trips list: the "A new journey starts here" tile first? (founder, 5 Oct, a thought, not decided): today it is the last tile of the Upcoming grid. Try it as the first tile; keep the running or next trip on top either way - [ ]
[be]/[fe]Leader notes on the trip and on each day (founder, 14 Oct; later, not now): a real group leader sends the team notes beside the daily plan — who leads the morning talk each day, who speaks at which visit, reminders. Free text for the whole trip and for each day, shown on the shared trip. Useful for any leader, not only faith groups. Card first (A13) - [ ]
[be]/[fe]Soft times in the day plan (founder, 14 Oct, from a real group's plans): breakfast is a window (7:00–8:30), lunch is often "in town" or "after the activity", free time is a block. Only departures, flights and visits have fixed times. Let a stop carry a window or "time to be confirmed" without the day looking broken. Needs a decision first - [ ]
[be]/[fe]Group splits within a day (founder, 14 Oct, from a real group's plans): part of the group does an activity (paragliding) while the rest has free time, and lunch waits on their return. Today a day has one track for everyone. Needs a card and a decision first (one track with "optional" stops, or parallel tracks) - [ ]
[fe]/[be]"Before you go" on the shared trip (founder, 14 Oct): leaders send pre-trip information as slides today — packing list, one checked bag, visa on arrival, insurance, cash to bring. One section on the shared trip, written by the leader; bag count already in P48 - [ ]
[fe]"Copy day as text" keeps room for the leader's own line (founder, 14 Oct; P42): real evening posts end with a personal line ("Long but FUN day!"). Let the leader add one before copying - [ ]
[fe]/[be]Ask the leader's basics while the trip is made (founder, 4 Oct): interests, pace and budget level matter at creation, not only later in the setup drawer. Put them in the new-trip flow (P24, step 2) - [ ]
[fe]/[be]Rename the pace "Packed" (founder, 4 Oct): the word is not nice. Find a better one ("Enrich" or similar) for Relaxed · Balanced · Packed (P33); needs a decision, then the label (and the enum value only if it is worth a migration) - [ ]
[be]/[fe]Headcount from enrolment, not a typed number (founder, 4 Oct): "Expected max" is not required. The count comes from the people in the trip and whether each has accepted. Two ways to enrol: (1) the leader invites each person; (2) the leader shares a link and a QR code and a traveller sends an enrolment request (join requests, P40). Needs a card and a decision first: it changes P9 (enrolled / expected max / lock date) and what sizes the service slots - [ ]
[be]/[fe]Join requests (P40), first after launch: a traveller asks to join from the public preview; the leader accepts or declines; accepted members see the full trip - [ ]
[be]/[fe]Private stops (P41): mark a stop's place as trip-only; never in the library, public preview or public map - [ ]
[be]Soft rule R11 (P43): warn when the last night before the international flight isn't in Kathmandu, or a domestic flight / long drive falls on departure day - [ ]
[be]The church group's restaurants as library places (founder, 30 Sep): Fire and Ice, OR2K, Roadhouse, KFC Pokhara, Hard Rock, plus two names to confirm; needs a restaurant place type. Later: rank the group's favourites for meal suggestions (F10) - [ ]
[ops]Cold-start fix: free keep-warm ping (T17; moved after the MVP by A14) - [ ]
[ops]Nightlypg_dump+ a real restore test (A8; moved after the MVP by A14) - [ ]
[be]Pailas hold no dates (founder, 27 Sep): a Paila is a template, not a trip — store days as day numbers only, plus what a trip needs to be made from it (minimum days, towns, stays in nights). No placeholder dates (today day 1 = 2000-01-01, which also shows in the public trip list) - [ ]
[be]/[fe]Backend-for-frontend login (T18, later): tokens move out oflocalStorageinto an HttpOnly session cookie; needs one shared domain (nepwalk.com+api.nepwalk.com) and CSRF protection on cookie-authenticated requests. Most secure option per RFC 10017. Do when the NepWalk domain is live. - [ ]
[ops]NepWalk domain live + Google app published (T18): verifynepwalk.comin Google Search Console; app onnepwalk.com(Vercel); privacy policy page; Google Auth Platform → Branding complete → Publish app; addhttps://nepwalk.comto the client's JavaScript origins and to backendCORS_ORIGINS. Do together with the backend-for-frontend login (api.nepwalk.com) - [ ]
[fe]Google sign-in in Firefox: the button does nothing (likely strict tracking protection blocking Google's iframe; found 25 Sep). Check with default settings; if still blocked, show a hint to use email login or another browser -
[ ]
[fe]3 seeded trips still point at dead Unsplash photos (404 in the dev log) — replace like the earlier three (found 20 Sep) -
[ ] F10 AI assist via OpenRouter (prefill + question suggestions), redaction,
AiRunlog - [ ] Model test (settles O5): 15–20 real requests (personal data removed) + the church example → 5–6 free/cheap models → score against the rules output → pick 1 primary + 2 fallbacks
- [ ] Anything moved at the Wed 23 checkpoint
- [ ]
[be]Rewritegoogle-oauth.stress.spec.tsfor Fastify (res.raw.writeHead); it currently crashes its worker - [ ]
[ops]Production env: setFRONTEND_URL(orCORS_ORIGINS) and realJWT_SECRET/JWT_REFRESH_SECRETbefore deploying the backend - [ ]
[be]/[fe]Festivals for trip creation (founder, 29 Sep): festivals without a trip (GET /festivals?from=&to=), so the 3-click flow (M7) can show and match festivals and trips can be built around one ("Tihar in Kathmandu"). Reshape the launch endpointGET /trips/:id/culturethen — see the M2 card backlog - [ ] Time profiles as data (typical/allowed windows per activity, place opening hours) for AI and rules (P15)
- [ ] Vendor confirmation link
- [ ] Brand token unification (green)
- [ ] Team dev onboarding via
decisions.md+scope.md+tasks.md+ CLAUDE.md
Slip log
| Date | What slipped | Moved to | Why |
|---|---|---|---|
| 2026-09-17 | Build day 1 (Wed 16) not started | Thu 17 with day 2; orgId + deploy → Fri 18; all later days +1; F10 → Oct |
Missed day |
| 2026-09-19 | Build day 3 (Fri 18) not started | Sat 19; later days unchanged (P16) | Day spent on hosting, security upgrade and docs |
| 2026-09-21 | Build days 5–13 paused after R1/R2 | Product definition Mon 21 – Tue 22 (A7); remaining build days re-planned against the signed-off prototype; launch ~Wed 7 Oct | Founder could not picture the product; build against a design, not a feature list |
| 2026-09-23 | Review follow-ups added with no build time: SEC-01–SEC-04, DATA-02, QUAL-01 (DATA-01/03 done with the resolver) | Picked up later, not today: triage Fri 25 · DATA-02 with Pailas Sun 27 · SEC-01 before the share link Thu 1 Oct · all SEC items before real traveller links (launch gate) | Code review found existing gaps; founder chose to finish the Place work first |
| 2026-09-25 | SEC-02/03 had no build time before the Thu 1 Oct security checkpoint | New build day 9b: Fri 25 afternoon – Sun 27. Pailas + 3-click trip → Mon 28; day plan + place page + culture → Tue 29 (day 12 merged into 11). Wed 30 cut-line unchanged; if Tue 29 overruns, culture moves first (already on the cut list) | Security gate first; SEC-01/04 done 25 Sep; rules made mandatory (A12) |
| 2026-09-25 | (reversal) SEC-02/03 and QUAL-01 finished on Fri 25 | Build days 10–12 back on their original dates: Pailas Sun 27, day plan Mon 28, place page + culture Tue 29. No slip remains | Security work took one day, not three |
| 2026-09-30 | Keep-warm ping, backup script + restore test (build day 18) | After the MVP; no-code stand-ins before launch (A14) | Plan revisit: no team soon, launch week full |
| 2026-10-01 | "Copy day as text" (M5 task 5) | ~~Fri 2 Oct~~ done the same afternoon, 1 Oct | The share flow was reworked three times from founder review (one link, popup, on/off switch — P45), plus a new backend endpoint; the public preview page was dropped, not slipped |
| 2026-10-02 | PWA (T16: manifest, icons, install prompt) | Sun 4 Oct (build day 16) | Founder added "the trip creator chooses vendors" (P46) to build day 15 after the confirmation line; all of it today |
| 2026-10-13 | Launch (build day 19, Wed 7 Oct): the day's phone fixes stayed unmerged | Tue 13 Oct: merged, deployed, MVP marked live. First real trip on the deployed site and the link to the leader still to come | Founder away after 7 Oct |
| 2026-10-14 | Share link to the church group leader (launch item, build day 19) | After the mission-trip Paila is built and their Dec trip is made from it (October backlog); the Paila waits for a fix-up the founder does first | No trip on production yet; a generic 7-day trip would not show the group's real day, so the experiment would test the wrong thing |
| 2026-10-22 | Team AI setup (A16: Wed 21 – Fri 23 Oct) | Ready by Sun 25 Oct (Sat 24 kept free) | Docs cleanup came first, and the founder added weekly hours, backlog picks and the game layer (A18) |