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

The problem and the answer,
in one view.

Every packing app I tested made me fill out forms before showing me a single useful item. I wanted to see what happens when the phone already knows where you're going.

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.

I kept asking myself: your phone already knows where you're going. Why is the app asking again?

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, 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. Overpacking is the rational response to a system that doesn't provide certainty.
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.

Synthesis of 4 interviews with a similar profile. Sofía is not a real person — she's the composite.
Sofía's current journey

Three days before a trip to Rome

Each row is a real moment reconstructed from the interviews. The bar shows cognitive friction — 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 that define the product.
And the cost of each.

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. 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

Pack generates, the user decides. 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 — protects privacy but prevents a new traveler from benefiting from collective patterns. Deliberate decision, not technical.
→ Materialized in screen 03 · editable list
Justifies Privacy
On-device only
↑ Trust
Cost · cold start
04iOS native

Four native integrations,
four moments of the trip.

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 Lock Screen
the trip appears 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
9:41●●● 88%
9:41
Monday, April 13
P
Pack
Flight in 7h 14m
Rome · 21°C 🌤
17 of 23 items · 6 missing
BCN → ROM · 10kg cabin · No rain
One Live Activity per flow · auto-ends at T+0
— Compact
P
Rome
7h
— Expanded (long press)
P
Pack · Rome
Flight in 7h 14m
74%
17 / 23
items ready
Pending
Adapter, charger, book
— Minimal (another app active)
P
⌖ 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
74%
Rome · 7h
P
Pack · Rome
7h
6
items pending
Tap to view →
P
Pack · Rome
17 / 23
Passport
3 shirts
Adapter
Charger
Book
Headphones
Tomorrow · 21°C 🌤
"Hey Siri, pack my suitcase"
P
Pack
App Intent
List ready for Rome · Apr 14 · 4 days. Generated 23 items based on your Calendar event and the forecast.
Open list
Later
⌖ 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,
how it adapts to Android.

I designed iOS first because that's where CalendarKit 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 isn't personal preference — it's architecture. 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 — reinforces the idea that the system knows you.
  • Wear OS. Tile + complication 1:1 with Apple Watch — 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. No linear narrative — just the real timeline.

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, just the visual language.

9:41●●● 88%
▼ Trip detected · via Calendar
Pack found
a trip.
✈️
Barcelona → Rome
APR 14 · 4 days · IB 2314
🌤
Rome · 18-24°C
Partly cloudy · no rain
Pack my suitcase →
Not my trip
Detected · 0 inputs required
Trips
List
Profile
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 as context, not as input

Information that supports the proposal. No forms. Microcopy explains: "partly cloudy, no rain" — actionable data.

4
One CTA, one decision

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

9:41●●● 88%
▼ Configure
Rome · Apr 14.
4 days · 18-24°C 🌤
Trip type
💼
Business
Meetings, suit, formal
🏖
Leisure
Casual, tourism
Luggage
🧳 10kg cabin 💼 23kg 🎒 Backpack
Generate list →
Trips
List
Profile
▼ 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.

9:41●●● 88%
▼ Your list
Rome · 23 items
17/23
▼ Clothing · 8
3 dress shirts
Full suitswipe ←
2 casual outfits
▼ Documents · 3
Passport
Boarding pass
+ Add item
Trips
List
Profile
▼ 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.

9:41●●● 88%
▼ Your list
Rome · 23 items
17/23
▼ Clothing · 8
3 dress shirts
Full suit
2 casual outfits
▼ Documents · 3
Passport
+ Add item
Trips
List
Profile
▼ 04 · Dark mode
Follows the system, doesn't invent

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.

9:41●●● 88%
🧳
No trips detected
When you schedule a trip in Calendar I'll see it and let you know. You can also add one manually.
Add trip manually
Connect Calendar
Trips
List
Profile
▼ 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.

9:41●●● 88%
9:41
Monday, April 13
P
Pack
7h 14m
Rome · 21°C 🌤
17/23 items · 6 missing
▼ 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 — 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. Pack doesn't break without internet — it degrades gracefully.

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. Learning (what items you always pack) is preserved — a canceled trip isn't data loss.

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
Try the prototype

The full flow, interactive.
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

Tested small, measured precisely.
Qualitative findings, grounded metrics.

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. With n=9 I'm not chasing statistical significance — I'm chasing consistent qualitative patterns.

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.

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

Looking ahead,
and a word about me.

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

iOS native
Apple HIG ActivityKit · Live Activity WidgetKit · 4 sizes App Intents · Siri
Design
Figma · auto-layout · variants Design tokens SF Symbols
Systems & A11y
Edge cases · state machine WCAG AA · Dynamic Type 1:1 interviews
Languages
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.