A travel-packing app built around a Sudoku-style 3×3 wardrobe grid — designed as a full token-based design system in Figma and implemented 1:1 in React Native.
PACKR is for travelers who want capsule-wardrobe results without capsule-wardrobe discipline. Add nine items to a 3×3 grid — three tops, three bottoms, three layers — and PACKR generates every wearable combination, tracks carry-on weight, and turns the result into a packing checklist.
A mobile app for travelers chasing capsule-wardrobe results without the discipline. Nine items become a generated set of outfits, a live weight budget, and a packing checklist.
Packing apps solve lists, not outfits. Travelers pack items, then discover mid-trip nothing combines.
Design a system where constraints do the thinking:
Limit users to a 3×3 grid and they pack fewer items and wear more of them — because the system proves 9 items already cover 27 outfit combinations.
If carry-on weight is visible on every build screen — not calculated at the end — users self-correct before overpacking, instead of repacking at the airport.
If the grid shows what's missing ("Row B incomplete — 2 items needed"), users finish setup. Empty-state ambiguity, not laziness, is why wardrobe apps get abandoned.
"I pack outfits in my head, then forget the math."
Nothing external holds the combination state — so people re-derive it, badly, while packing.
"Half my bag never gets worn."
Items are packed as individuals, not combinations — single-use pieces sneak in unexposed.
"I only find out it's overweight at check-in."
Weight is a checkout surprise, not a design constraint.
Every cell must combine with every cell in the other rows — like Sudoku, a cell is only "valid" in relation to its neighbors. Fill the grid to see 9 items become 27 outfits.
| PACKR | PackPoint | Stylebook / Whering | Notes / sheets | |
|---|---|---|---|---|
| Core model | 3×3 outfit grid → generated looks | Auto checklists from trip type | Full closet catalog, manual outfits | Freeform lists |
| Outfit logic | Combinatorial — 9 items = 27 looks | None — items only | Manual pairing | In your head |
| Weight budget | Live kg tracker vs airline limit | No | No | Manual |
| Definition of done | Grid complete + all packed | List checked off | Never — it's a closet | None |
The gap: nobody treats packing as a combinatorics problem with a weight constraint. That's the whole product.
Two families only. Mono carries all labels, stats, and system voice — the UI reads like an instrument panel.
No hardcoded values in components. Primitives → semantic → component tokens. Every Figma variable exists in code.
Trips as progress objects — grid % complete, days left, carry-on weight — plus lifetime wardrobe stats.
The 3×3 matrix with a live compatibility score. Incomplete rows warn in amber: "Row B incomplete — 2 items needed."
The payoff screen: every generated outfit, filterable, saveable, shareable. This convinces the Overpacker that 9 items are enough.
Add items by photo — AI removes the background and detects the palette (2 neutral · 2 hero · 1 accent). Cataloging cost stays near zero.
The grid becomes a checklist with per-item weights. The kg bar stays green while you're carry-on safe — weight is ambient (H2).
The system's source of truth in Figma — colors, type scale, and spacing as variables, mirrored one-to-one in code.
// tokens.ts — mirrors Figma variable collections export const color = { bg: '#0C0C0E', surface: '#18181B', accent: '#9CDCA5', warning: '#F4B25B', }; export const space = [0, 4, 8, 12, 16, 24, 32, 40]; export const type = { pageTitle: 30, cardTitle: 18, body: 13 };
looks from 9 items — the math holds in real packing
hardcoded style values in the React Native build
type families · 10 semantic colors · one 4pt scale
Nine items, twenty-seven outfits, one carry-on — a constraint turned into a product, and a design system that made the build a diff instead of a debate.