Memos 26.10.0-rc.2 brings a new editor that writes and reads memos the same way, per-user usage limits, and calendar versioning. Sign-in, browsing, Markdown rendering, and the server improve throughout.
What's new
- Editor: Writing and reading share one block editor, so a memo looks the same while you type and after you save. Format with the toolbar over selected text, the slash menu, or Markdown shortcuts. Markdown mode in the + menu edits the raw text and is remembered per device; focus mode opens a narrower sheet with larger text. (#6466, #6481, Markdown mode, #6498, focus mode)
- Suggestions and transcription: New drafts suggest tags, checklist formatting, and visibility from the current filters or View. Transcribe an existing audio attachment into the draft with the configured provider. (#6367, #6375)
- Usage limits: The memo length and upload size caps, previously two instance settings, are now one feature with two more metrics: memo count and total storage. Settings › Usage limits holds an ordered list of entries; the last entry is the default for everyone, and an entry above it gives the users it names their own limits. A refused save or upload names the limit it hit, and nothing already stored is hidden or removed. My Account shows your usage. (#6456, #6472, defaults and targets, upload size)
- Browsing: The selected creator or Space follows you across Timeline, Calendar, Map, and Attachments. Filter by
has_attachmentsandhas_image. Signed-out visitors can use Calendar and Map, which now show authors when several people write. Memo timestamps are links. (#6378, #6492, guest browsing, multi-author views, memo links) - Spaces: Pick a memo's Space next to its visibility in the editor's audience menu, including when editing. (Space selection, audience menu)
- Sign-in: With passwords disabled and a single SSO provider, sign-in starts SSO automatically and returns you to the page you wanted. (#6450, SSO loading state)
- Device preferences: Link previews and double-click to edit are per-browser choices under Settings › Preferences › This device. (device preferences)
- Release numbering: Versions are
YY.MM.N, such as26.10.0, with-rc.Kfor candidates and novprefix. Stable images also publish the month tag (26.10) andstable; candidates publish only their own tag. (#6362, #6469, development versions)
Improvements and fixes
- Markdown: Tables fill the width with a tinted header and wrap at words. Footnotes collect at the end of a memo with backlinks. Quotes and callouts hold lists, inline HTML such as
<ruby>renders again, collapsible sections and heading sizes are consistent between editing and reading, and Bilibili players embed. (tables and footnotes, quotes and callouts, inline HTML, #6364, Markdown layout, #6404, #6490) - Code and diagrams: Mermaid diagrams follow the theme and fit the memo's width; code highlighting is lighter. (Mermaid, highlighting)
- Image previews: Pinch to zoom, pan, and swipe between images; controls stay on screen on mobile, and attachments load on plain HTTP instances. (#6414, #6448, #6401, HTTP attachments)
- Memos and filters: Pinned memos get a clearer marker in single-creator feeds. New memos keep their place after an immediate edit and take the time of saving under a date filter.
has_task_list == falsematches memos without the property, constant operands no longer shift later filter conditions, deleting a memo removes its whole comment thread, and blurred content stays out of the detail sidebar. (#6369, pin ordering, #6451, #6457, #6382, folded operands, #6424, #6494) - Interface: Refreshed logo and brand copy. Menus, dialogs, and controls share one surface style with visible focus; sidebar menus stay anchored while scrolling, submenus stay on screen in narrow viewports, dialogs restore default focus, toasts follow the theme, and the composer renders with the Home page. (logo, brand copy, #6417, shared controls, #6474, submenu positioning, #6279, #6377, #6402, Home composer)
- Languages and link previews: Norwegian Nynorsk is available, the Korean hidden-content label is neutral, and previews of large pages find their title and image more reliably. (#6394, Korean wording, preview metadata)
- Server and security: The HTTP layer now runs on the Go standard library with unchanged routes and behavior; report any difference behind your reverse proxy. The last admin cannot be removed,
/healthzreports database outages, the admin's username is hidden from anonymous requests, outbound fetches refuse the CGNAT range, token store failures no longer appear as 401, authorization errors are JSON, hidden paths such as/.well-known/return 404, and MariaDB works. Go and gRPC are updated for CVE-2026-78669 and CVE-2026-84445. (#6475, #6454, #6491, #6256, #6461, #6504, hidden paths, #6497, #6462, #6453) - API:
ListAttachmentsuses the shared opaque page token and returns one only when more results exist. (#6452, page token)
Upgrade notes
- Upgrade path: Run
0.31.0once before installing this release if you are on anything older. Versions before0.22go through0.25.3first.0.31.0and26.10-rc.1upgrade directly; fresh installs need nothing. (#6362) - Everyone signs in again: Access tokens are tied to the account password. All sessions and cached access tokens expire on upgrade, and a password change or admin reset signs the account out elsewhere. Personal access tokens are unaffected. (token binding)
- Upload size and memo length: The two instance settings are gone and their values are not carried over. The built-in default is 8 KiB per memo and 32 MiB per file with no count or storage limit; set the all-users entry under Settings › Usage limits if you had changed the old caps. (#6456, upload size)
- Removed options: Double-click to edit is a per-browser preference, and a deployment config that still sets
enableDoubleClickEditis rejected. The composer's formatting toolbar preference, the built-in Tasks View (use a View withhas_task_list && has_incomplete_tasks), and the Move to Space action (use the audience menu) are removed. (device preferences, #6466, Tasks View, audience menu) - API clients: Update paths and renamed fields; binary protobuf clients regenerate from the new schema. The full list below is the API changelog. (#6447)
Breaking API changes
- Access tokens are now bound to the user's password hash and become invalid immediately after a password change or
an administrator password reset. Pre-upgrade access tokens are also rejected; clients must refresh them or sign in
again. The browser session that changes its own password can still refresh; other refresh sessions are revoked. - Usage limits replace the instance-wide upload size and memo content caps.
StorageSetting.upload_size_limit_mb
andMemoRelatedSetting.content_length_limitare removed and old values are not migrated. The limits are the
USAGE_LIMITSinstance setting,instance/settings/USAGE_LIMITS, an ordered list of entries read and replaced whole
throughGetInstanceSettingandUpdateInstanceSetting; the first entry naming a user applies, the last entry
applies to all users.UserUsagereturns the limit set in effect aslimitspluslimit_index. Exceeding a limit
returnsRESOURCE_EXHAUSTEDwith reasonQUOTA_EXCEEDEDand metadatametric,limit, andusage. MemoRelatedSetting.enable_double_click_editis removed; double-click editing is now a per-browser preference in
the web client and is no longer an instance setting.MemoRelatedSettingkeeps the single fieldreactions = 1. A
deployment config file that still setsenableDoubleClickEditis rejected.- The API no longer carries a
v1version marker. Every client must update its paths:- REST routes move from
/api/v1/...to/api/...(for exampleGET /api/memos). Server-sent events move from
/api/v1/sseto/api/sse. - The proto package
memos.api.v1is nowmemos.api, so Connect and gRPC procedures move from
/memos.api.v1.<Service>/<Method>to/memos.api.<Service>/<Method>. - Resource types move from
memos.api.v1/<Type>tomemos.api/<Type>. - The
domainofgoogle.rpc.ErrorInfodetails is nowmemos.api. - For this release only, requests to
/api/v1/...and/memos.api.v1.*return410 Gonewith anUNIMPLEMENTED
error that points here. The next release removes these routes.
- REST routes move from
- Field numbers in every message are renumbered from 1 in declaration order, and all
reservedranges are removed.
JSON field names are unchanged; clients that use the binary protobuf encoding must regenerate from the new schema. - Enum values are renumbered from 0 in declaration order, including
User.Role(ADMIN = 1,USER = 2) and
UserSetting.Key(GENERAL = 1,WEBHOOKS = 2,TAGS = 3). Clients that send numeric enum values must update them. - Names now follow AIP conventions:
MemoService:ListMemoAttachments,ListMemoRelations,ListMemoComments,CreateMemoComment,
ListMemoReactions, andUpsertMemoReactiontakeparentinstead ofname(REST path variable
{parent=memos/*}).ListMemoCommentsResponse.memosis nowcomments. The nestedMemoRelation.Memotype is
nowMemoRelation.MemoRef. TheMemoShareresource singular/plural is nowmemoShare/memoShares.UserService.ListAllUserStatsis nowListUserStats. It requires aparent:users/-for all users (REST
GET /api/users/-/statsinstead ofGET /api/users:stats) orusers/{user}for one user. The response field
statsis nowuser_stats.BatchGetUsersRequest.usernamesis nownamesand takes resource names (users/{user}), not bare usernames.PersonalAccessToken.created_at,expires_at, andlast_used_atare nowcreate_time,expire_time, and
last_use_time.LinkedIdentity.idp_nameandextern_uidare nowidentity_providerandexternal_uid;
CreateLinkedIdentityRequest.idp_nameis nowidentity_provider.- The
MemoViewandUserNotificationresource singulars are nowmemoViewanduserNotification. UserStats.tag_countis nowtag_counts.MemoImportPlan,MemoImportReport, andMemoImportIssueare nowImportMemosPlan,ImportMemosReport, and
ImportMemosIssue.ImportMemosPlan.memosandattachmentsare nowmemo_countandattachment_count;
ImportMemosIssue.memois nowmemo_uid.UserNotification.SpaceInvitationPayload.Stateis nowInvitationState.UpdateUserSettingRequest.settingandListUserSettingsResponse.settingsare nowuser_settingand
user_settings;UpdateInstanceSettingRequest.settingandBatchGetInstanceSettingsResponse.settingsare now
instance_settingandinstance_settings.SignInResponse.access_token_expires_atandRefreshTokenResponse.expires_atare both now
access_token_expire_time.SignInRequest.SSOCredentialsis nowSsoCredentials, and itsidp_nameis nowidentity_provider.
Please report regressions in GitHub issues.
New Contributors
- @girthquake12312-s made their first contribution in #6348
- @tandyleo110 made their first contribution in #6377
- @beemines made their first contribution in #6375
- @SulimanAbdulrazzaq made their first contribution in #6382
- @maxinedotdev made their first contribution in #6394
- @liuzel01 made their first contribution in #6404
- @MohammadKanaan made their first contribution in #6401
- @somasoil made their first contribution in #6430
- @hussnainahmedd made their first contribution in #6424
- @kediyalua made their first contribution in #6452
- @pentaoa made their first contribution in #6451
- @Gerrrt made their first contribution in #6453
- @estheruary made their first contribution in #6462
- @inchei made their first contribution in #6279
- @aotian16 made their first contribution in #6490
- @suzhiguo7 made their first contribution in #6497
- @manuaudio made their first contribution in #6504
Full Changelog: v0.31.0...26.10.0-rc.2