User portal overview
The public site at tcgkl.com — everything outside /admin. Pages live under
apps/web/src/app/(main)/; the data behind them comes from tRPC routers in
packages/core/src/server/trpc/routers/.
The surface, by area
Section titled “The surface, by area”| Area | Routes | Backing routers |
|---|---|---|
| Marketing & info | /, /about, /contact, /legal/[slug], /store-locator, /feedback |
site-settings, legal-pages, testimonials |
| Events | /events, /events/[slug], /events/archive, /events/[slug]/gallery |
publicEvents, eventArchive, artworkPieces |
| Artists | /artists, /artists/[slug] |
publicArtists, artists |
| Booking & checkout | /events/.../book, /checkout, /checkout/booth/[applicationId] |
bookings, reservations, bundles, vouchers |
| Tickets & profile | /profile, /profile/qr/[bookingId]/[itemId], /p/[token], /vp/[token] |
profile, bookings |
| Auctions | /auctions, /auctions/[slug], /auctions/[slug]/lots/[lotSlug], /auctions/[slug]/stream |
auctions, auctionChat |
| Stamp rally | /stamp-rally, /stamp-rally/[id], /stamp-rally/scan |
stampRallyPublic, stampRally |
| Vendors & partners | /collaborate, /collaborate/vendor, /collaborate/vendor/book, /collaborate/sponsor, /collaborate/media |
collaborate, vendorApplications, booths, partnershipLeads |
| Vendor self-service | /profile/vendor/applications, /profile/vendor/announcements/[id] |
vendorApplications, vendorAnnouncements, vendorApplicationMessages |
| Community & content | /news, /news/[slug], /membership, /merch, /comic-covers, /sponsors, /volunteer |
news, newsletter, merch, comicCoverPresales, sponsors |
| Messaging | /inbox, /inbox/[id] |
inbox, notifications |
| Tools | /tools/grading-calculator |
gradingAddon |
Things worth knowing before you change a page
Section titled “Things worth knowing before you change a page”- The cart is in the database.
cartsandcart_itemsplus the slot reservations hold the state; the Zustand store keeps onlycartIdandeventId. Clearing browser state does not clear a cart. - Pass pages are private.
/p/[token](entry pass) and/vp/[token](signing pass) render from a signed QR token and are markednoindex. The token is the credential; do not leak it into analytics or logs. - URL state uses nuqs. Filters, tabs and pagination belong in the URL via
useQueryState, never in local state plusrouter.push. - Dark mode only. There is no light theme to test against.
