Pack — UX/UI Case · Nicolas Marciano · 2026
Concept · iOS-first

Your suitcase,
in three taps
— the rest is known.

You have a flight on Thursday. Pack already knows — it read your Calendar, checked the weather in Rome, and built a packing list. You pick your luggage size. That's it.

End-to-end · sole designer · 6 interviews · 30 surveys · 8 screens · 4 widgets · 12 components · 9 usability sessions · iOS 17 first · 4–6 weeks
Tools · Figma, SF Symbols, Apple HIG Timeline · 4-6 weeks spread out · night work
Exploratory concept. Some native integrations (long-duration Live Activity, auto-add to Wallet) require API extensions or workarounds that are outside the scope of the MVP. I flag this where it matters.
01Snapshot

Nobody wants to fill a form to pack.

Your phone already knows where you're going. Why is the app asking again?

Every packing app I tried followed the same pattern: fill in your destination, dates, trip type, and luggage before seeing a single useful item. The input always exceeded the immediate value. And because generic lists don't consider context, people overpack, which is a rational response to the fear of forgetting.

So I built the opposite

The phone infers.
The user confirms.

Pack reads the Calendar event, checks the weather, and proposes a list. The user only makes two decisions the system can't infer: trip type and luggage size. Zero forms. Three taps. The list learns from every edit, silently and without setup.

02Research · Persona

The problem wasn't the apps.
It was how they ask.

I wanted to understand something specific: why do frequent travelers keep using Notes to pack when there are dozens of packing apps? Six interviews and thirty survey responses gave me a clear answer.

Methods · declared scope
n=6In-depth interviews · 30-45 min · frequent travelers >6 trips/year
n=30Exploratory survey · LinkedIn + IG · non-probabilistic
5 appsCompetitive analysis + Nielsen heuristics
Key finding
5/6
Forgot something specific to the weather or activity on their last trip. It's not the charger; it's clothing for the actual destination.
Behavior
22/30
Use Notes or paper for travel lists. The setup friction in dedicated apps outweighs the value they perceive.
User quote

"Packing apps ask for so much before giving you anything, that I end up opening Notes and writing by hand instead."

Participant · 30 years old · consultant · interview 03
Pain point
19/30
Overpack out of fear of forgetting.
Ignored complexity
17/30
Mix two contexts on the same trip (business + leisure, beach + city). No app handles that duality.
SR
Sofía Reyes
29 · Consultant · Madrid
Primary persona

"When I travel for work I don't want to think — I need it to just be done."

Context

1 trip per month. 2 days' notice on average. Mixes client meeting + formal dinner + tourism on the same trip.

Needs

An initial proposal she can confirm in less than 60 seconds. That understands the business + casual duality.

Frustrations

Setup that asks for airline, hotel, city, dates → drops off. Re-entering data that's already in Calendar.

Sofía is four interviews with a similar profile, stitched together.
Sofía's current journey

Three days before a trip to Rome

Each row is a real moment reconstructed from the interviews. The friction column is my reading of how hard each step is for Sofía today. The last row shows how it changes with Pack.

When
Stage
What she does
Dominant thought
Friction
Tue · 9:40pm
Realization
Glances at Calendar and remembers she travels in two days.
"I have to pack already and I haven't even thought about what to bring."
High
Wed · 2:00pm
List
Opens Notes at lunch and writes random items with no order.
"I'll forget something anyway, I always do."
High
Wed · 10:30pm
Packing
Packs with the Notes list and a mental picture of what she'll need in Rome.
"Just in case, two more pairs."
Medium
Thu · 6:00am
Airport
In the cab she realizes she forgot the adapter.
"I'll buy it at duty free, what a drag."
Medium
With Pack
→Target
Pack already detected the trip. She confirms type + luggage in 2 taps. The list appears with weather and categories.
"Done. Back to work."
Low
03Strategy

Three decisions, and what each one cost me.

Before drawing a single screen, I had to answer three questions that would define the product. Each one has a real cost, and I chose to pay it.

DecisionD1

Infer from Calendar before asking anything

The first data Pack gets is the trip event in Calendar: destination, dates, duration. The user never fills out an initial form. The zero screen already shows the detected trip.

Real trade-off: depends on the user having the trip in Calendar with a parseable title or location. If it's just "BCN-ROM" or only "Trip", the parser fails. Phase 2 needs local NLP for ambiguous destinations — infrastructure cost the MVP doesn't solve.
→ Materialized in screen 01 · detection
Justifies Insight 02
↑ Time-to-value
↓ Setup friction
Cost · local NLP
DecisionD2

