Building CardCore - April 17, 2026 - Founders, CardsHQ, and the Make-or-Break Window
The night before.
It is Friday, April 17. Tomorrow morning, a very tired version of me will load a van full of display cases, a Square Terminal, a backup Square Terminal, three phones with fully charged battery packs, a bag of zip ties, and a slightly unreasonable number of energy drinks, and will drive to Gas South Arena in Duluth, Georgia to run CardCore live at a 500-player Sector Qualifier.
I have done approximately everything I can do before that drive happens. I am writing this from the same kitchen table where I wrote the last one. The coffee is the same wrong temperature. The dog has given up and gone to bed. The inbox has stopped updating. And for the first time in two weeks I have that distinct, slightly unsettling feeling of a person whose todo list has bottomed out the day before the biggest day of his life.
So I am going to write to you instead.
This is the longer one. Buckle up.
Wednesday night at CardsHQ
Two nights ago I sat down to dinner with the team we are sponsoring.
If you have spent any time in the Georgia TCG scene you already know CardsHQ. It is one of the bigger stores in the state, a real gravity well of a shop, and the squad that rolls out of there is the kind of squad that actually wins things. These are not "players," quote-unquote. These are players. They travel. They test. They pilot decks that the rest of us spend a week trying to pronounce. And as of this week, they are playing with CardCore logos on their export images.
I had been talking to them on Discord and DMs and Zoom for weeks. This was the first time we were all in the same room with food in front of us, and I will tell you, there is a specific kind of relief you feel when you meet people you have been partnering with online and it turns out they are exactly as advertised. No sales pitch. No weird energy. Just a group of people who love this game, take it seriously, and are genuinely, visibly excited about what we are trying to build.
They told me things I needed to hear. They told me what their teammates at other stores are saying. They told me which tools of ours they have actually been using (good), which tools their friends keep bouncing off of (fair), and which features they would kill to have before Saturday (now on the list for next week). They asked me questions about the roadmap that were so good I had to pause and write them down. One of them pulled up The Lab on his phone to show me a deck he was considering for the SQ, and it was the single most validating thirty seconds of the entire project to date. A top-tier player using my software, on his phone, in a restaurant, voluntarily, because it was the best tool for the job he had.
The partnership I had been describing on paper suddenly had faces and inside jokes and a shared appetizer order attached to it. That matters more than I expected it to.
They are as excited as we are. They want this to work. They know what is on the other side of this weekend for us and they are treating it like their weekend too. I walked out of that restaurant at nine in the evening with a list of ideas and the very specific feeling of "oh, we are not alone in this anymore."
The twenty pre-orders nobody told me to do
Here is a thing that happens when you run a store for real players getting ready for a real tournament: people need cards. Not "I would love to have this card someday." Need. As in, my list is missing a Colossus and my round one is twelve hours from now and I need it in my hand before I drive.
We have fulfilled twenty pre-convention orders over the last few days. These are players who went to store.cardcore.gg, built out the missing pieces of their SQ deck, and clicked checkout on the expectation that their cards would be ready at the booth Saturday morning. Twenty times. Twenty players whose Saturday morning now starts with "walk up to the CardCore booth, say my name, get my cards, and go." Not "go rummage through a binder in a panic."
The pickup-at-convention shipping flow that went live this week (P3 in our pre-SQ sprint) is what made this actually work. We added it specifically for this weekend and it has already paid for itself in goodwill. I am sure that during Saturday morning setup a staff member is going to thank whoever decided that pickup orders should show up on a pre-printed list in picklist order. That whoever was me, three in the morning, Wednesday. You are welcome, Saturday morning Dan.
The ten trade-ins that ate my bank account
And here is where I get to eat some humble pie.
We also took in ten pre-convention trade-ins. These are players who wanted to get rid of cards, get credit, and use that credit to round out their decks before Saturday. They filled out the trade-in form from home, we reviewed, we counter-offered, we agreed, we paid, and ten sacks of cardboard will find their way into inventory this week.
Want to know what ten simultaneous pre-convention trade-ins do to a small store's checking account?
I do not.
I have checked it and I do not want to have checked it. The numbers are fine. The numbers are what they are supposed to be. The cards will sell. The credit will get spent, much of it this weekend, right back into the same store. This is how the flywheel is supposed to work. But there is a very specific, very physical feeling in the stomach when you see ten trade-in approvals hit the ledger in the same 48 hours and the outgoing line on the bank app starts to look like a ski slope.
I did this on purpose. Not the stomach part. The rest of it. The whole point of being the store that actually buys cards at a fair price before a big event is that players get to walk into the weekend with cash equivalent in their hands and the right deck in their case. That is the service. If the service costs me a rough 48 hours of "am I sure about this," then I paid that price and I would pay it again. It is the difference between being a shop and being a partner.
Let it not be said we did not put our money where our mouth is.
The Founders Club
OK. Let me tell you about the single most fun thing I shipped this week.
For a month now I have been watching our Discord fill up with people who found us before we were really ready to be found. They hung out. They told their friends. They filed bug reports. They said "hey, this is actually kind of cool" when the whole thing was held together with duct tape and a preflight script.
This week (COREAPP-1240) I gave them a badge.
The Founders Club is exactly what it sounds like. If you were a member of our Discord when we were still in our pre-launch window, you now carry a Founder badge on your CardCore profile, and you get locked into a shipping tier that will never expire and will never be matched again. The tier is locked at the top of the loyalty engine. The nightly tier-scoring job (which went live as Sprint C this week) literally has an if (founder) return branch. Future customers cannot earn it. It is not a rank you grind. It is a plaque on a door that says "these people were here before the door existed."
The grant script did a live Discord guild-membership check for every customer we have on file. 92 of 108 existing customers qualified. Ninety-two. That is an absolutely wild hit rate and it told me something I suspected but had not quite admitted: most of our earliest users came to us through the Discord, stayed in the Discord, and are still in the Discord. The community was here before the platform was. The platform just has to earn the community.
If you are in the Discord right now, not yet a customer, this is the nudge. Make an account this week. You might still be able to sneak in under the Founders wire. I am not going to tell you when it closes. I am not being coy. I genuinely do not know. It will close when I decide it has closed, and after that the door is welded shut forever.
Sixty-eight commits in forty-eight hours
The last blog was Tuesday. I am writing this Thursday night into Friday morning. Between those two sentences, sixty-eight commits hit main.
I am not going to describe all of them. That would be cruel to both of us. But let me walk you through the highlights of what changed since I last hit publish, because this is genuinely the most sustained building streak of my life and I want it on the record before I forget any of it.
The big ones.
P0 was a sitewide percent-off sale layer. Store-wide or per-game. Enforced server-side at checkout so you physically cannot game it from the client. Skips any variant we have already manually priced below market. Seventeen unit tests, a staff admin UI, a dismissible homepage banner. It is currently parked at zero percent because I need the levers in place before I touch them, but the levers are now in place.
P1 was the in-person cost-basis-transfer trade flow. If a customer brings you a stack of cards at the booth and you take it into the store, the cost basis now transfers cleanly from their side of the ledger to ours. No fudging, no reconciliation headaches at end of day, no mystery inventory that appeared from nowhere.
P3 was the pickup-at-convention shipping method I mentioned above. It unlocks the entire pre-order-for-the-event flow we used this week.
P8 was a full consignment MVP. Three new tables. A FIFO payout accrual helper that runs inside every inventory-decrement path we have, so when a consigned card sells, whether it sold online, at the POS, or got pulled into a repack, the consignor gets credited correctly on the same database transaction. Consigned stock also short-circuits the sale engine, because the store does not get to discount property that is not its own. That was a fun little safety rail to write and I am happy with where it landed.
P9 and P10 moved the in-stock filter to the results header on /cards and tacked a sale banner and strikethrough pricing onto both /cards and /store. The percentage off, when we turn it on, is going to be extremely hard to miss.
Also this week:
- Sprint B landed a proper shipping toggle on checkout, a real address form, a shipping quote endpoint, and server-side shipping validation. If you ship cards across the country, the weight and destination now drive the quote. No more single flat rate for everyone.
- Sprint C launched the nightly tier scoring engine, which quietly runs at 3am, reads your recent activity, and sets your shipping tier accordingly. Founders bypass this entirely.
- Un-cancel orders for staff. Atomic reversal. If credit was used to pay, credit gets re-charged in the same transaction. If the re-charge fails, the whole operation rolls back. The number of times I have watched a staff member cancel an order by accident and then panic is now zero.
- Counter-offer transparency diff view for trade-ins. When staff counter, the customer now sees a line-by-line "here is what you asked for, here is what we are offering, and here is why" instead of just a different number. Trust is built in the diffs.
- Heavy Play accessories now sync from a Shopify catalog. Sleeves, binders, deck boxes, mats. All live, all in-stock-aware, all visible on store.cardcore.gg/store behind a new Accessories tab. We also added a Cards / Sealed / Accessories tab row on that page because scrolling through everything mixed together was, in a word, bad.
- The Lab finally reached full filter parity with the deck editor. Card text search, trigger filter, rotation, cost ranges, sort options, arena, multi-cost. If you can filter it in the builder, you can filter it in The Lab.
- The homepage got a live partner widget that pulls in any YouTube or Twitch stream from our partnered creators that is currently live, with a staff CRUD UI and a cron that keeps it honest.
- Sealed product discoverability improved across the board with chips, a deep-link, and a proper create form for staff.
- The booth page got its N+1 query consolidated down to three queries. The booth stats page no longer hiccups under load.
- Checkout got Sentry instrumentation on the failure path and a double-submit guard. The one class of bug that absolutely cannot happen this weekend is "customer clicks Pay twice and gets charged twice."
- A PII leak in
/api/events/[eventId]got patched. Anonymous callers were getting roster data they should not have had. Now they do not. - An uptime pinger went live. Runs against a list of booth URLs and fires a Discord webhook alert if any of them stop responding. If Saturday goes sideways at the infrastructure layer, I want to know from the pinger before I hear it from a player.
- A staff sitemap page now exists at /staff/sitemap. Interactive. Searchable. Because I have 210-plus API routes and sixty-some staff pages and my own memory is no longer reliable.
And probably twenty other things I am forgetting. You can see the shape of the last two days. Ship, test, ship, test, ship. A lot of the fixes were from feedback the CardsHQ team gave me Wednesday at dinner and were in prod by Thursday morning. That is how I like the loop to feel.
Almost one hundred users after one week
Here is the number I am watching. One week in, store.cardcore.gg is sitting at just under 100 registered users.
That is, to be honest, more than I expected this fast. It is also, to be more honest, nowhere near enough.
The goal I wrote down on a sticky note last Saturday at the PQ was "triple it by the end of SQ weekend." Three hundred users by Sunday night. That is the bar. Not because three hundred is a magic number. Because three hundred after a 500-player event means we converted more than half the room into registered users, which means we did our job at the booth. Anything less than that and I have to ask what we left on the table.
If you are reading this and you are coming to the SQ Saturday, do me one favor. Stop by the booth. Make an account at the booth. Trade a card. Buy a sleeve. Hand us your Discord handle. Let us earn the Founder badge for you if you qualify. Let us show you the deck builder and The Lab and the trade hub and all the quiet little features that have been getting built for weeks specifically so that you would use them on a Saturday morning with a Sector Qualifier coming up.
Make or break. For real.
I am going to be direct.
This is a make-or-break window for CardCore.
Not in the dramatic "we will die if this fails" sense. The lights stay on either way. I have a backup plan and a backup plan for my backup plan. But in the sense of "is this actually going to be a thing, or is this going to stay a small and lovely hobby project that a guy in Georgia works on at his kitchen table at midnight." The answer to that question gets decided in the next 48 hours.
If the SQ works, if the booth moves, if players walk away telling their friends, if the sponsorship with the CardsHQ squad turns into content and content turns into signups and signups turn into a repeating flywheel, then CardCore becomes a thing. A real thing. A thing people type into their browser on purpose.
And here is the punchline I have been sitting with this week and I am just going to tell you outright, because this blog has always been honest and it is not going to stop now.
If this works, the only real reward is more work.
That is it. That is the prize at the bottom of the cereal box. If Saturday goes well, if the numbers come in, if the partnership pays off and the Founders Club grows and the booth line never stops moving, the thing I get to do on Monday morning is open a brand new initiative and start the actual hard part, which is getting CardCore working for Magic: The Gathering.
Magic is its own universe. Thirty years of sets. Tens of thousands of cards. Price data that moves faster. A buylist market that is so much bigger than SWU that comparing the two is almost unfair. The same tools that we built for SWU need to work for Magic, with Magic's weird quirks and Magic's existing tool ecosystem and Magic's very discerning, very loud player base, and they need to work well enough that a store owner with thirty years of Magic experience looks at it and says "yeah, I will use that."
That is the reward. A bigger mountain. No victory tour. No week off. Just the next climb.
And you know what? I am here for it. That is the deal I signed up for when I started this project. I wanted the hard thing. Saturday proves we can do the first hard thing. Monday I get to start the next one.
I cannot wait.
See you at Gas South
If you are coming Saturday: find me. I will be the guy at the booth who has not slept and is unreasonably excited to meet you. Wear your colors. Bring your list. Tell me what breaks. Tell me what you love. Tell me what is still missing. Say hi to the CardsHQ squad if you see them around, because they are the real deal and they are going to play some serious cards this weekend.
If you are not coming Saturday: you can still help. Make an account. Share the link. Join the Discord and become a Founder before the door closes. Every single user on the site right now is somebody who decided to show up early, and I am not going to forget that.
One week in. Almost a hundred of you. Tomorrow we make it three hundred.
Let's go.
The PQ was the small room. The SQ is the real room. The real reward is the bigger room after that. I will see you in all three.