Development only
Every route in the application, grouped and linked. This page is a developer surface — it is not linked from production navigation and it is marked noindex. Status is declared by hand in src/data/route-map.ts, which is the same source that generates docs/ROUTE-MAP.md.
67 routes shown of 67
States the positioning — upload once, see it on everything — and pushes to Studio or the flagship flag category.
Hero · SequenceStrip · StartWithYourBoat · LogoEverywhere · HowItWorks · MadeForTheWater · CollectionTeaser · SocialProof · BulkCta · ProductGrid — @/data/products, @/components/product/ProductRender, @/components/brand/SeaMoneyMark
The flagship category listing: every rectangular, burgee and pennant construction with blank-to-branded hover.
SectionHeader · ProductGrid · ProductCard · ChipGroup — @/data/products, @/data/categories
Performance shirts, tees and polos with decoration methods surfaced on the listing.
SectionHeader · ProductGrid · ProductCard — @/data/products, @/data/categories
Hoodies, quarter zips and shells — the cold-morning half of the apparel ladder.
SectionHeader · ProductGrid · ProductCard — @/data/products, @/data/categories
Trucker, rope, dad and bucket constructions, shown with the embroidered monogram mark.
SectionHeader · ProductGrid · ProductCard — @/data/products, @/data/categories
Towels, koozies, dry bags, coolers and mats — the products that finish a collection.
SectionHeader · ProductGrid · ProductCard — @/data/products, @/data/categories
Cut vinyl and die-cut stickers — the same artwork file at small format.
SectionHeader · ProductGrid · ProductCard — @/data/products, @/data/categories
Event landing: outdoor flags, booth kits, banners and displays, table flags, garden/car/cape flags, spec table and starter kits.
EventsLanding · EventsSpecTable · CollectionCard · UseCaseGrid — @/data/products, @/data/kits, @/data/photo-requirements
PDP for feather, beach, festival, garden, table, car and cape flags, banner, display stand, tablecloth and tent. Aliases folded-tent and table-cloth resolve here.
ProductDetail · ProductGallery · ProductConfigurator — @/data/products, @/data/options
Upload, preview, approve, produce — the four steps between a logo file and a shipped product.
ProgressStepper · SectionHeader · LifestyleFrame · ButtonLink — @/components/media/LifestyleFrame
Who CUSTOMS is and why the customer's brand — not ours — is the hero of every product surface.
PageHero · StepRail · SectionHeader · LifestyleFrame — @/components/media/LifestyleFrame, @/components/marketing/PageHero
Twenty-six answers on files, sizing, materials, turnaround, bulk and returns, filterable by search.
PageHero · FaqAccordion · Input — @/components/ui, @/lib/pricing
Direct line for artwork questions and custom requests the configurator cannot price. Form validates locally; nothing is transmitted in this build.
PageHero · Input · Textarea · Select · Button · Alert — @/components/ui
Pattern /{category}/{slug} for flags: size, material, print and finish options against a live flag render.
ProductRender · ColorSwatches · ChipGroup · QuantitySelector · SegmentedTabs · Badge — @/data/products, @/data/options, @/lib/pricing, @/state/cart
Pattern /{category}/{slug} for apparel: size runs, colourways, placement areas and decoration method.
ProductRender · ColorSwatches · ChipGroup · QuantitySelector · Badge — @/data/products, @/data/options, @/features/studio/placement, @/state/cart
Pattern /{category}/{slug} for hats, where the mark renders as an embroidered monogram.
ProductRender · ColorSwatches · ChipGroup · QuantitySelector — @/data/products, @/data/options, @/state/cart
Pattern /{category}/{slug} for gear — the low-price add-on that completes a collection.
ProductRender · ColorSwatches · QuantitySelector — @/data/products, @/data/options, @/state/cart
The core proof: upload artwork, place it on a live product render, choose colour and size, then add to cart.
UploadZone · ProductRender · ColorSwatches · SegmentedTabs · Drawer · Button — @/state/studio, @/state/cart, @/hooks/useHydrated, @/lib/customization
Apparel canvas with real decoration areas — left and right chest, full front, upper and full back (drawn on the garment's back), sleeves — per-area layers, placement presets and safe-zone guides.
ProductRender · ChipGroup · UploadZone · SegmentedTabs — @/features/studio/placement, @/data/options, @/state/studio
Pick products, apply one design across all of them and watch bundle pricing update live.
ProductGrid · ProductCard · Drawer · QuantitySelector · Alert — @/features/collections/generate, @/data/collections, @/lib/pricing, @/state/cart
The guided funnel into the builder: upload once, choose a starter bundle, generate the whole set.
UploadZone · ProgressStepper · SectionHeader · ButtonLink — @/data/collections, @/features/collections/generate
Curated bundles — Boat, Crew, Dock, Charter — priced as sets rather than individual products.
SectionHeader · Card · ProductGrid · Badge — @/data/collections, @/lib/pricing
Line items with their design previews, quantity breaks and the collection discount applied.
QuantitySelector · ProductRender · EmptyState · Alert · Button — @/state/cart, @/hooks/useHydrated, @/lib/pricing
Contact, shipping and payment steps with an order summary that never leaves the viewport.
ProgressStepper · Input · Select · Checkbox · Button — @/state/cart, @/data/orders, @/lib/pricing
Confirms the order the customer just placed, shows the production timeline and offers a one-click path back into Studio. Reads the session hand-off from checkout, falling back to the fixture order set.
OrderConfirmation · ProductRender · ButtonLink · Badge — @/state/last-order, @/data/orders, @/lib/customization
One-time setup: save a logo, brand colours and boat profile. Studio, collections, PDPs and the homepage preview start from it.
BrandKitEditor · UploadZone · ProductRender — @/state/brand-kit, @/data/boat-types
The brand home: active design, live orders, saved collections and the fastest route to reorder.
Card · CardHeader · OrderStatusPill · Badge · EmptyState — @/data/customers, @/data/orders, @/data/designs, @/data/collections
Every uploaded mark and its variants — primary, white, monogram, one-colour — ready to apply.
UploadZone · Card · Badge · SeaMoneyMark — @/data/designs, @/components/brand/SeaMoneyMark
Pattern /account/designs/[id]: one mark, its variants, colour values and every product it sits on.
ProductRender · SegmentedTabs · Card · Alert — @/data/designs, @/data/products
Configured products saved against the account — the reorderable catalogue of what the customer made.
ProductGrid · ProductCard · EmptyState — @/data/products, @/data/customers
Collections the customer has generated, with bundle totals and a direct reorder action.
Card · CardHeader · Badge · EmptyState — @/data/collections, @/lib/pricing
Pattern /account/collections/[id]: the products in one set, its pricing and its edit path.
ProductGrid · QuantitySelector · Card · Button — @/data/collections, @/lib/pricing, @/state/cart
Every order with its production status, so a customer can see where each job actually is.
OrderStatusPill · Card · UnderlineTabs · EmptyState — @/data/orders, @/lib/utils
Pattern /account/orders/[id]: line items, the production timeline, tracking and reorder.
ProgressStepper · OrderStatusPill · ProductRender · Card — @/data/orders, @/lib/pricing
One screen that turns past orders into a new cart — the repeat-purchase engine for crews and clubs.
QuantitySelector · Card · Button · Alert — @/data/orders, @/state/cart, @/lib/pricing
Who on the crew can order against the brand. Invitations render believably but send nothing in P0.
Card · Badge · Input · Select · Modal — @/data/customers
Brand profile, addresses and notification preferences. Persistence lands with the real backend.
Input · Switch · Select · Card · Alert — @/data/customers, @/data/orders
Volume pricing tiers and a quote request for tournaments, marinas and dealer programmes.
Input · Textarea · Select · QuantitySelector · Alert — @/lib/pricing, @/data/products
Standing programs for boat dealers, tournaments and clubs — the three segments the revenue plan is built on. What they get, how it runs, and the products it starts with.
PageHero · ProductGrid · LifestyleFrame · SectionHeader — @/data/icp, @/data/products
The B2B pitch: fleet branding, crew kits and dealer supply, with the bulk quote as the CTA.
SectionHeader · LifestyleFrame · Card · ButtonLink — @/data/collections, @/components/media/LifestyleFrame
The Sales OS landing screen (ADR-021, IA v7): six live numbers across the top — mailed, replied, waiting on pricing, pricing received, nudge due, held for Jesse — three with the accent rail, a horizontal lane / pricing / sort / replied-only bar, then the board by stage. Every number is a count of records from the book of business.
PipelineLanding · SupplierBoard · MoveConfirm — @/features/sales-os/book, @/features/suppliers/useFeeds, functions/api
The shared desk for the two people who run CUSTOMS: an update station (dated, who posted, which role), next moves ordered per project with owner chips, responsibilities in two columns, to-dos per project, and the launcher tiles. Browser-local, schema-versioned store. Filed under Tools; not a Sales OS section.
Launcher · UpdateStation · NextMoves · Responsibilities · Todos — @/state/workstation, @/state/actor, @/state/pipeline-side
Flips the Suppliers ⇄ Customers switch to Customers and sends you to the Workstation. The customer side is the same sections as the supplier side behind that switch, and it is empty by decision (ADR-017) until a real account exists.
CustomersRedirect — @/state/pipeline-side
Sourcing CRM, the Sales OS's first screen: the candidate factories in four views — kanban, tiles, sheet and list — filtered down to the list you are about to work, with lane summaries and CSV export. Scoring, the pre-payment checks and the timeline belong to the record a row navigates to. Under the Customers switch: an honest empty state.
SupplierCrm · SupplierBoard · SupplierTiles · SupplierSheet · SupplierTable · SideGate — @/data/suppliers, @/state/suppliers, @/state/pipeline-side
The front of the harvest loop (docs/sourcing/12): every record searched over the harvest fields — name, 名称, USCC, lanes, city, storefront URLs, email domain — with lane and email-status filters, and which field matched on each row. Type a factory name and see whether we already have it before anyone re-harvests it.
SupplierSearch · SideGate — @/features/suppliers/search, @/state/suppliers
The kanban as its own page — the book of business by stage. Drag to move; a move past an open gate item asks for a reason and logs it. Each column carries its pricing count (sheets sent / filled / price lists / quoted) and each card its pricing state, derived from the mail feed where a sheet link went out.
SupplierBoard · PricingPill · MoveConfirm · SideGate — @/state/suppliers, @/features/suppliers/pricing, @/features/suppliers/usePricing
Everything inbound across every supplier: typed entries with direction inbound, Instantly mail joined by the Instantly lead first and then by domain, phone rows joined by number, merged by key and never duplicated. Fails soft in one line, as the record does.
InboxPage · ActivityList · FeedNote — @/features/sales-os/book, @/features/suppliers/useFeeds, functions/api
Derived, not stored: tasks due on or before today and next actions past their date, meetings scheduled today, records with no gate item between them and their next stage, and the call-first queue. Every row links to its record.
TodayPage · ActivityList — @/features/sales-os/today, @/state/suppliers
The sourcing arithmetic, counted: lane summary, stage funnel with its real zeros, email-status split, scorecard distribution and reach. Nothing invented, nothing weighted.
SummaryPage · LaneSummary · BarRows — @/features/sales-os/summary, @/state/suppliers
The same figures over time, from the timeline's own timestamps and each record's updatedAt. One day of data is one point; no data is an empty state. There is no demo series.
ReportsPage · BarRows — @/features/sales-os/summary, @/state/suppliers
The honest what-is-connected board: read key and write key present or not, last feed fetch, the reply route probed (key present, nothing sent), every Pages Function asked live with its ok/reason, and the AI Reply Agent switch as a manual checkbox with a name and a date because Instantly exposes no API for it. Under next dev every route says no-backend, which is correct.
SystemsPage · AiAgentCheck — @/features/suppliers/useFeeds, @/state/systems, functions/api
The plan scripts/build-supplier-campaign.mts produces, rendered from the same inputs: one campaign per lane over the sendable records, with the approved copy read from docs/sourcing/10 §4 at build time. Labelled 'Plan — not created in Instantly'. Nothing here creates or sends.
CampaignsPage — @/features/suppliers/campaign, @/features/suppliers/csv, docs/sourcing/10
The reply loop from docs/sourcing/19 §1 as the graph it is, every node counted live from the book, and the 26 edge cases rendered as written. Replies leave from the record or the script; nothing on this page sends.
OutreachEngine · Markdown — @/state/suppliers, @/lib/authz
The logic page: what the key would unlock, which read scopes (emails:read, campaigns:read, accounts:read — no write), where the key lives, and the current state asked live.
InstantlyPage — @/features/suppliers/useFeeds, functions/README.md
One shelf, tabs inside: docs/sourcing 00 start-here, 05 scorecard (with the /11 correction note), 04 pre-payment checks, 10 outreach copy, 12 harvest loop — rendered as written by a dependency-free Markdown renderer — and the customer playbook from src/data/icp.ts.
ReferenceShelf · Markdown · IcpReference — docs/sourcing, @/data/icp, @/lib/markdown
This page. Every route in the application, grouped, filterable and linked. Development only.
RouteTable — @/data/route-map
Live specimens of every reusable component, token and product shape. Doubles as a regression sheet.
SpecimenSection · Button · ProductCard · ProductRender · Modal · Drawer — @/components/ui, @/components/product/shapes, @/app/globals.css
The full CRM record for one factory — the one record of the outreach (ADR-020). Left: identity, contacts, storefronts, the RFQ sheet and the pricing state. Middle: the six comm actions over one merged timeline — typed entries, the reply log's hand-sent replies, Instantly mail joined on the lead first, phone history — with channel chips, a composer, and a reply box that sends through Instantly on the thread it opened (disabled with the reason when it cannot). Right: sourcing analytics, not deal flow — the 10-criterion, 11-point scorecard, the 11 pre-payment checks, stage progress with gate issues, evidence gaps and landed-cost readiness. One page per research-seed id; browser-added records are served by /admin/suppliers/record.
IdentityColumn · PricingTile · ActivityColumn · ReplyBox · SourcingColumn · CommModal · StageMoveDialog — @/data/suppliers, @/data/reply-log, @/state/suppliers, @/state/actor, @/lib/authz, @/features/suppliers/timeline, @/features/suppliers/pricing, functions/api/email
The same record, for a supplier added in this browser. A static export can only generate routes it knows at build time, so records with a minted id arrive here through ?id= instead of a pretty URL. hrefForSupplier() picks between the two so both are real links.
SupplierRecord — @/state/suppliers, @/features/suppliers/href
The 50 supplier-catalogue frames sent to Ding on 8 September 2026, filed under the codes he quotes against, each linked to the storefront product it backs, plus the list of products still running on a silhouette alone. Read his price replies next to this.
CataloguePhotoFrame · Badge — @/data/catalogue-photos, @/data/products
Print-area mesh tool for the rendering pipeline: load a blank photo or placeholder, drag the quad or 3x3 grid, set physical size, watch the test mark composite live through the deterministic compositor, export mesh JSON. Browser-local until exported.
SegmentedTabs · Select · Input · Badge · Alert · Button — @/lib/mesh, @/state/meshes, @/data/products
A customer-hosted shop at their own handle, selling their branded catalogue to their crew. Documented, not built.
ProductGrid · SiteHeader · Checkout — Storefront service, @/data/collections, @/data/designs
Opens Studio straight onto one product with its options pre-selected, replacing the ?product= query. Documented, not built.
Studio canvas · ProductRender — @/data/products, @/state/studio
Where a customer configures, prices and publishes their own storefront. Documented, not built.
Card · Switch · Input — Storefront service, @/data/customers
Internal job board moving orders through design review, production and quality check. Documented, not built.
OrderStatusPill · UnderlineTabs · Card — @/data/orders, Production service
Server-rendered photographic mockups replacing the vector ProductRender silhouettes. Documented, not built.
@/components/product/shapes, Rendering service
Extracts colours, checks resolution and suggests placements from an uploaded file. Documented, not built.
@/components/ui/UploadZone, Vision service