v1.13

Patch Notes

Plain-English summary of what shipped each version. Newest first.

v1.13

2026-06-20

v1.13 — install OP-Atlas as an app (now for everyone, in Thai too), a fresh app icon, and faster Collection & Watchlists

  • Install OP-Atlas on your phone
    You can now add OP-Atlas to your home screen and open it like a real app — fullscreen, one tap, no app store. The 'Install app' button is available to everyone now (it was admin-only while we tested it), with a clear step-by-step guide for your exact phone and browser, in both Thai and English. It opens with a quick logo splash, and we gave the app icon a glow-up: a single gold compass star on a deep-blue background, on your browser tab and home screen.
  • Faster Collection & Watchlists
    Your Collection and Watchlists pages now open the instant you tap them — no more waiting on a full reload. While the cards fill in, you'll see soft placeholder shapes so the page feels alive immediately instead of sitting blank.
  • Fresh prices across every market
    We pulled the latest prices from every market we track — Cardmarket, TCGplayer, CardTrader, Yuyu-tei and PriceCharting — so the numbers across the site are current.

v1.12

2026-06-18

v1.12 — a fresh animated sign-in, a cleaner card page, the smartest price estimates yet, and snappier navigation

  • A brand-new sign-in page
    Signing in just got a glow-up: card art and price tags drift gently across the background, the sign-in button takes you straight there in one step, and the whole thing reads cleanly on a phone. The open-beta countdown is tucked neatly into its own little tag instead of taking up a banner.
  • A cleaner, clearer card page
    Every card page is tidier now. The card's name sits on its own line at the top with its language tag (JP/EN) right after it, so the name is always the first thing you see. The extra type tags — leader, alt-art, the print edition — moved into the 'Details' section so the top stays uncluttered. The price graph now quietly marks WHEN we improved our pricing method and what changed (in Thai too), and tapping the little confidence chip opens the full 'how we got this price' breakdown.
  • Smarter, more trustworthy prices
    Our price estimate got two upgrades. It now remembers each card's usual price, so a single weird listing can't suddenly drag the estimate up or down. And when the shops we trust most badly disagree with each other, it now drops the one that's clearly broken instead of letting it skew the number. On top of that we pulled fresh prices from every market and did a big hand-review pass — clearing hundreds of wrong-market readings — so prices across the site are both fresher and more accurate.
  • Snappier little things
    Tapping the logo to go home now shows a quick loading bar, so it feels responsive instead of dead. Search kicks in from two letters, and you can sort the grid by value.

v1.11

2026-06-15

v1.11 — a beautiful new price graph on every card: cleaner source tags, a grade picker for graded prices, and a faster-feeling home page

  • A redesigned price graph on every card page
    The price chart on each card just got a full redesign. The little source tags are shorter and cleaner — TCG, CM, CT, PC, SNKR — and each one links straight through to that shop. Tap a tag (or a line) to focus a single market and dim the rest. The lines now draw themselves in as the chart loads, the numbers count up, and hovering over any day shows every market's price for that day side by side. It reads far better on a phone too: a shorter chart, the timeframe picker moved up top, and the whole thing tuned to take less of your screen.
  • A grade picker for graded-card prices
    Switch to the Graded view and you'll find a clean row of grade buttons — All, 10+, 10, 9.5, 9, 8 — each showing the price range for that grade at a glance. Tap one to zoom into just that grade and see every grading company's price together, with the highest one drawn boldest so the chart stays readable instead of a tangle of overlapping lines.
  • A faster-feeling home page, and tidier cards on phones
    The home page used to look frozen while all the card images loaded in. Now each picture shows a soft shimmer and gently fades in as it arrives, so the page feels alive from the first second. On phones, the card tiles are tighter with bigger, easier-to-read prices, and the filter button is clearer to spot.

v1.10

2026-06-12

v1.10 — thousands of special card prints get their own pages and prices, and your custom watchlist folders now sync across all your devices

  • Over two thousand new card prints, each with its own prices
    We added more than 2,000 special versions of cards that didn't have their own page before — championship and tournament prints, anniversary editions, pre-release cards, and the various event and promo prints. They now show up in search by what they are: try "championship Luffy" or "anniversary Yamato" and you'll find them, each with its own image, prices, and value estimate. Many already pull prices from several markets at once.
  • Your watchlist folders now follow you across devices
    If you made folders to organise the cards you're watching, they now save to your account and show up everywhere you sign in — phone, laptop, anywhere. A quiet bug had been stopping custom folders from saving across devices; that's fixed, and any folders you'd already made are carried over automatically the next time you open the app.
  • Small fixes
    The profile editor in your collection now reads fully in Thai, and we cleared out a batch of background errors that were happening behind the scenes when you browsed while signed in.

v1.09

2026-06-11

v1.09 — sharper prices: Japanese and English cards no longer mix up each other's market prices, card pages hide readings we'd already thrown out as a wrong match, and the collection import page now reads in Thai

  • Japanese and English prices no longer get crossed
    A Japanese card and its English twin share the same card number, and that was occasionally letting one borrow the other's prices — so a Japanese card could show an English-shop price, or the other way round. We tightened how each card is matched to every market (CardTrader, TCGplayer, SNKRDunk, Yahoo) so a card only ever picks up prices for its own language. SNKRDunk in particular now finds the right-language listing: English cards read English listings, Japanese cards read Japanese ones.
  • Card pages stop showing prices we'd already rejected
    When a market's price clearly belongs to a different version of a card — like a Cardmarket average for a sealed box or a bundle showing up on a single card — our estimate already ignores it. But the little price tag for that market, and the line on the chart, were still showing it, which looked like a real price. Now those rejected readings drop off the tags and the chart too. We also clear out leftover prices from a market we've since un-linked. A price that's simply gotten old is kept but dimmed with an 'old' tag. Genuinely correct prices still show — even unusually high or low ones — so you can always see and double-check them.
  • The collection import page now reads in Thai
    The page where you bring your collection in from a spreadsheet (Collection → Import) is now fully translated, so the step-by-step — picking your columns and matching each card — reads in Thai when your language is set to Thai.

v1.08

2026-06-06

v1.08 — your collection becomes a real ledger: open any card for its own page, log what you paid, mark cards bought or pulled, record your sales, and import or export your whole collection as a spreadsheet — plus a faster collection page and fresher prices

  • Tap any card you own to open its own little page
    On your collection, click a card and a detail view floats up over the page. It lists every copy you've logged — how many, the day you got it, what you paid, and any note — and shows how that one card is doing: what it's worth now, what it cost you, and your profit or loss. No need to leave your collection to dig into a single card.
  • Write down what you paid — in any currency
    Open a card's detail and add the price you bought it for. Pick the currency (฿, $, €, ¥…) and we convert it for you. Once you've logged a price, your profit or loss for that card uses your real cost instead of an estimate. Didn't pay anything because it was a gift or a lucky pull? Leave it blank and we'll estimate from the card's value on the day you added it.
  • Mark each copy Bought or Pulled
    Tell the tracker how you got each card — bought it, or pulled it from a pack — with one tap. It's a nice way to look back later and see how much of your collection's value came from the wallet versus a lucky pull.
  • Sold a card? Log it and keep the record
    When you sell, record it: how many, the price, the currency, and a note. Your collection count goes down and a little 'Sold' history builds up on that card, so you can look back at what you cashed out and for how much.
  • Bring your whole collection in from a spreadsheet
    Already keep your cards in a spreadsheet? Upload it. Tell us which column is the card code, and — if you have them — which columns are the price you paid, the date, a note, and whether you bought or pulled it. Then we walk you through matching each row to the exact version of the card (base print, alt art, manga…). It saves as you go, so you can stop partway and pick up later. Starting from scratch? Download the blank template first.
  • Take your collection back out any time
    One button downloads your whole collection as a spreadsheet — every card, how many you own, what you paid, and what it's worth now. It's your data: keep a backup, or open it in Excel or Google Sheets whenever you like.
  • A faster collection page and fresher prices
    Your collection page used to make you wait for everything — the card list, every price, and all the totals — before showing a thing. Now it appears right away and each part fills in on its own. We also pulled fresh market data and re-checked a batch of cards whose price had drifted onto the wrong version, so more of your cards show a price backed by several markets at once.
  • See how each card's done since you added it — right on the tile
    Every card in your collection now shows, on the tile itself, how much it's worth more (or less) than the day you added it — as a percentage and in ฿. Your winners and your duds jump out at a glance, with nothing to open.
  • A quick − / + on every card to fix your counts
    Open any card you own and there's a small − / + right there to change how many copies you have. Cracked another one out of a pack, or traded one away? Adjust it on the spot instead of going back to the add screen.
  • Cards you pulled now count as free
    If you marked a card as 'pulled' rather than bought, it now counts as ฿0 spent in your profit math — because you didn't pay for it. Your profit and loss reflects only the cards you actually bought, so the number means what you'd expect.
  • Sealed boxes now read like a timeline
    On the sealed-products page, each section now lists boxes and packs in the order the sets came out — newest first — instead of by price. It reads like a timeline of the game, which makes the set you're after much easier to find.
  • A few touches that make the collection nicer to use
    The card detail view now opens centered on your screen instead of drifting to a corner, so it's easier to read on a phone or a wide monitor. And the filters and the search box now share one tidy row, so there's less hunting through controls and more looking at your cards.

v1.07

2026-06-04

v1.07 — Collection opens to everyone, these patch notes now read in Thai, card shares show Thai Baht, every price shows how much to trust it, plus fresher data and a couple of nav fixes

  • Anyone signed in can build a collection now
    Tracking your cards used to be locked to admins. Now every signed-in user can do it: open the 'Add cards' page and search, or tap the little card-deck button on any card's page to say you own it and set how many. Your collection page adds up what it's all worth and how it's trending.
  • These patch notes now read in Thai
    The whole changelog — this page and every past update going back to the very first one — now shows in Thai when your language is set to Thai. Use the language toggle at the top of any page to switch. Card names, set codes and prices stay as printed; everything else is translated.
  • Share a card and the preview shows Thai Baht
    When you paste a card link into Facebook, LINE, Discord or X, the little preview that pops up now shows the price in Thai Baht (THB) instead of US dollars — so the number means something at a glance for everyone here in Thailand.
  • Every price now shows how much to trust it
    On a card's price chart, each source (Cardmarket, yuyu-tei, TCGplayer…) now always shows a small confidence badge, so you can tell at a glance whether a price is backed by one source or several. We also added a little toggle that hides the reviewer buttons (✓ ✗ ⇄) by default so the price row stays clean — flip it on only when you want to help us check a price.
  • Fresher prices and another accuracy sweep
    We pulled fresh prices from Cardmarket, TCGplayer and CardTrader and re-baked everything, plus did another pass fixing cards whose price had gotten stuck on the wrong version of the card. More cards now show a price backed by several markets at once.
  • Small fixes
    Your name in the top-right corner now updates the moment you change it in settings (it used to keep showing the old one), and it no longer disappears for a second when your connection hiccups.