Luggage type as the only explicit input

Luggage (backpack / 10kg cabin / 23kg suitcase / large suitcase) is the only variable the system can't infer and that most changes the list. It's asked explicitly because the cognitive cost is low and the impact on the proposal is high.

Real trade-off: loses the pure "zero-input" marketing narrative. In exchange, gains precision: the cabin list is 30% shorter than the 23kg one (projected — concept, not shipped). Testers preferred an explicit tap to a less accurate proposal.
→ Materialized in screen 02 · configuration
Justifies Testing · n=6
Prioritization
IN the MVP
↑ Precision
DecisionD3

The list is a proposal, not an order

Items that get deleted stop appearing in similar trips. Items that get added become defaults on their own. On-device learning, no setup required.

Real trade-off: the on-device model limits learning quality to the device's own history. No cross-user learning: it protects privacy but prevents a new traveler from benefiting from collective patterns. I chose this; the constraint didn't force me.
→ Materialized in screen 03 · editable list
Justifies Privacy
On-device only
↑ Trust
Cost · cold start
04iOS native

Where Pack shows up when the app is closed.

A packing app that only works when you open it isn't solving the real problem. I designed Pack to show up in the lock screen, the home screen, and Siri — where the traveler actually is.

About technical scope. Pack is a portfolio concept. Live Activities have a nominal 8-hour cap with an extendable `staleDate` — a real version would need to re-start it with a silent push. Apple Wallet requires explicit user action to add a pass; it doesn't happen automatically. I flag this so the case can be evaluated against what the platform actually allows.
ActivityKit · iOS 16.1+

Live Activity on the Lock Screen, without opening the app.

Pack starts a Live Activity 8 hours before the flight (API limit) and keeps it alive with push updates. Shows pending items, weather, and countdown. The activity closes at T+0 when the trip begins. For the days prior to the 8h cap, Pack uses a Lock Screen Widget: same info, different surface.

API
ActivityKit · ActivityAttributes
Trigger
T-8h before the Calendar event
Updates
Push for critical weather + every 30 min
Covers
Show up when it matters
Dynamic Island · iPhone 14 Pro+

Three states,
the same persistent information.

The Live Activity adopts the three Dynamic Island sizes by context: compact while navigating, expanded on long-press, minimal when another app claims the slot. The user sees the trip status without opening Pack.

Compact
Destination + time remaining
Expanded
Progress + pending items
Minimal
Brand identity only
Tap
Opens the list on the main screen
WidgetKit · Lock + Home

Four sizes,
one principle: glance and go.

Widgets in small, medium, and large + complication for Lock Screen. Each one follows the same principle: the most relevant info about the active trip, without opening the app. Updates via TimelineProvider every 15 min. Smart Stack rotation support so Pack rises to the top when there's an active trip.

Small
Progress + countdown
Medium
Active list with checkboxes
Large
List + weather + actions
Lock screen
Inline complication
App Intents · Siri · Shortcuts

One voice command
builds the whole list.

Pack exposes three App Intents to the system: PreparePackingIntent, CheckListIntent, AddItemIntent. They work from Siri, Spotlight, Shortcuts, and the iPhone 15 Pro Action Button. Responses are audible, visual, and actionable.

Intent 01
Pack my suitcase
Intent 02
What am I missing?
Intent 03
Add X to the list
Surfaces
Siri · Spotlight · Action Button
05Android · Phase 2

Why iOS first, and how it moves to Android.

I designed iOS first because that's where EventKit and WeatherKit live natively. Android gets the same core logic with Material You surfaces — but the detection engine is the same.

The chronological decision

iOS first is an API decision. Five native APIs make the product: EventKit (unified Calendar), WeatherKit (weather), ActivityKit (Live Activity), Dynamic Island, App Intents. Android has equivalents but with technical differences that justify validating the model on iOS before porting.

  • Live Activity ↔ Persistent notification. Android handles ambient presence with a foreground notification, less visually integrated.
  • Action Button ↔ Quick Settings tile. On Android, the notification panel replaces the physical button.
  • Material You. Pack themes dynamically from the wallpaper, which reinforces the idea that the system knows you.
  • Wear OS. Tile + complication 1:1 with Apple Watch, for cross-device parity.
Material You · persistent notif
P
Pack
7h 14m
Rome · Tomorrow 21°C
17/23 items · 6 missing.
Open
Done
Dynamic color
Wear OS · Tile
74%
Rome · 7h
17/23 items
06Process · Screens · System · A11y

How I got to these screens.
And the system that holds them up.

This section is the messy truth: how the project actually evolved, which ideas survived, and which ones I killed, in the order it happened rather than as a tidy narrative.

