Commit graph

4773 commits

Author SHA1 Message Date
497ae1959d declare the native (macOS) build: node+go toolchains, go build recipe
Some checks failed
Backend Tests / Static Checks (push) Has been cancelled
Backend Tests / Tests (internal) (push) Has been cancelled
Backend Tests / Tests (other) (push) Has been cancelled
Backend Tests / Tests (server) (push) Has been cancelled
Backend Tests / Tests (store) (push) Has been cancelled
Build Canary Image / build-frontend (push) Has been cancelled
Frontend Tests / Lint (push) Has been cancelled
Frontend Tests / Build (push) Has been cancelled
Proto Linter / Lint Protos (push) Has been cancelled
Release Please / release-please (push) Has been cancelled
Build Canary Image / build-push (linux/amd64) (push) Has been cancelled
Build Canary Image / build-push (linux/arm64) (push) Has been cancelled
Build Canary Image / merge (push) Has been cancelled
2026-09-11 04:05:25 +02:00
e57f966119 add uduapp.json manifest for the udu harness 2026-09-10 22:41:05 +02:00
8fa018e6ec Add self-contained Dockerfile (build frontend + backend) and fix .dockerignore 2026-09-09 00:07:07 +02:00
Johnny
51b434d3b5
feat(views): support custom icons for saved memo views (#6305) 2026-09-08 22:10:02 +08:00
boojack
e02899e514 chore: move saved memo views into UserService 2026-09-08 21:40:50 +08:00
boojack
b3e67399b8 feat(attachment): upload files in resumable chunks
Add UploadAttachment, a unary RPC that accepts a file in bounded chunks
and streams it to a temp file instead of holding the whole blob in one
request body and in memory. A call carrying a spec starts an upload and
returns an opaque upload_id; later calls carry that id with
write_offset,
data, and finish_write, following the Cloud Storage WriteObject shape.
Retrying the last chunk after a lost response is idempotent, uploads are
bound to their owner, and they expire after 30 minutes of inactivity.

CreateAttachment and the chunked finalize now share one processing
pipeline for motion-photo detection, EXIF stripping, and storage. The
motion-photo detector works over an io.ReaderAt so large JPEGs are never
loaded whole, and the request body cap is a single per-procedure lookup.

The web editor uploads through the new RPC in 2 MiB chunks with bounded
concurrency under the server's per-user limit.
2026-09-08 21:07:06 +08:00
bluedbird
805e608aa5 chore(seed): organize memos into spaces with custom icons 2026-09-07 23:24:57 +08:00
ABird
34dbb83948
feat(spaces): support custom icons and emoji (#6287) 2026-09-07 23:12:18 +08:00
johnnyjoygh
92a95a262f chore(calendar): display daily snapshots with text and image previews 2026-09-07 21:44:59 +08:00
Johnny
2d75439ecc
feat(memos): support moving memos between spaces (#6285) 2026-09-07 20:45:59 +08:00
Abdellatif Anaflous
607dc28413
fix(webhook): block unspecified-address destinations in the SSRF guard (#6284)
Co-authored-by: hktitof <hktitof@users.noreply.github.com>
2026-09-07 20:13:10 +08:00
johnnyjoygh
9da3765b19 refactor(web): drop the memo origin scope
The "all" / "preserve" origin scope existed to decide whether returning
from a memo detail should clear the remembered Space. With the Space now
part of the origin URL itself, nothing branches on it any more; it was only
computed, serialized into router state as fromScope, and threaded through
props as parentScope.

Router state is now just { from }, createMemoNavigationState takes one
argument, and resolveMemoDetailOrigin / resolveMemoParentPage return the
origin page as a string. The archived-memo fallback to /archived stays.
2026-09-07 09:33:47 +08:00
johnnyjoygh
af008b2153 feat(web): scope Spaces by URL path instead of a remembered selection
The selected Space used to live in sessionStorage and ride along invisibly
with every collection route. It now lives in the URL: collection pages exist
both globally and beneath /spaces/:spaceUid, and the Space context derives
its scope from the current location.

- Add a Space route branch (Home, Explore, Calendar, Attachments) guarded by
  a SpaceRoute that shows loading, unavailable, and retry states.
- Resolve collection routes through one matchPath-based helper built from the
  route constants; build Space-scoped paths with buildCollectionPath.
- Fetch the route Space directly, seeded from the switcher list so pages are
  not held behind a second round-trip.
- Turn the Space switcher into plain links that preserve the current
  collection view and query.
- Drop the remembered-Space machinery: clearSelectedSpace/selectMemos,
  the compose-placement policy, routeSupportsCollectionScope, and the
  quick-find switchToAll flag are all implied by the URL now.
- Return from memo details to the full origin URL, including its Space.
- Add space.unavailable and space.back-to-memos strings; align the
  Azerbaijani catalog with English.
2026-09-07 09:29:50 +08:00
johnnyjoygh
0716eaac2c fix(editor): preserve memo timestamp edits when closing popover 2026-09-07 09:25:51 +08:00
Jamal Ali
3d97b39f2d
feat(i18n): add Azerbaijani language support (#6278) 2026-09-06 22:52:59 +08:00
johnnyjoygh
c031b77c83 chore: add a quiet button variant and one ring-free focus for kit
buttons

The calendar shipped its own "quiet control" grammar as a page-local set
of class strings: 28px tall, 13px text, muted ink that darkens under a
light hover wash, ring-free outline focus, and the accent fill reserved
for a pressed or current state. The same look was hand-rolled elsewhere
with drifting values (/65 ink, /50 washes, ring focus) as className
overrides on the kit's Button, against the kit policy.

The grammar now lives in the kit as `variant="quiet"`, with the accent
fill keyed off `aria-pressed`, `aria-current` and `data-popup-open`, so
a
control that is on, current, or holding a popup open fills itself. A
`size="icon-compact"` names the 28px square the sidebar already used for
its compose control; `sm` already had the height for labelled chips.

Kit buttons had no focus treatment of their own, so sites that needed
one
bolted `focus-visible:ring-*` overrides onto the Button. The base now
carries a 2px inset outline from a new `ui/focus.ts` constant that raw
controls (calendar grid cells, the reaction chip) import too, and the
calendar's controls.ts goes away.

With both in place the hand-rolled sites collapse onto the variant: the
calendar's header, month picker and day panel; the statistics month
navigator; the sidebar's section actions and compose and mobile menu
controls; the memo card's trailing actions and its action menu, which no
longer takes a className; the share-image dialog's footer; the memo
outline; and the inactive underline tab. The month title fills while its
picker is open and the outline's current heading fills like every other
current thing. Tests follow the classes they assert.
2026-09-06 22:43:21 +08:00
boojack
ef410846c4
chore: fix sponsor logo links
Signed-off-by: boojack <stevenlgtm@gmail.com>
2026-09-06 22:19:02 +08:00
boojack
94b9904a92
chore: add Star History section to README
Added a Star History section with a chart to visualize repository stars.

Signed-off-by: boojack <stevenlgtm@gmail.com>
2026-09-06 22:13:20 +08:00
Johnny
ad6433c51a
feat(web): calendar day panel refinements (#6280) 2026-09-06 13:15:17 +08:00
Johnny
500bb716bc
feat(web): add a calendar view of your memos (#6277) 2026-09-05 12:51:39 +08:00
johnnyjoygh
50e71e2192 chore(editor): name the commit action by host and surface its shortcut
The save button now reads Save in the composer, Update when editing, and
Comment in the comment editor, with a Cmd/Ctrl+Enter chip inside it that
is
hidden on coarse pointers. Saving keeps the verb and swaps the chip for
a
spinner in the same grid cell, so the button no longer changes width;
the
"Saving..." string is removed from every locale. Hosts that close after
saving hold a short "Saved" confirmation while the caches refresh, then
reset and close; the in-place composer clears immediately as before.
2026-09-05 10:19:22 +08:00
johnnyjoygh
5ad4aea565 chore(sidebar): move tag layout toggle into a menu 2026-09-05 10:17:19 +08:00
Johnny
bf1f742321
feat(search): add expression mode to Quick Find (#6276) 2026-09-05 09:14:08 +08:00
Johnny
60b89736a2
feat(editor): autofocus Home on initial desktop load (#6275) 2026-09-05 07:43:20 +08:00
Ruben Pari
f8b55ad16e
fix(i18n): align Chinese sensitive content labels (#6274) 2026-09-05 07:21:35 +08:00
johnnyjoygh
55d8e6ad42 chore(web): compact user profile header and in-place views on profiles
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.
2026-09-05 00:22:05 +08:00
Johnny
dfa0fda766
feat(filter): support space placement in saved views (#6267) 2026-09-04 09:29:09 +08:00
Johnny
230e3a1d11
feat(spaces): deliver invitations to the inbox (#6266) 2026-09-04 08:58:49 +08:00
johnnyjoygh
e963d326ab chore(mcp): satisfy revive lint rules 2026-09-04 08:19:44 +08:00
johnnyjoygh
1ed894bee4 chore(web): bump CodeMirror packages
Update @codemirror/view 6.43.6 -> 6.43.10, commands 6.10.4 -> 6.11.0,
state 6.7.1 -> 6.7.2, lang-markdown 6.5.0 -> 6.5.2 and @lezer/markdown
1.6.4 -> 1.7.2 to pick up upstream composition and Android/iOS fixes
while investigating #6183.
2026-09-03 23:43:38 +08:00
johnnyjoygh
652957c0f9 fix(mcp): expose standard JSON Schema formats in tool schemas
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
2026-09-03 21:53:03 +08:00
johnnyjoygh
b88a71540a feat(web): add 0.5x and 0.75x audio playback speeds
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
2026-09-03 21:34:38 +08:00
johnnyjoygh
e87dfe637d test(sidebar): align compact navigation assertions 2026-09-03 21:33:10 +08:00
johnnyjoygh
02caf98c7b chore: separate the header brand from the navigator
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.
2026-09-03 09:23:01 +08:00
boojack
6346bed57f
chore: update README.md
Signed-off-by: boojack <stevenlgtm@gmail.com>
2026-09-03 00:16:08 +08:00
johnnyjoygh
882664d9d6 refactor(calendar): collapse the activity calendar to the month grid
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.
2026-09-02 22:55:51 +08:00
johnnyjoygh
aba1f7384d feat(sidebar): separate checked filters from current rows
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.
2026-09-02 22:50:29 +08:00
johnnyjoygh
ce0dd23d2f fix(ui): refine compact navigation and memo actions 2026-09-02 22:22:13 +08:00
johnnyjoygh
5a65350400 fix(sidebar): flatten account footer surface 2026-09-02 20:45:43 +08:00
Johnny
d79b2e1dc3
feat(sidebar): redesign memo detail navigation (#6261) 2026-09-02 20:20:22 +08:00
johnnyjoygh
245e5e3a3e chore: prioritize access policies in system settings 2026-09-01 23:30:43 +08:00
johnnyjoygh
191ec01d11 fix(sidebar): unify layout rails and spacing
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.
2026-09-01 23:24:50 +08:00
Johnny
673b9df05f
feat(editor): add Markdown formatting shortcuts (#6258) 2026-09-01 21:54:55 +08:00
johnnyjoygh
ee3a0a2bba chore(sidebar): add common content and clarify navigation 2026-09-01 21:24:56 +08:00
johnnyjoygh
de843f658a chore: slim down the view options popover
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.
2026-08-31 23:56:36 +08:00
boojack
04be0d9ee6 chore(web): unify sidebar rows on a shared row grammar
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.
2026-08-31 23:40:47 +08:00
boojack
5b2bd74bdb chore: remove promotional branding output 2026-08-31 21:33:29 +08:00
elonfliter
59541ea438
refactor(webhook): iterate hostname labels with SplitSeq (#6251) 2026-08-31 09:04:15 +08:00
boojack
dcef4188db chore: tweak README 2026-08-30 12:49:04 +08:00
boojack
2c7cf91aac
fix(editor): enable native mobile text assistance (#6248) 2026-08-30 11:59:16 +08:00