v1.06

2026-06-02

v1.06 — the beta-baseline pass: every price re-checked from seven sources at once, Japanese prices got a proper rebalance + OP-16 JP prices, a 'is it worth grading?' calculator on every card page, and a final accuracy sweep so every number you see is true

  • OP-16 Japanese prices are live
    The whole OP-16 Japanese set now carries real yuyu-tei retail prices — 146 cards, from base prints all the way up to the chase parallels (the ¥498,000 / ~$3,100 alt-arts included). We had OP-16 indexed the day it dropped in Japan, but with no JP price yet; now every Japanese OP-16 card shows a real number with a chart point to build on.
  • Japanese cards stopped borrowing their English twin's PriceCharting price
    Japanese console cards share a PriceCharting page with their English version, so a JP card could end up showing its EN twin's number — we caught a JP parallel reading about $56 when its real value was closer to $7,000. We now read Japanese prices from a separate JP-only PriceCharting feed and never fall back to the English value. Every affected Japanese card now shows its own honest PriceCharting reading.
  • The homepage numbers are now exact
    The hero line under the search bar ('X prices · Y validated') was over-counting: 'prices' was really counting source LINKS — including ones with no live price, dropped outliers, and a source that's hidden everywhere else — and 'validated' was tallied from a different place that also counted rejected matches. Both are strict now: 'prices' counts only real, kept readings that actually feed an estimate; 'validated' counts only confirmed matches. The numbers got smaller and completely honest.
  • Hover a card → see how trustworthy its price is
    On the home grid, hovering a card used to show the single source behind its price. Now it shows the same confidence badge as the card page — e.g. 'MEDIUM · 2/4 SRC' — so at a glance you can tell whether a price is backed by one source or corroborated by several, before you even click in.
  • Another sweep for wildly-off prices
    We re-checked every reading that sat an order of magnitude away from the agreement of a card's other sources — the tell-tale sign of a price stuck on the wrong version of a card. Most turned out to be genuine chase prices and were left alone, but about a hundred were real mix-ups (a base print wearing a parallel's price, a championship card's number colliding with another set's) and got re-pointed to the correct card or removed. The headline Atlas Est. on those cards is now true.
  • Smaller fixes
    The Thai 'updated X ago' stamp used an ambiguous abbreviation for minutes (น., which also reads as 'o'clock') — it now reads นาที. And the ✓ / ✗ / ⇄ icons that contributors sometimes saw stay 'stuck' after we'd already actioned their flag now clear reliably. Two new automated daily checks also run behind the scenes: one fails loudly if the published prices ever fall behind a fresh source scrape, the other lists any card whose reading is 10×+ off its peers so we can fix the mapping fast.
  • Atlas Est. is now built from seven live sources, not five — Japanese prices finally land where they should
    We brought SNKRDunk online as a real contributing source (it had been gated off for QA) and we rebalanced how much weight Cardmarket carries for Japanese cards. Translation: if you own JP cards, the price you see on the headline is now the median of up to five real sources (yuyu-tei + SNKRDunk + CardTrader + Cardmarket + PriceCharting) instead of one or two. Hundreds of JP cards that previously had only a single reading now show a proper blended estimate. Atlas Est. version bumped to v4 — every card page recomputed, every chart redrawn.
  • Is it worth grading? A calculator on every card page
    Every signed-in user now sees a small panel on the card detail page that tells you, in dollars: what the raw card costs, what grading + return shipping costs at your chosen PSA tier (Value Bulk through Super Express), what you net IF the card grades PSA 10, what you net IF it grades PSA 9, and the breakeven sell price. No probability handwaving — just transparent conditional math. Click the strip to expand the full breakdown. Includes a deeplink button to PSA's official population report for the card's set (OP-01 through OP-09 covered).
  • Sealed products — clean transparent backgrounds, 5-up grid, hover details
    Booster boxes, packs, decks, and promo bundles on the Sealed tab and /sealed page now show with their white backgrounds removed (498 product images batch-processed, edges feathered, file size cut to 21 KB average). Five-up grid at desktop, dropping cleanly to 4 / 3 / 2 as the viewport narrows. Each tile shows a 7-day delta pill, lifts the price on hover, reveals the product name as a sub-headline, and rounds the corners as it tilts away from the bottom info block.
  • Collection page: cleaner tiles, quantity controls hide until you hover
    The owned-cards grid was getting busy — every tile carried a visible quantity counter and -N+ row even when you weren't using them. Now the orange quantity badge stays at rest in the top corner, and the -N+ controls only appear when you hover or tap the tile. Tile footer redesigned: bigger card name on top, price + 7-day delta pill on the left, open-in-new-tab link on the right. Set / collector number chip dropped — the name already identifies the card. Add Cards view is unchanged because that's where controls should always be visible.
  • Header polish for tablet + a trailing currency symbol
    On tablet-sized viewports the Collection and Watchlists nav buttons used to overlap the sign-in pill. They now collapse to icon-only on tablet (same as mobile) and only show their text labels on desktop. The currency dropdown in the top-middle (THB · ไทย and friends) got its leading coin icon dropped in favour of a trailing symbol — so it now reads 'THB ฿' instead of '[icon] THB'. Globe icon next to the language label bumped slightly bigger for better balance.
  • Source pills tell you which sources are quiet at a glance
    On the card detail price graph, the row of seven source pills (Cardmarket, yuyu-tei, PC Ungraded, TCGplayer, CardTrader, Yahoo!Auctions, SNKRDunk) now dims connected-but-no-price pills to 50% opacity at rest. They lift to full opacity on hover. So the row visually communicates 'three of seven sources have current data for this card; the other four are mapped and listening but quiet today' instead of looking like all seven are populated.
  • Behind the scenes — scrapers fixed + faster admin pages
    Five of the daily data-refresh workflows had been silently failing at the end of their runs because of a Git push race — a 2-hour SNKRDunk scrape would complete cleanly, then fail to commit because other work had landed during the run. Wrapped every push with a pull-rebase-retry loop. SNKRDunk + Yahoo + PriceCharting refreshes now self-heal even when other commits land mid-run. Separately: the /admin/market-watch chart was hitting a hidden 1000-row cap on the price-history query and showing 'no data' for windows the table actually covered. Switched to parallel-paginated reads with a 30-min in-memory cache; first load takes a couple seconds, subsequent loads are instant.
  • Beta-baseline data refresh — the showdown pass
    On 2026-05-31 we ran the full consolidation: fresh Cardmarket import, fresh CardTrader scrape (6,667 blueprints + 6,305 prices), the daily PriceCharting / SNKRDunk / Yahoo refreshes already green, and we applied every swap decision + every accepted flag from the operator's QA review queue. Then we re-baked everything end to end. 8,658 cards now carry a fresh v4 Atlas Est.; 7,545 of those blend three or more sources. This is the baseline for the open beta — every price, every chart, every per-source pill is anchored to this pass.

v1.05

2026-05-30

v1.05 — thousands of prices double-checked, faster pictures, OP-16 cards are already in, a new sources page, a feedback widget with a rebate code, search + sort on your collection, and a sneak peek at the next big thing

  • Tell us what you think — get a rebate code on the way out
    There's a new floating chip next to the bug button at the bottom of every page. Tap it to open a short feedback form: five quick 1-to-10 ratings, a free-text note, and you can attach up to three screenshots. The moment you hit send, we issue you a rebate code (FDBK0p4Tl4S2k26 for now — same code for every early submission). Hold on to it. When the paid tier opens after the open beta, that code unlocks a one-time discount. If you're signed in, the confirmation lands in the email we have on file; otherwise you can drop one into the form. We read every single submission.
  • Search, filter, and sort your collection
    Above the cards grid on /collection there's now a search bar, a row of rarity chips (C, UC, R, SR, SP, SEC, L, P — only the rarities you actually own show up), and a sort dropdown over on the right (Recently added, Value high → low, Value low → high, Name A → Z, Top movers · 7d). The big number-trio in the box right above — Atlas total, 7-day change, 30-day change — re-scopes to whatever you've filtered for. So if you want to know what just your Luffy SPs are worth, type 'luffy' + tap SP and the headline tells you exactly that. Sort lets you find your most expensive cards or your biggest movers in two taps.
  • Collection search now finds Japanese and English cards together
    Type 'zoro' into the collection search and you'll see your English Roronoa Zoro tiles AND any Japanese ロロノア・ゾロ you own — no language toggle needed. Works the other way too: typing the Japanese name surfaces both prints of any twin pair. Useful if you mix JP and EN cards in one collection (most do).
  • Collection + Watchlists got proper labels in the header
    On desktop, the little brass icons in the top-right for Collection and Watchlists now have their names next to them so you can find them at a glance. Once you've added cards to your collection, the Collection chip morphs into a live status pill showing your total value and the 7-day change — your portfolio is right there in the nav.
  • New sources page — see where every price comes from
    Click the underlined 'Updated Xh ago' on the homepage and you'll land on a new page we built for transparency: a sounding chart of all our marketplace sources, plotted by region. Each source hangs at its freshness — the higher it rides, the more current the data. Hover or tap any source to see when it last refreshed, how many cards it covers, and how often it updates. Two sources (SNKRDunk and Yahoo! Auctions Japan) show as 'charting next · v1.06' so you can see what's coming.
  • We double-checked thousands of prices
    We went through marketplace after marketplace and made sure each listing actually matches the right card. Lots of small mistakes that snuck in over time — a price for the wrong version of a card, a sticker mistaken for the normal print, a parallel mixed up with the base — got fixed. The headline numbers across the site (Atlas Est., per-source chips, the price chart) are more trustworthy now than they've ever been.
  • The homepage now shows the real numbers
    The hero line above the search bar used to just name-drop four sources. We replaced it with the actual count: total prices we have mapped + how many we've validated. Hover or tap the little 'Updated Xh ago' pill next to it to see when each individual source last refreshed — TCGPlayer, Cardmarket, CardTrader, PriceCharting, yuyu-tei, SNKRDunk, Yahoo. Some sources update daily, some weekly; this lets you see exactly where each one stands.
  • Open Beta chip moved to the bottom-left
    Small layout flip on desktop: the floating 'Open Beta' chip now lives in the bottom-LEFT corner instead of the bottom-right, and the cookie banner moved to the bottom-right. Reading flow lands on the chip first and the cookie consent last (where it should be). Side bonus: when the chip morphs into the small badge after you dismiss it, the animation no longer travels the whole screen — it's just a shape change in the same corner.
  • Two new price sources are coming soon (Japan)
    We're getting ready to add SNKRDunk and Yahoo! Auctions Japan as price sources. Both of them are huge in Japan and they'll give us much better numbers for Japanese cards. They're not switched on yet — we want the data to be really solid before they show up next to the other prices — but the plumbing is all there and we're just waiting on a couple of bootstrap runs to finish. Look out for the announcement in v1.06.
  • Pictures load way faster (74% faster, actually)
    We were quietly serving every card image in a fancy modern format called AVIF, thinking it'd be faster. Turns out for the sizes we use, an older format called WebP loads 74% quicker with no visible quality drop. Flipped the switch. The home page, card detail page, and every grid view should feel noticeably snappier now.
  • All graded prices, not just PSA 10
    Before today, the price chart only remembered the PSA 10 and raw/ungraded values over time. Even though we always knew the PSA 9, BGS 9.5, and ten other grade tiers, we weren't saving them — so when you looked at how a graded copy moved over a month, the chart was empty for everything except PSA 10. Now every grade tier is remembered + charted. Backfilled a few weeks of history too so the lines have something to draw immediately.
  • OP-16 cards are already in the index — including alt-arts
    We don't wait for Bandai to officially publish the cardlist anymore. OP-16 (releasing tomorrow!) is already searchable. All the alt-arts the community has spotted are in there, including the Kuzan manga rare. If a card pops up in a deck thread or a leak, you can already pull it up by name or by collector code. As real prices come in over the next weeks, the chart will start filling.
  • Japanese cards now have English ability text where we can
    Some Japanese cards weren't showing any ability or trigger text because their Japanese cardlist entry was empty. If the English version of the same card had the rules, we now copy them across so you can actually read what the card does. Closed the gap from about half of JP cards missing text to roughly one in seven.
  • Card hover got fancy
    Hover over a card on the home grid: the image lifts out of the tile, tilts in 3D, catches a foil shimmer, and the price + extra info slide up. Same energy on the graded slab tiles — the slab gets a glare highlight and the card window now hugs the full image without cropping. Subtle, but feels good.
  • Cards without pictures now show a nice placeholder
    Some cards (especially brand-new pre-release ones) come into the index before we have an image for them. Instead of an empty grey box, they now show the OP-Atlas card-back logo with the card name + collector code printed across it. Looks like a real card-back, holds the spot until the real image lands.
  • Welcome popup is now a tiny chip you can ignore
    The big 'welcome to the open beta!' overlay that took over the whole screen on first visit is gone. It's now a small floating chip in the bottom-right corner (or a sticky strip on mobile under the cookie banner). Tap it any time to see the tour; ignore it and it stays out of your way. Click it to expand into a richer info panel + skip button.
  • Card detail page is cleaner
    The meta strip on the card detail page used to throw a lot at you all at once — set name + colour + power + cost + counter + attribute + rarity all in one band. Now most of it tucks behind a 'Details' chevron you can open if you want it; the yellow set name and the call-to-action button stay always visible. Ability text + trigger stay always visible on desktop.
  • Six days of swap submissions finally save
    (Carrying forward from v1.03 — flagging in case any v1.04 readers missed it.) If you clicked the swap-source button anywhere between May 17 and May 23 last week, the system said 'thanks!' but the actual save dropped silently. We fixed that, replayed the lost submissions, and everything from your end now persists correctly. Nothing for you to do; just letting you know your patience wasn't wasted.

v1.03

2026-05-24

v1.03 — six days of missing swaps now stick, sitemap goes from 1.4k to 9.2k URLs, archive duplicates, polish polish polish

  • Your swap submissions from the last six days actually saved this time
    Bad news first: every time you clicked the swap-source button between May 17 and May 23, our database rejected the entry with an obscure regex error and the app failed silently — it kept showing you a confirmation but the row never landed. Six days of triage work was getting dropped on the floor. The root cause was a security check we added during the v1.0 audit: a pattern designed to block stored-DOM-XSS via flag URLs, written in a way PostgreSQL's regex engine couldn't actually handle (it hit an internal repetition-count limit and threw on every insert). Replaced with three explicit checks that do the same job without hitting the engine limit. The 1,031 swap submissions from your May 24 export went through cleanly post-fix. The cascade run today carried all of them into the index plus 127 new blacklist entries from the live_override backlog.
  • Sitemap rewritten — Google now sees all 9,171 cards
    Our /sitemap.xml had been silently capped at around 1,400 URLs because of how Next.js's dynamic sitemap route caches the bundled card list at deploy time. Replaced with a static file that gets regenerated by the data pipeline on every cascade run, so the moment new cards land in the index they show up in the sitemap. Google Search Console picks the full set up automatically. This is also why you might have seen a traffic spike in Vercel analytics yesterday — that was Google's secondary crawler walking the old (smaller) sitemap multiple times; the new one will give them a much bigger menu.
  • Admins can archive duplicate cards now
    A new "Archive as duplicate" button on the card-detail page (admin-only) opens a modal where you pick the canonical card the duplicate should redirect to, optionally add a reason, and submit. The archived card disappears from search + the index, but the underlying audit trail lives in the database so you can restore from /admin/archive. Useful for the long-tail of weird duplicates where two different upstream sources gave us slightly different card IDs for what's actually the same print.
  • Cardmarket links now always go to the search page
    We tried several different ways to deeplink directly to a card's product page on Cardmarket — numeric IDs, expansion + character slugs, metacard pages. None of them worked reliably: about half of them hit Cardmarket's WAF or 404'd on unknown variants. Switched the "Cardmarket" button on every card to a search URL pre-populated with the character name + card ID. You land on Cardmarket's search results with the right card at the top of the list. Less elegant than a direct deeplink, but actually works.
  • Cards no longer say "Effect-" under their image
    On 43 promo cards, the ability-text section was showing the literal string "Effect-" (with a stray dash) as if it were game text. Came from Bandai's cardlist HTML, where they render that placeholder for cards with no effect. Our scraper was capturing it verbatim. Now sanitized at both ends of the pipeline so it can't come back.
  • Grading-ROI popover on watchlists no longer gets clipped
    On /watchlists, the grading-ROI chip's popover was getting cut off at the bottom by the row's overflow container. Rewrote it to portal directly to the document body via React's createPortal, so the popover floats freely regardless of any parent's overflow rules. It also flips above the chip when there's not enough room below.
  • Swap icons stop pinning to gold forever
    On the home grid, the ⇄ icon would stick in its bright "pending" gold color even after we'd applied the swap on our side. Caused by a defensive check in the icon component that returned "pending" any time the caller didn't pass the card's current source-stamp. Now it gracefully accepts no-stamp by checking against a 6-hour grace window from the swap's decided-at timestamp.
  • Full upstream price refresh
    Same-day refresh of every price source: Cardmarket (singles + sealed), CardTrader, PriceCharting, TCGcsv, yuyu-tei. About 8,468 cards now carry an Atlas Est. (was 8,348), with 6,418 backed by multiple sources for higher-confidence baselines. Every card's price chart has a fresh data point for today's date so the trend lines stay continuous.

v1.02

2026-05-22

v1.02 — Collection + Watchlists are public, the whole site speaks Thai, mobile no longer crashes on tap

  • Collection + Watchlists open to everyone
    Up until now, the personal-inventory features were admin-only drafts. As of today, anyone can sign in and start tracking their One Piece collection plus build multiple watchlists. Collection has an overview page with the running total value across your inventory and a 14-day trend; you add cards through a search-driven page with quantity controls; the system writes server-first so a transient API failure can't silently revert your '+1'. Watchlists support multiple groups (e.g. 'Trade pile', 'PSA queue', 'Want to buy'); the dedicated /watchlists view shows each group as a collapsible row with count + Atlas total + 14-day %, plus a value-over-time graph and a top-movers split by region. A new brass folder button on each card opens a quick-add picker so you can drop cards into a group from anywhere on the site.
  • Site now speaks Thai (เว็บไซต์เป็นภาษาไทยแล้ว)
    Full Thai localization landed across login, sign-in gates, all toasts, the profile page, the /watchlists + /collection + /me + /leaderboard surfaces, the card-graph chrome, the OpenBeta info popover, and every tooltip on the home grid. Around 135 new translation keys with native Thai phrasing matching the existing tone. Thai visitors auto-default to th + THB on first visit via geo-IP; you can flip the toggle in the settings dropdown at the top of every page. Brand names, card identifiers, and card text stay in English/Japanese as printed; everything else is in Thai.
  • Mobile 'OP-Atlas had a hiccup' crash on search-tap — fixed
    Several mobile users reported the page crashing the moment they tapped the search input on iOS. Root cause: a Rules-of-Hooks violation in the Open Beta badge component — when the iOS soft keyboard opened, the badge took an early return BEFORE one of its hooks ran, and React's hook-count check threw on the very next render. Moved the early return below the hook so every hook runs on every render. While we were at it, we built a diagnostics pipeline so the next mobile crash gives us the actual error instead of a generic 'hiccup': the error boundary now POSTs the real exception + stack to a Vercel-logged endpoint and shows a 'Copy diagnostics' button so testers can paste the exact error into a bug report.
  • Mobile hamburger nav: tap anywhere on a row to navigate
    Operator reported 'my mobile nav buttons don't work'. The hamburger dropdown was rendering each row as a tiny icon-link with the label text as a separate sibling element — so tapping the word 'Collection' was hitting the menu panel (which closed the menu) instead of the link. Rebuilt as one tappable row per item with 44px min height per iOS HIG. The 'Sign In' row at the bottom also had no link — it was opening the free-until countdown modal — so we wired it to /login?next=<current> for anonymous visitors and /me for signed-in users.
  • Mobile search bar — no more overlap from floating widgets
    When the iOS keyboard pops up, the search input pins itself directly above the keyboard. The floating bug-report button (bottom-right) and version pill (bottom-left) were sitting in the same vertical band and visually overlapping the input. Both widgets now hide while the keyboard is open and reappear when you dismiss it.
  • PSA 10 cards now sit in a graded slab
    Switched the PSA 10 tab tiles from the standard card tile to a 'graded slab' visual — the card sits inside a translucent case with the GEM MT 10 header band and the PSA-style cert number + card code at the bottom. The whole thing reads as 'this card, graded' at a glance. Card image takes ~70% of the slab height; the price sits right below it inside the case.
  • Sign-in gate on the price graph
    Anonymous visitors see the headline Atlas Est. but not the per-source breakdown or the over-time chart — those are gated behind a brass 'Sign in to unlock' overlay. The locked content gets a real blur (not just an overlay) so prices aren't readable through the frosted layer. /login picks up the cool grid backdrop from the home page so the sign-in screen feels part of the app rather than a separate auth flow.
  • Free-until date pushed to September 1
    Open beta now runs until September 1, 2026 (was August 22). The countdown modal + onboarding-slide-4 founding-discount cutoff both reflect the new date in EN and TH.
  • Roadmap link removed from the footer
    Removed the /roadmap link from the site footer. The route itself stays in the codebase; we just don't ship it as a primary nav surface yet.
  • Watchlists: lists open closed by default + a real popover for grading ROI
    Two operator-requested polish items on /watchlists. (1) When you land on the page, your groups start collapsed instead of auto-expanding the first one — you opt in to each list by clicking the header. (2) The grading-ROI chip (PSA10/raw ratio + cost + net edge) now opens a styled in-app popover on hover instead of relying on the native browser tooltip that takes a beat to appear. The tooltip text is still attached for screen readers and bots.
  • Live Atlas Est. on the card detail page
    When the live price fetch for a card lands fresh values from any of the five sources, Atlas Est. is now recomputed inline and rendered on the chart frame — instead of falling back to the value baked into the snapshot. Matters most for the championship + serial-numbered cards (synthesized at bake time with no static atlasEst stamp); those cards now show a real headline number the moment the per-source fetch returns.

v1.01

2026-05-21

v1.01 — Japanese tournament cards finally show the right art, mobile keyboard behaves, OP-16 is already in

  • Japanese championship + serial-numbered cards now show their actual artwork
    When we added the 83 Japanese championship and serial-numbered promo cards to the index, every single one was rendering with the BASE card's art instead of the actual tournament/serial variant. So jp-EB04-061_serial_serial would show the normal Luffy from EB04 instead of the gold-numbered serial print. Today we wired up three different sources to fix this: PriceCharting's own product images where available (covers 26 cards), the English championship twin's TCGplayer art where the same card exists in both regions (21 cards), and Bandai's own JP cardlist parallel-variants for the rest (30 cards). 99% effective coverage — 82 of 83 cards now show real variant artwork. The one holdout is a Sasaki championship card that Bandai, PriceCharting and TCGplayer have all simply never catalogued an image for; we'll fix that one manually when it surfaces in QA.
  • All 85 English championship + serial cards are searchable now
    TCGplayer catalogues 88 English championship and serial-numbered promo cards (the 'OP01-084 Bentham Championship 25-26 Regionals Season 1' style alt-arts). We were missing 85 of them because our matcher keys on the card number — and championship variants share their number with the base print, so they were getting silently merged. Built a synthesizer that walks TCGplayer's catalogue, picks out the championship/serial entries that aren't already in our index, and adds them as their own cards (with the real product image from TCGplayer's CDN). Same approach for the Japanese side, via PriceCharting (83 cards). Prices stay blank on these — operator manually assigns from the new 'English Championship' and 'JP Championship' tabs in /ep triage.
  • OP-16 cards are already in the database before release
    Bandai's OP-16 set drops 2026-05-30 in Japan, 2026-06-12 in English. Their product preview page already has 15 cards' artwork posted. We pulled those into the index so you can browse OP-16 ahead of release — they show with an 'indexed pending' status badge (no prices yet, just the card itself). The remaining ~110 cards in the set will auto-flow in as Bandai publishes their cardlist closer to release.
  • Mobile keyboard stops shoving the page around
    Tapping the search bar on a phone used to make the page jump around as the soft keyboard opened — the input would scroll behind the keyboard, or the page would resize awkwardly. Added the `interactive-widget=resizes-content` viewport hint (Android Chrome handles this natively) plus a Safari-specific fallback that pins the search input directly above the keyboard via `visualViewport`. Tap-to-search now stays pinned and visible on every mobile browser we tested.
  • Search bar pins on scroll-up, not all the time
    The sticky search bar logic was getting noisy — the bar would animate in and out as you scrolled, the filter row would follow, sometimes the hero would fade. Stripped it back: the search bar, tabs, and filter row all scroll naturally with the page. Only AFTER the first row of cards reaches the top of the screen does the search bar start showing up at the top when you scroll UP. Scroll down and it stays out of your way. Filter row doesn't follow — that was a usability complaint.
  • All Cards tab — Japanese cards aren't getting dropped anymore
    On the All Cards tab, anonymous visitors are capped at 500 cards (anti-scrape measure). We were applying the cap BEFORE sorting, and the index is built English-first then Japanese-last, so anonymous visitors only ever saw the first 500 English cards — every Japanese card was getting silently dropped. Fixed by sorting before the cap-slice. Anonymous visitors now see a representative cross-section of both regions; signed-in users still see all 9,093 cards.
  • Direct links to championship + serial card pages work
    After we added the new card-ID format for synthesized cards (e.g. `/card/OP01-084_championship_bentham`), the edge-layer URL validator was 404'ing them before the page could load. Third time this regex has caught us off-guard with a new taxonomy — we've now flagged it in the operator runbook so the next person knows where to look.
  • Facebook link added to the site footer
    We have an OP-Atlas Facebook page now (the link is in the footer, between Roadmap and GitHub). Useful for users who'd rather follow updates on Facebook than via the in-site patch notes.

v1.0

2026-05-20

v1.0 — your flags actually stick now, the site loads way faster, and we built a moat

  • Your flags actually do something now
    Before this update, when you clicked the little ✗ next to a wrong price to say 'this source is mapped to the wrong card', the system would write it down — but several different parts of the site were quietly putting the wrong price back. The result: you'd flag the same price five times and it would keep coming back like a zombie. We tore through the entire pipeline this week and found three separate places where wrong prices were sneaking past your verdicts. All three are now sealed. Going forward, when you click ✗, the price disappears for real — first within seconds on the live site, then permanently after the next overnight rebake. Across the whole database, about 4,000 cards that were silently showing wrong prices despite operator flags are now showing the correct data (or honestly showing 'no price' when every source was wrong).
  • Atlas Est. is honest now
    Atlas Est. (the headline number you see on every card) is computed from up to five different price sources. If you'd marked a source as wrong, it was still supposed to ignore that source — but for a chunk of cards, it wasn't. So you'd see Atlas Est. = $1,000 with no idea that 80% of that number was coming from a source you'd already flagged as bogus. Total Atlas Est. coverage dropped a little after this fix (8,513 → 8,430 cards have an estimate), but every estimate that DOES show up now is built from sources you haven't flagged. Lower coverage, higher truth.
  • A specific bug: cards priced at $30,000 because of one stuck listing
    Found a card showing 'Atlas Est. ฿978,446' (about $30K) where the actual market price was about $2,900. Traced it to a single seller on TCGplayer who listed the card for $29,995 and never sold it. Our system was using the midpoint of the listing range as the price when no real sale had happened — so 'midpoint of one stuck listing at $29,995' looked exactly like '$29,995 fair market'. Fix: when no actual sales exist, we now fall back to the smoothed market estimate from the bulk feed instead of the stuck-listing number. Same fix protects against the next time a seller tries to anchor a price at $1M for memes.
  • Site loads ~5× faster on phones
    PageSpeed Insights was scoring 48/100 on mobile, mostly because every card image had to go through a server-side resize-and-convert process that took 4-5 seconds the first time. We now pre-make the top-60 most expensive cards' images at build time and serve them as plain static files. First card on the home page now lands in about 150 milliseconds cold instead of 5 seconds. Target: mobile Performance 80+, the headline image showing up in ~2 seconds instead of 12.
  • Cards stopped vanishing from the front page
    Bug where the most expensive cards (the $1M Manga Luffy, the $700K LDR Shanks) would appear on first load and then disappear about 2 seconds later. The front page does two fetches — a fast one for the top 200 by price, then a 'show me everything' fetch to populate the filter dropdowns. The 'everything' fetch was capped at 500 cards to stop scrapers, but the cap was alphabetical, so it was throwing away the price-sorted top cards and replacing the list with cards from OP01-OP04 only. Now the second fetch asks specifically for the top-N by price, so the headline cards stay put.
  • When you swap a card to a new source, old flags reset
    If you say 'this card's Cardmarket ID is wrong, here's the right one' (a 'swap'), and there was an old 'this source is trusted' verdict on the OLD Cardmarket ID, that verdict used to silently carry over to the new ID — even though the new ID is a completely different product. That's bad: a trust verdict for product A shouldn't be vouching for product B just because you said B is the new mapping. Fixed: confirmed swaps now wipe any conflicting verdicts on the same (card, source) pair. Caught 91 cards with stale verdict contamination on first run; all cleared.
  • Price chips on the home page are bigger and cleaner
    Removed the ✓/✗/⇄ buttons from prices on the home grid and search results. The price is now bigger and centered. QA still happens on the card detail page where the buttons remain — the home grid is for browsing, not for data review.
  • Cross-language price mirror — 74 Japanese cards auto-filled
    When you confirm the English version of a card's Cardmarket / PriceCharting / CardTrader mapping, the Japanese print of the same card usually shares those product IDs (Western catalogues don't always distinguish regional variants). Built a tool that scans for English cards you've already reviewed and proposes the same mapping for their Japanese twins — but only when you haven't already flagged that source as wrong on the JP version. 74 cards auto-filled this week; about 1,200 more candidates surfaced for manual review.
  • All four price sources refreshed at once
    Pulled fresh data from Yuyu-tei (Japan, 2,705 cards), PriceCharting (3,871 slugs — PC throttled us hard, 25% success rate is normal for them), Cardmarket (9,945 products), and CardTrader (6,282 blueprints). Net effect: 284 more cards now have multiple independent price sources backing their Atlas Est. — that's the biggest single quality bump since v0.9.
  • Anti-scraping defenses — every layer, all live
    We expect competitors to try to scrape this site. Seven layers now make casual scraping painful: rate limits on every endpoint, a Cloudflare challenge we can turn on at any time, the compiled card index moved out of public URL space, a forensic 'canary' card embedded in every snapshot (if anyone else ships our card list, this card proves they pulled it from us), a subtle 'op-atlas.app' watermark on every card image, hardened Terms of Service citing the canary, and a JSON sentinel buried in the data pipeline outputs. We won't sue anyone — this just raises the cost of casual scraping above the cost of paying for a real API.
  • Security audit — closed clean
    Did a thorough security pass and caught one real vulnerability: a malicious user could have submitted a price flag with a fake URL that, when clicked by a moderator reviewing the flag, would execute code in the moderator's session and potentially escalate them to admin. Fixed in three places — the moderator UI, the API that accepts flags, and a database rule that rejects bad URLs no matter who writes them. Plus a bunch of smaller fixes — rate limits on all writing endpoints, log hygiene, and a database migration to lock down which fields anonymous visitors can see.
  • Admin / moderator gates on internal pages
    The /cheatsheet page (operational reference) now requires admin role. The /flags page (user-submitted price-flag triage queue) requires moderator. Both used to be reachable by URL alone. Removed the 'Reviewed flags' link from the bottom-left Open Beta popover so regular users don't get bounced into a permission error.
  • A validator that catches the bugs we can't see
    We built a script that, after every overnight rebake, walks every single one of your confirmed source mappings (about 9,000 of them) and asserts the resulting snapshot actually reflects what you said. If a bug somewhere silently undoes your work, this script catches it the next morning. The 4,000-card blacklist leak we fixed this week was found by this script — it's now part of our standard close-of-train recipe.

v0.992

2026-05-16

v0.992 — Thai-launch readiness, ส่วนที่ยิ่งใหญ่ที่สุดในวันเดียว

  • Site loads way faster on phones
    On a slow phone connection, the first big card image used to take 38 seconds to show up. That's a long time to stare at a blank screen. Three fixes: we now tell your browser to remember card pictures for a year instead of a day (so coming back is almost instant), we stopped trying to load 24 cards at once (your phone only shows about 6 anyway — the other 18 were stealing internet from the one you actually see first), and we tell the browser ahead of time what the very first picture will be so it can start downloading it earlier. First visits should land in 5-8 seconds, return visits feel instant.
  • You stay signed in now — for real
    Two bugs were quietly logging you out. The first: when you came back the next day, the page would flash you as signed in, then flip to logged out — the site was trusting an old 'you're signed in' note that had actually expired without anyone asking for a fresh one. The second: if you only browsed cards quietly for an hour, the note expired in the background. Both fixed. The site now automatically gets a fresh note before the old one runs out, so you should just… stay signed in.
  • The site speaks Thai now
    Click the 🇹🇭 button in the header and the cookie banner, footer, and the top of the Privacy Policy all switch to Thai. The Privacy Policy summary in Thai covers the important stuff — who runs the site, what we collect, why, who we share it with, and what rights you have. The full legal text underneath stays English until we get a Thai lawyer to review the translation properly (we're forming the company in Thailand).
  • Privacy Policy, Terms of Service, and Imprint pages
    Three new pages, linked from the footer on every screen. Privacy explains what data we keep about you and what you can ask us to do with it. Terms covers the basic rules of using the site (don't spam, don't lie, we don't promise the prices are perfect). Imprint says who runs the site and how to contact us. All three are marked DRAFT — we'll re-publish them with the official company name when the Thai company registration finishes.
  • Cookie banner that doesn't suck
    When you first visit, a small box at the bottom asks if you're okay with analytics cookies. Two buttons: Accept, or Reject. That's it. Reject is the default — nothing tracks you until you say yes. No 'you must agree to continue' wall. No tiny X-button hidden in a corner. We don't run ads and never will, so we permanently said NO to ad cookies on your behalf. Your choice is remembered for a year.
  • We can finally see how the site is being used
    Hooked up Google Analytics 4 (the standard free analytics tool — most sites use it). It only turns on if you accepted the cookie banner; if you rejected, GA still loads but in a mode where it can't put cookies on your device and only collects anonymous counts. With it on, we can see things like 'which cards do people look at most', 'where do visitors come from', and 'is the site getting faster or slower over time'. No personal info is sent to Google — emails, names, addresses, nothing.
  • Google can now find every card page
    Submitted a sitemap (a map of every page on the site — 8,914 URLs total, basically one per card plus the main browse pages) to Google Search Console. Over the next few weeks Google will crawl through them and start showing OP-Atlas in search results when people search for specific cards. Before this, only the home page really showed up on Google.
  • Email to us actually works now
    If you write to privacy@op-atlas.app, info@op-atlas.app, or hello@op-atlas.app, the email now reaches a real inbox we read. Before today, those addresses didn't exist — anyone who tried to email got an immediate bounce-back. Useful for: privacy questions, bug reports, partnership inquiries, anything you wouldn't post publicly.
  • Moved our domain to Cloudflare
    Domain names (op-atlas.app) need a service that tells the internet which computer to connect to — like a phonebook. We were using Vercel's phonebook; we moved to Cloudflare's, which is one of the biggest in the world and looks up the answer faster from more places worldwide. Same site, same hosting, just a faster lookup before you ever load anything. As a bonus, this is what made the @op-atlas.app email addresses possible.
  • Anti-spoof protection for our email
    Added a special record to our domain that tells receiving email servers: 'If you get an email claiming to be from @op-atlas.app and it didn't actually come from us, treat it as spam.' This stops scammers from sending fake emails pretending to be us. The kind of thing nobody notices when it works but you'd definitely notice if it didn't.
  • Health monitoring around the clock
    A free service called UptimeRobot now checks every 5 minutes whether the site is online by pinging it from several places around the world. If it goes down — even at 4am on a Sunday — we get an email immediately and can start fixing things, instead of finding out from a frustrated user on Twitter the next morning.
  • Bug-catcher tool installed (waiting to be turned on)
    Set up Sentry — a tool that automatically catches errors when something goes wrong in the site (like a page crashes for one user) and sends us a detailed report. The code is shipped but the connection isn't activated yet (we need to finish signing up for the free account first). Once it's on, every crash anywhere on the site lands in our dashboard within seconds, so we can fix problems faster.
  • Updated to the latest Node.js (the engine the site runs on)
    The site is built on Node.js (think of it as the engine under the hood). We were on version 22, which is still supported but heading toward retirement. Bumped to version 24, which is the current stable release and supported for another year and a half. No visible change for users — just future-proofing.
  • A pile of small infrastructure fixes
    A handful of behind-the-scenes things: confirmed that our hosting setup allows long-running tasks (the weekly price-update job needs more than the default 60-second time limit). Set up secret tokens so the price-schedule editor and reward-email system can't be poked by random people. Deleted some leftover credential files from the operator's computer that shouldn't have been there. Scanned every page for security-policy errors and got a clean bill of health.

v0.991

2026-05-15

v0.991 — platform health-check sweep, the day after v0.99

  • User-flagged corrections to rarity / category / print-edition now auto-apply
    v0.99 added the ✎ buttons next to those chips on /card/[id] so you can flag wrong values. v0.991 wires the back end: when a moderator confirms one of your flags, it now flows through the weekly cascade into the override file the index reads, so the next bake actually uses your correction. Six fields auto-apply: subVariant, variantCode, pcTokens, rarity, category, family. Set / language / 'other' still route to a manual-review queue because flipping those would change which physical card we're talking about.
  • When a flag auto-confirms, the change appears immediately
    v0.99 fixed this for manually-confirmed flags. v0.991 closes the same window for auto-confirmed ones (the high-community-trust path where the database itself confirms the flag without a human in the loop). Both routes now hit sub-second propagation.
  • Security headers + per-IP rate limits across the API
    Production HTTPS responses now carry Content-Security-Policy, HSTS, X-Frame-Options, Referrer-Policy and friends — defense-in-depth against XSS / clickjacking / mixed-content. Three public endpoints (image proxy, eBay sold lookup, prices route) gained 60/10/30-per-minute caps so a single flooding client can't pin lambda concurrency for everyone else. Normal browsing is unaffected (a card-detail page load fires under the cap by an order of magnitude).
  • Stricter TypeScript surfaced 4 real bugs across the codebase
    Turned on a TS flag that requires every array / map / object index access to acknowledge it could return undefined. 396 spots in the codebase had to be revisited; most were safe but unproven (loops where the index is provably valid), and a few turned out to be real latent bugs: a price-outlier calculation that could divide by NaN, a Facebook-parser destructure that could yield undefined fields, a Japanese-card ID synthesizer that could produce malformed IDs, and a yuyu-tei cache that could store undefined values. All fixed; tests still 338/338.
  • Recovery story: fresh-environment reproducibility
    The repo used to be missing the original CREATE TABLE statements for the core data tables (profile / flag / live_override / price_history / etc.) — they only existed in production. If we ever needed to spin up a fresh database, you'd have had to manually recreate the schema from memory. v0.991 commits an idempotent baseline migration so a clone-and-run produces an identical environment. Running against production is a no-op (everything already exists).
  • Internal cleanup: archive layout + doc accuracy
    Moved ~67 historical files (old audit reports, archived handoffs, one-shot data sweep scripts) into archive/ subdirectories so active docs aren't lost in the noise. Updated several inline references to deleted code or files that had moved. Not user-facing, but makes future you (and future-me) faster.

v0.99

2026-05-14

v0.99 — filters that actually filter, rarity from Bandai itself, security sweep

  • Every card's rarity now comes straight from Bandai
    The home-page rarity filter was broken because lots of cards had missing or wrong rarity tags. Two of Bandai's rarities — SP and SPP (the special-parallel cards) — weren't in our data AT ALL. Fixed: the scraper that reads Bandai's official cardlist had been looking at the wrong part of the page since v0.9826; it now reads rarity from the right spot. 1,155 cards that had no rarity tag now do. 228 SP cards and 1 SPP card now appear in the index for the first time. Every chip on the rarity filter now actually matches cards.
  • The TYPES filter (Leader / Character / Event / Stage) now actually filters
    The chip IDs were capitalised ("Leader", "Character") but the underlying data is lowercase. Clicking any of the four type chips matched zero cards. Fixed — clicking now narrows to the right cards. Also dropped the dead DON!! chip (those utility cards aren't catalogued individually).
  • The All / EN / JP toggle now reloads results
    Clicking EN or JP updated the toggle state but the grid never re-pulled cards — you'd toggle and stare at the same results. Fixed.
  • EFFECTS filter — 4 new chips + better matching
    Added [Main], [End of Your Turn], [On Opp Attack], and [On Block] as filter chips (covering 647 new searchable cards combined). Also caught a silent bug where Bandai writes both "[Activate: Main]" and "[Activate:Main]" (no space) — the filter now matches both forms, picking up 256 cards that had been silently dropped.
  • Flag wrong rarity / category right from the card page
    Both chips on /card/[id] now have a small ✎ pencil button next to them. Click to open a fix modal: pick the right value from a canonical list (or type one), add a note. Submission lands in your local flag store + the moderator queue + the /flags 'Export everything' bundle, same as the print-edition chip from v0.9827.
  • Mod-confirmed corrections apply immediately now
    When a moderator confirms a swap / blacklist / whitelist on /triage/user-feedback, the change used to take up to 24 hours to show up on the live site (it depended on the next index rebuild). Now it propagates sub-second.
  • Auth + security cleanup based on an outside audit
    Closed an open redirect in the sign-in flow (the ?next= parameter accepted external URLs in some paths), upgraded Next.js to close four high-severity CVEs (including a middleware-bypass vulnerability and an SSRF), fixed a race condition in the founding-verifier slot grant (where two users could both claim the last slot), and tightened the anonymous bug-report payload cap so the Content-Length header isn't trusted blindly.
  • Cron rebuilds actually rebuild now
    The daily 'rebuild index from upstream' cron and the Atlas Est. bake cron were both no-ops since v0.975 — they'd clear the in-memory cache and immediately re-read the committed disk snapshot, never fetching fresh data. Both now actually pull from upstreams again.

v0.9827

2026-05-14

v0.9827 — JP promos, promo triage page, agent flagging, security hardening

  • 640 EN + 11 JP missing promo cards added
    Every alt-art championship card on the official Bandai EN cardlist + every JP alt-art promo punk-records hadn't picked up yet are now in the index. 651 newly-tracked /card/[id] pages, most of them already auto-linked to Cardmarket + CardTrader + PriceCharting on first bake. Index 8,254 → 8,906 cards.
  • New /ep triage page for promo cards
    Internal admin tool. Lists every newly-seeded EN+JP card with image preview + lang chip + setId + variant + commercial-source badges + Atlas Est. Filter chips (All / EN / JP / Needs review / Linked / Done). Per-row 'done' checkbox saved to your browser so you can walk down the list across sessions. Hidden — direct URL only.
  • Newly-seeded cards now have today's price history
    Empty price-history graphs on the 651 newly-added cards have been backfilled. 34,814 new history rows captured covering every card × every source. Every chart line has today's data point.
  • Click anywhere on a candidate row to swap
    The Fix Mapping picker used to require aiming for a tiny Select button. Now the whole row is the click target. Hover state shifts background + border so the target is obvious. Thumbnail, open-link, and Select button all still work via their own affordances.
  • Bigger candidate previews (where they exist)
    Cardmarket / TCGplayer / CardTrader candidate thumbs in the Fix Mapping modal are now 96×134 (up from 64×90). SAMPLE-vs-non-SAMPLE prints, EN-vs-JP markers, holo patterns — all readable without click-to-enlarge. PriceCharting candidates (which don't ship thumbnails) keep the small placeholder but the TITLE font bumped 0.8rem → 1.05rem since the name is the only distinguisher there.
  • Lightbox preview at 1.5× the size
    Click any candidate thumbnail in the modal to open the lightbox. Max-width went from 520px → 780px so the full card art reads at desktop scale.
  • Click the print-edition chip to flag it wrong
    On any /card/[id] page, the chip below the name shows the print edition (FLAGSHIP-BATTLE-WINNER, 25TH-ANNIVERSARY, etc.). Click it now to open a fix modal: pick the correct value from 28 canonical alternatives, or type a custom one, plus an optional note. Submission flows through the standard moderator queue.
  • Stay logged in longer
    Sessions were getting killed every few minutes when navigating between public pages. Middleware was firing a Supabase session refresh on every navigation — including pages that don't need auth at all — and concurrent refreshes within Supabase's 10-second anti-replay window were revoking both children. Public pages (home, /card/[id], /sealed, /leaderboard, /contributors, /patch-notes, /cheatsheet, /roadmap, /graph) now skip the refresh entirely. ~70% fewer refresh attempts per session.
  • Admin pages now require admin
    Three internal triage tools (/triage, /curate, /ep) were technically reachable on the open internet despite being labeled admin-only. Now properly gated. Anonymous visits redirect to login.
  • Tighter limits on anonymous bug reports
    Anonymous users could previously upload up to 60MB/min of image data through the bug-report endpoint. Now capped at 1/min × 64KB × 0 images for anonymous. Signed-in users keep the full allowance (4/min, 20MB, 5 screenshots).
  • FB auction parser caught two more false-positive patterns
    Posts that read like sales teasers (ของเข้าเพียบ / มาลงราคา) without any actual auction keywords are now hard-rejected. Posts that wrap *1ใบ* (1 card) in asterisks are detected as single-card auctions even when the seller posts 3+ close-up photos that look like a multi-card lot. Plus an automated parser-side review pass after every harvest tags suspect tiles with an amber 'agent ⚠' chip on /fb so the admin can confirm/dismiss.

v0.9825

2026-05-12

v0.9825 — Price chart polish, full refresh, logout fix

  • Atlas Est. lives inside the price chart now
    The Atlas Est. headline used to sit in its own box under the card image. It now lives INSIDE the price-chart box, in a horizontal row: big green price, ATLAS EST. label, confidence chip, and a 'How we got this' expander that opens the per-source contribution table. One box instead of two means your eye doesn't bounce — you see the headline number and the chart that proves it side by side.
  • Bigger prices everywhere
    The Atlas Est. headline price is bigger. The price numbers inside every source pill (Cardmarket, TCGplayer, yuyu-tei, etc.) are bigger. Reading prices at a glance shouldn't require squinting.
  • Printings moved below the price chart
    The 'other versions of this card' carousel used to sit between the card info and the price chart. It now sits BELOW the chart, with a rope-divider separator. The page reads as three stacked sections: this card → its prices → its other printings. The price story lands before the 'what else exists' invitation.
  • Full price refresh across all five sources in one session
    Cardmarket (11,046 products / 9,945 priced), CardTrader (6,245 priced / 6,659 blueprints), yuyu-tei (2,704 cards), TCGcsv (6,171 products), and PriceCharting (3,650 priced) — all refreshed together in a single 26-minute window. Every chart line now has today's data point, so the graphs make sense end-to-end.
  • PriceCharting line no longer freezes
    242 high-value cards (jp-OP13-118_p3 and similar long-tail prints) had their PC Ungraded chart line frozen at whatever date the bake last happened to stamp it — sometimes weeks ago. A bake bug was reading the fresh price but never merging it onto the card itself, so the weekly snapshot job didn't write a row to the database. Fixed. Going forward all 242 cards will refresh weekly like the rest.
  • No more getting logged out every few reloads
    Signed-in users were occasionally getting kicked out after a handful of card-page reloads. Each card render was firing 6+ parallel Supabase session-refresh attempts (one per public API fetch), and Supabase's anti-replay protection was killing the session when two refreshes raced within its 10-second window. Tightened the middleware to skip 12 public API routes that don't need a session at all — drops the per-render refresh count from 7 to 1.
  • Free until August 1
    The open-beta free-tier countdown was set to July 1. Extended to August 1 so everyone has more time to claim founding-member rewards before paid tiers launch. Every feature — live prices, cross-region comparison, watchlist, the QA contribution system — stays free during the beta.

v0.975

2026-05-10

v0.975 — Live price chart, every grade, every week

  • A live price chart on every card
    Open any card and you'll see a chart of every price source over time. Each market gets its own colored line — TCGplayer, Cardmarket, CardTrader, yuyu-tei, PriceCharting. The chart smoothly redraws when you change settings. Hover any date to see exactly what every source said that week. Click a line or a pill to focus on just that source — the chart rescales to that source's range so you can read tiny price changes without other lines crowding the view.
  • Switch between Raw and Graded views
    A toggle in the top-right of the chart lets you flip between regular ungraded prices and the full graded ladder. Graded view shows PSA 10, BGS 10, CGC 10, SGC 10, ACE 10, TAG 10, Grade 9.5, Grade 9, and Grade 8 — every grade we know about for the card. Premium grades like BGS 10 Black and CGC 10 Pristine sit in their own little strip at the bottom so they don't crush the chart's scale. A gray dotted 'Raw $X' line on the graded chart shows the ungraded price for context — so you can read 'PSA 10 is 3× raw' at a glance.
  • Pick the time window: 7 days, 30 days, or 90 days
    Top-right toggle. The chart redraws and the percentage arrows on each price pill update to reflect the chosen window. 30 days is the default.
  • The website now remembers prices over time
    We now take a snapshot every Monday morning of every price source for every card and save it to a database. That's what powers the chart — without this, prices would reset every visit. The first run captured 35,197 rows across 8,000 cards. The chart fills in more dots every week from here.
  • Every price has a 'open on the source' icon
    Each price pill has a small external-link icon that opens that source's listing for the card in a new tab. Click the Cardmarket pill's icon and it opens the Cardmarket page; click TCGplayer's, you go to TCGplayer. PriceCharting links go to the full grade ladder.
  • Booster boxes have real photos now
    551 of 690 sealed products have real photos now (used to be 271). That's 80% of everything Cardmarket sells, including 100% of the booster boxes. Japanese boxes use the Japanese source so they actually look Japanese. The remaining 142 are super-rare event-distribution packs nobody catalogs.
  • PSA 10 home tab
    Fifth tab on the home page next to Most Valuable / Card Sets / All Cards / Sealed. Shows every card with its PSA 10 price, sorted by PSA 10 value descending. Originally called 'Graded' — renamed to 'PSA 10' so the name matches what's actually on the tiles.
  • Cards on phones are sized right
    On phones, cards used to be way too big — only one fit per row. Shrunk them so 2-3 fit per row at typical phone widths. The trust/flag/swap action buttons hide below 400px because the screen is too cramped to use them anyway. Tap-to-open a card still works.
  • The website got way faster
    Building the card list used to happen on every visit, which was eating Vercel's CPU budget. Now we bake the list ahead of time and serve it. Pages feel snappier and the hosting bill goes down. Same trick for the price-chart data — it's already on the page when you click in.
  • Same card, same price (no more)
    Sometimes Cardmarket sells one big page that holds a few different prints — like a Japanese version and an English reprint can share the same Cardmarket page. Before this fix, all those different prints would copy each other's price. We saw three different OP05-119 cards all saying $3,431 even though their real prices were very different. Now the website notices when prints share a Cardmarket page and skips that source for the ones that share, so each card shows its own real price.
  • Sharing a card link looks pretty
    When you send a card link to a friend on Discord, Twitter, Slack, or Telegram, they now see a big picture of the card with its name, set, variant, and price — instead of boring text. The home page link does this too. Google search results look better too.
  • OP16 cards show up before the set even comes out
    The new OP16 set comes out later this year, but Bandai already published the card list. The website now shows those cards with a 'Pre-release · prices pending' sticker, so you can see them coming but no fake prices show up. As soon as the set actually releases, real prices fill in automatically.
  • Browse booster boxes and starter decks at /sealed
    Every booster box, booster pack, starter deck, and promo bundle Cardmarket carries — 690 products across 57 sets, 95% with live prices. Each has its own page with a picture, full price history, and a button to buy it. The most expensive one is a Romance Dawn Booster Box Case Pre-Errata, around $27,000.
  • CardTrader pictures finally load
    In the swap menu where you pick the right product for a card, all 6,659 CardTrader pictures used to render as blank placeholders because of a tiny address mismatch. Fixed at the source so every CardTrader thumbnail loads everywhere it's used.
  • eBay sold prices: still down, still working on it
    eBay's bot-protection layer is still blocking us. We applied for the official eBay API on May 8 and review usually takes 1-6 weeks. We hid the eBay section while we wait so you don't see broken numbers. All the code stays — flipping it back on is a one-line change once approval lands.

v0.95

2026-05-09

v0.95 final — Way more accurate prices, real rewards, and a real domain

  • 6,085 cards now point to the exactly right product
    The website needs to know which Cardmarket / CardTrader / yuyu-tei / TCGplayer product matches each One Piece card. Before, only 167 cards had their match locked in by hand — the rest used a fuzzy guess. We checked every card against every product and locked in the right match for thousands more: 497 Cardmarket, 2,686 CardTrader, 3,097 yuyu-tei, 1,829 TCGplayer cards. So if a card had a wrong-looking price before, there's a good chance it's correct now.
  • Silver SP and Gold SP cards finally show their own prices
    Some One Piece cards have both a silver-foil version and a gold-foil version with the same number, like OP09-093. The Japanese price source lists them under one entry but with different stickers (silver and gold). The website used to mix them up. Now we sort the prints by price and match the cheaper to silver and the more expensive to gold. 45 cards got fixed this way.
  • The 'pick a different product' button on yuyu-tei works now
    On the /triage page, you could click a button to pick a different product for any price source — except yuyu-tei, where the button was broken because of a tiny mistake in how we looked up the data (uppercase set code instead of lowercase). Fixed.
  • We cleaned up 1,570 wrongly-mapped Japanese cards
    An old bug made fancy parallel cards (alt-art versions) point at the BASE version's price instead. Symptom: a $200 alt-art Luffy showing $5. We found and fixed all 1,570.
  • The website has a real address now: op-atlas.app
    It used to live at a Vercel link. Now it's at https://op-atlas.app. Old links still redirect, but go ahead and update bookmarks. Same site, same data, just a real address.
  • Filters look way better
    The filter bar across the top is one clean row now: Origin, Star, Sort, Color, Rarity, Types, and Effects. On phones, tapping a filter opens a slide-up panel instead of a cramped row. There's a new Effects filter too — pick 'draw', 'counter', 'trash' and other words that match across both ability and trigger text.
  • You can earn real cards as rewards
    Every 100 contribution points = one Super Rare card (up to 50 per person, 350 total per page). The first 20 people to hit 1,000 points get a random Premium Alternate. The first 3 to hit 5,000 points get a Mythic worth 1,500+ Thai baht. Set up your shipping address once on /me/rewards, then click 'Claim all prizes' whenever.
  • Prices got more accurate
    Atlas Est. (the website's fair-value number) now uses 5 sources instead of 4 — CardTrader joined Cardmarket, TCGplayer, PriceCharting, and yuyu-tei. The system is much better at telling parallels and alt-arts apart from base cards, so they almost never share prices by mistake. About 92% of cards have a multi-source Atlas Est. now.
  • The mod queue is way cleaner
    On /me, the activity feed shows whether something is auto-approved, mod-approved, pending, or under review. Admins can approve their own swaps with one click and bulk-approve big queues. All the queue prices show up in USD so you don't have to do currency math in your head.
  • Search is faster
    Browsing through search results doesn't freeze anymore when you go fast. The first 24 cards load their pictures right away, so the grid feels instant.
  • Made-up card URLs return a real 'Not Found' error
    Typing /card/SOMETHING-FAKE used to load an empty card page. Now it returns a proper 'Not Found' error so search engines and link checkers know it's bogus.
  • Sharing the site looks better
    Pasting any OP-Atlas link in Discord, Twitter, or Slack now shows a real preview card with title, description, and branding. It used to render as a bare URL.
  • eBay sold prices are temporarily down
    eBay's bot-protection (Akamai) recently started blocking every request from Vercel-hosted apps at the network level — affects every site like ours. So our 4th price source is dark right now. We applied for an official eBay API approval (their Marketplace Insights program) on May 8, 2026 — they usually take 1 to 6 weeks to review. The other 4 price sources are unaffected.

v0.925

2026-05-04

v0.925 — Bug-fix sweep and tighter privacy

  • Parallel cards stopped showing the base card's price
    When you opened a Manga, Alternate Art, or SP version of a card, it sometimes showed the regular version's price. We were grabbing the first row of price data without checking which print it was for. Fixed everywhere — search, the daily price baking, and the card detail page. About 45 of the top 200 most-valuable cards were affected.
  • Atlas Est. trusts the right sources more
    The Atlas Est. formula (the website's fair-value number) now properly weighs how much we trust each source. So one weird, untrustworthy reading can't drag the whole answer way off.
  • Swap suggestions actually save now
    When our team approved a 'use a different product' suggestion, the change technically passed but didn't actually change anything. Fixed, and we filled in the ones that were already approved.
  • The daily price refresh actually runs
    There was a typo in the path our daily refresh ran on, so it had been silently failing every night. Moved to the right path. Tonight's refresh will run.
  • The diagnostic page leaks less info
    The /api/debug page used to show cookie info and your email even to people who weren't signed in. Now anonymous people only see counts and yes/no flags. Full diagnostic stays admin-only.
  • Sign-in stays signed in when our sign-in service hiccups
    If our sign-in service has a bad moment, you don't get bounced to /login mid-session anymore. The website tells the difference between 'sign-in is temporarily wobbly' and 'you're actually signed out'.
  • Logged-in pages are faster
    They used to do 2 or 3 extra check-who-you-are trips per page. Down to 1. /me, /admin/*, and the moderator queue feel snappier.

v0.9

2026-05-04

v0.9 — Earn real cards by helping with QA

  • Earn points for every flag, trust check, and swap
    Every time our team approves your contribution, you earn points. Trust check = 1 point. Flag a wrong price = 3. Pick the right product = 9. Suggest a URL = 15. If your contribution stays valid for 30 days, you earn another 3 retroactively.
  • Real cards as rewards
    Hit 50 points and you can claim a Super Rare card. Hit 250 and you can claim a Premium Anniversary card. Top contributors over time get high-value cards. Real cards from a real collection, shipped to your home. Free site, free rewards.
  • Founding Verifier — first 20 people to 100 points
    The first 20 people to hit 100 points become Founding Verifiers. Lifetime discount when paid features eventually launch, plus a permanent badge on your profile and the leaderboard.
  • See your contributions, what got approved, what got rejected
    Your /me page shows every flag and trust you've made, what state it's in, and — when something's rejected — exactly why so you can learn what we needed.
  • Faster reviews
    If your accuracy is high enough, your trust checks get auto-approved instantly so you don't wait. Every flag still gets a human review.
  • All the rewards info on one page
    New /contributors page explains the points system, the reward tiers, and shows the top 20 leaderboard. Send it to friends.
  • Sign-in is faster and never gets stuck
    Your name in the top right shows up instantly now. Clicking it always opens your profile — no more bouncing back to the sign-in form when you're already signed in.
  • Atlas Est. on every card detail page
    Atlas Est. is our daily fair-value number for every card. We pull live readings from each source we track, weigh them by trust and freshness, drop outliers, and bake one number per card per day. Card detail leads with that number plus the source range. A 'How we got this' panel shows every input that fed the formula and which got dropped. (The home grid and search keep their old price for now while we tune the formula.)
  • Card tiles got cleaner
    The little 'EN' / 'JP' text label on cards is now a small UK or Japan flag icon. Source labels above prices are gone — every price renders in the same green color. Less stuff to read, easier to scan a grid.
  • Search waits for Enter now
    Typing in the home search bar doesn't fire a search on every keystroke anymore. Press Enter when you're done. The grid doesn't recompute on every key press, so typing feels way snappier on slow phones. The dropdown autocomplete on card pages still works the way it did.
  • Refresh indicator while prices catch up
    On first page load, you'll see a small 'Refreshing prices…' pill while the latest Japanese snapshot streams in, so you know which numbers are cached versus fresh.
  • Mod queue: thumbnails and side-by-side comparisons
    Pending flags now show the card thumbnail, the card name, what the user said, and what the price source currently shows. Swap suggestions show the suggested replacement (name, price, link). Reviewing 20 flags now takes way less time.
  • Swap and propose actions actually save
    Before, suggesting a different product or pasting a new URL only saved on your computer locally. Now they save in our queue alongside trust and flag, so we can actually follow up.
  • Reliability — fewer ways to break the database
    We rebuilt some database security helpers after an early bug left them flaky, and we wrote down the fix as a real migration so the same problem can't come back. Your trust-check and flag clicks, the import of pre-account flags, the moderator queue, and the leaderboard are all instant again. Made-up card URLs now show a real 'Card not found' page instead of a blank shell.

v0.875

2026-05-01

v0.875 — Sign in. Get credit. Earn rewards.

  • Accounts are here
    Sign in with Google or your email — no password needed. Your name shows up on every flag and trust you make, so you get credit for keeping the site accurate.
  • Your contributions, in one place
    Visit /me to see how many prices you've flagged, how many we've confirmed, and what's still pending. Hit 100 confirmed flags and you can claim a Founding slot — guaranteed lifetime discount when paid features launch later.
  • Public leaderboard
    Top contributors get listed on /leaderboard. Want to be on it? Tick the box on your profile. Want to stay anonymous? Don't tick the box — and you won't be listed.
  • Your flags actually fix things now
    When you flag a wrong price, it goes into a queue for our team to review. Once approved, the fix goes live across the whole site within seconds — no more waiting for a deploy.
  • Fresher Japanese prices, better CardTrader pictures
    We refreshed the Japanese price snapshot and pulled in proper preview images for every CardTrader listing.

v0.85

2026-04-30

v0.85 — New home page, smoother animations, more accurate prices

  • Brand new home page
    Three tabs across the top — Most Valuable, Card Sets, All Cards — let you flip between views in one tap. Cards are bigger, the grid is wider, and the welcome text fades out gracefully as you scroll.
  • Cards fly into the detail page
    Tap a card on the home page and it lifts off the grid, drifts to the center, and lands as the detail-page hero. Smooth and fast. It only happens when the actual card image is ready, so no more half-loaded landings.
  • More right prices, fewer hidden ones
    Confirmed prices now stay visible even when the system would normally have second-guessed them. 30 prices that were being hidden incorrectly are back. What you see is more reliably the price you should trust.
  • Real region flags
    The little 'US / EU / JP' labels next to prices are now actual flag icons, drawn so they look the same on every device. Quicker to scan, less crowded.
  • See when prices are being checked
    When a card page opens with cached prices, you'll see a small spinner next to each one while we double-check it against the live source. So you know prices are quick AND fresh.

v0.8

2026-04-29

v0.8 — Cards know themselves now (matched by their actual picture)

  • Prices are matched by the actual card picture now
    Every Cardmarket and yuyu-tei product has been fingerprinted against the official Bandai card art. If the picture on the seller's listing doesn't match, we don't use that listing's price. The website can finally tell a regular print from an alt-art, a manga reprint from a wanted poster, a gold-foil SP from a silver-foil SP — by what the card actually looks like, not by guessing from the name.
  • Reprints in odd places find the right page on their own
    Sellers often list a reprint under a totally different set than the card's home set. Before, those needed a manual fix to find. The picture-matching catches them automatically — including the famously stubborn LECAFIG cards and 134 foil reprints across multiple sets.
  • Confidence dot on every price
    Each price now has a small green / amber / red dot next to it. Green means confirmed. Amber means we're using it but it hasn't been double-checked. Red means flagged wrong. Hover for the reason. So you can scan a page and instantly see which prices to trust.
  • Silver vs gold SP — finally tell them apart
    Some cards have both silver-foil and gold-foil 'SP' versions, and our classifier was treating them as the same card. Fixed — they get separate prices now.

v0.75

2026-04-29

v0.75 — Trust, flag, swap (your verifications now build the dataset)

  • Trust check and flag on every single price
    Tap the green checkmark to confirm a price looks right. Tap the red flag to flag it wrong. Your marks stay across visits and feed back into the dataset.
  • Pick the right product without leaving the card page
    There's a swap button next to every price now. It opens a list of all the candidate products with thumbnails and prices. Pick the right one, and the card pulls from your choice from then on. If nothing matches, paste a URL where the right price lives.
  • Big automatic cleanup of wrong prices
    We closed the systemic leaks where the wrong country's price was showing up — English cards getting Japan-only prices, Japanese cards getting English-only ones. About 4,800 more cards now have at least one wrong source removed.
  • Copy card codes in one click
    Click the OP01-001 (or cardId) pill at the top of any card page to copy it.

v0.7

2026-04-27

v0.7 — Search that actually searches, sets unified, way fewer wrong prices

  • Search is finally search
    Type a partial card number like 'OP13-00' and you get all the cards that match. Type a keyword like 'counter', 'slash', or 'supernova' and you get cards with those abilities — including Japanese cards, which used to be invisible to attribute search. Cost and counter values work too: try 'c2000', 'cost5', or '1000 counter'.
  • Sets unified
    OP14EB04 and OP15EB04 now show up as part of OP14 and OP15. Cleaner browsing, less confusion about which release a card belongs to.
  • Sticky search bar and filters
    Scroll through hundreds of cards without losing the search bar or your filters — they pin to the top. Tap a sort, a filter, or type a query, and the loading bar pulses so you know it registered.
  • 'Show all cards' actually shows all of them
    Hitting 'Show All Cards' used to cap at 2,000. Now you get every card in the index (8,200+) and price-sort actually puts the most expensive ones at the top.
  • Prices are way more trustworthy
    We blacklisted 2,623 known-bad price mappings, found correct alternatives for 547 of them automatically, and added gates that block whole classes of common errors (CardTrader showing English prices on Japanese cards, yuyu-tei showing Japanese prices on English cards, Cardmarket picking the wrong parallel print). The card detail page now hides any price reading that's wildly out of line with the others, even if we haven't been told it's wrong yet.
  • Fallback prices, but consistent
    If we don't have a price in your preferred region, you'll see one from another region with a clear region badge — no more empty cards. Source priority is the same for every user (your currency only changes how the number is displayed, not which source we pick), so prices stay the same across users.
  • Loading bar everywhere it should be
    Click sort, change a filter, type into search — the bar under the header pulses so you know something's happening. No more wondering if the click registered.

v0.65

2026-04-27

v0.65 — Cardmarket added, faster card pages, flag-it on every price

  • Cardmarket joined as a 5th price source
    Live German-market prices now show up alongside TCGplayer, CardTrader, yuyu-tei, and PriceCharting. Especially helpful for European buyers and for cards that don't show up on the US/Japanese markets.
  • Card pages stream prices in
    Card pages used to freeze until the slowest source replied. Now each price source paints in the moment its data lands, and the headline price falls back through the chain so Japanese-only and Europe-only cards still show a number.
  • Stale prices stay readable when sources hiccup
    If a source returned a price within the last 30 days but is currently down, you'll see the previous reading with a small 'Nd ago' badge so you know it's stale rather than missing.
  • Hover a card and it loads instantly when you click
    Hovering a card tile for a moment warms its detail page. Coming back to a card you've seen recently paints from a local cache while fresh data loads in the background.
  • Flag wrong prices in one click
    Every price across the site has a small flag icon next to it. Click it and the flag is recorded. The /flags page lists everything submitted, grouped by recurrence so the most common breakages surface first.
  • Japanese cards stop showing English-only prices
    Three new gates auto-eliminate the most common false-mapping pattern. The card now shows 'no recent sales' instead of a misleading number scraped from the wrong product.
  • Self-correcting price data
    When a source is flagged wrong for a card, the website searches that source for a different product whose price agrees with the rest, then auto-applies it for high-confidence cases.
  • eBay 90-day median backstops the headline price
    If every other source is empty but eBay has at least 3 recent sold comps, the median lands as the headline price. Long-tail prints finally get a number.
  • Visual polish
    A skeleton paints in under 50ms while data fetches; a thin loading bar pulses below the navbar; a back-to-top button appears when you've scrolled. Open-Beta pill explains the data-quality status and links to /flags.

v0.6

2026-04-23

v0.6 — Real card pages, drag-scroll carousels, Thai UI

  • Every card has its own URL
    Card detail moved from a popup to a real /card/[id] page. Browser back, back-swipe, deep-linking from Discord/Twitter, bookmarks — all work for the first time. Variant switches update the URL too, so the link you share opens to exactly the print you meant.
  • Search bar everywhere
    A compact search bar lives at the top of every page now. Type a name and the first 10 matches drop down with thumbnails; scroll for more. Total count is always visible.
  • Drag-scroll carousels
    Market Pulse, Recently Viewed, Watchlist, Similar Cards, the Printings strip — all support touch swipe and click-and-drag now. Edge arrows show when there's more.
  • Printings panel as a thumbnail strip
    Up to 8 prints of a card side-by-side. Current print is highlighted with a brass border. Tap any and the URL updates and prices below switch to that print.
  • Booster Packs grid: image left, info right
    Set tiles flipped to horizontal. Square box image on the left, set code/name/card count on the right. Three-up at desktop widths, single column on phones.
  • Compact settings dropdown
    Currency (USD/EUR/GBP/JPY/CNY/THB/MYR) and language (English / Thai) collapsed into a single 'USD · EN' button.
  • Thai (ภาษาไทย) UI
    Every native interface element translates. Top character names also have Thai aliases (ลูฟี่, โซโร, ซันจิ, etc.) so search works in Thai.
  • Smarter eBay fallback
    When a bare card-code search returns too few sold comps, the query auto-broadens with the variant keyword. Long-tail prints finally have data.
  • Graded readings ladder
    PSA / BGS / CGC / SGC grade-10 medians, plus premium sub-grades (BGS 10 Black, CGC 10 Pristine, etc.). Each cell shows the multiplier vs. raw — so 'PSA 10 = 18× raw' is visible at a glance.
  • Region badge on the headline price
    The big number on each card now has a small NA / EU / JP badge so it's instantly clear which market it's from.
  • Mobile and tablet layouts
    Modal close buttons grew to 44×44 on phones; tablet has its own column count; mobile header collapses everything into a dropdown.

v0.5

2026-04-21

v0.5 — First usable release: three regions, one taxonomy, atlas look

  • Live prices from three regions
    TCGplayer (US), CardTrader (Europe), and yuyu-tei (Japan) wired up side-by-side. Each card shows the variant-matched price from each source and flags the cheapest. A quick-compare line under the prices reads '40% cheaper than EU' so you don't have to do currency math in your head.
  • Variant taxonomy that actually works
    Every variant (Alt Art / Manga / Red Super / SP / Gold / Wanted Poster / Box Topper / Fixed Reprint / Base) is matched across all four sources by typed code, not by keyword. Killed the bug where a Red Super Alt Art Luffy showed the basic parallel's price ($123) instead of its real price ($8,241).
  • Deep links to the right print
    Click 'eBay sold' / 'Cardmarket' / 'Mercari Japan' / 'Yahoo Auctions' on any card and you land on a search scoped to that exact variant, not the base card.
  • Atlas look
    A cartographer's chart-paper aesthetic. Verdigris green for North America, indigo for Europe, seal red for Japan. JetBrains Mono with tabular numerals for prices, so $1,481.73 stays readable.
  • Discovery rails
    Market Pulse (Top Value + Freshly Scraped), Pinned (your stars), Recently Viewed. Drag-scroll on every rail.
  • Similar Cards and Quick-Nav
    Below each card's prices: similar prints (same character, then same archetype, then same set, then same color). Above it: one-click pills for 'All OP13 Cards', 'All Monkey.D.Luffy Cards', 'Straw Hat Crew', etc.
  • Search that gets out of the way
    Type any printable key from anywhere to start searching. Up/down arrows navigate, Enter opens the first result, Esc clears. Searches across name, code, character, family, and the cross-language altName.
  • 3D tilt lightbox on every card image
    Click a card image and it opens at full resolution in a perspective-true 3D modal. Hover to parallax-tilt, drag to push it further. Holographic sheen tracks the angle.
  • Bug-report button bottom-right
    Brass-framed bug icon opens a modal with subject, description, and up to 5 screenshots. Goes to the team inbox.
  • Free during open beta
    Sign In reveals a modal explaining everything is free during open beta. No accounts, no paywall, no signup.
OP-Atlas — One Piece TCG card price tracker