CardCore
Back to Blog

Building CardCore - March 31, 2026 - Twin Suns Builder, DB Pool Crisis, and 16 Commits

March 31, 20266 min readBy Dan Vohasek
building-in-publicstar-wars-unlimitedtwin-sunsdeck-builderinfrastructurefeaturesbug-fix

Twin Suns Builder is live

The headline feature today: CardCore now has a dedicated Twin Suns Builder. If you're not familiar, Twin Suns is a fan-favorite SWU format - 80-card singleton decks built from two leaders and one base. It rewards creativity and deckbuilding skill in a way that standard constructed doesn't.

We didn't just give you a card search and say "figure it out." We built curated modules - pre-built 30-card packages designed around specific leaders and strategies. Browse the library, pick two leader modules and a base module, and your deck assembles itself. Each module shows a difficulty rating (Beginner, Intermediate, Advanced), a strategy description, and a live market price from our pricing engine.

The builder launched with 8 leader modules and 4 base modules. Sabine's Rebellion, Rex's Battalion, Vader's Fist, Thrawn's Gambit, Palpatine's Empire, Han's Gamble, Guardians of the Whills, and Crimson Dawn on the leader side. Kestro Assault, Command Center, Scarif Defense, and Jedha Intrigue for bases. Prices range from $14 to $80 depending on the cards involved.

Behind the scenes, we also built a full import and validation pipeline (COREAPP-823) so new modules can be reviewed, validated against the card database, and published through a staff workflow. No manual card-by-card entry - import a module definition, the system resolves every card, flags anything it can't find, and presents it for review before publishing.

The site went down - DB connection pool exhaustion

Let's talk about the bad part of the day. The site went completely unresponsive. Pages hanging. API timeouts. Everything frozen.

Root cause: database connection pool exhaustion (COREAPP-830). Our PostgreSQL setup runs 300 max connections, and between the web app's 4 PM2 instances (10 connections each across 4 pools) and the Twin Suns importer running batch queries, we were maxing out. The importer was spinning up its own pool with default settings - 10 connections - on top of everything else. Under load, connections weren't being released fast enough and the entire app ground to a halt.

The fix was two-part. First, we capped the Twin Suns importer's pool to 2 connections and batched its tier-2 resolution queries instead of firing them individually (COREAPP-829). Second, we reduced the main app's pool sizes to leave more headroom. The connection budget is now documented: 160 web + 20 bot = 180 used, 120 headroom out of 300 max. This one earned a postmortem.

Checkout was rejecting valid orders

Another urgent fix: the checkout system was rejecting orders that should have gone through (COREAPP-828). The issue was a mismatch between effective pricing and raw pricing. CardCore uses an effective price layer - when market conditions create a price squeeze or a card is in presale, the system calculates an adjusted price. The checkout validator was comparing the cart's effective price against the raw market price and seeing a difference, then blocking the order.

The fix removed the redundant raw-price check. The server already validates through the effective pricing engine - the extra check was just creating false rejections. Orders flow through cleanly now.

Collection dashboard - from slow to instant

The collection dashboard had a nasty N+1 query problem (COREAPP-832). Loading a user's collection was firing individual database queries for each card to fetch pricing data. If you had 200 unique cards in your collection, that was 200 separate queries. The page was visibly slow.

We rewrote it to batch all pricing lookups into a single query and added a total collection value display at the top. Your collection page now loads fast and shows you exactly what your cards are worth in aggregate.

Feature discovery pass

Sometimes features exist but nobody knows about them. Today we did a discovery pass (COREAPP-831) to fix that:

  • Want Board (formerly Wishlist) got renamed across the entire app. "Want Board" is more descriptive and less generic than "Wishlist" for a trading card platform.
  • Repack onboarding - new users landing on the repacks page now see an explanation of what repacks are and how they work, instead of just a grid of packs with no context.
  • Post-login token notifications - if you have pack tokens waiting, you now get a notification after signing in. Previously you'd only discover them by navigating to the repacks page.

Deck editor fixes

Two deck editor bugs squashed today:

  • COREAPP-827: You couldn't split copies of a card between maindeck and sideboard. If you had 3 copies of a card and wanted 2 in main and 1 in sideboard, the editor would move all 3. Fixed - cards can now be distributed across zones.
  • COREAPP-810: Twin Suns decks with two leaders were showing the same leader image twice in the deck thumbnail. The preview generator wasn't accounting for the two-leader format. Fixed - both leaders now render correctly.

Everything else that shipped

The rest of today's commits, in no particular order:

  • COREAPP-826: Completing an order now properly clears its pickup claim. Previously, fulfilled orders still showed as "claimed" in the staff dashboard.
  • COREAPP-825: Staff navigation got reorganized - sections are cleaner and we fixed a duplicate QR code icon that was showing up twice.
  • COREAPP-824: The repack pool health dashboard now shows total card quantity alongside unique variant counts. Knowing you have 47 unique variants is useful, but knowing you have 312 total cards in the pool is more useful for restocking decisions.
  • COREAPP-822: We built a /hello QR landing page for business cards, then immediately moved it to the marketing site where it belongs. The store app redirects to it.
  • COREAPP-819: QR check-in and dashboard links now show on all events, not just tournaments. Previously, non-tournament events had no way to access the check-in system.

The full ticket count

Sixteen commits. Twelve Plane tickets moved to testing:

  • COREAPP-832: Collection dashboard performance + total value
  • COREAPP-831: Feature discovery pass
  • COREAPP-830: DB connection pool exhaustion fix (urgent)
  • COREAPP-829: Twin Suns importer pool limiting
  • COREAPP-828: Checkout effective price validation fix (urgent)
  • COREAPP-827: Maindeck/sideboard card splitting
  • COREAPP-826: Order pickup claim completion
  • COREAPP-825: Staff nav reorganization
  • COREAPP-824: Pool health total quantities
  • COREAPP-823: Twin Suns import/validation pipeline
  • COREAPP-822: Business card QR landing page
  • COREAPP-821: 4 new Twin Suns modules
  • COREAPP-819: QR check-in links on all events
  • COREAPP-810: Twin Suns deck thumbnail fix

Two urgent production fixes, one performance rewrite, one brand-new feature with 12 modules, and a stack of quality-of-life improvements. Not a bad Monday.

What's next

The Twin Suns Builder needs more modules. We're watching what leaders and strategies the community is actually playing and building packages around them. The April 12 PQ is twelve days out and the check-in system needs real-world stress testing. And the collection dashboard's total value feature opens the door to portfolio tracking over time - showing how your collection's value changes week to week.

Try the Twin Suns Builder at store.cardcore.gg/tools/twin-suns-builder.


Sixteen commits, two production fires, one new format tool. That's a Monday.