Proposed screens, one at a time, built on the design direction. Left is today's app from the simulator; middle is the proposal, which scrolls; right lists what changed and why. Prices and card facts come from the app's own data for that card unless marked otherwise.
00
The new menu
(tabs)/_layout.tsxApp-wide
Now
Search · Scan · Collections · Settings. The app opens on Search, a list of 1,000+ sets.
Scan hides the tab bar and looks like any other tab, though it's the reason people install the app.
Active tab is orange, the same orange as every button.
VoiceOver reads "1 of 7" because hidden routes are counted.
Proposed
Collection · Browse · Scan · Wishlist · Settings. The app opens on Collection, which shows what you own and what it's worth.
Scan sits in the centre as a raised orange button: the one action that's always one tap away. It's the only orange in the bar.
Browse merges the Search tab and card search: one field for cards, sets and artists, sets below it.
Wishlist gets its own tab because hunting cards is one of the four core jobs. Favorites folds into it as a filter.
Active tab uses ink plus a heavier icon. Hidden routes get removed from the tab navigator so VoiceOver reads "1 of 5".
The price comes first. The current screen spends the first viewport on a 290pt card image and a three-button variant grid; the price only starts at the bottom edge. Now name, set, number and price all sit above the fold.
Printings live inside the price slab, each showing its own price, because switching printing changes the price. Normal $46.94 and Holo $274.99 in one glance tells a collector which copy they need to check for.
Every number names its source. Today the headline says $46.94 while the history chart below shows Cardmarket flat at $60.00, and neither says where it comes from. The slab labels its figure as an average across sources, and the chart gets a source switch.
Change is stated in words and numbers ("No change · last 30 days") instead of a lone trend icon.
Live vs local stays visible as a small status dot, which keeps the trust distinction from the screen's rules without an orange badge competing with the CTA.
One primary action, always reachable: a sticky "Add to collection" bar with Wishlist next to it. Orange appears once on the screen.
"Wrong card?" sits next to the identification, where a scan mistake is noticed, and opens the existing report form.
Card image opens full screen on tap. Header shows where the card came from ("Scanned just now", "From Chaos Rising", "Search result").
Card text sections become compact: a four-up battle profile, energy dots, one details list with set and artist as links (both already navigate today).
Data checks
No API change needed for the segment: /cards/:id/prices already returns all variants in one response (data.variants, read in PokemonPriceQueries.ts).
Jumbo and Reverse show no price because none was loaded in this session.
Data: scan record base6-4 on the simulator, average price $46.94 (live), Holo $274.99 from the Pricing screen. Price history from the app: Cardmarket, flat at $60.00 from 15 Sep to 14 Oct 2026. Whether TCGplayer history exists for this card is unchecked.
Ungraded (raw) means a card not sealed in a grading slab.
Live means fetched just now, not from the on-device cache.
Prices are observed marketplace data, not an appraisal or offer. We may earn a commission from marketplace links.
What changed
The screen says which card it's about. Today the header is a back arrow and two unlabeled chips, with no card name.
A range bar shows the spread from low to high listings with the market price marked, so "is $274.99 a good price?" reads in one look. Mid ($151.75) sits as a faint tick near the low end, which shows the market price sits well above the mid listing price.
"RAW" becomes "Ungraded (raw)" and both status chips are explained at the bottom in plain words.
"Direct low –" becomes "No listing" instead of a dash.
The table keeps all six figures and the buy link. The table head is now a section title, so the TCGplayer logo image goes.
Open questions
Does the API return Cardmarket figures for this card? The current screen only shows TCGplayer, so Cardmarket and eBay appear as links only.
7-day and 30-day averages exist in the code but weren't on screen for this card. Where are they shown today?
Data: Pricing screen for base6-4, variant holofoil, captured from the simulator: market and average $274.99, low $125.00, mid $151.75, high $399.98, no direct low. The disclaimer wording is a placeholder for the app's existing legal text.
03
Collection
/(tabs)/collection · new homeProposal v1
Now
Proposed · scroll inside
9:41
Collection
Owned · 4 cardsLive
$94.45
▼ $0.09 (0.1%) · 7 days
7D1M3M1Y
Lists 2
My Cards4 cards · owned
$94.45▼ 0.1%
Wishlist6 cards · to buy
$1,460.01to complete
New list
Most valuable owned
Dark Blastoise ×2LC · 4/110 · Normal
$93.88$46.94 each
Lurantis exPBL · 004/084 · Holo
$0.41▲ $0.02
PoltchageistPBL · 005/084 · Normal
$0.16—
CollectionBrowseScanWishlistSettings
What changed
Opens on value. The total and its 7-day chart are the first thing you see. Today the chart is two taps deep inside one collection.
Owned and wanted are separated. The headline counts owned lists only; Wishlist shows the cost to complete instead of a change, because it isn't money you have.
Rows instead of 2×2 tiles. Each list shows count, value and change. "Create new" becomes a slim dashed row rather than a quarter of the screen.
Most valuable cards answer "what's my best card" without opening anything.
Real: My Cards $94.45, ▼ $0.09 over 7 days, Dark Blastoise $46.94 each. Example values: Wishlist total and the Lurantis ex and Poltchageist prices.
04
Browse
/(tabs)/browse · replaces SearchProposal v1
Now
Proposed · scroll inside
9:41
Browse
Cards, sets, numbers, artistsEN
All setsCollectingRecentFavorites
Mega Evolution8 sets · 1,066 cards
Pitch Black
PBL · 1202/120
Chaos Rising
CRI · 1220/122
Perfect Order
POR · 1240/124
Ascended Heroes
ASC · 2950/295
Phantasmal Flames
PFL · 1300/130
Mega Evolution
MEG · 1880/188
Other22 sets · 432 cards
Legendary Collection
LC · 1101/110
CollectionBrowseScanWishlistSettings
What changed
One search field for cards, sets, numbers and artists. Today there are two stacked fields ("Search cards" and "Filter sets by name or code") plus a separate card-search screen.
Set rows show your progress (2/120) with a thin bar, so Browse doubles as a completion tracker. The data already exists in catalogue:owned_cards_by_set.
Set code in mono (PBL · 120) reads like the code printed on the card.
"Collecting" filter shows sets you own at least one card from.
Series header gives set and card counts in words; today it says "Total 1066" without a unit.
Pokémon TCG Pocket sets, which are digital-only, should get their own filter or be hidden in a physical-card scanner. That's a question for you.
Real: set names, codes, card counts, series totals. Owned counts (2/120, 1/110) come from the cards in your collections.
05
Set detail
/setDetail · Legendary CollectionProposal v1
Now
Proposed · scroll inside
9:41
Browse · Other
Legendary Collection
LC · 110 cards · EN · 24 May 2002
Complete set$2,948sum of market prices
You own1/110
PriceNumberRarityMissingFilter
Charizard
3/110$410.75
Dark Dragonite
5/110$52.30
×2
Dark Blastoise
4/110$46.94
Alakazam
1/110$38.50
Articuno
2/110$24.10
Dark Persian
6/110$14.80
What changed
A price on every tile, sorted by price by default. The first thing a collector wants from a set is which cards matter. Today the grid has no prices and sorts by number.
Complete-set value and your progress replace the "Avg price" box and the empty progress ring.
Owned cards are marked (×2 on Dark Blastoise). A "Missing" sort turns the set into a shopping list.
One corner "+" per tile replaces the full-width "+ Collect" pill and the star.
Four outlined dropdowns (Category, Type, Finish, Rarity) collapse into one Filter sheet; sort options are visible chips.
Backend
Tile prices need a price field in /sets/:id/cards?view=summary. Complete-set value needs a sum per set; both can be cached server-side.
Real: set name, code, size, release date, card numbers, Charizard $410.75 and Dark Blastoise $46.94 (from the scan test). Example values: Dark Dragonite, Alakazam, Articuno, Dark Persian prices and the complete-set total.
06
Scan
/(tabs)/scanProposal v2
Now
Proposed
9:41
9
This batch$504.63
Dark BlastoiseLC · 4/110 · Normal ▾
$46.94✓ Matched
1x2x
Organize 3
v2 · after your review
Top bar unchanged: Close, Info, the admin Settings gear (debug builds only, as today) and the free-scan pill in its current "⚡ 9" form.
Trash is gone. A wrong card is removed on the Organize screen.
Flash moves down into the trash slot, bottom left, with Gallery right next to it. Both are thumb-reachable and no longer share the top bar with the free-scan pill.
Zoom 1x / 2x stays where it is, above the shutter.
Kept from v1: the floating match card (name, set, number, printing, price, "Matched"), the corner-bracket frame with the dimmed surround, "This batch" running total, and the Organize button with a card stack and count.
Ties to bugs
B1 (wrong card on a misread number): show "Check this match" instead of "Matched" when the name read by the model and the matched card's name differ.
B4: the free-scan pill must update after each scan.
B2: touches stop working after a gallery scan; fix before this ships.
Real: Dark Blastoise $46.94; Charizard $410.75 from the misidentified scan. Example value: the third batch card ($46.94) that makes up the $504.63 total.
07
Review scans
/scannedCardsProposal v1
Now
Proposed · scroll inside
9:41
Review 3 cards
Batch value$686.56
3 cards 4 copies
Dark BlastoiseLC · 4/110
$274.99Holo · NM
Printing
Normal$46.94Holo$274.99Reverse—
Condition
NMLPMPHPDMG
−1+
CharizardLC · 3/110
$410.75Holo · NM
Condition
NMLPMPHPDMG
−1+
Lurantis exPBL · 004/084
$0.822 × $0.41
Condition
NMLPMPHPDMG
−2+
Add toMy Cards
Add 4 copies · $686.56
What changed
Printing is a real choice with each printing's price, which fixes B3: today "Type" is a static label stuck on Normal, so a holo pull is filed at a sixth of its price.
Condition is back (NM to DMG), as the screen's spec requires. When a card has a single printing the printing row disappears, as for Charizard in this example.
Destination is chosen on the screen, not in a sheet after pressing the button, and the button states the result: "Add 4 copies · $686.56".
The batch value moves into the dark slab; per-card value shows quantity math (2 × $0.41).
Scan icon top-right returns to the camera, so the empty state never strands you.
Real: Dark Blastoise Normal $46.94 and Holo $274.99, Charizard $410.75. Example values: Lurantis ex price and the condition picks. Condition-adjusted prices aren't modelled; the API has no per-condition price today.
08
Collection detail
/collectionDetail · also the Wishlist tabProposal v1
Now · My Cards
Proposed · My Cards · scroll inside
9:41
Collection
My Cards
4 cards · owned
Collection valueLIVE
$132.32
▼ $0.01 (<0.1%) · last 7 days
7D1M
Shows how the cards currently in this collection changed in market value.
×2
Dark Blastoise
#4 · Normal$65.86each
Poltchageist
#005/084 · Normal$0.09
Lurantis ex
#004/084 · Holo$0.51
What changed
Same parts as the Collection home. Round back and edit buttons, the list name as a page title, and the value in the dark slab with the 7-day line and 7D / 1M switch. Today it's a white box with a 176pt chart that pushes the cards below the fold.
Every tile shows its price, for the printing you picked, as on Set detail. Two copies show "×2" and "each" so the tile still adds up to the slab.
"Finish: Normal" becomes mono metadata next to the number (#4 · Normal) instead of its own line.
The explainer line moves under the slab in small grey text. Partial-coverage ("Based on pricing for 80%…") goes inside the slab under the line.
Empty list: Ionicons albums-outline with the existing "No cards yet" text.
Needs your call
Tile prices are new data on this screen. They come from the per-card price requests the Collection home already makes for "Most valuable" (cached, shared). For big lists I'd cap it like the home does (30 most recent) and show "—" beyond that. OK?
Chart rule mismatch: for this same list the home draws the 7-day line, but this screen says "Not enough price history yet" because it also checks available_ranges. I'd use the home's rule, so both screens agree.
Real: My Cards $132.32, ▼ $0.01 over 7 days, Dark Blastoise ×2 at $65.86 each (Normal), Lurantis ex $0.51 (Holo), Poltchageist $0.09, all read from the simulator today. The line's shape is illustrative of a flat week.
Now · Wishlist tab
Proposed · Wishlist tab · scroll inside
9:41
Wishlist
To complete · 6 cardsLIVE
$2,181.11
Current market prices, one copy each
Dark Blastoise
#4 · Normal$65.86
Umbreon VMAX
#215/203 · Holo$2,094.10
Erika's Oddish
#001/217 · Normal$0.38
Erika's Gloom
#002/217 · Normal$0.41
CollectionBrowseScanWishlistSettings
As the Wishlist tab
A tab root, not a pushed screen: big page title like Collection and Browse, no back button, edit as the one round button, bottom padding from useTabBarInset().
The slab says what it costs to complete, the same figure the Wishlist row on the Collection home shows ($2,181.11 "to complete"). No change line and no chart, because it isn't money you have.
Tiles are identical to My Cards, so a card looks the same wherever it's listed.
Needs your call
Showing a value on the Wishlist is new. Today shouldShowCollectionValue hides it for the wishlist. The query is the one the home already runs, so it costs nothing extra. Two new strings: "To complete · {{cards}}" and "Current market prices, one copy each".
Real: 6 cards, $2,181.11 to complete (Collection home), Dark Blastoise $65.86. Example values: Umbreon VMAX, Erika's Oddish and Erika's Gloom tile prices.
Now · Edit sheet
Proposed · Edit sheet
9:41
Collection
My Cards
4 cards · owned
Edit Collection
4 cards
Add Cards from Wishlist
Dark BlastoiseLegendary Collection · 4
NormalHoloReverse HoloJumbo
−2+
PoltchageistPitch Black · 005/084
NormalReverse Holo
−1+
Lurantis exPitch Black · 004/084
Holo
−1+
Save Changes
Edit sheet
Same sheet as New list (CollectionFormModal): paper background, close X top left, title centred, Save as the one orange button in a footer. "Cancel" and "Save Changes" pills in the header go.
Rows instead of a 3-column grid. Each card shows set and number, so two printings of a similar card can be told apart; today the tile shows only the name.
Printings are chips you tap once. Today "Finish: Normal ▾" opens a dropdown inside a 110pt-wide tile. A card with one printing just shows it as text.
Quantity uses the stepper from Review (ink, not orange). Remove is a grey close-circle at the row's corner instead of a blue X on the art.
"Add Cards from Wishlist" becomes a white row with a chevron, as in New list, instead of a full orange button competing with Save.
Custom lists keep Name and Description fields on top and get "Delete Collection" under Save, in red text on white, as in the form sheet.
Real: My Cards contents, quantities and picked printings from the simulator. Dark Blastoise's four printings are the ones the card has; Poltchageist's second printing is an example.
09
Report sheet
/cardResult · "Wrong card?" and "Report this card"Proposal v1
Now
Proposed
9:41
Report card
Dark BlastoiseLC · 4/110 · EN
What is wrong?
Missing image
Image is low quality
Image does not match the card
Missing price data
Incorrect card details
Other issue
Add a description (optional)
Submit report
What changed
Fixes the empty band at the top. The sheet adds the status-bar inset, but a page sheet already sits below the status bar, so ~50pt of blank space sits above the title.
Same sheet header as the other sheets: close X on the left (Ionicons, replacing the text "×"), title centred in Archivo.
Says which card you're reporting with a small row: art, name, set code, number and language. That data is already on the screen.
Reasons become one grouped list with hairline dividers and an ink radio. The orange border and orange dot go; orange is kept for Submit. Rows get accessibilityRole="radio" and a selected state.
Text is regular weight, not bold. The note field is a borderless white box like the form sheets.
Submit sits in a footer above the home indicator and rises with the keyboard, so it's never under it.
Real: reasons, placeholder and button text are the app's current English strings; "Incorrect card details" is preselected because "Wrong card?" opens the sheet that way. No new strings.
→
Incremental rollout
6 releases
Ship it in slices that each stand on their own, so every release looks finished and can be measured. App-wide changes land first because every screen after them reuses them; the riskiest change, the new menu, comes after the screens it points to are ready.
App-wide changes
Color roles
One token set in theme/themes.ts; fold in acquisitionPalette.ts; one orange; green/red only for price moves.
Type
Add Archivo (prices, titles) and JetBrains Mono (codes, numbers). Fix getFontFamily so 700 renders bold.
Price components
<Price>, <PriceDelta>, <PriceSlab>: tabular figures, source label, live/local dot. Used on 8+ screens.