Nouvelle version d'UrzaGatherer: Rétrospective

UrzaGatherer : comment j’ai passé deux ans à coder au lieu de jouer à Magic

Il y a un paradoxe cruel quand on développe une app de collection Magic: The Gathering. Plus on code de fonctionnalités, moins on a le temps de jouer. Depuis la version 16, j’ai enchaîné les mises à jour comme un joueur de burn enchaîne les Lightning Bolt. On en est à la version 18.9 et je crois que mon app a plus évolué que le métagame Modern. Petit tour du propriétaire.

Quand je regarde la version 16.0, c’est un peu comme revoir une photo de soi au lycée. On reconnaît les traits, mais on se dit « quand même, on a fait du chemin ». À l’époque, UrzaGatherer faisait déjà le boulot mais l’interface avait un petit côté « site web de 2019 » qui ne me laissait pas dormir la nuit. Alors j’ai fait ce que tout développeur raisonnable ferait : j’ai tout cassé pour tout refaire.

L’interface

Commençons par l’éléphant dans la pièce. J’ai redessiné chaque dialogue, chaque menu contextuel, chaque popup. Les vieilles notifications navigateur ? Remplacées par des toasts empilés avec un effet de gravité (parce que même les notifications méritent de la physique). La barre latérale ? Animation fluide. L’indicateur de chargement ? Aux couleurs de mana, évidemment. Est-ce que j’ai passé une soirée entière à calibrer la vitesse de rotation ? Peut-être.

Et puis je me suis attaqué aux listes déroulantes. Je sais, dit comme ça, c’est la feature la moins sexy de l’histoire du développement web. Mais c’est un composant qu’on utilise partout, et les miennes me rendaient dingue. Maintenant elles s’ouvrent dans la bonne direction, se ferment quand il faut, et on peut taper pour chercher dedans. Ma thérapie a été un succès.

Côté mobile, j’ai tout repensé. Deux cartes par ligne, curseurs adaptés, taille de texte configurable… Je voulais que l’expérience sur téléphone soit un vrai plaisir, pas juste un « bon, ça rentre, on va dire que c’est responsive ».

Ah, et j’ai aussi refait l’icône de l’app. Parce que des fois, il faut savoir dire stop à une icône.

La page carte

La page de détail d’une carte, c’est mon enfer personnel : j’y passe tout mon temps et j’en ressors toujours avec des nouvelles idées. Je l’ai reconstruite de zéro. Grille, sections repliables, et mon petit plaisir : le drag & drop pour réorganiser les sections, synchronisé via le cloud. Votre obsession de mettre les prix en premier et le texte de règles en dernier vous suit sur tous vos appareils.

Chaque copie a maintenant ses badges colorés : drapeaux SVG pour les langues, condition, grading, date d’ajout. Les formats légaux sont en pilules cliquables. Et j’ai ajouté des sparklines d’historique des prix, parce qu’il n’y a rien de plus satisfaisant que voir la courbe de sa Ragavan monter en flèche depuis qu’on l’a achetée 30€.

Depuis la version 18.7, on peut même enregistrer son prix d’achat par copie. L’app affiche le gain ou la perte. C’est soit une source de fierté, soit un rappel douloureux qu’on a acheté des Oko à 50€. Chacun ses traumas.

La recherche : enfin, la syntaxe Scryfall

C’est LA fonctionnalité que tout le monde me demandait. « Tu peux pas mettre la syntaxe Scryfall ? » Apparemment, en version 17.4, j’ai pu. On tape `t:creature c:red cmc>=3 o:« enters the battlefield »` et ça marche. La négation aussi : `-c:red`, `-t:creature`. J’ai l’impression d’avoir débloqué un achievement.

La barre de filtres a aussi été refaite : panneau dépliable, pastille avec le nombre de filtres actifs, curseur pour les exemplaires possédés, et un bouton « Tout effacer » pour quand on s’est un peu trop emporté avec les filtres.

Le petit détail qui tue : l’aperçu en direct du nombre de résultats dans le bouton de recherche. On sait immédiatement si on a tapé un truc trop restrictif ou si on va se retrouver avec 14 000 résultats. En général, c’est l’un ou l’autre.

Les decks

Honnêtement, le module de decks a reçu tellement de travail que si c’était un deck Commander, il serait à 200 cartes.

Les vues : Vue groupée par type (Créatures, Éphémères, Rituels…) avec tri par catégorie. Vue empilée avec aperçu latéral au survol. Quand on construit un Commander et qu’on peut voir d’un coup d’œil qu’on a 3 créatures et 47 terrains, ça évite des conversations gênantes à la table de jeu.

L’auto-tagger : J’en suis probablement trop fier. Ce moteur analyse le texte de chaque carte et lui attribue un rôle : Pioche, Rampe, Suppression, Nettoyage, Contresort, Protection, Tuteur, Récursion. Quand je vois que mon deck Commander a 2% de pioche, je sais pourquoi mes parties finissent dès le tour 6. On peut corriger les rôles, et tout se synchronise via le cloud.

