CardLoop
Global and regional marketplace for trading card games: Laravel API, React/TypeScript frontend, custom fee, risk, and AI-scan domains — currently a Phase 1 foundation.
CardLoop is designed as a global and regional trading platform for trading card games: international reach for listings combined with local handover, trust points, and a TCG-specific trust model built on condition proofs, shipping quality, and audit trails. The project is in Phase 1 — architecture, domain model, and some of the core flows are in place; it is explicitly not yet a production-ready trading platform.
Gallery
Case Study
Situation
TCG trading suffers from inconsistent condition descriptions, weak evidence in disputes, and distrust around high-value single transactions — made worse once global reach and local handover have to coexist in the same system. CardLoop pursues this deliberately as a solo effort built from the ground up: domain model, compliance, and payment analysis first, implementation second, rather than UI first and business logic afterward.
Challenge
Marketplace payments (split payments to sellers) and SaaS billing (premium subscriptions, scan credits) are deliberately modeled as two separate domains with their own provider abstraction, not as one system — a documented evaluation of Adyen for Platforms, Stripe Connect, and Stripe Billing against split-payment capability, KYC/KYB, and usage billing precedes the provider choice, before any contract or compliance sign-off even exists. A real finding from ongoing development: scans, auctions, premium/billing, and protection were running into a NetworkError through a dead feature-flag mechanism in local dev, instead of a working mock state — fixed with one explicit mock flag per domain instead of a single global switch. On the identity side, there was a deliberate course change: instead of fully migrating the marketplace logic already modeled in Eloquent, policies, and Filament resources over to Supabase/Appwrite, Laravel remains the sole system of record for business data — Appwrite supplies only identity and browser session, and a server-side, Appwrite-verified JWT synchronizes the local users row.
Approach
Laravel 12 with PHP 8.4 as a monolith-first API backbone with clear domain boundaries (listings, orders, fees, billing, risk, scans, auctions), PostgreSQL, Redis for cache/locks/queues, Filament for the admin panel. Frontend as a React 18/TypeScript application with Vite, Tailwind CSS, and TanStack Query; a documented mock architecture encapsulates all data access behind src/lib/api/*, so the gradual switch from mock data to real endpoints leaves page structure and components unchanged. A commit in June 2026 moved the core flows — auth, marketplace search, watchlist, cart, checkout, orders, seller dashboard, uploads — from that mock state onto real Laravel API calls; scans, auctions, premium/billing, and protection are deliberately still mock-only.
Decisions
Marketplace payments and subscription billing are separate interfaces with a documented provider analysis (Adyen, Stripe Connect, Stripe Billing) — no commitment before compliance sign-off and a contract are in place.
Fixed after a real bug where a dead fallback mechanism sent four areas into a NetworkError instead of a working mock state, resolved with dedicated flags per feature.
No full migration of the already-modeled marketplace logic into Appwrite collections — a server-verified JWT synchronizes a local user row instead.
Structured outputs from the vision-provider abstraction are checked server-side against a JSON schema and never treated as a legally binding authenticity or condition guarantee.
Mandatory proof requirements, payout holds, and a moderated claims process instead of an insurance promise, as long as there is no partner and no legal review behind it.
My contribution
All commits are by Felix Schattenberg, built solo: domain model, compliance and payment-provider analysis, Laravel backend including the Filament admin, React/TypeScript frontend with a documented mock-to-API architecture, Appwrite identity integration.
Results