dani.ko ships iOS, Android, web and Windows, and every mock ever drawn for it is a
375 × 812 phone. DdsBreakpoint already declares phone <600, tablet 600–1023 and
desktop ≥1024; kDdsMaxContentWidth = 1100 and
kDdsMaxProseWidth = 680 already exist. Nothing has ever exercised them. This file draws
what those constants are for.
Flag blue #0047A0 is structure. Flag red #CD2E3A means a deadline and nothing else.
unknown is neutral with a dashed edge, never red. Manrope for text, DM Mono for every number,
reference, price and date. English leads, Korean annotates — except on the handover surfaces, where Korean
leads at display size.
Anything dotted and grey is an annotation, not product. Nobody ever built it.
Review aid:?s=6 renders section 6 alone and ?s=6&m=light renders one
mode of it, because a 1,440px frame does not fit a headless screenshot beside its siblings.
THE DECISION. The bottom bar becomes an 84px left rail. Same three
destinations, same order, same icons, same one filled blue circle. It does not collapse and it has no
hamburger, because there are three destinations and a control that hides three things is a control that
costs more than it saves. What the rail has that a bottom bar could not: a keyboard legend under every
item, and Emergency permanently on screen — the hold gesture has no mouse equivalent, so on
desktop it stops being a gesture and becomes a row.
ko
⌘N
Trip⌘1
Korea⌘2
You⌘3
EMERGENCY⌘⇧E
Spring in Seoul
DAY 3 OF 11 · LIVE
Search everything you saved
⌘K
The measure, drawn. The window is
1,440. The rail takes 84. The document column is capped at kDdsMaxContentWidth = 1100 and centred
in what is left, which puts 128px of air on each side at this width. Inside it, prose never exceeds
kDdsMaxProseWidth = 680. Both constants already exist in dds_tokens.dart; nothing had
ever used them.
The reading column680 · PROSE
A 1,440px line of body text is
unreadable and no viewport justifies it. Everything the user reads
— a day's briefing, a handbook answer, a note they wrote — lives in this column and stops at 680,
which holds roughly 75 characters at desktop body size. Widening this column is the single
easiest way to make a desktop build worse than the phone it came from.
What is not prose
a
Figures — money, a transport balance, a
countdown
READOUT
b
Rows — saved places, documents, the
party
LIST
c
A handover card — Korean at display
size
SHOW
d
A gap we have not sourced
UNKNOWN
Only these four go in the second column. Nothing in
the right-hand column is a sentence longer than one line. That is the rule that decides one column
or two on every screen in this file — it is a property of the content, never of the width.
The second column330
MONEY TODAY
₩48,200
Spent today, from
what you entered.
Weather
No forecast source
for Korea we are willing to stand behind, so there is not one here.
TONIGHT
조선 팰리스 서울
Josun Palace Seoul · show this to a driver
1 · The shell — web desktop, 1440 × 900
1Why a rail and not a top bar. A top bar spends the one
dimension a desktop window is short of. 900px of height minus a 38px titlebar minus a 54px header is
already tight for a day page; a second horizontal bar would take another 56. Vertical space is scarce on
desktop and horizontal space is abundant — the navigation goes where the space is.
2Why it does not collapse. Three destinations, permanently
labelled, at a fixed 84px. A collapse control would save 84px of a 1,440px window and introduce a piece of
state the user has to manage. The content column is capped at 1,100 anyway, so the saved width would go to
nobody.
3The ⊕ moves to the TOP of the rail, not the middle. On the
phone it sits between Korea and You and the asymmetry is the argument. On desktop the top-left corner is
a Fitts's-law corner — an effectively infinite target, and where every desktop application in existence
puts new. It keeps its size, its fill and its shadow: still the only filled blue circle in the
product.
4The active item carries three signals, exactly as the phone
bar does: the label goes --blueText, the icon's stroke thickens 1.7 → 2.2, and the 26 × 2.5 blue
cap that sat on the bar's top edge is rotated to the rail's left edge. Colour is never the only signal.
5Search is still not a destination. On the phone it is a
field pinned to the top of the Trip and Korea roots. On desktop it is a field in the window header on
every screen, plus ⌘K — which is closer to "one tap from everywhere" than the phone ever gets.
It still does not take a rail slot.
7🚨 ONE THING THE CODE AND THIS FILE DISAGREE ABOUT.dotTypeScaleFor applies a single multiplier per breakpoint — 1.0 / 1.2 / 1.3. Applied
uniformly at desktop, body goes 14 → 18.2, and 18.2px inside the 680 measure drops the line to about 58
characters, under the comfortable band, while display at 34 → 44 is right. These frames are
drawn with display and heading at ≈1.3 and body at ≈1.15, which needs the scale to become
per-role rather than per-breakpoint. Flagged rather than assumed — it is a token change, not a drawing
decision.
0How to read these frames. A frame states its viewport in
its caption and is then drawn at the full height of its content, because a fixed height is how three of
the six v1 files silently lost their heroes. So the rail looks longer than 900px in most frames — in the
build it is the window's left edge and does not scroll, and Emergency sits at the bottom of the
window, always on screen, not at the bottom of the page.
6Emergency stops being a gesture. A 0.5s hold is a touch
idiom; a mouse-down-and-wait is a bug report. So on desktop it is a permanently visible row at the foot of
the rail — outlined in --text, monochrome, never red, because flag red means a deadline and the
emergency surface has no date on it. One click from anywhere, no auth check, no network branch. Keyboard:
⌘⇧E / Ctrl+Shift+E, registered as a global accelerator so it fires with the window unfocused.
Every rail state6
a · Trip — a trip exists
ko
⌘N
Trip⌘1
Korea⌘2
You⌘3
EMERGENCY⌘⇧E
The default. Today's day page is the root while the phase is Live.
b · Korea
ko
⌘N
Trip⌘1
Korea⌘2
You⌘3
EMERGENCY⌘⇧E
The fifteen shelves, ordered by the derived phase.
c · You
ko
⌘N
Trip⌘1
Korea⌘2
You⌘3
EMERGENCY⌘⇧E
The person layer, the party, Carry, the library, sources.
d · No trip — tab 1 reads Saved
ko
⌘N
Saved⌘1
Korea⌘2
You⌘3
EMERGENCY⌘⇧E
The only shape change in the whole app, and it is one word. The icon, the position, the
count and the order do not move.
e · ⊕ armed — the window is a drop target
ko
DROP
Trip⌘1
Korea⌘2
You⌘3
EMERGENCY⌘⇧E
A file is over the window. The ⊕ turns into the drop glyph and the destination
highlights — but the target is the whole window, not the rail.
f · No rail at all
Emergency and Show render with no rail. Emergency because a persistent
navigation element is an app-shell dependency by definition and that surface has none. Show because it is
one fact at handover size and a stranger is reading it — though on desktop, see §7: Show is the one
surface where the honest answer is this is not what a desktop is for.
The keyboard, in fullmacOS ⌘ · WINDOWS CTRL
⌘1 ⌘2 ⌘3
The three destinations, in
rail order. There is no ⌘4 and there never will be.
⌘K
Search, from anywhere,
including from inside Emergency. One field, no scoping.
⌘N
Capture. Opens the paste box
with focus already in it. ⌘V into any screen does the same thing without opening anything.
⌘⇧E
Emergency. Global — it fires
with the window minimised or unfocused, and it renders signed out and offline.
⌘P
Print. On desktop this is
first-class: the carry sheet, the day, and Emergency all print, and printing is the answer to a dead
phone.
⌘[ ⌘]
Back and forward. The web
build's browser buttons already do this; the Windows build has to provide them.
← →
The previous and next day, on
the day page. The day ribbon is the mouse version of the same move.
⌘C
Copies the focused reference
or Korean string — never the romanisation, always KoreanName.copyValue().
WHAT IS PHONE-ONLY, STATED ONCE. The OS share sheet (capture route 1, the
highest-value input in the product) does not exist on Windows and is weak on the web — drag-and-drop is
not a desktop bonus, it is desktop's entire replacement for it (§6). The camera route is phone-only.
Show — holding a screen up to a taxi driver, a pharmacist, a restaurant server — is phone-only in
practice, and §7 says what desktop does with it instead. Live location is phone-only. Everything else is
the same product.
THE DECISION. The seven bands do not become a dashboard. They become
one 680px reading column and one 330px readout column, because bands 2, 3 and 4 are things you read in
order and bands 5, 6 and 7 are things you glance at. Band 1 is promoted out of both and becomes the strip
that answers where and when am I before anything else on the screen. The one thing genuinely added
by the width is the day ribbon — on the phone, moving to another day costs a page.
ko
⌘N
Trip⌘1
Korea⌘2
You⌘3
EMERGENCY⌘⇧E
Spring in Seoul
DAY 3 OF 11 · LIVE
Search everything you saved
⌘K
THE 11 DAYS
SAT
4
SUN
5
TUE 6 APR
Today
WED
7
THU
8
FRI
9
SAT
10
SUN
11
MON
12
TUE
13
WED
14
← →
Seoul
서울
TUE 6 APR 2027 · KST · DAY 3 OF 11
Every time you saved is shown in Korean time, including the ones you saved before you flew.
14:22
Band 1 leaves the column and becomes the
strip. It is four short facts and a clock — on the phone that is a card because there is no
horizontal room; here it is one line, and it stops competing with the thing you actually came for.
Right nowBAND 2 · THIS IS `NOW`
YOU ARE STAYING AT
Josun Palace Seoul
조선 팰리스 서울
CONFIRMATION
88213904
CHECK-OUT 11 APR · 11:00
⌘C
Nothing else for 28 minutes. That is the honest answer, and it is
the one this band gives most often.
What is different about todayBAND 3
Hyoje Bunsik (효제분식) lists today as
a rest day
You have it saved
for 19:00 today, and it is the only thing on this page that collides with anything.
SOURCE: THE VENUE'S OWN PAGE · CHECKED 6 APR 09:04
Public holidays
We hold no
holiday calendar for 2027 on this machine, so we are not going to tell you whether today is
one. When we have a source with a date on it, this becomes a row.
Transport · weather · strikes
No disruption
source we are willing to stand behind. Nothing is being hidden from you here — there is
nothing.
The day's thingsBAND 4 · 6 SAVED
09:40
Gyeongbokgung Palace
경복궁 · Jongno-gu
ALLOW 90 MIN
12:30
Gwangjang Market
광장시장 · Jongno-gu
CASH ONLY
14:22
You are here. The next saved thing is at
14:50 — a 6-minute walk, so there is no hurry and we are not going to invent one.
14:50
Bukchon Hanok Village
북촌한옥마을 · Jongno-gu
HOURS UNKNOWN
19:00
Hyoje Bunsik
효제분식 · Jongno-gu
REST DAY · SEE BAND 3
No time on them2
Osulloc Tea House
오설록 · Jung-gu
SAVED 2 APR
A pin Mira sent on WhatsApp
Kakao link kept · name not resolved
UNRESOLVED
Untimed items are not second-class and are not given
invented times. They sit under the timed band with the day's date on them and nothing else.
Money todayBAND 5
₩48,200
SPENT
Transport card
₩11,300
What you last told us on 5 Apr. We cannot read the card.
Cash on you
₩60,000
Also yours, also from 4 Apr. Nothing here is a live balance.
WeatherBAND 6
No source
We have no forecast
source for Korea we are willing to stand behind, so we are not going to invent one. This is the
state, not a failure to load.
Show this to a driverBAND 7
조선 팰리스 서울
서울특별시 강남구 테헤란로 231
Josun Palace Seoul · road address in Korean, never romanised. Tonight's stay.
On desktop this block is a COMPOSER, not a handover. Nobody holds a
1,440px window up to a taxi driver. So the primary action stops being show it and becomes
send it to the phone — and the block keeps handover typography anyway, because what you are
checking here is that the Korean is right before you need it. §7 argues this in full.
With youPARTY
MK
Mira Kwon
Holds the Busan tickets
TS
Tom Shaw
Peanut allergy card · shared 2 Apr
Neither of them needs the app installed.
2 · Trip root, in country — web desktop, 1440 × 900, scrolled to full height
1Restraint was considered and rejected here, and it is the only
screen in this file where that is true. A single centred 680 column with air around it works for a
handbook page. It fails for the day page, because bands 5, 6 and 7 are exactly the things a person wants in
peripheral vision while reading bands 2–4 — money, weather, the address. Pushed below the fold they stop
being glanceable, which is the whole reason they are bands and not pages.
2Band order is preserved, not rearranged. Left column reads
2 → 3 → 4 top to bottom; right column reads 5 → 6 → 7 top to bottom. Nothing changes rank; the column break
happens between 4 and 5, where the page changes from prose to readouts. Anyone who learned this page on a
phone can find everything on the desktop version without being told.
3The day ribbon is the one net-new desktop affordance. The
trip's other days are the same page for a different date, so a ribbon costs no new layout and no new data
path. On a phone it would eat the top of the most-opened screen in the product; at 1,440 it is 44px.
4Red appears exactly nowhere on this page. Nothing here has
a date attached in the deadline sense. The rest-day collision is a dashed neutral row and a neutral outline
tag — a closure is not a deadline, and spending flag red on it would make it indistinguishable from a K-ETA
countdown. Red lives on §3's checklist, and on nothing on this page.
THE DECISION. A grid, and the phase ranking survives it. A naive 3 × 5 grid
destroys rank — nobody reads a grid as an ordered list. So the top three of the derived order get a
full-width band of three large tiles and the other twelve are compact rows in three columns, read left to
right. The user never sees the word phase; they see that eating, moving and manners are on top
today, and they were not on top in March.
ko
⌘N
Trip⌘1
Korea⌘2
You⌘3
EMERGENCY⌘⇧E
Korea
DAY 3 OF 11 · LIVE
Search everything you saved
⌘K
What you need to know
Fifteen shelves. Each
one holds the answer and what you saved about
it, on the same page. Nothing here is filed by you and nothing asks you to file it.
The order is derived from your dates and
this machine's clock, not chosen — you are on day 3 of 11 in Seoul, so these three lead. In March
the same fifteen led with Entry & Identity, Money and Connectivity. 🚨 Ordering, never availability:
nothing is ever missing from this page.
On top today3 OF 15 · LIVE
8
Eating
6 SAVED · 2 RESERVED
6
Moving
3 SAVED · 1 UNRESOLVED
12
Manners
NOTHING SAVED YET
All three heroes would carry a
photograph. 1,102 images from 한국관광공사 포토코리아 are in hand under 공공누리 제1유형, and the
credit line sits under the tile and taps through to You › Sources. The drawn scenes are what an
unphotographed shelf gets, and a drawn shelf is never captioned photo missing.
The other twelveSAME ORDER, SMALLER
9
Drinking
2 SAVED
11
Doing & Booking
7 SAVED
7
Staying
1 SAVED
4
Money
3 SAVED
13
Health
1 CARD
15
Language
4 PHRASES
10
Buying
—
5
Connectivity & Accounts
2 SAVED
14
Safety & Law
—
1
Where in Korea
5 SAVED
2
When
1 MONTH
3
Entry & Identity
DONE
Not filed12
12 things you captured and never sorted
A counted row,
never a sixteenth shelf. Search reaches all twelve whether you ever sort them or not, and
nothing in this product will ask you to.
The unfiled pile is the proof that filing is
optional. If it were a shelf it would be a chore with a name. As a counted row it is a fact
about your binder that you are allowed to ignore forever.
Accessibility, dietary, specific needs
There is no shelf 16. A step-free
route is Moving, a prayer room is
Doing, halal certification is
Eating. Whatever you have told us annotates those pages —
it never removes a row from them.
2 NEEDS ON RECORD · YOU › HOW YOU TRAVEL
3 · Korea root — web desktop, 1440 × 900
1Fifteen tiles of equal size would have been the lazy
answer. It reads as a launcher, it hides the ranking that the whole phase register exists to produce,
and at 1,440 it produces fifteen 340px photographs, which is a wallpaper, not a menu.
2Three columns, not four or five. Four columns puts
Connectivity & Accounts on two lines at this size; five makes the KEEP count collide with the
name. Three is what the longest shelf name will take.
3The KEEP count is on the shelf, in mono, and an em dash means
zero. Not "0 saved" — zero saved is not a number the user did anything to earn, and printing it as a
figure makes an empty shelf look like a failed one.
THE DECISION — and this is the screen that most earns two columns. On the phone
the two bands are stacked, and band order flips on content: with rows of your own, WHAT YOU HAVE
leads; with none, the answer leads. 🚨 At 1,440 that flip has no meaning, because both bands are above the
fold at the same time. So on desktop the flip stops being an order and becomes an emphasis — the leading
band gets the heading weight and the other gets the label. Nothing moves. That is a real behavioural
difference between the platforms and it has to be written down rather than discovered in code review.
ko
⌘N
Trip⌘1
Korea⌘2
You⌘3
EMERGENCY⌘⇧E
Korea
8 · Eating
Search everything you saved
⌘K
SHELF 8 OF 15
Eating
What to know about eating in Korea, and the
six places you saved.
DRAWN SCENE · A PHOTOGRAPH WOULD LEAD HERE
The short versionKNOW
Eating out in Korea has its own
mechanics — how you order, what arrives unasked, where you pay, and what a portion assumes about
how many of you there are. None of it is difficult and all of it is different enough to be worth
five minutes before your first meal.
34 CARDS · VERIFIED 12 MAR 2027 · SYNCED TO THIS MACHINE 2 APR
Two dates, and they
are different numbers on purpose: when a human last checked it, and when this machine last
received it.
01
Ordering when the menu has no English,
and what to point at
CARD
02
반찬 (banchan) — what arrives without
being ordered
CARD
03
Where you pay, and when the table is not
where it happens
CARD
04
1인분 — what a single portion assumes
about your party
CARD
05
Telling a kitchen about an allergy, and
what to hand over
CARD
06
Cash-only rooms, and how to tell before
you sit down
CARD
Halal certification, venue by venue
Not sourced. No
dataset we are willing to stand behind covers this restaurant by restaurant, and we are not
going to guess from a menu. Tell us it matters and we will annotate what we do hold — we will
never quietly drop the places we cannot answer for.
A dashed neutral block in the KNOW band means nobody has
sourced this yet. An empty KEEP band means you have not saved anything. Two different
sentences, two different treatments, and neither of them is red.
Resources on this shelfA BAND, NOT A PAGE
▸
Reading a menu board — a 6-minute
walkthrough
WATCH LATER
▸
The allergy card, and how to build
one
CARRY
What you haveKEEP · 6
Hyoje Bunsik
효제분식 · today 19:00
Gwangjang Market
광장시장 · saved 28 Mar
Onjium
온지음 · 9 APR 19:30
RESERVED
Osulloc Tea House
오설록 · untimed
A Kakao link Mira sent
link kept · name not resolved
Derived, not filed. You never told anything here that it belonged to Eating.
Your checklist for this2
Build Tom's peanut card in
Korean
No date on it,
so no red on it.
✓
Book Onjium for the 9th
DONE 1 APR
The rows themselves, not a link to them. A shelf that says "you have 2 tasks
here" and makes you go somewhere to see them has spent a page to save a scroll.
1Why two columns here and not on the handbook card
itself. This page is two sources with two different truth models: KNOW has a source, a
verified_at and a sync date; KEEP has no source at all because every fact in it is yours.
Putting them side by side lets the shapes do the explaining — a column of sourced prose next to a column of
your own rows. A card page (/handbook/:section/:slug) is one source and stays a single
centred 680 column with air around it.
2The KEEP column is 330 and that is enough, because every row
in it is a name, a Korean annotation and a state. Nothing in the KEEP band is prose, which is exactly the
§1 rule that decides the split.
3The hero stays. At 1,440 the temptation is to drop the image
and get to the content — but the shelf list is photo-led and a shelf page that opens with a wall of text
breaks the thread from the tile that was clicked. It is 230px, not 400.
THE DECISION. The only master/detail in the product. You is a flat list of
eleven shallow destinations, which is the exact shape master/detail was invented for — and on the phone it
costs a page transition per row. The list is 280px, permanent, and the panel beside it changes. 🚨 The
1,100 cap does not apply to a pane layout: 1,100 caps a document. A pane is bounded by its own
column width, and the prose inside the panel still stops at 680.
ko
⌘N
Trip⌘1
Korea⌘2
You⌘3
EMERGENCY⌘⇧E
You
Search everything you saved
⌘K
THE PERSON LAYER
Overview
People2
Documents7
Carry
Library31
Next time4
How you travel2
OfflineON
Sources
Settings
Privacy
Sources is a first-class row, above Settings.
공공누리 제1유형 requires attribution, so it cannot live in a footer nobody opens. It is the only row
in this product that exists because a licence says so.
Everything that outlives a trip
You, the people you travel with, the documents, the cards you carry, and the library. Nothing here
belongs to Spring in Seoul; the trip borrows
from it by reference and gives it back.
YouREFERENCED, NEVER COPIED
TC
Ted Cho
Signed in · identity shared
with dani.go
PASSPORT ON FILE · EXPIRES 2031
HOW YOU TRAVEL
peanut allergy — Tomstairs are hard for my mother
In your own
words, each removable in one action. Nothing here was asked at onboarding and nothing here
hides a row from you.
PeopleTHE PARTY · PERSON-SCOPED
MK
Mira Kwon
2 trips · no app installed
HOLDS THE BUSAN TICKETS
TS
Tom Shaw
1 trip · no app installed
CARRIES A PEANUT CARD
Add someone
A child, a
parent, a friend who wants no app. Zero other installs required.
The party is a record here and a band on the trip, not a
field on the trip. A companion who travels twice is one record. Sharing a trip shares items;
🚨 it never shares the vault — handing a companion a document is a per-document,
per-recipient act with its own consent.
DocumentsTHE VAULT · 7
Passport — Ted Cho
PERSON-SCOPED · ENCRYPTED · MRZ READ ON DEVICE
VERIFIED
Travel insurance — policy PDF
TRIP-SCOPED · ADDED 28 MAR · 2 PAGES
SHARED WITH MIRA
Screenshot — KTX seat map
TEXT READ · INDEXED FOR SEARCH · 2 APR
scan_0043.pdf
LANDED WHOLE · NOTHING READABLE IN IT · YOU NAMED IT NOTHING
UNKNOWN
TWO DOORS, ONE VAULT
The same
documents open from You and from the trip. A passport is the
most person-scoped object in the product and must not have to belong to a trip to exist.
OFFLINE
ON THIS MACHINE
7 documents,
the day pages, the phrases and the address cards. A visible is this actually here
state, because believing you have it and not having it is worse than knowing you do not.
CarrySHOW'S FRONT DOOR
주소 카드
Address card — tonight's stay
REVIEWED
알레르기 카드
Allergy card — Tom, peanut
REVIEWED
문장 4개
4 saved phrases
2 MACHINE-MADE · PROVISIONAL
Print the carry sheet
The answer to a
dead phone, a stolen phone and a surrendered one.
⌘P
🚨 Carry is where desktop's honesty is
tested. Every card here is used by holding a phone out to a person. On desktop you
build and check them — big type, a real keyboard, both scripts side by side — and
then you send them to the phone or print them. The panel says Send to my phone where the
phone says Show, and machine-made strings stay visibly provisional in both places.
Library31 · AND 4 FOR NEXT TIME
31 saved things, no trip attached
The bag exists
before the trip does. This is what tab 1 shows when there is no trip, and it is why the empty
state is not a wall.
4 things marked next
time
The only object
that survives the trip, and the reason the app is opened again a year later.
5 · You root — web desktop, 1440 × 900, panel scrolled to full height
1The rail and the section list are not the same thing and must
not look like it. The rail is three destinations with icons and blue caps; the section list is a plain
indented list on --surface with counts in mono. A second column of icon-and-label rows would
read as a second navigation and the user would have to work out which one is in charge.
2Counts, not badges.7 beside Documents is a
fact. A red dot beside Documents would be a demand, and the checklist is the only thing in dani.ko entitled
to make one.
3What the desktop adds here, concretely: the vault is
usable. Dragging seven PDFs into a phone's document picker is a chore nobody completes; dragging them onto
this panel is one gesture (§6). This is the screen where the binder actually gets filled.
THE DECISION, AND THE ARGUMENT FOR THE WHOLE PLATFORM. PRD §6 calls capture the
biggest risk in the product: if getting things in requires typing or classifying, the binder stays empty,
and an empty binder is retrieved from zero times. On a phone, capture route 1 is the OS share sheet —
which does not exist on Windows and is weak on the web. Desktop's replacement is better than the thing
it replaces: the entire window is a drop target, a folder of confirmations lands in one gesture, and
an email drags straight out of Mail. This is the machine the binder actually gets filled on, probably the
night before flying.
ko
⌘N
Trip⌘1
Korea⌘2
You⌘3
EMERGENCY⌘⇧E
Keep this
Goes to Spring in
Seoul · nothing else is asked
ESC
Paste it, drop it, or drag the whole folder.
Nothing is asked of you at this point — not a type, not a shelf, not a date. The raw file is kept
exactly as it arrived. If we can read something out of it we will offer that afterwards, and you
can say no.
Drop anything here — or anywhere in
this window
PDFs, screenshots,
a folder, an email dragged out of Mail or Outlook, a photo of someone else's screen.
The drop target is the window, not this box. The box is only here so you know that.
Or paste⌘V WORKS ON ANY SCREEN
A URL, a blob of email text, a Korean confirmation, a phone number, an image off the
clipboard — the parser may not fail, it may only recognise less.|
kakao map linka screenshot on the clipboarda pasted PNRa paragraph of an email한글 텍스트
⌘V does not need this screen. Pasting on the day
page, on a shelf, or on the search results captures to the trip and says so in a strip — because
the moment the user already has the thing in front of them is the moment worth meeting.
The routesDESKTOP
Drag and drop
DESKTOP ONLY · REPLACES THE SHARE SHEET
A whole folder
DESKTOP ONLY · NO PHONE EQUIVALENT
An email, dragged out of Mail
DESKTOP ONLY · THE FREE HALF OF FORWARDING
Paste
EVERY PLATFORM
Read this — text out of an image
EVERY PLATFORM · ON-DEVICE
Camera
PHONE ONLY · NOT DRAWN AS AVAILABLE HERE
OS share sheet
PHONE ONLY · ABSENT ON WINDOWS
The two dashed rows are not broken, they are absent. A desktop build that
greys out a camera button is telling the user the app is worse here. It is not worse; it is
different, and the two rows above it are things the phone cannot do at all.
Never a gate
There is no kind picker in front
of a drop. Requiring a type at capture is the quiet killer — the user is standing up, the wifi is
bad, and they do not want a taxonomy quiz. 🚨 An image or a file we cannot interpret
still lands.
6a · Capture at rest — web desktop, 1440 × 900
ko
DROP
Trip⌘1
Korea⌘2
You⌘3
EMERGENCY⌘⇧E
Spring in Seoul
DAY 3 OF 11 · LIVE
Search everything you saved
⌘K
Seoul
서울
TUE 6 APR 2027 · KST · DAY 3 OF 11
14:22
Right nowBAND 2
YOU ARE STAYING AT
Josun Palace Seoul
조선 팰리스 서울
88213904
6b · A drag is over the window — web desktop, 1440 × 900
Drop 4 things into Spring in Seoul
Nothing will be asked of you. Every one of them is kept exactly as it arrived, whether or not we can
read a single word out of it.
1The target is the whole window, not a zone. A 300px drop
rectangle is a thing to aim at; a window is a thing to let go over. The overlay names the destination —
into Spring in Seoul — because that is the only decision in the whole gesture, and it is made for
you and stated rather than asked.
2Dashed blue, not dashed grey. A dashed neutral edge means
unknown everywhere else in this product. A drop target is an invitation, not a gap, so it is
the only dashed thing in dani.ko drawn in flag blue — and it exists for about a second.
3⌥ is the one modifier, and it is stated on screen. Trip is
the default because a trip exists; holding ⌥ sends the drop to the person-scoped vault instead. A user who
never learns it never loses anything, because everything is searchable either way.
ko
⌘N
Trip⌘1
Korea⌘2
You⌘3
EMERGENCY⌘⇧E
Everything landed
27 things, 0 refused
⌘Z
You dropped a folder of 23 and three loose files.
All 27 are in the binder. Twenty-two had text we could read and index; five did not, and those five
are here too, under the names they arrived with.
27 OF 27 STORED · 22 INDEXED FOR SEARCH · 0 DISCARDED
What arrivedFIRST 7 OF 27
Onjium confirmation.eml
EMAIL · BODY AND HEADERS KEPT · TEXT INDEXED
READ
Busan-KTX.pdf
PDF · 1 PAGE · TEXT INDEXED · NO FIELDS PROMISED
READ
IMG_4471.PNG
SCREENSHOT · 한글 AND LATIN TEXT READ ON DEVICE
READ
photo of the counter screen.jpg
PHOTOGRAPH OF SOMEONE ELSE'S SCREEN · PARTIAL TEXT
PARTLY READ
scan_0043.pdf
STORED WHOLE · NOTHING READABLE IN IT
UNKNOWN
받은문서.hwp
STORED WHOLE · FORMAT WE CANNOT OPEN
UNKNOWN
Korea trip/ — 23 files
FOLDER NAME KEPT AS A HINT, NOT AS A SHELF
EXPANDED
The ones we could not read5
Unreadable is not rejected
Five files hold nothing we can turn into text. They are in the binder anyway, with their original
filename as the title and the file itself attached. You can name them, or never look at them
again — but they will not have quietly failed to arrive, which is the failure that teaches
someone the app cannot be trusted with their things.
🚨 This is a live defect, not a hypothetical.shared_intake.dart currently returns null for an unreadable share and navigates
nowhere, and a shared image or PDF is routed to the vault's kind picker — a classification gate in
front of the highest-value capture route. The desktop drop path must not inherit either.
Offered afterwardsDECLINABLE
This looks like a train booking.
BUSAN-KTX.PDF
Set the date to 9 Apr and attach it to the Busan leg?
A reference number is in this
email.
ONJ-2704-88
Keep it as the item's reference so search and the day page can show it?
Enrichment is offered after the thing is already safe, never before. Every
card here can be dismissed and the item stays exactly as it landed. Nothing on this panel is a
step; the drop was the whole interaction.
What is now searchable
Every readable file's text is
indexed, in both scripts, including the text inside screenshots. 🚨 That is what rescues the
items nobody filed — and on desktop, "nobody filed" is 27 files at once.
ON-DEVICE · NOTHING WAS UPLOADED TO READ IT
6c · After the drop — web desktop, 1440 × 900
4A folder keeps its name as a hint and not as a shelf.Korea trip/ becomes a word in the search index and a line under the items. Turning a folder into a
collection would be the taxonomy quiz arriving by the back door.
5One undo for the whole drop. 27 items dropped by accident
is the only capture mistake a desktop can make at scale, and ⌘Z is the only thing anyone will try.
6What desktop cannot do, stated plainly: it cannot be in
your hand at a counter. Capture is the half of the product that gets better on a big machine; retrieval is
the half that does not. That asymmetry is the whole platform story and §7 is where it bites hardest.
THE DECISION. A 0.5s press-and-hold is a touch idiom; on a mouse it is
indistinguishable from a slow click and nobody will ever find it. So on desktop Emergency stops being a
gesture and becomes a permanent row at the foot of the rail — outlined in --text,
monochrome, labelled, on every screen, one click. Keyboard: ⌘⇧E / Ctrl+Shift+E, registered
globally so it fires with the window unfocused or minimised. 🚨 It is not red. Flag red means a
deadline and this surface has no date on it — a red emergency screen would be indistinguishable from a K-ETA
countdown and would spend the product's one urgency colour on the surface that needs zero decoration.
Four ways in, none of them a hold4
a · the mouse
Trip⌘1
EMERGENCY⌘⇧E
Always on screen, on every screen, at the foot of the rail. One click. No auth check,
no trip selection, no network branch.
b · the keyboard
⌘⇧E
Global, not window-scoped.
Fires from another application, from a minimised window, and from a cold launch.
WINDOWS: CTRL + SHIFT + E
c · outside the app
macOS — the app's Dock menu and the menu bar. Windows — a jump-list task on the taskbar icon and a tray item. Web — /emergency, a real URL that can be bookmarked and
opens with no session.
d · paper
⌘P
Printing is a desktop
strength and this is where it earns most. The printed sheet is the answer to a dead phone, a stolen
phone and a surrendered one — the only surviving path for a traveller who has lost the device the
binder lives on.
Emergency
ESC
This screen has no navigation, no sign-in,
no network call and no illustration. It renders on a machine that has never had a connection.
CALL
Police
Ask for an interpreter — the line for that is printed beside the number.
···
CALL
Fire and ambulance
Say the address in Korean first. It is on this page, below.
···
CALL
Interpretation
The line to reach when neither side can proceed in English.
···
CALL
The numbers are deliberately not drawn in this mock.
They are compile-time constants in emergency_directory.dart, never bundle content — a
device that has never had a network has never applied a bundle, and the one screen that cannot fail
would be empty in exactly the situation it exists for. A mock is not a source of truth for a number
somebody dials under stress.
SHOW THIS — WHERE YOU ARE STAYING TONIGHT
조선 팰리스 서울
서울특별시 강남구 테헤란로 231
Josun Palace Seoul ·
the property's own line is beside the address on the printed sheet.
MEDICAL
Tom Shaw — peanut allergy
The card in Korean, at handover size, with the words a clinician needs.
OPEN
Medications carried
What is in the bag, in both scripts, with the prescription scan attached.
OPEN
IDENTITY AND MONEY
Passport scan
Stored on this machine. Opens without a sign-in from this screen only.
OPEN
Your embassy
The block you saved before you flew, with its hours and its address in Korean.
OPEN
Travel insurance
Policy number and the 24-hour line, exactly as you entered them.
POL-4471-KR
CALL
If something here is empty, it is
because you have not given it to us — not because we could not reach a server. Nothing on this page
waits for anything.
7 · Emergency — web desktop, 1440 × 900, no rail, monochrome, prints
1760px, centred, in a 1,440px window — and the air is the
point. This is the one screen where a wide layout would be actively dangerous: three columns of
emergency options is a decision tree, and a person reading this screen has no decisions left in them. One
column, big rows, high contrast, nothing to scan past.
2No rail, on purpose. Persistent navigation is an app-shell
dependency by definition, and this surface has none — it renders signed out, with no trip, with the session
expired, offline, on a cold launch. The only chrome is a close button and a print button.
37:1, not 4.5:1.DdsContrast.critical already
declares it. Every border on this screen is --text at 1.5px, every row is at least 56px tall,
and there is no accent colour anywhere — including on the buttons.
4🚨 The address block keeps handover typography and loses
the handover. Korean leads at display size because that is what makes it readable across a desk, and
because what you are doing at a desktop is checking that it is right. The action beside Copy
is Send to my phone, not Show — a person in trouble is not holding a laptop up to a
paramedic, and pretending otherwise would be the only dishonest thing in this file.
THE DECISION. Retrieval path 2 of 6, and the one path desktop straightforwardly
improves: the result list and the answer are on screen together, so moving the selection with ↑↓
reads the record without opening it. On a phone every result is a page transition and a trip back. Still one
field, still no scoping, still ⌘K from anywhere — including from inside Emergency.
ko
⌘N
Trip⌘1
Korea⌘2
You⌘3
EMERGENCY⌘⇧E
josun|9 RESULTS · EVERYTHING · NO SCOPEESC
SAVED THINGS · 3
Josun Palace Seoul
STAY · 4–11 APR · CONF 88213904
Matched the title
Onjium confirmation.eml
EMAIL · 2 APR
…meet at the
Josun Palace lobby at 19:00…
A note you wrote on 5 Apr
…left the umbrella
at the Josun…
IMAGES · TEXT READ ON DEVICE · 2
IMG_4471.PNG
OCR:
…JOSUN PALACE SEOUL / 조선 팰리스…
Screenshot 2 Apr 21:14
OCR:
…check-in Josun 4 Apr 15:00…
ALSO MATCHED IN KOREAN · 조선 · 4
Four more rows matched
조선 rather than josun. Searching in the
script you are holding must never silently return emptiness.
show them
Grouped by what the thing is, ranked by recency inside
each group. Never grouped by shelf — search is the path people take precisely because they do not
know which shelf it is on.
SELECTED · ↑ ↓ MOVES, ⏎ OPENS
Josun Palace Seoul
조선 팰리스 서울
CONFIRMATION
88213904
CHECK-IN 4 APR 15:00 · CHECK-OUT 11 APR 11:00
2 GUESTS · BOOKED 12 FEB
⌘C
Never truncated,
never masked. This is the number a receptionist is waiting for.
A ticket, a sign, a map pin and a confirmation that
spell one place four ways are recognised as one thing. Every romanisation on record is a search
term, and none of them is the "correct" one.
Take it with you
8 · Search — web desktop, 1440 × 900
1The search field takes the whole header when it is live.
The trip name and the phase readout are gone — you are not on a screen any more, you are in a query, and
leaving the furniture in place would suggest otherwise. ESC puts it all back.
2400 / rest, not 50/50. The results are titles and one line
of matched context; the preview is the record. A 50/50 split would give the list room it cannot use and
take it from the only part anyone reads.
3Preview is not "open". Moving the selection never navigates
and never marks anything read. ⏎ opens the record properly, in the destination that owns it, with the rail
back.
4Nothing found would say which sources were searched. An
empty state that says only "no results" teaches a person that their thing is not in the app. Nothing found
never means nothing exists.
THE DECISION, AND IT IS TWO DIFFERENT ANSWERS ON PURPOSE.DdsBreakpoint.hasRoomForTwoColumns is true at tablet, and it is a permission, not an
instruction. At 1,024 the rail takes 84 and the content has 940. 🚨 The Trip root goes to ONE column —
a second column would be about 200px, narrower than the phone the design came from, which is a worse layout
than the phone at twice the size. 🚨 The shelf page goes to TWO — 560 is still a comfortable measure
and the KEEP band is rows, which compress gracefully where prose does not. One column or two is decided by
what is in the columns.
14:22
ko
ADD
Trip
Korea
You
EMERGENCY
Spring in Seoul
DAY 3 OF 11 · LIVE
Search everything
SAT
4
SUN
5
TUE 6
Today
WED
7
THU
8
FRI
9
SAT
10
SUN
11
MON
12
TUE
13
WED
14
Where you areBAND 1
Seoul
서울
TUE 6 APR 2027 · KST
14:22
Right nowBAND 2
YOU ARE STAYING AT
Josun Palace Seoul
조선 팰리스 서울
88213904
CHECK-OUT 11 APR · 11:00
Nothing else for 28 minutes.
What is different about todayBAND 3
Hyoje Bunsik (효제분식) lists today as a
rest day
You have it saved
for 19:00 today.
SOURCE: THE VENUE'S OWN PAGE · CHECKED 6 APR 09:04
The day's thingsBAND 4
09:40
Gyeongbokgung Palace
경복궁 · Jongno-gu
ALLOW 90 MIN
12:30
Gwangjang Market
광장시장 · Jongno-gu
CASH ONLY
14:50
Bukchon Hanok Village
북촌한옥마을
HOURS UNKNOWN
Money todayBAND 5
₩48,200
SPENT
Transport card ₩11,300 — what you last told
us, not what the card says.
WeatherBAND 6
No source
We have no forecast
source for Korea we are willing to stand behind, so we are not going to invent one.
Show this to a driverBAND 7
조선 팰리스 서울
서울특별시 강남구 테헤란로 231
Josun Palace Seoul · tonight's stay
On a tablet the primary action goes back to
Show it. A tablet is held. That is the one behaviour that follows the device rather than
the breakpoint, and it is why DdsBreakpoint alone cannot decide it.
9a · Trip root — tablet, 1024 × 768, ONE column
14:26
ko
ADD
Trip
Korea
You
EMERGENCY
Korea
8 · Eating
Search everything
SHELF 8 OF 15
Eating
The short versionKNOW
Eating out in Korea has its own
mechanics — how you order, what arrives unasked, where you pay, and what a portion assumes
about how many of you there are.
34 CARDS · VERIFIED 12 MAR 2027 · SYNCED 2 APR
01
Ordering when the menu has no
English
CARD
02
반찬 (banchan) — what arrives without
being ordered
CARD
03
Where you pay, and when the table is
not where it happens
CARD
04
1인분 — what a single portion
assumes
CARD
Halal certification, venue by venue
Not sourced. No
dataset we are willing to stand behind covers this restaurant by restaurant.
What you haveKEEP · 6
Hyoje Bunsik
효제분식 · today 19:00
Gwangjang Market
광장시장 · saved 28 Mar
Onjium
온지음 · 9 APR 19:30
A Kakao link Mira sent
link kept · not resolved
Your checklist2
Build Tom's peanut card in
Korean
✓
Book Onjium for the 9th
DONE 1 APR
9b · Shelf page — tablet, 1024 × 768, TWO columns at 560 + 300
1The rail is the same rail, with bigger targets. A tablet is
a touch device with a desktop's width, so the navigation follows the width and the tap targets follow the
finger: rail items go to 56px, matching DdsTapTarget. The bottom bar is phone-only, below
600.
2The day ribbon survives to tablet; the second column does
not. The ribbon is 11 chips of 4 characters and it fits at any width above the phone. That is the test
for whether a desktop affordance belongs at tablet — does it need width, or does it need a second column.
3The handover block is the one place the device beats the
breakpoint. A tablet is picked up and turned around; a desktop is not. Same class, same typography,
different primary action — and it cannot be resolved from MediaQuery width alone, which is a
real implementation note and not a drawing decision.
THE DECISION. Windows gets its own titlebar and everything else is the desktop
shell unchanged: rail, 1,100 cap, 680 measure, two columns. ⌘ becomes Ctrl everywhere, the frame
radius drops from 22 to 10 to match Windows 11, and the min/maximise/close set is 46px, square, and hard
right. 🚨 The thing that actually differs is capture: there is no OS share sheet on Windows, so route
1 of PRD §6 — the single highest-value input in the product — does not exist here. Drag-and-drop is not a
nicety on this platform, it is the replacement.
Spring in Seoul — dani.ko
ko
CTRL N
TripCTRL 1
KoreaCTRL 2
YouCTRL 3
EMERGENCYCTRL SHIFT E
Spring in Seoul
DAY 3 OF 11 · LIVE
Search everything you saved
CTRL K
SAT
4
SUN
5
TUE 6 APR
Today
WED
7
THU
8
FRI
9
SAT
10
SUN
11
MON
12
TUE
13
WED
14
Seoul
서울
TUE 6 APR 2027 · KST · DAY 3 OF 11
14:22
Right nowBAND 2
YOU ARE STAYING AT
Josun Palace Seoul
조선 팰리스 서울
88213904
CHECK-OUT 11 APR · 11:00
CTRL C
Nothing else for 28 minutes.
What is different about todayBAND 3
Hyoje Bunsik (효제분식) lists today
as a rest day
SOURCE: THE VENUE'S OWN PAGE · CHECKED 6 APR 09:04
The day's thingsBAND 4
09:40
Gyeongbokgung Palace
경복궁 · Jongno-gu
ALLOW 90 MIN
12:30
Gwangjang Market
광장시장 · Jongno-gu
CASH ONLY
14:50
Bukchon Hanok Village
북촌한옥마을
HOURS UNKNOWN
Money todayBAND 5
₩48,200
TRANSPORT CARD ₩11,300
What you last told
us. Nothing here is a live balance.
WeatherBAND 6
No source
No forecast
source for Korea we are willing to stand behind.
Show this to a driverBAND 7
조선 팰리스 서울
서울특별시 강남구 테헤란로 231
Josun Palace Seoul · tonight's stay
Drop things hereNO SHARE SHEET
Drag from Explorer, Outlook or the
desktop
Windows has no
share sheet, so this is how things get in. Anywhere in the window works.
38px, on
--surface2, carrying the trip name and the app name in that order — the window is a trip, not
an app. Buttons are 46 × 38, square, no radius, hard right.
Ctrl, not ⌘
Every accelerator in §1
with Ctrl substituted, including the global Ctrl+Shift+E. The rail legends change with the
platform, not the build.
No share sheet
Capture route 1 is absent.
Drag-and-drop, Explorer, Outlook and paste carry the whole load, which is why §6 is drawn as carefully as
it is.
Taskbar and tray
A jump-list task for
Emergency and one for Keep this. Both open with no session and no trip selection.
Resizing is the whole responsive story
Drag the window under
1024 and it becomes §9's tablet layout. Under 600 the rail becomes the phone's bottom bar. One codebase,
three shapes, no per-platform branch.
11,280 still runs the full two-column desktop layout.
1,280 − 84 rail = 1,196, capped to 1,100, minus 52 of padding = 1,048 — which holds 680 + 30 + 338. The
breakpoint at 1024 is therefore genuinely the point where the second column stops working, not a round
number someone liked.
2A drop zone is drawn on this platform and not on macOS.
Not because the behaviour differs — the whole window is the target on both — but because a Windows user
arriving from a phone has no share sheet to fall back on and has to be told once, on the screen they live
on, that dragging works.
3The frame radius is the only cosmetic concession. 22 → 10.
Everything inside keeps its Taegeuk radii — cards 20, rows 18, buttons 16 — because those are the design
language and not a platform convention.