···3636## Image & Display Fields
37373838### Images
3939-- `image_uris`: Object with card image URLs at different sizes
4040- - Keys: `small`, `normal`, `large`, `png`, `art_crop`, `border_crop`
3939+4040+**Image URI Reconstruction:**
4141+Scryfall image URLs follow a predictable pattern. Instead of storing `image_uris`, reconstruct them:
4242+4343+```typescript
4444+function getImageUri(scryfallId: string, size: 'small' | 'normal' | 'large' | 'png' | 'art_crop' | 'border_crop'): string {
4545+ return `https://cards.scryfall.io/${size}/front/${scryfallId[0]}/${scryfallId[1]}/${scryfallId}.jpg`;
4646+}
4747+```
4848+4949+Pattern: `https://cards.scryfall.io/{size}/front/{id[0]}/{id[1]}/{id}.jpg`
5050+5151+Verified on 100% of sampled cards (96.5% of all cards have images).
5252+5353+**Stored fields:**
4154- `image_status`: Quality indicator (`missing`, `placeholder`, `lowres`, `highres_scan`)
4255- `highres_image`: Boolean for high-res availability
4343-- `illustration_id`: Unique artwork identifier
5656+- `illustration_id`: Unique artwork identifier (not currently stored, but available)
44574558### Card Appearance
4659- `layout`: Layout code (e.g., `"normal"`, `"split"`, `"transform"`, `"modal_dfc"`)
+4
.gitignore
···1212.vinxi
1313todos.json
1414.direnv
1515+1616+# Scryfall data (downloaded during build)
1717+public/data/
1818+.cache/
+2
CLAUDE.md
···90909191## Important Notes
92929393+- **This is a TypeScript project** - ALL code (including scripts) must use TypeScript with proper types
9494+- **Use `nix-shell -p <package>` for missing commands** - If a command isn't in PATH, use nix-shell to get it temporarily
9395- `src/routeTree.gen.ts` is auto-generated - never edit manually
9496- `typelex/externals.tsp` is auto-generated from lexicons folder - add external lexicon JSON to trigger regeneration
9597- Demo files (prefixed with `demo`) are safe to delete
+1
flake.nix
···2323 nodejs_22
2424 # wrangler
2525 just
2626+ jq
2627 # language servers
2728 typescript-language-server
2829 typespec