The book catalogue grows from 7 families to 34, all self-hosted through
@fontsource under the SIL OFL 1.1 or the Apache License 2.0: condensed and
poster faces, heavy retro display, elegant display serifs, Montserrat, twelve
scripts and DM Mono. Weights run from 100 to 900, each family offering only
the weights it ships, and the serifs gain real italics.
The catalogue lives in @trek/shared (book-fonts.data.ts) with each family's
roles (display, heading, body, script, mono), weights, italics and letter
width, so the Studio, the findings, the design engine and the assistant read
one list. Page operations and the design engine set a weight a family lacks
at its nearest one, describe_book_page names the role and the weight, and
font_mix no longer counts scripts and mono faces, warning above three.
The Studio gets StudioFontPicker: the current family set in itself, a
searchable list grouped by kind with every family in its own face and the
book's own families first, and a weight slider over the weights the family
has. Faces load only when used; the assistant's page snapshot embeds only the
faces a page draws, the service worker installs only the latin files of the
original seven families, and the faces of an opened book are cached for
offline use. BOOK_SCHEMA_REV goes to 2.
The assistant can now plan and save every type the Tours tab plans. A bike
tour or a run is proposed and created through the hike's own plan and save
(propose_tour, create_tour), routed on the server with the costing of its
profile, now kept once in shared and read by the planner as well. A paddle
or ski tour planned with plan_paddle_route or plan_ski_route is saved with
create_paddle_tour or create_ski_tour, and "Plan this" takes those plans,
bike tours and runs too. Every create has its card and its way back.
- The editor's 'Pick a picture' is the one place a place's picture is set, on
the desktop dialog and the phone sheet alike: upload one from the device,
keep the current one (now shown as chosen), take an image attached to the
place, or one of the sources' photos, or remove it. Nothing is sent before
the save: the upload and the attached file are put in place once the place
is saved, so Cancel leaves the picture as it was and a new place can get
one too. Without the details column the same picker sits in the form.
- The view (inspector and phone sheet) shows the picture plainly; a click opens
the gallery of its own picture and its sources' photos.
- The gallery drops an answer that arrives after the place changed, and its
credits link to their source pages. The lightbox is a labelled modal dialog
that takes and gives back focus, names its arrows and follows the reading
direction.
- The picker leaves the details column (PlaceImagePicker), the column reads
the shared enrichment cache, and PlaceAvatarUpload and usePlaceImagePick,
which only the view used, are gone.
- Web search: ChatGPT (Responses web_search), Anthropic (web_search server
tool) and OpenRouter (web plugin) search the web themselves when the admin
switch allows it (on as it ships). A search shows as a step ("Searching the
web for ..."), the cited pages as source chips under the answer. Anthropic
answers that searched are replayed with their blocks (new provider state
adapter); the search step never goes back to the model as a call. The
prompt says when to search and that chosen places still go through
search_place.
- Tour writes: assign_tour_track (undo: take that assignment off),
unassign_tour_track, set_tour_activity_excluded (undo: the other switch),
link_tour_packing and unlink_tour_packing (undo from the link before, which
both answers now name) get change cards and their ways back.
- Found places: the strip shows only when the answer names one of them, the
named ones first. A click on a card, or "Add to trip", opens the planner's
place form filled in with the place on the day in focus, its Google details
(photos, hours, description) loading beside it; "+ Day" and the day grid
are gone.
- Trip notes: remember_for_trip runs at once without a card. The assistant
keeps lasting facts the user mentions (who travels, needs, likes, budget,
pace) on its own and offers the unsure ones as a follow-up; the chat shows
"Noted for this trip: ..." with the notes a tap away, and reads them again
so the dialog never saves over the new note.
- City walks: set_city_walk_visit checks a station off on its day (visited,
skipped, or the mark taken back), with day_edit as in the day plan, a
change card naming the station and its walk, and an undo that restores the
status before while the station is as the change left it.
- Card heads are a step smaller (32px tile, smaller title and count), and the
dot beside "Working on it" in the header is gone.
- propose_hike, create_hike and update_tour take stage_end on the stops a day
ends at, checked by the tours' own stage rules (never at the start or the
end, at most 60 stages) on REST and MCP alike.
- A proposal over several days names its stage ends and sets no single day's
schedule; its card counts the stages and marks the stops they end at.
- New points for a hike in stages keep the keys of the stops they stand on,
so a stage keeps its day; they are refused only where they would drop every
stage end.
- The tours group and the prompt name the stages, how to put each on its day,
and what to offer once a tour is planned: places along it, its packing, the
GPX file.
- The tour's sketch, figures and profile in a change row take the whole width
of the card and sit apart from the row above (wideBody), instead of under
its text pressed against it.
- "Start by 16:08" says the latest start in three words; the reason (to be
back before sunset) is its tooltip.
The cards were rows of badges in badges with no head of their own; they now
follow the frame #2541 gave the trip's dialogs and booking cards.
- Every answer card and the change card open on a tinted head band: a raised
tile with the icon (a route its sketch), the kind as an eyebrow, the title,
one quiet line and the count; the change card turns green once decided.
- Figures are framed fields under their labels (a route's distance, climb,
descent, time), the parts of a card sit under eyebrows (height profile,
stops), and the ways onward sit in a foot bar across the card.
- A route's stops are a timeline down a line, each walk on the line between
two stops; the ways of a route are calm choices with their figures in one
line and how they differ from the chosen one in another.
- Packing, to-dos, the journal, Vacay and the Atlas get the band; quantities
and weights are quiet figures, an expense's place and split share one line.
BOOKQA-009 looks at font_mix alone (three one-text pages also repeat their
layout), and BOOKSTY-004 measures the display tier against the title the
classic style already sets (34 pt on this fixture, as on dev) instead of a
guessed size.
- The design prompt keeps the print rules and adds energy: calm keeps today's
rules, lively and loud layer photos, tilt, set oversize display type and
block colour. Type sizes come as numbers relative to the page, and the model
answers eight silent questions and previews the cover twice before it
proposes.
- The type scale reaches 2.5 and a display tier sets a cover title up to
200 pt; existing books keep their sizes.
- An overlap is severe only where more than half of a photo or a text is
covered by accident; a title over a photo, a framed inset or a turned photo
is layering.
- The assistant may use every icon of the icon tab, checked by name, and every
enum of the book tools says what its values mean.
- A book carries schemaRev. The reader that meets a newer one opens the book
read-only with a reload banner and saves nothing, where it used to drop the
elements it could not read on the next save.
- The server refuses a save, a restore or a tool edit that would write an older
revision over a newer book or one newer than itself (409 book_schema_newer),
on REST and through every book tool alike.
- normalizeBookDocument moves to book-normalize.ts.
- Print waits for photos eagerly and up to 15 s for an export of more than 40
photos, and skips images without a source.
- "Plan this" decides the take it holds at once instead of waiting below for a
second confirmation, says it is being planned, and once the tour is added the
desktop opens it in the Tours tab to be edited.
- The stops run as a timeline: each walking time sits on the line between two
stops, read with the stop it leads to, so no time reads as a stop's own.
- An answer about a tour leaves out the strip of places its searches went
through (hotels, a club in another state).
- "On map" from another tab of the planner brings the map back first, and a
map that mounts right after a request still carries it out.
A turn may end on suggest_follow_ups: the server answers the call itself, keeps
its questions as data-trek-follow-ups and the chat shows them as chips under
the answer. Without them the chips fall back to what the answer holds, now by
the kind of change: a tour asks about the tour, the day plan's questions only
follow a change to the day plan, and an answer that asks the user something
offers no "tell me more".
The design engine sized a text frame by counting characters against the
letters a line holds, as if a line ended mid word. A line breaks at a space,
so a long story needed a line or more than its frame held and the Studio and
the print cut its last sentence off. The measure now wraps the words as the
Studio does, takes each family's letter width as measured on story text,
and sizes the engine's own frames with a few percent of headroom; measured
against the Studio on 1512 texts it falls short in under one percent of
them, where it fell short in 27. The overflow finding keeps the best
estimate, so a frame a person sized is not flagged for a few percent.
A chapter of several entries used to set the story of its first entry only.
Its words now flow in reading order from the opener or the panorama onto the
pages after it: the first entry's story, its pros and cons, then every
further entry's story under a small heading of its title, else its place or
date. A quiet page without a photo runs its column on across both pages, and
the planner gives a chapter as many pages for words as its stories need. A
chapter that tells a story opens on a hero or a panorama only when a page
for its words follows. Pros and cons with no room where they fall wait for a
later page that takes words.
What the pages cannot hold is said once for the whole book, named by entry,
ahead of the notes on stories cut to fit, and an entry two chapters share is
told once.
The day word of every language now says where the number goes ("DAY {day}",
"{day}日目", "第{day}天", "{day}. GÜN"), and one helper builds the mark for the
engine, the auto layout, a template and the Travel panel, so Japanese,
Korean and Chinese no longer read "日目 3". A word stored without the
placeholder is followed by the number as before. The panel's own day word is
gone with its only reader.
A country mark carries the name as its words beside the outline and a flag
mark sets it small beside the flag, the same for the engine's value, the
panel's tile, the assistant's add and a template's country mark; a flag in a
template keeps the place its name was drawn in. A flag or country mark asked
for by its own code is named after that country without the journey having
to name one.
The Studio drew the page after a held edit or cover change by running the
card's operations on its own book, which knows nothing of the journey's
photos, words and figures, so a caption from a photo, a text from an entry
or a map from the route came out differently or not at all. The card now
carries the page the server's trial made with the full context, read with
the book's schema and within the card's size, and the Studio draws it while
its book stands at the version the trial ran on. A book that moved on, a
card from before and a page too heavy to carry still run the operations on
the book on screen, the book the change will run on. The receipt leaves the
page out, since an applied change is drawn from the book itself.
A page preview draws the spread the server applied with the journey's photos,
texts and figures instead of applying the operations again without them. The
Studio's welcome, privacy banner and header fit a journey chat: a viewer is
told they can only look, the banner speaks of the book, and the trip notes
button stays in the trip chat. Escape closes the header menu before it stops a
reply, a single page renders at the full long edge, the status says a model
reads pages only while its provider has not refused an image, and pointing at
a page in a design card outlines it in the Studio.
Changes held in one step are applied in the order the chat shows them, so
"undo all" walks them back newest first. A page put back is checked against
the digest of the page as the change left it, so a save to another page no
longer blocks the undo; restore_book_page takes these digests as an option and
keeps the whole book check without them. The book card counts the user's own
photos, the preview tool describes itself per role, a copy into another trip
names no places, a held vacay toggle says up front whether it can be taken
back, and a viewer's Studio prompt names none of the design's tools.
A burst of four or more photos within a quarter of an hour becomes one grid,
no beat runs three times in a row, and an entry's pros and cons go into the
room under its words on the opener, the panorama or the quiet page, with a
note when they find none. A chapter map is the map of the chapter's trip, and
entries on no trip are named in the notes. The sorts compare by code unit, the
summary metrics and the page lookups exist once, and a flag or country mark
asked for by its own code is labelled with that country.
The reservation and booking import describers move from the core preview
helpers to the booking card package, the collab domain names the whole
area, an unused vacay label is gone, and the trip, Studio and design prompt
lines no longer contradict each other or name tools a scope is not offered.
A quiet page the opener took the whole story from was dropped but still
counted, so the next hero came one page early. The change card's body now
sits beside its row, so the book design strip keeps the chosen pages while
the apply runs, and a card part that failed is drawn again on the next state.
The shared book engine takes the schema's own frame type, so the client's
non-strict compile accepts a zod frame; promise lookups compare against
undefined, the render wait keeps its timer const, the notification store
moves its read and unread update into one helper, and the registry test
counts the two book packages.
design_book, revise_book_design and apply_book_design work on a draft, the
apply keeps the old book as a revision for undo, skips pages changed since,
and broadcasts once after the commit. Book level tools set the page setup,
duplicate pages and save layouts.
A chat column in the Studio with its own privacy notice, a live page snapshot
through modern-screenshot that leaves out photos of other people and foreign
map tiles, and flushes before every turn and apply.
The Studio draws the page on request and uploads it once, each provider gets
the image where it expects it, and a refusal falls back to the text
description. No image is stored.
Threads carry a journey scope next to the trip scope, with journey rights
(outsider 404, viewers without write tools, addon off), its own routes and a
book context, and the client keys chats by trip or journey.
Every element kind and Studio tool gets an op, the auto layout and its
templates move from the client to shared with a parity fixture, and a pure
design engine turns directives into a finished book with design findings.