Changelog
What we’ve shipped. Have an idea for what’s next? Vote on the roadmap.
v0.4.0
June 13, 2026Features
- ·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, 2026v0.2.0
June 10, 2026Features
- ·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
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