From interview to pixel

Each stage produced decisions that survived to the final version. I didn't jump from research to a pretty screen.

▼ 01 · Research
Affinity mapping

36 quotes from 6 interviews grouped into 8 pain-point clusters. Three dominant ones: ignored context, overpacking, setup friction.

clima infer
▼ 02 · Sketches
Pencil and paper first

I tried 12 layouts for the detection screen before touching Figma. The version that survived showed weather as passive data, not as input.

▼ 03 · Wireframe
Structure without style

Lo-fi in Figma to validate hierarchy and tab structure. Tested 3 variants; the single-CTA one won against the ones offering 3 options.

9:41 TRIP DETECTED Pack found a trip. ✈ Barcelona → Rome APR 14 · 4 days 🌤 Rome · 18-24°C No rain Pack my suitcase → Not my trip Trips List Profile
▼ 04 · Final UI
The frame you defend

Token system applied. Editorial typography + native-iOS UI. Every wireframe element survives in place: hierarchy didn't change, only the visual language.

1

The eyebrow declares the source

"Trip detected · via Calendar" earns trust in less than a second. That label matters: it makes explicit why the app knows what it knows and reduces suspicion.

2

Minimal trip card, one row per data point

Origin → destination, date, duration, flight. Everything needed without visual overload. IATA code for precision.

3

Weather you read, never fill in

Information that supports the proposal without asking for a single form field. The microcopy stays actionable: "partly cloudy, no rain."

4

One button, and a way out

Pack the suitcase or say it's not your trip. Zero branches. One screen, one goal: confirm and move forward.

▼ 02 · Configuration
Three taps · the only explicit input

Trip type + luggage. The difference between 10kg cabin and 23kg suitcase changes the list 30%, so it's worth the tap. After this: zero forms.

▼ 03 · Editable list
The heart of the product

Collapsible categories. Tap = mark done. Swipe left = remove and tell Pack you don't want it on similar trips. Long press = save as a permanent item.

▼ 04 · Dark mode
Dark mode the way iOS does it

The warm palette translates to deeper tones in the same family, not flat black. Same WCAG AA contrast. The primary action shifts from clay-deep to ochre to keep visual weight without aggression.

▼ 05 · Empty state
No trip, still a path forward

When Calendar has no upcoming trip, Pack offers two paths without blaming the user: add manually or reconnect permissions. It never feels like a broken app.

▼ 06 · Lock screen
The trip lives outside the app

8 hours before the flight, the Live Activity takes over the Lock Screen. Glanceable info: weather, pending items, countdown. Tap → opens the list directly.

Edge cases · system response

What happens when something doesn't happen

A system that infers fails with more nuance than one that asks. Each case has a predictable response, not a generic error.

Pack needs Calendar
Without access to your events I can't detect trips. I won't see anything else either — only those in the next month.
Retry
Manual
Edge 01
Calendar permission denied

Persistent banner that explains the benefit before asking again. Lets the user keep using Pack in manual mode without exiting the app.

Persistent banner
Trip with 3 destinations
BCN → ROM → ATH. The list combines climates: the coldest one dominates. Tabs per destination for detail.
BCN
ROM
ATH
Edge 02
Multi-destination trip

When the Calendar event has multiple stops, Pack generates a combined list with tabs per destination. The dominant weather defines the luggage base.

Trip detail header
Offline
You work with the cached list. Weather updates when you're back online; editing doesn't stop.
Auto-reconnect
Edge 03
Offline at open

Cached list + offline editing. Weather is hidden and returns on reconnect. You can still tick items on the plane.

Top banner + offline state
Flight canceled
I detected the change in Calendar. Save the list to reuse on the next similar trip?
Save
Discard
Edge 04
Flight canceled or removed

If Calendar loses the event, Pack asks before deleting. What you always pack survives the cancellation.

Confirmation sheet

Color · palette

5 brand tones + 4 semantic accents (alert, accent, success, info). Each with a soft tint for backgrounds.

Typography · scale

Aadisplay · 96px
Aah2 · 48px
Aa body · 14px
Aa mono · 11px
Fraunces (display) + DM Sans (UI) + JetBrains Mono (data).

Components · core

Primary
Secondary
Tonal
🧳 chip
selected
option
3 buttons · 2 chips · list rows · trip card · weather card · empty state · toggle. Each component with default + active + disabled states.

Accessibility

  • WCAG AA contrast in light + dark
  • Dynamic Type · 17-53px
  • VoiceOver labels on custom icons
  • Reduce Motion respected
  • Tap targets > 44×44pt

