Changelog·Roadmap
Wayfile v0.4.106 · BETA · built 2026-06-17
← Wayfile

Changelog

What we’ve shipped. Have an idea for what’s next? Vote on the roadmap.

v0.4.0

June 13, 2026
Features
  • ·account: auto-save notification prefs + privacy toggle, closes [#290](https://github.com/miles202/dev-wayfile/issues/290) #292
  • ·auth: magic-link send resilience — guard every send path, central email-alert chokepoint, closes [#303](https://github.com/miles202/dev-wayfile/issues/303) #321
  • ·email: record hard bounces on users.deliverability_status + admin surface, closes [#304](https://github.com/miles202/dev-wayfile/issues/304) #325
  • ·ingest: fail-soft parsing — salvage valid segments when one fails schema validation #329
  • ·ingest: Inngest onFailure dead-letter — no more eternal parsing spinner, closes [#302](https://github.com/miles202/dev-wayfile/issues/302) #322
  • ·obs: wire Sentry — server init, request-error hook, parser/email/monitor capture, client-error sink, closes [#301](https://github.com/miles202/dev-wayfile/issues/301) #323
  • ·pdf: export quality pass — room normalization, lodging collapse, labeled boundaries, footer essentials, +1 badge, closes [#316](https://github.com/miles202/dev-wayfile/issues/316) #319
  • ·prefs: date entry boxes follow the user's date format ([#283](https://github.com/miles202/dev-wayfile/issues/283) v2), closes [#288](https://github.com/miles202/dev-wayfile/issues/288) #289
  • ·prefs: user-selectable date format — display follows preference ([#283](https://github.com/miles202/dev-wayfile/issues/283) v1) #287
  • ·qa: pnpm preflight — parallel read-only provider probes + prod hardening of the silent magic-link no-op #328
  • ·qa: Tier 5 synthetic smoke — real email in, parsed trip out, self-cleaning, closes [#238](https://github.com/miles202/dev-wayfile/issues/238) #330
  • ·security: baseline security response headers, closes [#300](https://github.com/miles202/dev-wayfile/issues/300) #313
  • ·segments: canonical start/end locations that derive each endpoint's tz, closes [#295](https://github.com/miles202/dev-wayfile/issues/295) #297
  • ·segments: harden manual segment entry — 8 types, tz autocomplete, required fields, closes [#203](https://github.com/miles202/dev-wayfile/issues/203) [#184](https://github.com/miles202/dev-wayfile/issues/184) #285
  • ·trips: auto-fill end date to day after start on trip forms, closes [#282](https://github.com/miles202/dev-wayfile/issues/282) #284
  • ·trips: merge a trip into another trip with segment dedup, closes [#314](https://github.com/miles202/dev-wayfile/issues/314) #315
  • ·trips: real hero images on create/ingest with attribution overlay #280
  • ·trips: two-pass cityscape query for hero images #281
  • ·ui: bump base font size to 17px for dense-content readability #278
  • ·ui: load Inter as the app font #276
  • ·ui: mobile-optimize trips list, trip detail, and segment detail, closes [#332](https://github.com/miles202/dev-wayfile/issues/332) #333
  • ·ui: readability tuning for dense content + record Inter in the plan #277
Bug Fixes
  • ·account: auto-save date format + refresh calendar feeds in place #291
  • ·changelog: drop broad *.md from .dockerignore so CHANGELOG.md ships, closes [#271](https://github.com/miles202/dev-wayfile/issues/271) #274
  • ·changelog: keep CHANGELOG.md in the Docker build context, closes [#271](https://github.com/miles202/dev-wayfile/issues/271) #272
  • ·changelog: parse the whole file (marker is at the bottom, not the top) #275
  • ·deps: force a single @opentelemetry/api so drizzle-orm resolves to one instance #324
  • ·ingest: idempotent inbound webhook + attachment size/count caps, closes [#299](https://github.com/miles202/dev-wayfile/issues/299) #312
  • ·pdf: embed Inter, conf once, never country-only locations, time-true day sort, closes [#317](https://github.com/miles202/dev-wayfile/issues/317) #318
  • ·segments: anchor manual segment times to their timezone; show the zone, closes [#294](https://github.com/miles202/dev-wayfile/issues/294) #296
  • ·trips: hard-reject manually-entered destinations that resolve to nothing, closes [#165](https://github.com/miles202/dev-wayfile/issues/165) #286

v0.3.0

June 10, 2026
Features
  • ·auth: passkey (WebAuthn) enrollment + sign-in ([#268](https://github.com/miles202/dev-wayfile/issues/268)) #240
Bug Fixes
  • ·ci: prettier-ignore release-please's CHANGELOG.md #265

v0.2.0

June 10, 2026
Features
  • ·account: sectioned settings layout + notifications prefs ([#39](https://github.com/miles202/dev-wayfile/issues/39)) #38
  • ·actions: revalidatePath for inline-click success paths ([#88](https://github.com/miles202/dev-wayfile/issues/88)) #74
  • ·admin console for roadmap + feedback ([#228](https://github.com/miles202/dev-wayfile/issues/228)) #227
  • ·admin+privacy: name source documents at ingest + user-controlled support access #160
  • ·admin: filter roadmap requests by status + inline edits without page refresh, closes [#241](https://github.com/miles202/dev-wayfile/issues/241) #242
  • ·admin: tenant-centric console — list, detail, dashboard, audit viewer, closes [#106](https://github.com/miles202/dev-wayfile/issues/106) #111
  • ·brands: admin Merge action to fold duplicate stubs into target, closes [#158](https://github.com/miles202/dev-wayfile/issues/158) #159
  • ·brands: brand profiles for airlines, hotels, cruise lines, etc. #141
  • ·brands: switch logo source to Logo.dev (publishable key) #143
  • ·calendar: all-day trip event + split hold segments into Start/End #200
  • ·calendar: per-user iCal subscription feed #198
  • ·calendar: rate-limit the unauthenticated iCal feed, closes [#243](https://github.com/miles202/dev-wayfile/issues/243) #264
  • ·calendar: TZID/VTIMEZONE so event tiles show the trip's local time #206
  • ·ci: add release-please workflow + CHANGELOG.md, closes [#181](https://github.com/miles202/dev-wayfile/issues/181) #182
  • ·flights: canonical schedule + amenity data via FlightAware /schedules/ ([#113](https://github.com/miles202/dev-wayfile/issues/113)) #112
  • ·geo: Mapbox forward-geocoder for canonical destination geo ([#110](https://github.com/miles202/dev-wayfile/issues/110)) #31
  • ·location: add autocomplete to edit page + warn on free-text destinations #148
  • ·ops: Pushover notification on new user signup, closes [#150](https://github.com/miles202/dev-wayfile/issues/150) #151
  • ·recover [#118](https://github.com/miles202/dev-wayfile/issues/118) hardening + [#109](https://github.com/miles202/dev-wayfile/issues/109) geo fix (lost during prod-launch firefight) #147
  • ·roadmap: add tag-scoped calendar feeds entry #246
  • ·roadmap: seed 16 planned entries + admin "add entry" action #239
  • ·show app version + build date in footer, closes [#186](https://github.com/miles202/dev-wayfile/issues/186) #188
  • ·snappier trip navigation — loading skeleton, pending buttons, cookie cache, hero priority, closes [#189](https://github.com/miles202/dev-wayfile/issues/189) #190
  • ·stream trip-detail weather strip behind Suspense #193
  • ·trip-card nav pending spinner + disable card prefetch, closes [#191](https://github.com/miles202/dev-wayfile/issues/191) #194
  • ·trip-detail: Expand toggle for multi-day segments (Closes [#62](https://github.com/miles202/dev-wayfile/issues/62)) #64
  • ·trips: 14-day weather strip + canonical destination autocomplete ([#146](https://github.com/miles202/dev-wayfile/issues/146)) #42
  • ·trips: canonicalize Airline sidebar filter via brand resolution, closes [#152](https://github.com/miles202/dev-wayfile/issues/152) #153
  • ·trips: derive title/city/country/hero-image from segments after parse (Closes [#57](https://github.com/miles202/dev-wayfile/issues/57)) #58
  • ·trips: manual hero-image upload + reset on trip edit (Closes [#60](https://github.com/miles202/dev-wayfile/issues/60)) #63
  • ·trips: move segment between trips ([#37](https://github.com/miles202/dev-wayfile/issues/37)) #21
  • ·trips: Processing section for in-flight inbound docs (Closes [#61](https://github.com/miles202/dev-wayfile/issues/61)) #65
  • ·ui: bigger brand icons, footer pinned to bottom, BETA tag, per-deploy version #197
  • ·ui: SubmitButton with useFormStatus pending state (Closes [#71](https://github.com/miles202/dev-wayfile/issues/71)) #78
  • ·ui: useOptimistic for tag add/remove on trip detail ([#87](https://github.com/miles202/dev-wayfile/issues/87)) #73
  • ·user feedback widget, roadmap voting, and changelog surfaces #226
  • ·weather: compact per-day weather badge inline with itinerary day headers #213
Bug Fixes
  • ·account-delete: clean up R2 blobs and Stripe customer ([#102](https://github.com/miles202/dev-wayfile/issues/102)) #101
  • ·account: delete trips before user to satisfy FK RESTRICT chain ([#99](https://github.com/miles202/dev-wayfile/issues/99)) #98
  • ·admin: guard /admin/roadmap before data fetch to stop RSC data leak #229
  • ·brands: replace Clearbit (dead) with Google Favicon; force unoptimized #142
  • ·brands: resolver short-circuit in ensureBrandStub, closes [#154](https://github.com/miles202/dev-wayfile/issues/154) #155
  • ·calendar: all-day trip banner dates in UTC to match the UI #202
  • ·contact-enrich: validate enriched URLs + pending state on the button, closes [#211](https://github.com/miles202/dev-wayfile/issues/211) [#210](https://github.com/miles202/dev-wayfile/issues/210) #263
  • ·db: default new tenants to a 14-day trial + backfill legacy rows (Closes [#45](https://github.com/miles202/dev-wayfile/issues/45)) #51
  • ·enrichment: resolve venue socials, not the booking platform's, closes [#261](https://github.com/miles202/dev-wayfile/issues/261) #262
  • ·env: alias GOOGLE_GENERATIVE_AI_API_KEY in load-env-dev.sh (Closes [#79](https://github.com/miles202/dev-wayfile/issues/79)) #80
  • ·env: ship apps/web/.env.example with non-secret runtime defaults (Closes [#46](https://github.com/miles202/dev-wayfile/issues/46)) #50
  • ·geo: disambiguate "CA" between California and Canada via prev token #103
  • ·geo: extract city + country from US-long-form addresses #83
  • ·inbound: prefer raw HtmlBody over stripped reply for forwarded emails #54
  • ·ingest: set placeholder trip dates to segment span ([#33](https://github.com/miles202/dev-wayfile/issues/33)) #22
  • ·itinerary: order same-day end boundaries by their real time, closes [#250](https://github.com/miles202/dev-wayfile/issues/250) #251
  • ·parser: allow Gemini to omit optional fields entirely (.nullable() → .nullish()) #56
  • ·parser: extract confirmation from email subjects + content-based merge fallback #95
  • ·parser: round-trip flight confirmations stop collapsing to one segment, closes [#167](https://github.com/miles202/dev-wayfile/issues/167) #185
  • ·prod: bypass pnpm at runtime to fix EACCES on /pnpm/.tools #137
  • ·prod: correct Dockerfile path in fly.toml + drop redundant CLI flag #134
  • ·prod: drop broken account-retrieve preamble in stripe price script #130
  • ·prod: finalize placeholder trip after async parse via Inngest #138
  • ·prod: move auto-merge of placeholder ingest into Inngest finalize #139
  • ·prod: provide build-time env placeholders for module-load validators #136
  • ·prod: redirect stdin in op item edit (same bug as seed script) #132
  • ·prod: redirect stdin in seed script's op calls #123
  • ·prod: replace corepack with direct npm i -g pnpm #135
  • ·prod: skip Next image optimizer for auth-gated /api/r2/ trip images #140
  • ·prod: tolerate Object-R/W token in setup-r2 (skip CORS ops on 403) #128
  • ·prod: tsx path in setup-r2-prod workflow #127
  • ·security: gate /admin/* at the edge + guard admin pages before data fetch, closes [#230](https://github.com/miles202/dev-wayfile/issues/230) #231
  • ·trip: clean up R2 blobs on trip-delete + image-replace/reset ([#105](https://github.com/miles202/dev-wayfile/issues/105)) #104
  • ·trips: correct correlated subquery for segmentCount (Closes [#67](https://github.com/miles202/dev-wayfile/issues/67)) #68
  • ·trips: derive trip status at read time so it advances over time, closes [#254](https://github.com/miles202/dev-wayfile/issues/254) #256
  • ·trips: Processing card → linkable to placeholder trip detail #145
  • ·trips: sort Upcoming section ascending by startAt (soonest first) #144
  • ·trips: trip start/end are date-only (Closes [#30](https://github.com/miles202/dev-wayfile/issues/30)) #34
  • ·ui: empty user.name no longer crashes /account avatar render, closes [#43](https://github.com/miles202/dev-wayfile/issues/43) #44
  • ·weather: instant CSS hover tooltip on the day weather badge #215
  • ·web: add tsx to apps/web devDeps #126
Performance
  • ·queries: parallelize getTripDetail awaits (Closes [#70](https://github.com/miles202/dev-wayfile/issues/70)) #77
  • ·ui: migrate TripHero + edit-page preview to next/image (Closes [#72](https://github.com/miles202/dev-wayfile/issues/72)) #81
Infrastructure
  • ·ci: add a next build job to catch deploy-only failures, closes [#249](https://github.com/miles202/dev-wayfile/issues/249) #253
  • ·prod: auto-write Stripe price ID back to 1P from workflow #131
  • ·prod: deploy artifacts — Dockerfile, fly.toml, deploy workflow #133
  • ·prod: one-shot GH workflow to apply migrations against prod Neon #124
  • ·prod: one-shot R2 prod bucket setup (CORS + smoke test) #125
  • ·prod: one-shot Stripe live Pro Annual price creator #129
  • ·prod: seed prod-wayfile 1P vault (one-shot) #122