WallpaperMachine
The wallpapers you love. A new home on your Mac.
Scan your cards, follow every set like a binder and see the Cardmarket price of each card. Built for collectors, works on your phone.
LifestyleTypeScript · PLpgSQLGitHub @LarsJ95OnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Kaartenmap: Pokémon-collectie, verkoop en marktwaarde
Translation pending
Loading the full README.
Read the full README ↗Persoonlijke PWA voor een Pokémon-kaartencollectie: collectie, aan- en verkoop, marktwaarde (Cardmarket via TCGdex), set-voortgang, wishlist en kaarten scannen met de camera.
Live: https://dexcrate.com (landingspagina) en https://dexcrate.com/app/ (de app) (sinds 17-10-2026; het oude adres https://larsj95.github.io/dexcrate/ stuurt door). Domein bij Versio (DNS: 4× A en 4× AAAA naar GitHub Pages, CNAME www → larsj95.github.io, TXT _github-pages-challenge-LarsJ95 voor de domeinverificatie; geen wildcard-records). Custom domain en Enforce HTTPS staan in de repo-instellingen (Pages), geen CNAME-bestand nodig bij publiceren via Actions.
vite-plugin-pwa, hash-routing)src/lib/cardImages.ts en src/lib/setIcons.tssrc/lib/localCatalog.ts, sleutels zoals en/clc-010; foto via PriceCharting, geen prijsnpm install
cp .env.example .env.local # vul VITE_SUPABASE_URL en VITE_SUPABASE_PUBLISHABLE_KEY in
npm run dev
| Script | Doet |
|---|---|
npm run dev | Ontwikkelserver op productie-data (.env.local) |
npm run dev:staging | Ontwikkelserver op de testdatabase (.env.staging.local), met rood TEST-label |
npm run build | Typecheck + productiebuild in dist/ |
npm run build:staging | Build tegen de testdatabase |
npm run lint | oxlint (.oxlintrc.json) |
npm test | Vitest (altijd zonder Supabase-sleutels, net als CI) |
npm run test:e2e | Browsertests (na npm run build) |
Zonder sleutels start de app niet (src/lib/supabase.ts). De publishable key is publiek; de beveiliging loopt via RLS. Gebruik nooit de secret key in de app. dev:staging en build:staging weigeren te starten zonder .env.staging.local die naar een ánder project wijst dan .env.local.
main is beschermd: wijzigingen gaan via een branch en pull request.
.github/workflows/ci.yml draait op elke pull request: lint → tests → build → browsertests (Chrome). Pas als die groen is kan de pull request erin.main draait .github/workflows/deploy.yml: lint → test → build → GitHub Pages. De Supabase-URL en publishable key staan als repository variables.Tests draaien zonder Supabase-sleutels: een test die (indirect) src/lib/supabase.ts laadt, moet vi.mock('…/supabase', …) gebruiken plus een dynamische import (zie bv. src/lib/model.test.ts).
Het schema staat in migraties: supabase/migrations/<tijdstempel>_<naam>.sql, toegepast met de Supabase CLI (vaste versie via npx [email protected], geen Docker nodig, geen dependency).
Nieuwe databasewijziging:
npx [email protected] migration new <naam> en de SQL in het nieuwe bestand schrijven. Nooit een bestaande migratie aanpassen..github/workflows/migrate.yml zet de migratie automatisch op de testdatabase. Test met npm run dev:staging.production, mode migrate. Daarna samenvoegen (de app gaat dan pas live).Secrets per GitHub environment (staging, production): SUPABASE_DB_URL = de Session pooler-verbinding uit Supabase → Connect (wachtwoord percent-encoded). Productie heeft daarnaast BACKUP_PASSPHRASE.
supabase/migrations/20261017120000_baseline.sql: het volledige schema na STAP16 (startpunt). Op productie alleen als toegepast gemarkeerd (workflow met mode mark-applied, die alle migraties t/m versie tot markeert zonder ze uit te voeren); tot dan weigert de workflow productie, zodat de basismigratie daar nooit draait.supabase/legacy/: de oude STAP-bestanden en schema.sql (geschiedenis; niet meer gebruiken).supabase/config.toml: nodig voor de CLI; geldt alleen voor een lokale stack. Nooit supabase config push zonder het hele bestand te controleren..github/workflows/backup.yml: elke maandag (en met de hand via Actions) een dump van de productiedatabase (rollen, schema, data), versleuteld met BACKUP_PASSPHRASE en 90 dagen bewaard als artifact. De repo is publiek: de workflow stopt als de passphrase ontbreekt. Bewaar de passphrase in je wachtwoordmanager: zonder is een back-up onbruikbaar. Foto's en bonnetjes (Supabase Storage) zitten er niet in; die staan in de back-up van de app zelf (Backup-pagina). GitHub zet geplande workflows uit na 60 dagen zonder activiteit in de repo (dan een mail; opnieuw aanzetten in Actions).
Terugzetten (in een nieuw, leeg project):
gpg -d dexcrate-backup-JJJJ-MM-DD.tar.gz.gpg | tar -xzf -
psql --single-transaction --variable ON_ERROR_STOP=1 \
--file dexcrate-backup/roles.sql --file dexcrate-backup/schema.sql \
--command 'SET session_replication_role = replica' \
--file dexcrate-backup/data.sql --dbname "<Session pooler-URL van het nieuwe project>"
In supabase/functions/, via de editor in het Supabase-dashboard gedeployd (controleer bij deployen het naamveld). "Verify JWT" blijft aan.
recognize-card: herkent kaarten op een foto met Claude. Secret: ANTHROPIC_API_KEY. Limiet per gebruiker (40 per minuut, 500 per 24 uur) via scan_quota_take() (STAP15, in de basismigratie); zonder werkt scannen zonder limiet.card-image: laatste redmiddel voor kaartfoto's via PriceCharting.Crashes en onafgevangen fouten (geen netwerkfouten) gaan naar de tabel app_errors (STAP16, alleen eigen regels): Supabase → Table Editor → app_errors. Zie src/lib/errorLog.ts.
Sinds 17-10-2026: dexcrate.com is een statische landingspagina (landing/), de app staat op dexcrate.com/app/.
This is the beginning of the README. Read the rest at the original. Read the full README ↗