2026-08-18 — Directory listings lifecycle

Summary

Food trucks are modeled as real-world directory listings, not Square locations owned by a user row. Closed trucks stay registered and claimable. Find can include closed listings as an opt-in. After about three years a closed listing is hidden (delisted), never deleted. Square is an optional POS attachment. Personal data is erased only after a deletion-request form.

Highlights

  • New businesses tenant table. foodTrucks.userId and squareLocationId are optional so unclaimed directory rows can exist.

  • Listing fields: operatingStatus (operating / closed), listingStatus (listed / delisted), claimStatus.

  • Find default is operating + listed. closed=1 includes closed listed trucks. Developers can include delisted.

  • Account close keeps trucks and Square credentials. Erasure unclaims trucks and tombstones the user; the directory row stays.

  • Privacy form at /privacy/deletion-request (account close, erasure, listing removal). Not legal advice: the directory is a compilation of a real-world business; personal data is erasable on request; a listing can remain unclaimed unless they also ask for delist.

  • Idempotent Memphis seed (She Shed closed, Paper Plate Pavilion closed, Smoke And Rolls operating) runs after production Convex deploy. Do not treat paperplatepavilion.com as that business.

  • Instagram/Facebook are a live public bridge for later description generation, not source-of-truth copies we store. Later cheap text models (Gemini Flash, Groq, or xAI) may draft copy from those public pages — not built in this change.

Deploy

Schema and functions land on production Convex only with a production Vercel build (convex deploy). Until then, seed/backfill/export mutations exist in the repo but cannot run against the shared production data plane from Preview or local convex dev.