Les tokens : L’app détecte automatiquement les tokens, emblèmes, donjons et marqueurs de jeu. Fini le « attends, cette carte fait un token 2/2 ? » en pleine partie. Il y a aussi un mode manuel pour les control freaks (je ne juge pas, j’en suis un).

J’ai ajouté le format Oathbreaker (avec validation complète), l’import unifié MTGA/TappedOut/mtg.wtf, et, cerise sur le Mox, les Patreons peuvent partager leurs decks via un lien en lecture seule. Une belle interface dédiée, sans barre latérale. Parce que montrer ses decks, c’est le nouveau montrer ses cartes.

Exemple de deck

Le Trade Center : préparez vos trades sans stress

En version 18.1, j’ai créé le Trade Center. Trois onglets : Trade Hub, Wishlist, Tradelist. Tout au même endroit.

L’idée : centraliser ce qu’on cherche et ce qu’on propose, avec la valeur calculée par copie. On arrive au trade avec tout chiffré, on sait exactement ce que vaut chaque carte dans chaque état. Fini les négociations au feeling où on se fait arnaquer parce qu’on ne savait pas que sa carte était en Excellent plutôt qu’en Near Mint. Pas que ça me soit déjà arrivé. Plusieurs fois.

Le scanner OCR

Le scanner, c’est mon boss de fin de jeu technique. Le truc qui m’a arraché le plus de cheveux.

Depuis la version 18.6, un mode OCR local tourne *directement sur votre appareil*. Pas de cloud, pas de latence, pas de « et si Google lisait mes cartes ». Le modèle est caché localement. J’ai réécrit toute la détection autour du titre de la carte. Avant, scanner un Omnath bruité pouvait donner un token Chèvre 0/1. C’est réglé.

La version 18.9 va encore plus loin avec les « Paramètres de scan ». Vous scannez un boîtier de Modern Horizons 3 ? Dites-le au scanner. Il va biaiser les réimpressions vers cette extension et appliquer automatiquement vos tags et emplacements. Le gain de temps est obscène. J’ai scanné 500 cartes en une soirée. Ma femme était ravie (non).

Les emplacements

On a tous vécu ce moment. On sait qu’on a la carte. On sait qu’elle est quelque part. Mais entre le classeur blanc, le classeur noir, la boîte sous le bureau et le deck qu’on a démonté la semaine dernière, c’est Mission Impossible.

Depuis la version 18.7, on peut créer des emplacements personnalisés : classeur, étagère, pièce, boîte à chaussures (zéro jugement), chacun avec sa couleur et son image. On assigne un emplacement à chaque copie, et la recherche filtre par emplacement. Ma Doubling Season ? Classeur bleu, page 12, rangée du haut. Merci, je me dois une bière.

Les performances

Personne ne va tweeter « OMG le tri de ma collection est 4x plus rapide :fire: ». Et pourtant, c’est peut-être le travail le plus important que j’ai fait.

J’ai déporté la compression dans un Web Worker, viré la double sérialisation JSON, et nettoyé les sauvegardes inutiles. Résultat : le filtrage est quasi-instantané même avec plus de 120 000 cartes. Changer le tri ne reconstruit plus le DOM. La taille du bundle a fondu de 35 %. Le cache de 75 %.

Quand l’app répond instantanément là où elle ramait avant, tout le monde le remarque sans le savoir. C’est le super-pouvoir invisible du développeur : quand tu fais bien ton boulot, personne ne s’en rend compte.

Les arrière-plans animés : parce que le style, c’est la vie

Je suis développeur, mais je suis aussi un joueur qui aime les jolies choses. En version 16.4, j’ai intégré des arrière-plans animés rendus par un shader Babylon.js : Fumée, Feu, Eau, Forêt, Molécules, Braises. Tout est configurable : couleur, vitesse, opacité.

Est-ce que c’est strictement nécessaire pour gérer une collection Magic ? Absolument pas. Est-ce que ça rend l’app 47% plus cool ? Selon mes mesures très scientifiques, oui.

Le tout tourne hors du thread principal, donc aucun impact sur les performances. J’ai des principes.

La personnalisation Patreon : pour ceux qui m’aident à justifier mes heures

Pour les supporters qui me permettent de continuer ce projet (et de m’acheter des boosters pour « tester le scanner »), j’ai ajouté des bonus sérieux. Modes avancés pour les cartes d’extension et de bloc avec aperçu en direct, personnalisation de chaque élément, capsule dorée animée sur les extensions Collectors, création d’extensions personnalisées…

Et la connexion Patreon se fait via OAuth, parce qu’en 2026 on ne donne plus son mot de passe à n’importe qui.

La synchro cloud : le truc qui ne doit JAMAIS casser

Vos données de collection, c’est sacré. C’est des heures de tri, de scan, de saisie. Perdre ça, c’est comme perdre une partie de Commander au tour 3 : techniquement survivable, mais émotionnellement dévastateur.

