The user page at /u/:username now opens with a compact identity block
(40px
avatar, name, handle, clamped bio) instead of a hero header with a share
button, and the list beneath it follows the user's column setting like
Explore does. In grid mode the header spans every column via a new
ColumnGrid
header slot, exposed through PagedMemoList.renderHeader. Loading shows a
skeleton after the standard delay, not-found renders a body instead of a
toast fired from render, and visitors get an explicit empty message.
Saved views now apply on profile routes too. A single profile-route
matcher
in lib/memo-views replaces five separate spellings,
isMemoCollectionRoute
names the routes where views, calendar days and tags narrow the list in
place, and the sidebar shows the Views section on every such route for
signed-in users. The never-taken navigation-target branch in the
collection
sidebar is removed along with its props.
The gnostic OpenAPI generator hardcodes `format: enum`, `format: bytes`,
and `format: field-mask` on string properties. These are OpenAPI-only
markers; MCP clients treat tool schemas as JSON Schema 2020-12 and warn
or fail on them (zod-based parsers log "unknown format" for every tool
on every load, ajv strict mode rejects the definitions).
Normalize schemas as they leave the resolver and when parameter schemas
are cloned: drop `format: enum` (the `enum` keyword is already present),
rewrite `format: bytes` to `contentEncoding: base64`, and drop
`format: field-mask`. The generated openapi.yaml is unchanged.
A catalog test now walks every curated tool's input and output schema
and fails on any format outside the registered allowlist.
Fixes#6262
Voice notes recorded quickly or in noisy surroundings are easier to
follow when slowed down. The speed button still starts at 1x and cycles
through 1.5x and 2x before wrapping to the slow rates.
Closes#6263
The space switcher and the navigator pills shared one grammar (rounded
pill, same padding, 16-20px glyph, labels on the same rail), so the
header read as two rows of a list. Make the brand a title (24px mark,
15px semibold, small chevron), keep only the bordered compose control in
the header, move search to the trailing end of the navigator, and size
the nav pills as 28px squares to match compose.
Only the month view is rendered anywhere, so drop the unused year
calendar, the size variants and the helpers that existed for them.
- Build the month grid in one place (monthDays.ts) with the week-start
rotation and out-of-month padding, and test it.
- Keep every chip visual in cellStyles.ts. A selected day now owns its
fill outright so the empty-cell hover tint cannot swap the accent out.
- MonthCalendar derives maxCount from its own data instead of taking it
as a prop; the index exports only what callers use.
The rail used one fill for two meanings: the page you are on and a
filter that is on. A view, a tag and a calendar day could light three
rows like three current pages, while the view itself was never echoed
above the list.
- Split sidebarRowStateClasses into idle / current / checked. Nav pills,
settings sections and list scopes stay filled; views, tags (flat and
tree) and the selected calendar day take the checked look: foreground
text, accent icon and count, a 2px accent mark in the rail inset, no
surface.
- Echo the active view as a filter chip like a tag, and format the day
chip as a date.
- Make the tags list/tree toggle surface-free so only rows carry a fill.
- Tighten rows from 32px to 28px; nav pills keep their 32px square.
Keep the primary navigator compact and horizontal while aligning header, content, and footer controls on shared artwork and label rails. Add regression coverage for symmetric popovers, compact hit targets, and mobile drawer accessibility.
Drop the title bar and section micro-headers, and let the layout
switcher recede: transparent track with an accent fill on the active
segment only, which also reads correctly in dark mode.
Align every sidebar list (tags in both modes, views, settings, memo
detail) on shared slot and count-rail primitives so icons, labels, and
digits sit on the same vertical lines. Tree branches show their # mark
at rest and swap in the chevron on hover or keyboard focus; views rows
gain glyphs and move onto the same grammar, with ViewsSection extracted
to its own module.
- Generate UUID v4 values in the client with validated custom UID
support.\n- Show immutable UIDs where Space titles need
disambiguation.\n- Standardize Space surfaces on the Lucide Astroid
icon.
Preserve the underlying database error across all drivers and cover the wrapping behavior with focused tests. Make creation tests wait for the asynchronous completion callbacks to avoid timing-dependent assertions.
- Treat All as an unfiltered Space collection while preserving exact Space filters.
- Keep global resources outside remembered Space context and preserve memo navigation origins.
- Surface Space placement consistently across memo, attachment, and visibility UI.