Fixed a long-standing set of serialization bugs that broke remote card animations for other players, plus deck flip hangs and animation queue corruption.
4 fixes
Fixes
Remote card animations - card animations were silently never playing for other players due to Three.js objects (positions, rotations, curves) not being correctly serialized and reconstructed across the network. Fixed.
Deck flip hang - the deck flip animation would hang indefinitely when triggered on an empty deck. Fixed.
Animation queue corruption - rapidly adding cards to the top of a deck with keep-flipped enabled could corrupt the animation queue. Fixed.
Animation data guards - added runtime checks that surface bad animation data at the call site rather than crashing silently several frames later.
Fixed a statistical bias in the shuffle algorithm, corrected the deck bounce animation, fixed visual glitches when moving cards between zones, and improved crash resistance.
5 fixes
Fixes
Shuffle bias — the shuffle algorithm had a statistical bias that gave cards near the top of the deck a higher chance of staying there. Fixed with a correct Fisher-Yates implementation.
Deck bounce animation — the bounce animation when cards are added to the deck was using the wrong position as its anchor, making it look wrong. Fixed.
Card rotation mutation — moving cards between zones (graveyard, stacks) was accidentally mutating the parent mesh rotation, causing visual glitches. Fixed by cloning the quaternion before inverting.
Transfer crash — transferring a card with a missing source zone could crash the game. Now handled gracefully.
Animation path guard — added a guard against undefined points in card movement paths, preventing a class of rare animation crashes.
Deck Paste with Mismatched Card System, Hand Animation Fix, and Scroll Speed
You can now paste a deck list even when the card system doesn't have full search config. Fixed a hand card animation bug and increased card grid scroll speed.
Paste deck list with any card system — pasting a deck list into the editor no longer fails when the card system doesn't have a full search configuration. Cards are loaded and matched more robustly.
Fixes
Hand animation bug — cards added to hand were missing rotation data, causing them to snap or animate incorrectly. Fixed.
Card grid scroll speed — scrolling through the card grid was far too slow. It's now 8× faster and much more usable.
Settings are now saved — your preferences (like camera tilt) are remembered between sessions. No more re-enabling it every time you reload.
Fixes
Camera tilt smoothness — the previous build had no easing on the camera tilt, making it feel immediate and jarring. It's now properly smoothed with separate horizontal and vertical sensitivity, and a much gentler motion overall.
Settings Menu, Camera Tilt Toggle, and Regression Fixes
Camera tilt is now opt-in via a new in-game Settings menu. Also fixes two regressions from the previous build affecting hand card overlays and battlefield card dragging.
The table has been expanded to support four players, a night sky environment has been added to the scene, and the camera now subtly tilts as you move your mouse.
Keyboard Shortcut Overhaul, Reveal Action, and Counter Fix
Revised keyboard shortcuts with platform-aware modifier keys, shortcuts displayed in menus, a new Reveal action, top-of-deck shortcut from peek, and a counter display fix.
5 features2 fixes
⚠️ Shortcut Changes
Several keyboard shortcuts have changed. If you have muscle memory from before, here's what moved:
Action
Old
New
Untap all
Shift+U
Shift+R
Clone
—
Ctrl/⌘+C
Discard
Ctrl/⌘+D
Ctrl/⌘+D(renamed from Destroy)
Exile / Remove from game
E
Ctrl/⌘+E
Transfer to field
B
Ctrl/⌘+F
Top of deck
—
Shift+T
Bottom of deck
—
Shift+B
Modifier keys now display correctly per platform — ⌘ on macOS, Ctrl elsewhere.
Features
Shortcuts in menus — keyboard shortcuts are now shown next to their actions in the move menu and deck menu, so you can learn them in context.
Reveal — new Reveal action added to the move menu.
Top Deck from peek — a "Top Deck" button is now available directly in the peek menu.
Platform-aware modifier keys — shortcut labels use ⌘ on macOS and Ctrl on Windows/Linux throughout the UI.
Fixes
Counter display — counters in the field menu now update correctly when switching between selected cards.
Card list crash — fixed a crash when a card system doesn't define any card types.
Keyboard Shortcut Overhaul, Reveal Action, and Counter Fix
Revised keyboard shortcuts with platform-aware modifier keys, shortcuts displayed in menus, a new Reveal action, top-of-deck shortcut from peek, and a counter display fix.
Changelog page — you can now read the full release history at arcanetable.app/changes, linked from the footer. Each release shows its date, target, and full notes.
Fixes
MTG card server — fixed a typo in the MTG card server URL that was causing card lookups to fail when starting a game from the landing page.
External links — Discord, GitHub, and Patreon links in the nav were not opening in a new tab. Fixed.
Deck Editor, Pokémon & Yu-Gi-Oh, New Landing Page, and More
The biggest Arcanetable release yet: a built-in deck editor, Pokémon and Yu-Gi-Oh support, a collapsed counter display, deck list export, a new landing page, and a large pile of bug fixes and performance improvements.
6 features12 fixes
Features
In-App Deck Editor
You can now build and edit decks directly inside Arcanetable — no more managing lists outside the app. Search for cards, adjust quantities, paste in a list, or download your deck as a .txt file when you're done. Search supports multiple comma-separated terms and searches across card faces, so double-faced and split cards show up when you expect them to.
Pokémon & Yu-Gi-Oh Support
Two new built-in card systems join MTG: Pokémon and Yu-Gi-Oh are now supported out of the box. Switch between them in the deck selector and use the system viewer to browse available cards. Multi-type search works correctly for both — searching "Fire Water" in Pokémon or "Effect Monster Spell" in Yu-Gi-Oh returns the right results.
Collapsed Counter Display
Cards with counters now show a compact counter row directly below the card action menu. Left-click to add a counter, right-click to remove one. No more hunting through menus to track Infamy, Population, or any other counter type — they're always visible at a glance while a card is selected.
New Landing Page
The landing page has been completely redesigned with updated copy, imagery, and layout that better reflects what Arcanetable actually is. Game picker cards now let you jump straight into MTG, Pokémon, or Yu-Gi-Oh with one click. A new Community section links to the Discord and Ko-fi for anyone who wants to follow along or chip in.
Stale-While-Revalidate Card Server Caching
The card data servers now serve cached responses immediately while refreshing stale data in the background — so browsing large card sets is snappier, especially on repeat visits. Card images also now cache correctly at the Cloudflare edge, which should make a noticeable difference on first load.
Download Deck List
Export your current deck as a .txt file directly from the deck editor — handy for sharing with friends or backing up your lists outside the app.
Fixes
Deck export — exported lists no longer include cards currently on the battlefield.
Disabled states — "Start Playtest" and "Edit Deck" now correctly disable when no deck is selected.
Tags field — pressing Enter in the deck tags field no longer submits the form.
Deck mutation — the deck is cloned before entering the editor, so unsaved edits can't affect your saved deck data.
Add card button — click handler moved to the button element, fixing interaction issues in some browsers.
Starting life total — clearing the field no longer produces NaN; it falls back to 0.
Deck picker close button — removed from the session start dialog to prevent accidentally dismissing it.
Delete dialog — the confirmation dialog now includes a copy button next to the deck name so you don't have to retype it manually.
Type filter search — toggling a card type filter off and back on now correctly triggers a new search.
Search cancel — clearing the search field cancels any pending debounced search, preventing stale results from flashing in.
Loading spinner — the "Loading more results" indicator in the deck editor now only appears when a search is actually active.
Mobile — the multiplayer image now displays correctly on mobile.
New draft of the landing page is live with updated copy and layout.
Scry Server Caching
Card data servers now use a stale-while-revalidate model. Since upstream card servers can be slow, cached responses are served immediately while fresh data loads in the background — less waiting when browsing cards.
Fixes
Toggling a card type filter off and back on now correctly triggers a new search.
Multiplayer image now displays correctly on mobile.
Landing Page Polish, Community Section, and Loading Fix
Refreshed landing page imagery, a new community support section with Discord and Ko-fi links, and a fix for the loading spinner showing when no search is active.
A new "Support the Project" section on the landing page links to the Discord and Ko-fi. Free and open source, built in spare time — this makes it easier for people to find where to hang out and chip in if they want to.
Landing Page Imagery
Updated hero, game picker, and section images across the landing page for a fresher look.
Fix
The "Loading more results" spinner in the deck editor now only appears when a search is actually active — it no longer shows on page load or after clearing the search field.
A round of deck editor fixes: correct disabled states, form submission prevention, deck mutation fix, corrected deck export, and small UX improvements to the deck picker and delete dialog.
Card Image Caching, Search Cancel Fix, and Loading Spinner
Improves card image caching for edge delivery, fixes a stale debounced search firing after clearing filters, and polishes the deck editor loading state.
Search cancel — clearing the search field or deselecting all type filters now cancels any pending debounced search, so stale results no longer flash in after you've already cleared the input.
Card image edge caching — removed the Vary header from image responses on the MTG scry server, which was preventing Cloudflare from caching card images at the edge. Card images should now cache and load significantly faster.
Improvements
The "Loading more results" indicator in the deck editor is now a proper animated spinner instead of plain text, and uses the correct page field to determine when more results are available.
Collapsed Counter Display, Deck Export, and YGO Multi-Type Search
Adds a compact always-visible counter row, deck list export to .txt, Yu-Gi-Oh multi-type search, and a card back texture fix that lays the groundwork for sleeve customisation.
Cards with counters now show a compact counter row directly below the card action menu. Left-click to add a counter, right-click to remove one. No more hunting through menus to track counters like Infamy or Population — they're always visible at a glance while a card is selected.
Download Deck List
You can now download your deck list as a .txt file directly from the deck editor — handy for sharing or backing up lists outside the app.
Yu-Gi-Oh Multi-Type Search
Searching for cards with multiple types in Yu-Gi-Oh (e.g. "Effect Monster" + "Spell") now works correctly. The server fans out requests per type and merges results with proper deduplication and error handling.
Fixes
Switching card systems now correctly updates the card back texture on all existing cards in the scene in real time, instead of only newly loaded cards. This lays the groundwork for sleeve customisation — custom card backs per deck could happen if there's enough interest.
Fixed a bug where deck search wasn't filtering results correctly due to a typo in the config key.
Various stability fixes in the counter and deck search subsystems.
Card images for Pokémon, Yu-Gi-Oh, and MTG were being served over HTTP instead of HTTPS, causing them to be blocked as mixed content in the browser. All three systems now load card images correctly.
Search results in the deck editor are now paged. Previously, searching "creatures" in MTG triggered 8,800+ requests and transferred nearly 1 GB. Only the current page of results loads now — browsing large sets is dramatically faster.
Fixes
Searching for MTG cards with multiple types (e.g. "Artifact Creature") now works correctly.
Fixed card image requests being served over HTTP instead of HTTPS (mixed content block). (See also 2026-05-18 patch.)
Credits
Thanks to Zulu in the SolidJS Discord for catching the performance issue and providing the network tab receipts.
You can now build and edit decks directly inside Arcanetable — no more managing lists outside the app. The editor supports searching for cards and adjusting quantities without leaving the table.
Pokémon & Yu-Gi-Oh Support
Two new built-in card systems join MTG: Pokémon and Yu-Gi-Oh are supported out of the box. Switch between them in the deck selector and use the system viewer to browse available cards.
Try the new systems by adding ?system=scry-server-[game].arcanetable.app to the URL — replace [game] with pokemon or yugioh.
Unknown Card Image
Cards that cannot be loaded now show a proper placeholder instead of a broken state.
Token Routing
Tokens are now routed through the caching server, improving load times and reducing redundant fetches during play.
Fixes
Resolved an issue with card image display (addressed in subsequent staging patches).
Fixes a bug preventing decks from saving and improves the deck selector with deckId migration, system viewer access, and copy-link support.
3 features1 fix
Bug Fix
Fixed a bug that could prevent decks from being saved. If you experienced decks not persisting, this is now resolved.
Deck Selector & Editor Improvements
Switched from deckIndex to deckId for identifying decks — a more reliable foundation for future work.
Migrated the deck store from an array to a map for better performance and lookup efficiency.
The system viewer is now accessible directly from the deck selector.
The copy-link feature now captures the full URL including the ?system= parameter when one is present.
stableaf202d5d
Custom Card Systems and Landing Page Refresh
Arcanetable can now load any remote card system via the ?system= query parameter, enabling support for custom cubes, proxied MTG decks, and other TCGs.
2 features
Features
Custom Card Systems
Arcanetable can now load a remote card system at startup. Point it at your own JSON endpoint via the ?system= query parameter to bring your own cards — whether that's a custom cube, a proxied MTG deck, or a completely different TCG like Pokémon or Yu-Gi-Oh.
The card system config controls: where card data comes from, how images are structured, how cards are indexed for search, and which field drives popularity sorting.
Two image formats are supported:
standard (default) — for systems with multiple printings per card, where each card has a map of print variants.
scryfall — mirrors the Scryfall API format, used by the built-in MTG system.
Full documentation is in the README.
Landing Page
Refreshed landing page copy and layout to better reflect what Arcanetable actually does.
stable
Stability, Resilience, and Copyable Error Reports
Improved stability for long play sessions with copyable error reports, graceful animation degradation, and null-safety fixes.
2 fixes
Improvements
Added copyable error reports when something goes wrong, making it easy to share useful bug reports without opening DevTools.
Improved handling of corrupted or invalid animations — the game now degrades gracefully instead of crashing.
Normalised how resting positions are assigned to reduce subtle layout inconsistencies over time.
Fixes
Added null checks and refactored user data handling to prevent serialised data from being stored incorrectly.
Cleaned up internal formatting and data handling to reduce hard-to-track issues during extended gameplay.
Community
Special thanks to @Herbert De La Comb Au Loup for reporting a major issue where cards can disappear for a player mid-game. This update includes groundwork to make issues like that easier to track down and fix.
stable
Double-Sided Card Fix and Deck Editor Card Count
Fixes completely broken double-sided card rendering and adds total card count display to the deck editor.
2 features1 fix
Features
Deck editor now shows total card count.
Double-sided cards now render and behave correctly in play (they were completely broken before this fix).
Chore
Prettier run: tidied up the codebase for cleaner diffs and consistency.
stable
Multi-Selection, Enhanced Search, and Performance Improvements
Adds multi-card selection with drag, enhanced comma-separated search, worker-threaded image loading, and visual polish across the table.
12 features6 fixes
Features
Multi-Selection
Initial support for multi-selection.
Drag select with Ctrl, Command, and Shift.
Ctrl, Command, and Shift click for multi-selection.
Battlefield menu actions now apply to all selected cards.
Hotkeys now apply to selected cards.
Search Enhancements
Search now includes card faces for more comprehensive results.
Multiple search terms can be used, separated by commas.
Performance
Card images now load and resize in a worker thread to reduce jank.
Added a card loading texture for smoother visual feedback.
Cards now stack during drag-and-drop operations.
Dragging cards ignores intersections with the items being dragged.
Visual Improvements
Updated table colours to be more theme-appropriate.
Card loading animations and card backs load earlier for a better first impression.
Command Palette
Ctrl+K / Cmd+K can now be used to toggle the command palette (in addition to Ctrl+Space).
Fixes
Prevented scroll bounce during gameplay interactions.
Fixed card grid filter removal when the last filtered card is removed.
Prevented the search field from wiping unexpectedly.
Fixed player menus to allow proper expansion.
Normalised app name to "Arcanetable."
Cleaned up navigation so Back → Start Now works correctly.
Locked interactions during bulk transfers to and from grids.
Fixed a selection bug where clearing the selection would not work as intended.
Chore
Refactored hotkeys into their own file for cleaner code organisation.
Updated dependencies.
Added analytics to track user engagement.
Removed unnecessary console logs.
stable
Command Palette and Keyboard Shortcuts
Introduces a command palette with deck-specific commands, dice rolls, and global keyboard shortcuts for common battlefield actions.
5 features1 fix
Features
Added a command palette for quick actions (Ctrl+Space / Ctrl+K / Cmd+K).
Integrated deck-specific commands into the command palette.
Enabled logging-only dice rolls via the command palette. (#32)
Introduced global keyboard shortcuts for key actions.
Card grids now auto-focus the search field when opened.
Keyboard Shortcuts
Scope
Key
Action
Battlefield
C
Clone
Battlefield
T
Tap
Battlefield
F
Flip
Global
D
Draw
Global
S
Search deck
Global
Shift+U
Untap all
Global
Ctrl+Space
Open command palette
Card (global)
B
Send to battlefield
Card (global)
Ctrl+D
Destroy
Card (global)
E
Exile
Card (global)
P
Peek
Card grid
Esc
Close menu
Fixes
Properly dispose of cards when closing the token menu.
Closed Issues
#21 Basic keyboard shortcut implementation
#32 Add dice rolls
stable
Card Grid Stability and Search Fixes
Stability and UX fixes for card grid interactions, counter visibility, flipped cards, and search field behaviour.
5 fixes
Fixes
Locked interactions during bulk transfers to and from the card grid to ensure consistent behaviour.
Fixed an issue where flipping a card multiple times caused it to land incorrectly on the table.
Allowed expanding other players' counter views for better gameplay monitoring. (#40)
Resolved an issue where removing the last filtered card from the card grid would not clear the filter.
Prevented the search field from wiping unexpectedly during use.
stable
Shuffle Performance, Graveyard Counter, and Token Order Fixes
Performance improvements for shuffling into the deck, graveyard counter decrement fix, and correct token ordering for remote clients.
1 feature4 fixes
Features
Improved performance by reusing dismissFromZone for shuffling cards into the deck. (#37)
Fixes
Resolved an issue where the graveyard counter did not decrement correctly. (#41)
Fixed token order in the "Add Token" menu on remote clients — tokens now sort correctly based on IDs. (#39)
Prevented multiple transferCard events when dismissing cards from the grid. (#41)
Updated transferCard to use setCardData for improved consistency.
Improvements
Optimised shuffle-into-deck by leveraging bulk events. (#37)
Added optional chaining to logging for cleaner error handling.
stable
Invite Link Copy, Concede, and Counter Visibility Fixes
Adds copy-invite-link from the deck picker, player concede flow, and fixes counter visibility on card backs.
2 features2 fixes
Features
Added the ability to copy an invite link directly from the deck picker. (#22)
Players can now concede a game. Conceding moves the player to spectator mode; when all but one player has conceded the game transitions to deck selection mode. (#23)
Fixes
Fixed counter visibility from the back side of cards.
Counters are now properly removed when a card is destroyed.
stable
Hand and Battlefield Search
Adds search functionality for the hand and battlefield zones, and fixes tap direction for flipped cards.
1 feature1 fix
Features
Added search functionality for the hand and battlefield zones.
Fixes
Flipped cards now tap in the correct direction.
Chore
Cleaned up logs and optimized imports for a smaller bundle size.
stable
Number Field Inputs and Draw Refactor
Updates all variable inputs to number fields and refactors draw to use transferCard with extended options.
2 features
Features
Updated all variable inputs to use proper number fields.
draw now utilises transferCard with extended options for consistency.
Chore
Refactored transferCard to support extended options.
stable
Card Counts, Token Toggle, and Counter Fixes
Adds zone card counts, toggleable token grid, clone-as-token tagging, and several counter bug fixes.
3 features3 fixes
Features
Display card counts for hand, battlefield, peek zone, token search zone, deck, and card stacks.
"Add Tokens" now toggles the token grid instead of opening a separate view.
Cloning cards tags clones as tokens automatically.
Fixes
Fixed initial counter rendering issues.
Fixed counter placement, scaling, and values exceeding 999.
Fixed dismissing the token menu when triggered by a remote action.
Fixed removing cards from stacks and prevented duplicate additions.
Fixed cards being dismissed twice when added.
Removed mesh correctly when calling deck.removeCard.
Chore
Refactored emitEvent logic.
stable
Token Display and Drag Fixes
Fixes for token visibility and card dragging from the token menu, plus production artifact hashing.
2 fixes
Fixes
Fixed tokens not showing for cards that started in play.
Fixed dragging cards from the Add Token menu.
Chore
Enabled hashing and compression for production artifacts so browsers always receive the correct file versions.