J’ai passé beaucoup de temps à blinder la synchronisation. En version 18.9, j’ai corrigé un bug critique où un rechargement pouvait écraser les données cloud avec des données locales périmées. Le genre de bug qui vous fait transpirer à 3h du matin. C’est réglé, l’app vérifie les horodatages avant de toucher à quoi que ce soit.

Et maintenant ?

Quand j’ai commencé à écrire cet article, je voulais juste lister les nouveautés. En les mettant bout à bout, je réalise que j’ai un problème. Un beau problème, mais un problème quand même : je ne sais pas m’arrêter.

UrzaGatherer, c’est mon projet passion. Je le développe seul, sur mon temps libre (enfin, « libre », ma famille a une définition légèrement différente du mot). Chaque message d’un utilisateur qui me dit « grâce à ton app j’ai retrouvé une carte » me donne envie de continuer. Et d’acheter des boosters. Pour tester le scanner, bien sûr.

Si vous gérez une collection Magic et que vous n’avez pas encore essayé UrzaGatherer, c’est le moment. Et si vous l’aviez laissé tomber il y a quelques versions, rouvrez-le. Vous ne reconnaîtrez pas l’app.

UrzaGatherer est accessible gratuitement sur https://urzagatherer.app et également sur iOS et Android.

David.

34 « J'aime »

Félicitations pour ce taf délirant et ce report encore plus fou. Fun fact, j’ai découvert UrzaGatherer ici en 2018, en même temps que Geekzone !

Merci bcp!! Ça fait un bail que je suis dessus:)

Moi juste un message pour dire que j’ai pas tout compris, j’ai jamais joué à Magic, j’ai pas d’intérêt pour l’app, mais j’ai apprécié le rapport, la passion GZ, c’est divertissant et intéressant !

1 « J'aime »

J’avais regardé ton projet il y a 3 ans au moins, et bien, que de chemin parcouru. Je ne joue plus, non, ne titille pas ma fibre d’ancien, mais je te félicite, je vais scanner des fonds de deck juste pour le fun (les cartes datent de 20 ans ouch!).

1 « J'aime »

C’est malin, tu m’as donné envie d’exhumer ma collection de cartes qui n’a pas bougé depuis 25 ans ! J’ai envie de tout scanner, refaire des decks…

Je n’ai plus de partenaire de jeu, les règles ont dû changer (pour moi, les tokens étaient des jetons qu’on plaçait sur une carte pour incrémenter un truc), mais tant de passion c’est communicatif. Merci !

Le token peut aussi être une créature invoquée dans mes souvenirs.

Merci de vos commentaires et désolé pour la colline du crack :smiley:

2 « J'aime »

Mazette, quel boulot de maboule, bravo !

Double bravo même, tu m’as donné envie de réinstaller l’appli (j’avais essayé il y a quelques années) pour scanner ce qu’il me reste de cartes.

J’ai joué (beaucoup) au tout début de Magic puis arrêté car le rythme de sortie des extensions était délirant, puis repris il y a 2-3 ans quand Magic Arena est sorti sur Mac et iOS puis arrêté car le rythme de sortie des extensions est délirant (again). Mais j’avais racheté des cartes et des decks pour m’amuser, et tout ça est en bordel avec ce qu’il reste de mes vieilles cartes pas encore revendues. Ca mérite de faire un petit tri et de ranger tout ça, au moins virtuellement.

J’ai eu le même parcours. J’ai revendu une grande partie il y a 3 ans.

Et qu’est-ce que vous pensez de la tendance récente à sortir des cartes autour de licences d’autres œuvres ? En joueur des années 90, je me retrouve pas du tout dans ce concept, pour moi il y avait une esthétique Magic, pas forcément un lore construit mais au moins une cohérence. Voir des cartes Final Fantasy ou Tortues Ninja, ça me donne une impression de grand n’importe quoi qui m’a retenu de m’y remettre.

2 « J'aime »

pareil. Je n’aime pas du tout.

Mais les gens achètent donc ils en sortent encore plus

1 « J'aime »

La même chose ici, je vois les trucs sortir sur les réseaux de veille Magic que j’ai pas encore dumpés, mais ça me passe tellement au-dessus…

Ça avait commencé avec des trucs “Secret Lair” qui sont juste des cartes existantes rebrandées, juste pour la collec’. Mais là si j’ai bien compris, avec les Tortues Ninja ils ont carrément sorti une extension complète O_o

Déjà que les univers Japon-néon, mechas, etc ça me sortait du truc, mais là jouer à Magic avec les TMNT, vraiment je m’en fiche. Mais comme dit Deltakosh, apparemment ça marche bien donc c’est pas prêt de s’arrêter.

1 « J'aime »

J’ai découvert récemment les extensions FF, je ne savais pas qu’il y avait Tortues Ninja. Non merci. Magic c’est de l’heroic fantasy. Point. On est trop vieux probablement, trop habitués au LEGACY probablement.

2 « J'aime »