Slabfy's comparison article is winning SEO and getting cited by LLMs. It also happens to be a feature roadmap handed to us for free. This deck maps every Slabfy feature (plus CollX & Ludex table-stakes) onto Cardboard — and where we make each one better.
Cardboard · thecardboard.app · local-first React 19 PWA + single Cloudflare Worker + Supabase + Card Hedge + Claude vision. Competitor: slabfy.com
Slabfy published "CollX vs Ludex vs Slabfy: Best Sports Card App" — a long-form article they wrote themselves. Two smart things happened.
Buyers searching "best sports card app" land on a page where Slabfy conveniently wins. Classic own-the-comparison content.
Because it's structured, thorough, and comparative, LLMs quote it as a source — so it recommends Slabfy inside AI answers too. That's the real prize.
Zero work required. These are live today and go straight onto the comparison page.
| Slabfy headline feature | Cardboard equivalent | Status |
|---|---|---|
| Price Check at shows | Quick price check — scan → value, saving optional | Shipped |
| Grade-ladder ROI | /ch/grades ladder + "worth grading?" upside signal | Shipped |
| Real-time values | Card Hedge FMV + daily reprice + two-clock trust line | Shipped |
| Collection tracking | Full inventory + 3-act portfolio analytics | Shipped |
| — neither competitor has — | Movers feed · sell-signals engine · offline-first PWA · demo mode | Our moat |
Eleven features, each tagged with its competitor source, complexity, and target phase.
| # | Feature | From | Complexity | Phase |
|---|---|---|---|---|
| 1 | Fees-aware profit math underpins Slabfy's "full profit math" | Slabfy | Low | 1 |
| 2 | CSV export + import CollX/Ludex migration wedge | CollX Pro | Low | 1 |
| 3 | Card Show POS — events, cart, per-show P&L | Slabfy | Medium | 2 |
| 4 | Want List — app UI + schema | Slabfy | Medium | 3 |
| 5 | Want List 24/7 eBay monitoring + alerts | Slabfy | High | 4 |
| 6 | Flip Finder — eBay arbitrage w/ profit math | Slabfy | High | 4 |
| 7 | "Ask Fy" AI agent — chat + portfolio tools + slab ID | Slabfy | High | 5 |
| 8 | Consignment management — splits, payouts | Slabfy | Med-High | 6 |
| 9 | QR-code Storefront — public for-sale page | Slabfy (theirs "coming") | Medium | 6 |
| 10 | Binders / tags (+ set completion) | Ludex | Medium | 7 |
| 11 | eBay listing / repricing | Slabfy | Very High | Deferred |
eBay monitoring, arbitrage, and an AI agent — the features that made people notice Slabfy. All three ride the single existing Cloudflare Worker we already run. No second service.
Everything eBay-flavored depends on getting this right. Good news: the read-only path is free and generous.
item_summary/search with app-level OAuth (client-credentials — no per-user consent). Free, 5,000 calls/day.
eBay won't grant a production keyset until you host a public Marketplace Account Deletion endpoint (challenge/response).
GET/POST /ebay/account-deletion to the Worker (~30 lines)EBAY_VERIFICATION_TOKENYou describe the card you're hunting and your max price. The Worker watches eBay around the clock and drops matches into an in-app inbox.
MoverDetailScreen. The eBay query string is built client-side by reusing the term-builder already inside ebaySoldUrl().worker/src/scan.js, hourly) — pulls due wants, Browse-searches each under max price, de-dupes hits into ebay_alerts.AlertsScreen with deep links.Dexie v5: wants, wantTombstones, alerts. Supabase: want_list + ebay_alerts with a unique(want_id, ebay_item_id) guard so the same listing never alerts twice.
US marketplace, fixed-price + auction, 20 active wants/user, hourly scan, in-app inbox only. Web Push is a later enhancement (needs iOS home-screen install).
Continuously flags cards listed under market, with the full buy-flip-sell math done for you.
Keep only rows passing a tunable FLIP_CONSTANTS block: MIN_PROFIT $20 · MIN_MARGIN 25% · title must contain player + year + grade (the fuzz guard).
flip_candidates table — one scan serves every user, so cost stays flat as users grow.FlipFinderScreen reads through marketCache.js — paints instantly, works offline.expires_at cleanup — listings churn fast.v1: movers-derived slabs. v2: also scan your want-list players + your own portfolio's cards, with user-tunable thresholds.
Slabfy's "Fy" knows your cards, knows the market, and IDs slabs by camera. We already pay for Claude in the Worker — this is a natural strength to lean into, not a new dependency.
Your portfolio lives in Dexie on your device, and the Worker has no user auth — so the Worker never executes tools. When Claude asks to use a tool, the client runs it locally, appends the result, and re-calls. Streaming SSE passes straight through the Worker.
The chat's "ID a slab" button reuses the existing /identify flow, injects the card JSON into the conversation, and the agent prices it via its tools + offers "add to inventory / want list."
get_portfolio_summary — reuses portfolioStats()search_my_cards · get_card_detail — Dexie queriessearch_market · get_fmv · get_grades · get_comps · get_price_history — existing market.js through the cache, so repeat questions are free + offlineget_movers · add_to_want_list · ebay_sold_linkSame daily-cap KV counter as /identify, a per-IP rate-limit binding, max_tokens 1024, history truncated to ~20 messages, 6 tool-rounds max, and prompt caching so multi-turn chats are mostly cached tokens.
The features that turn a collector app into a business tool — point-of-sale, consignments, a public storefront, and the migration wedge that pulls users off CollX and Ludex.
One schema bump adds shows, sales, consignors, payouts, wants + new card fields. All null-defaulted — zero data migration.
Today sync.js is hardcoded cards-only. Refactor to a table-driven SYNC_TABLES config with per-table cursors. Mitigation: refactor cards-only first (behavior-identical), then add tables one at a time.
New DealerScreen hub: active-show banner, Want List, Consignors, Storefront, CSV. Keeps the three collector tabs clean; every dealer feature gets a home.
Today profit = sale − cost in exactly two places. New fees.js adds channel presets and net-of-fees math:
Presets prefill, never lock. The regression test: null-fee legacy cards must compute identically to today. Everything (portfolio, inventory summary, flip math) inherits real margins.
Cards stay the source of truth — each sold card carries its allocated price + sale_show_id, so event P&L is a pure live query and portfolioStats needs zero POS awareness.
Track cards owned by other people that you sell. Consignor with a split %, per-card override, and a payout ledger (owed = Σ their cut − Σ payouts).
A public, shareable page of your for-sale inventory. Share the link or flash a QR at a show.
cost, fmv_*, or sale fields. Leaking a dealer's cost basis would be existential.GET /s/:slug as server-rendered HTML (no JS needed), 60s edge cache, on thecardboard.app.qrcode dep). "Ask about this card" → prefilled mailto/SMS/Venmo./s/{slug}.json logged out and assert the response contains no cost / fmv / sale fields. This is a ship-blocker check, not a nice-to-have.Hand-rolled RFC-4180 (no dependency). Export inventory + sales with computed net/profit. Import with a column-mapping UI + CollX/Ludex header presets and a 5-row preview.
imported-YYYYMMDD → filter + bulk-delete = instant undo.A tags array on each card (multi-entry index, jsonb in Supabase) — zero new sync tables. A binder is just a tag: "PC", "Show box A", "Grade candidates". Chip filters in inventory, tag editor in the card form.
Dependency-ordered. Each phase is shippable on its own. Fees + POS compound; sync generalization is the pivot everything downstream waits on.
Real profit margins, tag organization, and the CSV migration wedge. Only a user_cards ALTER — no Dexie bump.
Dexie v5, the hub, POS/cart/summary screens, card-picker sheet.
Table-driven sync engine + 5 new Supabase tables + cursor migration. The pivot that unlocks everything multi-device.
Synced want list + full consignor/payout/statement flow.
Hourly want-scan cron + alerts inbox, then the 2-hourly flip scanner + screen.
/agent streaming route, client tool loop, chat UI, slab-ID reuse.
Public view, Worker GET /s/*, storefront screen + QR.
Web Push alerts, EPN affiliate links, flip-finder personalization, binders screen.
Production keyset → EBAY_CLIENT_ID / EBAY_CLIENT_SECRET secrets + the account-deletion endpoint live before keys are granted. Browse API: app token, 5k/day, free.
CLI-first (Dashboard fallback per SOP): card ALTERs, 5 new user_* tables + RLS, want_list / ebay_alerts / flip_candidates, storefronts + public view. Migrate before shipping client.
New cron expressions (30 * * * * wants, 15 */2 * * * flips, keep movers prewarm), new secrets, agent rate-limit binding, KILL_EBAY + agent daily-cap counters, GET carve-outs for /s/* and account-deletion.
/s/* routes on thecardboard.app apex (QR carries the brand). One new npm dep: qrcode (CSV hand-rolled, Push uses WebCrypto). /agent rides the existing Anthropic key — no new account.
Pricing intelligence, sell-signals, offline PWA, movers — Slabfy has none of these. We start with a lead, not a deficit.
Everything rides the existing single Worker + Supabase + Claude key. One new npm dep. Read-only eBay is free at our volume.
CSV import pulls users off CollX/Ludex. The storefront beats Slabfy's "coming soon." Their own article becomes our comparison-page template.
Cardboard · Slabfy-parity master plan · full technical detail in vivid-weaving-island.md