Changelog
This page is a readable story of what changed, newest themes first within each year. It is not a commit ledger. For exact diffs, use GitHub or the milestone notes in changelog details.
2026
September
Find search suggests improving location accuracy after a results search (and once when opening the map with only IP geo); the location control toggles device GPS on/off; device/manual centers are not overwritten by result-pin fitting; Vercel/MaxMind Memphis IP points snap to downtown (not MEM airport); Memphis directory pins sit on land across the metro; unknown listings stay unpinned. Detail: 2026-09-13 — Find accuracy nudge and Memphis land pins.
Find category suggestions rank by token position (word-start before mid-string), so "f" prefers Fried Chicken over Seafood. Detail: 2026-09-13 — Token-ranked food category search.
Empty Find search no longer pitches trucks in the suggestion list — blank query is a valid map browse. Detail: 2026-09-13 — Empty search skips truck recommendations.
Light/dark chrome and page glow share one token clock (no mid-fade frost snaps); homepage store badges sit above Download App + platform selector. Detail: 2026-09-13 — Theme transition surfaces unify.
Nabla themes can store distinct light and dark COLR triples, the hero lockup runs a single heartbeat-style letter pulse (then a flat gap) and bounces Food/Truck/Nerdz on hover, the footer follows the session Nabla look, and the self-hosted Nabla woff2 is a plain git blob so Vercel actually serves the font. Detail: 2026-09-13 — Theme Nabla light/dark, hero motion, and Vercel Nabla font.
Nabla COLRv1 is self-hosted (variable EDPT/EHLT under family name Nabla) so hero and footer lockups no longer depend on Google Fonts for the wordmark. Detail: 2026-09-12 — Self-host Nabla variable font.
Fan homepage search moves into the hero, the Download control says Download App, and the dense single-row header (logo far left) stays on Find only — other pages keep logo + toolbar without a global search bar. Detail: 2026-09-12 — Hero search and Find-scoped chrome.
Footer round mark stays badge-sized (brand SVGs use width="100%"), Diana Montero credit stays on About / Brand Center only, Nabla wordmark CSS is unlayered so hero and footer keep the COLRv1 face, and Memphis seed typing unblocks Vercel next build. Detail: 2026-09-12 — Footer logo, Nabla cascade, Vercel typecheck.
Header search keeps IP geo as a coarse seed, but fine GPS is opt-in only: a navigation target next to the location field and Use my location / Improve location accuracy in the dropdown. Homepage and Find no longer auto-prompt for device location. Detail: 2026-09-12 — Location accuracy is opt-in.
Developers can check Convex declared-schema and table-data parity between a reference deployment and a personal/dev deployment via pnpm convex:schema-parity (--data counts, --content fingerprints, --json for agents) or /dev/schema-parity. Detail: 2026-09-12 — Convex schema parity tool.
Listing registration can go live with only a city (or no pin). Community photos get Gemini auto-review, show a truck-mark placeholder while pending or flagged, and can be manually flagged afterward for PR at /manage/pr/listing-media. Detail: 2026-09-12 — Listing media review and city-level location.
Owners can embed a FoodTruckNerdz-hosted location map on their own websites: MapLibre + OpenFreeMap, live check-in/schedule/base resolution, and a round FTN mark under the map that links to the truck profile. Manage Settings provides the iframe snippet. Detail: 2026-09-12 — Owner location website embed.
Host Mermaid diagrams now rewrite inline fill/stroke !important paints to var(--themed-svg-ftn-diagram-…) via local @dev-centr/themed-svg 0.2.2, so dark mode can recolor nodes after the Themed SVG runtime upgrades the image. Detail: 2026-09-10 — Host diagram CSS variables.
The authoritative badge now ships from one canonical SVG and themed-svg manifest into adaptive, host, fixed, truck-mark, PNG, and ICO formats. Header, footer, homepage, and About badges progressively follow the active site or saved logo palette; favicon and app-icon files stay fixed. A public Brand Center provides approved downloads and Diana Montero credit, while /theme/logo adds semantic light/dark controls and optional logo payloads to saved themes. Detail: 2026-09-09 — Theme-aware badge and Brand Center.
Food truck profiles now carry stronger name, cuisine, and location search signals, valid food-establishment structured data, and periodically refreshed metadata. A server-rendered directory gives every public listing a crawlable internal link, while the sitemap and site hierarchy support discovery and automated search-result sitelinks without a redundant search-box action. Detail: 2026-09-09 — Food truck search discovery.
Vercel installs now explicitly allow Puppeteer’s lifecycle script through the pnpm 11 workspace policy, and deployment builds use committed diagrams without launching Chrome. The project was renamed from ftn-site-nextjs to ftn-site without changing its stable project ID; the old short alias remains while team and branch aliases use the new name. The missing redacted Square use-case screenshot was also restored. Detail: 2026-09-08 — Vercel build and rename preparation.
Four AMDphreak-authored HCI diagrams now ship from canonical Mermaid sources with explicit manifests, adaptive fallbacks, host artifacts, and preserved fixed originals. The role-lens UI mock remains hand-authored and gains adaptive and host-themed variants without being represented as Mermaid. Detail: 2026-09-08 — Adaptive themed diagrams.
August
Operator scripts for the canonical GCP project food-truck-nerdz (FoodTruckNerdz Platform): Bitwarden sync for Gemini/OAuth into Convex and Vercel helpers, with Auth Platform web-client apply notes (IAP clients are not Sign-In). Detail: 2026-08-29 — Platform Google Cloud env sync.
Web Adapty access checks landed: server-side profile lookup via ADAPTY_SECRET_API_KEY, /api/adapty/access, and hasPaidAccess on the auth provider — complementing the existing Flutter adapty_flutter scaffold (mobile IAP + future Stripe sync still need dashboard products and Checkout wiring).
The marketing homepage gained an OS/arch-detecting Download control (GitHub release asset matching, platform override) plus official-style Google Play / App Store / Microsoft Store badges. Listings and Flutter packages are still empty, so the control and badges render disabled / Coming soon until assets exist. The web app stays on this origin (/find); app.foodtrucknerdz.com remains unused.
Browse and Search were combined into Find (/find): map plus header search on one page, old URLs redirect, header Download text link dropped in favor of the homepage control. The lockup switched from evenly spaced Sriracha to a Nabla FoodTruckNerdz wordmark (F/T/N in red/white/black) with a thin food-truck color band under the header. The band stays full-bleed: a constant viewBox path from left edge to right edge (wavelength as a fraction of that box) so browser zoom no longer retracts the right endpoint or opens a horizontal scrollbar. Follow-up: hamburger compact FTN stays (light: red / black / red; dark palettes frozen); the sticky header is the round mark only. The homepage hero and footer keep the full name with light palettes (red Food, black Truck, red Nerdz; yellow left COLRv1 extrusion, not the face), and the giant Find button came off / (search stays in the header). F, T, and N on the hero (and hamburger FTN) vary Nabla extrusion depth on a sine wave — Google Fonts must request the EDPT/EHLT axes, and the values are set in JavaScript so COLRv1 paint actually rebuilds. Hamburger FTN letters bounce on individual hover (a short CSS scale pulse, not another EDPT wave). Nabla wordmarks stay visibility: hidden until the COLR face reports ready so a hard reload does not flash fallback text. The red Login button uses a pointer cursor. On-site news and a blog were added. Homepage load may prompt for fine GPS (IP remains fallback); the contrast band floats over the header seam with a full-width black spline; light-mode FTN gained a red under-shadow against white. The header search bar is frosted glass over the contrast-band splines. A follow-up replaced multiply/hard-light washes with a cream/asphalt scrim plus blur so type stays readable while threads still sit under the bar.
Find’s desktop layout is map-first (map left, results overlay right) with /find query params for place, radius, and text search. The map stage now clears the header spline band (~100px top inset) and uses matching side/bottom gutters on desktop; the standard footer scrolls into view instead of infinite-scroll chrome. When Radar or tile init fails, the map shows an on-screen error instead of a blank gray panel; the layout Radar CDN script matches radar-sdk-js 4.5.1.
Address or area code plus Enter presupplies the worth-driving radius (10 mi) from the existing distance bands; the radius stays editable. The location field typeaheads while you type (US cities and area codes instantly, Radar places after a short pause). GPS on Find is silent.
The /about craft scene’s 3D truck was rebuilt as a curvy two-tone step-van (candy-apple red and cream, chrome belt, serving window and awning) instead of the old copper box.
Browser tab and Apple touch icons dropped the round badge: a cropped truck-only mark fills the square (baked cream/red paints plus an asphalt halo so it reads on light and dark chrome). Header, footer, homepage, and about still use the circular lockup.
Manage came out of public header and footer chrome: it is an owner function (work account context with an active membership), not a marketing control. Help is footer-only (including on Find). Desktop nav is Events (Events, Schedule, Venues) and About (About Us, News, Blog); Find left the top bar for a map icon in the location field. The footer uses the same groups as side-by-side columns (Events, About, Help, Get the app). Download is its own column, not nested under Help. Instagram and Facebook (foodtrucknerdz) sit in a footer icon row; X is coming soon with no live profile. Dropdowns stay open across the trigger–panel gap (overlap + padding hit area + 180ms close delay), including when the pointer approaches from below and the portaled panel appears under the cursor. The location field uses the same idea: it does not close on a delayed input blur after you click the chevron or the portaled list. Guests get one Login button; Sign up is a tab at the top of the dialog. The cream/asphalt page wash plus top glow paint on body so they continue under the transparent header fade into the spline band.
/dev/nabla and /dev/styles were sending anyone without a developer platform role (including local next dev) silently back to /. Local next dev now shows those catalogs without the production email allow-list; production still gates them but renders a visible denied page instead of a blank redirect. The floating FTN developer panel also appears in local next dev and links to the Nabla review (14 ten-slot options on white and black) plus a spline & search lab (/dev/splines) for thicker threads and glass blend presets.
Help, Support, and Privacy were rendering as a single wall of text: they used Tailwind prose without the typography plugin, so preflight stripped heading size, list bullets, and paragraph spacing.
A placeholder Terms of Service page at /terms supports OAuth and app-store registration URLs ahead of full legal review.
The retired SolidStart prototype (site-solidstart/) was deleted from the monorepo. The workspace is root + site-nextjs + shared; Next.js is the only web package.
Linked vault hosting guidance (Bitwarden cloud vs official self-host vs Vaultwarden) from Private docs & team secrets to Dev-Centr Business Bootstrap; FTN docs hub gained Business resources for Cal.com/Cal.diy, Penpot, and vaults.
Square Developer app renamed to FoodTruckNerdz; API version bumped to latest; use-case set documented (payments, customers, team, catalog). Credentials and OAuth redirect matrix recorded; secrets from Bitwarden synced into local env + Vercel (Square sandbox, Resend on updates.foodtrucknerdz.com, Radar, Stripe sandbox, Customer.io test keys, Adapty, Yoti sandbox, Linear inbound). Private-docs options (edge vs OIDC) and GitHub-org-secrets guidance captured.
Directory listings are now a first-class model: a truck is a real-world business, Square is optional, closed trucks stay registered and claimable, and Find includes closed only when the guest asks. After three years a closed listing is hidden, not deleted. Account close keeps records; erasure needs the privacy form.
A public directory seed compiles 879 unclaimed truck names from FoodTrucksIn.com and Memphis alliance/roster sources across 15 cities (Memphis through Denver/Houston). Names and sourceUrl attribution only — no copied logos or photos.
Listings gained a Square/Facebook-shaped company profile: logo, cover, up to 10 gallery photos, tagline, description, cuisines, dietary tags, price range, timezone, and extra social handles. Menu items keep one photo each. Owners upload to Convex storage; we do not scrape third-party logos into the catalog.
Route changes now crossfade by default (React view transitions on page content; header stays pinned). Clicking the header round mark pops with a short scale while navigation to / is in flight.
Nabla wordmarks (hamburger FTN, footer lockup, hero) stay hidden until the COLR font is ready so reload no longer flashes unstyled black fallback letters.
Signed-in guests get Account (/account) and Favorites (star in the header → Find with ?favorites=1). Favorites persist in Convex and filter the map and results list.
AI menu scan (web + mobile): photograph a menu, Gemini parses items on Convex, owner approves whole-menu and per-item before publish; fans can submit for claimed trucks.
Guests can customize a bounded theme on /theme (deeper editor at /theme/editor), save it with a name, and see the last three as footer swatches. The public Nabla live preview can edit all 10 COLR slots and EDPT/EHLT, apply the look to the header/hero for the session, and store that Nabla look with the theme. Developers review submissions at /dev/themes.
Header chrome put Find search above the toolbar row; / and /find autofocus the query field. Results navigations with a longer q land first on a three-character prefix, then upgrade to the full query during the route crossfade.
An app-style toolbar sits under search: Fan | Owner on the left with Map and Foods, then Events and About. The round logo sits left of the search bar and links home (no FTN logotype in the sticky bar). Owner mode swaps the homepage for owner marketing (Get found. Claim your business. Advertise to customers.) and gates /find (empty map + signup when logged out). Footer dropped Download. Hero live-trucks copy is its own line; location is a cobalt MapPin chip underneath. Download copy says App coming soon. Light hero/footer faces are red / black / red with yellow extrusion.
Owners can request follower marketing: FTN advertises to fans who favorited the truck, as a paid service. Manage /manage/marketing plus a PR queue; Customer.io send is still TODO.
Find map style settings let guests pick Roadmap / Bright / Mono / Dark / Fiord (OpenFreeMap). Light defaults: fan Bright, owner Positron (mono). Site dark defaults both lenses to fiord (OFM dark stays optional — too low-information for a default). Light and dark picks are stored separately per Fan|Owner lens; Map settings updates only the active theme’s preference. Overlay titles use --on-light / --on-dark against basemap luminance. Fan control overlays the map corner (left of Find my location); owner sits above the map.
Fan category chips moved off Find into a Foods directory (/food); the toolbar adds a Foods control beside Map.
Find map tiles use maplibre-gl directly with OpenFreeMap styles (no Radar.ui.map wrapper, no Mapbox). A Radar publishable key is not required to render the basemap — only for place search. If one OpenFreeMap style fails, the client tries another OFM style or shows a clear error. A follow-up matched the working OpenFreeMap Next demo: absolute inset: 0 map fill (percentage h-full inside the Find flex stage collapsed the MapLibre container to 0 height) and sync style URL init without a pre-flight fetch.
A public product roadmap page (AsciiDoc / Antora) lists capabilities by status for fans and owners; ops vendor research stays on the internal monitoring/testing note. The footer, About dropdown, and hamburger link Roadmap to that published docs URL.
Scrolling content under the hanging contrast-band threads is backdrop-blurred and cream/asphalt-screened via a fixed frost layer (sibling of the sticky header). Sticky-child backdrop-filter cannot blur page content behind a sticky bar; the fixed stack can. Chrome frost covers the top bar; hang frost fades through the splines into the page. An in-header overlay (.ftn-header-chrome-over-splines) mutes the threads under search and toolbar without breaking hang page-blur.
The header round mark (home) resets the Fan|Owner lens to Fan so / always shows the fan marketing homepage after a logo click.
Site light/dark toggle now crossfades theme color tokens (~250ms ease-in-out) instead of snapping; prefers-reduced-motion: reduce keeps the instant switch. A follow-up documents the shared clock (Theme transition speed unify); chrome and page-glow formula snaps were cleared later (Theme transition surfaces unify).
The public theme store on /theme lists saved custom themes with F/T/N light and dark letter previews, name search, and load-into-editor. Individual previews live at /theme/<id>. /dev/nabla demotes COLR slots 0 / 2 / 4 / 5 as low-visibility (font paint trees, not a wiring bug). Color wells keep a local draft while dragging; COLR CSS is rAF-coalesced, the EDPT wave freezes during the drag, and split preview uses one surface so the native picker does not hitch. Dragging EDPT / EHLT / amplitude on the Nabla live preview freezes display to the scrubbed value while the wave clock keeps advancing — release resumes the live phase without a restart.
Opening a Radix Select (for example on /dev/nabla) no longer unsticks the site header (overflow: clip on locked body instead of hidden) and no longer horizontally contracts the page (cancel RemoveScroll gap margin; scrollbar-gutter: stable on html). Menus stay portaled above the chrome.
On extra-wide viewports the header collapses to one row: Fan|Owner + Map/Foods/Events/About sit left of the logo, theme/login sit right of search, and the chrome fills page width. When that row no longer fits, it returns to the two-tier max-w-6xl bar. Frost height tracks the measured chrome.
The Antora website component uses version: ~ (default in the UI), not master — the git branch is not a docs version. Numbered hub components keep bare /component/ version choosers via @antora-supplemental/unversioned-component-urls.
The login dialog now includes email/password and Forgot password? (/reset-password, Resend when configured). Auth SQLite on Vercel uses /tmp so /api/auth/* no longer fails mkdir on the read-only Lambda filesystem.
Until release, local next dev and Vercel Preview share production Convex data; Preview builds skip convex deploy so branch code cannot push functions onto that backend.
Production Vercel builds were failing because vercel-build.mjs ran convex deploy --cmd through a shell (shell: true), which mangled the command into an extra positional argument. Dropping the shell got past that; Convex then failed loading bundled sharp on linux-arm64. Marking sharp as an external Node package lets Convex install the matching native binary on the action runtime.
Production deploys on the FTN Vercel team were failing typecheck because Convex _generated API lagged communityEvents. GitHub Actions was also targeting a personal Vercel scope; deploy now uses team slug ftn-cea058e2.
July
Adapty was chosen as the subscription management stack for paid app access (mobile IAP + future Stripe web sync), kept separate from business-team memberships and Square POS.
Customer.io (United States data center) was chosen as the messaging / marketing brain for Email, SMS, Push, and In-app — with Resend kept for hard transactional mail and Twilio for SMS transport. WhatsApp and Slack are out of scope for now.
Late July also locked email lane separation: Resend stays in application code on updates.foodtrucknerdz.com; human Gmail send-as uses ZeptoMail when needed; marketing stays on Customer.io (news.). Org DNS for Resend/DMARC moves toward the infra Pulumi repo.
Community events (meetups / conferences / workshops) landed as a separate model from truck gig listings, with a unified public schedule, RSVP attendee management, PR approval for FTN-affiliated branding, and a Yoti verification scaffold.
Late July: the public site redesign shipped — marketing homepage, Browse/Search discovery routes, red + cream identity with Diana Montero logo credit, account context switching, and SolidStart retired from deploy (archive footnote only).
Tooling: monorepo moved to pnpm 11.17.0 (Corepack) with allowBuilds in pnpm-workspace.yaml, and setup docs rewritten for Node 24 + the four workspace members.
Website performance monitoring and website testing were added to the ops roadmap with an explicit note that no vendor research has been done yet.
June
Next.js is documented as the official web stack; SolidStart is on hold. The site gained a developer platform role (users.platformRole), an FTN developer panel (floating control, not in public nav), and a /dev/styles catalog for card surfaces including optional liquid-glass-react cards.
April
Mid-month, deployment and backend work matured: Vercel and GitHub Actions were aligned with the pnpm monorepo (including deploying from the repository root), the Next.js build was relaxed when Convex URLs are absent at build time, and product work shipped for venues and events and auth, with docs updated to match.
Later in April, the public face of both web apps moved: a shared glassmorphism direction on Next and SolidStart, a SolidStart on-ramp with a 3D hero and geolocated search, and follow-up fixes for shared styles, logos, and layout. Documentation was reorganized in Antora (shared guides on the ROOT module; older material under the old-website module). A short-lived doc experiment about code signing in a release pipeline was reverted. The month ended with lockfile maintenance and small comment cleanups around Square and internal APIs.
March
Housekeeping and foundations: day-to-day editor settings moved to .vscode/, org naming and cross-links in docs pointed at FoodTruckNerdz on GitHub, and a batch of workspace updates was merged in from a fork. Separately, the map stack grew multi-provider support and client performance hooks, and code-workspace settings were refreshed from the shared template approach.
February
The monorepo took the shape you see today: pnpm and package metadata at the repository root, the Next app in site-nextjs/, Node 24 on Vercel, Biome for formatting and lint, and environment variables documented in Antora instead of only in ad hoc .env comments. Old migration paths and folder names were cleaned up, Zustand stores in the Next app were restored, and small doc quality rules landed (AsciiDoc list style, how to republish the doc site). That February wave sits right after a late-January security pass on React Server Components (below).
January
A React Server Components advisory was addressed through a merge from the fork queue, and a few default editor nags were toned down. The doc tree moved to a flatter docs/ layout, check-in behavior was captured in the published doc set, and pnpm became the default story in build instructions. JSON and code-workspace files picked up the same Biome treatment as the rest of the repo, and per-repository settings kept aligning with the common workspace template. This January work completes the move that began when Antora was introduced the previous fall.
2025
Late November
Repository layout, Git, and first-run deployment all moved at once: the Next app lived under a clearer subfolder, Vercel and Convex install and build lines were made explicit, example env files were committed on purpose, and a round of over-eager Git LFS tracking was unwound. Cursor and Turbopack cache ignores, pnpm config, and workspace metadata (including funding) landed in the same period, overlapping the Antora transition that had started in October.
October
Narrative content moved out of ad hoc READMEs and into Antora, with a root README.adoc as the shell for humans cloning the repo. An in-tree dev-setup GUI was extracted to its own repository so the monorepo could stay slimmer. Early October was mostly stashes and small doc nudges before that cutover landed.
See also
-
Repository — full git history
-
Milestone write-ups — commit anchors and
gitcommands where recorded