The full flow. Tap through it.

Pick a trip type and luggage size — the list adapts. Tap items to pack them, swipe left to remove and teach Pack. Add custom items to any category.

07Testing · Metrics

What nine people made me change.

I tested with 9 people in 3 rounds. Not enough for statistical significance — more than enough to catch the patterns that changed the design. Here's what I found and what I did about it.

Study

3 rounds, 3 users each

Moderated test in Figma with an interactive prototype. Each task was recorded and transcribed. Nine people don't give significance. They gave me patterns that repeated.

9
Sessions
4
Tasks
3
Adjustments made
Recruitment · LinkedIn + IG · travelers 28-40 yrs with >6 trips/yr.
Limitation · non-probabilistic sample. Findings are indicative.
Qualitative findings

What we learned · what changed

F1 · Auto-detection drives instant adoption

"I didn't expect it to already know where I was going. That changes everything."
Confirms: inferring from Calendar as the first input. Decision: reinforce the "via Calendar" eyebrow to build instant trust.

F2 · "Cabin" without context caused doubt

"I didn't really get the difference between cabin and 10kg until I read it twice."
Adjustment: added explicit weight + short description. "Cabin 10kg · no check-in" replaced "Cabin". The next testers stopped asking.

F3 · They wanted to preview before confirming

"I'd like to see the list before it's saved so I can change things."
Adjustment: added a preview screen after generation. The list appears editable before "saving". Testers used the preview to delete 4-6 items on average (n=9).

F4 · Live Activity didn't activate on its own

"I thought I had to do something else to see it on the lock screen."
Adjustment: Live Activity starts automatically when confirming the trip. The off toggle lives in profile with a clear explanation.
Measurement framework · post-launch

How to tell
if Pack is working.

A north-star metric with a precise operational definition, leading metrics that predict it, and lagging metrics that confirm it. Targets are aspirational and need to be tuned with real data from the first month.

North Star
% of detected trips that end with the list marked "ready to fly"

Captures the full pipeline: detection → configuration → generation → completion. If this rises, the flow works end-to-end.

Operational definition:
"Completed trip" = trip with ≥80% of items checked off at T-2h before the flight.

Initial target: 60% (aspirational, no real baseline).
Refine with: first month of post-launch data.
Time-to-list generatedfrom detect → list visible
Leading
TBD · benchmark
Edit rate per useritems edited / proposed
Leading
TBD · post-launch
Live Activity tap-throughfrom Lock Screen → app
Leading
TBD · post-launch
Trip rejection rate"not my trip" over detected
Leading
TBD · alert ≥ 15%
D14 retentionactive users at 2 weeks
Lagging
TBD · vs consumer
"Forgot X" rateself-report at T+5d after return
Lagging
TBD · target ↓
Each target gets defined with the first month of data. Before that, fixing an exact number would be guesswork — benchmark against consumer apps in the segment and move from there.
08Roadmap · About

Where Pack goes, and where I'm going.

Where Pack goes from here, and where I come from. If you read this far, I'd love to hear what you think.

Now · MVP iOS

Phase 1 · validate.

The product you're seeing. Calendar detection, proposal, edit, Live Activity, widgets, Siri intent. Hypothesis: users prefer an inferred proposal over a manual setup.

Surface · App + Live Activity + Widget
Pricing · Free · no paywall
Later · 12+ months

Phase 3 · go deeper.

Wardrobe integration: Pack moves from generic items to recommending specific garments. Requires a model of the user's clothes (camera or manual entry). Risk: closet onboarding can introduce friction that contradicts the product DNA.

Surface · VisionKit · CoreML
Metric · items per trip ↓ as confidence ↑
Hard skills

Tools and practices

I designed for ActivityKit, WidgetKit and App Intents reading the Apple HIG.
Figma with auto-layout, variants and design tokens; SF Symbols where the system already has the icon.
Edge cases as a state machine, WCAG AA and Dynamic Type, 1:1 interviews. Spanish native, English C1.

Availability

What I'm looking for

Seniority
Junior · Mid Product/UX Designer
Setup
Remote · hybrid in BCN/Madrid
Geography
ESP · LATAM · EU
Industries
Digital product · SaaS · consumer
How I work

How to read this case

I structured this case so you can skim it in 2 minutes or dig into any section. Every decision traces back to a research finding or a trade-off I had to make. If something doesn't convince you, I'd rather hear about it than assume it works.

Want to talk?
Open to UX/UI roles.

The Figma file is real, the research is documented, and I can defend every decision in this case. If any of it interests you — or doesn't convince you — I'd like to hear about it.