Memos 26.10.0 adds a rich editor that shows a memo as it will look while you write, per-user usage limits, and declarative configuration for operators. Browsing, Markdown rendering, sign-in, security, and the server improve throughout, and releases now use calendar versions.
Highlights
- Editor: Memos opens in a rich editor by default: text looks the way the saved memo will, with a toolbar over selected text, a slash menu, and Markdown shortcuts. Markdown mode in the + menu keeps the raw text, now saved to your account under Settings › Editor; focus mode opens a narrower sheet with larger text. (#6466, #6481, Markdown mode, #6498, #6512, Markdown mode label, editor 26.10.30, 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)
- Browse by creator or Space: Pick a creator or a Space once in the sidebar and Timeline, Calendar, Map, and Attachments all show it. Home, Explore, and profile pages are one place now. (#6378)
- Filter by attachments:
has_attachmentsandhas_imageselect memos with files or pictures, in Views, Quick Find, and the API. (#6492) - Choose a Space while writing: The editor's visibility control is now an audience menu: pick who can read the memo, then the Space it belongs to, or none. It works when editing too, so a memo moves between Spaces from the same menu. (Space selection, audience menu)
- 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)
Fixes and polish
- 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. Check all and Uncheck all reach tasks inside quotes and nested lists. (tables and footnotes, quotes and callouts, inline HTML, #6364, disclosure spacing, Markdown layout, #6404, #6490, #6508) - Code and diagrams: Mermaid diagrams follow the theme and fit the memo's width, labels on custom fills stay readable in dark mode, and pie, git, and timeline palettes follow Mermaid's theme variables; code highlighting is lighter. (Mermaid, highlighting, library update)
- Images and attachments: Pinch to zoom, pan, and swipe between images; arrow keys switch items again and the full-screen preview has square corners. Attachments open in a new tab with a separate download button, controls stay on screen on mobile, files load on plain HTTP instances, and names containing
%,?, or#download and share correctly. (#6414, #6448, preview navigation, #6496, #6401, HTTP attachments, #6506) - 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, the composer renders with the Home page, the sidebar switcher shows the Space mark beside the creator, and a memo's timestamp links to it. Link previews and double-click to edit are per-browser choices under Settings › Preferences › This device. (logo, brand copy, #6417, shared controls, #6474, submenu positioning, #6279, #6377, #6402, Home composer, Space mark, memo links, device preferences)
- 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)
Administration and integrations
- Declarative configuration: Describe identity providers, instance settings, bootstrap users, and their SSO identities in JSON files under
/etc/memos/config(--config-dir,MEMOS_CONFIG_DIR). The server applies the directory at startup, ormemos config validate | plan | apply | statedoes it from the command line, so a fresh instance is usable without a browser and staging can match production. Resources the files manage show "Managed by configuration" in Settings and cannot be changed through the UI or API until the file releases them; secrets come from${env:NAME}and${file:/path}. (#6507, linked identities) - Export: Exporting an account's memos is now an administrator action that streams the archive straight to the download, so large archives no longer depend on server memory. Administrators export any account from Settings › Members or Export & Import; members ask an administrator for their archive. Import is unchanged. (#6514)
- Sign-in: With passwords disabled and a single SSO provider, sign-in starts SSO automatically and returns you to the page you wanted. Identity providers are validated when created or changed. (#6450, SSO loading state, #6507)
- Server and security: The HTTP layer 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 and MCP:
ListAttachmentsuses the shared opaque page token and returns one only when more results exist. The MCP reaction tool no longer shows a redundantparentargument beside its path. (#6452, page token, MCP reaction tool) - 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)
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.0,26.10-rc.1, and26.10.0-rc.2upgrade directly; fresh installs need nothing. (#6362) - Everyone signs in again: Access tokens are tied to the account password. Cached access tokens expire on upgrade, and a password change or admin reset signs the account out elsewhere. Browser sessions renew silently; API clients that hold access tokens must refresh or sign in again. 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)
/etc/secretsis no longer read: The deployment configuration files introduced in 0.31.0 (memos-idp-*.json,memos-instance-setting-*.json) are ignored, and the database values they overrode take effect again. Move those resources into a configuration directory asmemos.api.Configurationdocuments, keep the same identity provider UID so linked accounts keep working, and runmemos config planto preview before the first start. (#6507)- Export is an administrator action: The Export button is gone for members, and the
ExportMemosAPI is removed. Administrators download any account's archive; the archive content and the import flow are unchanged. (#6514) - Removed options: Double-click to edit is a per-browser preference, and the composer's formatting toolbar preference, the built-in Tasks View (use a View with
has_task_list && has_incomplete_tasks), and the Move to Space action (use the audience menu) are removed. The editor opens in rich mode; turn on Markdown mode under Settings › Editor to keep writing raw Markdown, as the old per-browser choice is not carried over. (device preferences, #6466, Tasks View, audience menu, #6512) - Demo mode: The seeded demo no longer ships a public access token or fixed user ids; its content attaches to users declared in the configuration directory, or to the same four demo users as before when none is declared. (demo seed)
- 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
UserService.ExportMemosandExportMemosRequestare removed. Export is an instance-administrator download at
GET /file/users/{username}/export, authenticated like attachments (Bearer header or session cookie), streaming the
archive withContent-Disposition. One export runs at a time per instance; a second request receives429. Members
ask an administrator for their archive.ImportMemosis unchanged.- 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. TheusageLimits/{usage_limit}resource and its five RPCs do not exist.UserUsagereturns
the limit set in effect aslimitspluslimit_index. Exceeding a limit returnsRESOURCE_EXHAUSTEDwith reason
QUOTA_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.- The deployment configuration files under
/etc/secrets(memos-idp-*.json,memos-instance-setting-*.json)
introduced in v0.31.0 are no longer read, and the stored values they overrode take effect again. Identity providers,
instance settings, bootstrap users, and their linked identities are declared instead asmemos.api.Configuration
documents in the configuration directory (--config-dirorMEMOS_CONFIG_DIR, default/etc/memos/config), applied
at startup unless--config-apply=off, or throughmemos config planandmemos config apply. Keep an identity
provider's UID when moving it so linked accounts keep working. An API write that changes a field a file manages
returnsFAILED_PRECONDITIONwithErrorInfo{reason: MANAGED_BY_CONFIGURATION}naming the file and fields;
GET /api/instance/configuration(administrators) lists what is managed. CreateIdentityProviderandUpdateIdentityProvidervalidate the provider as it will be stored and return
INVALID_ARGUMENTwhen it has no title, an invalididentifier_filter, noclient_id, a non-absolute or non-HTTP(S)
auth_url,token_url, oruser_info_url, an empty scope entry, or nofield_mapping.identifier. A request that
omittedconfigorfield_mappingpreviously failed withINTERNAL.UpdateInstanceSettingforSTORAGErequires every new or changed S3 storage to haveendpoint,region,bucket,
access_key_id, andaccess_key_secret(an empty secret still keeps the stored one). ForGENERAL,
week_start_day_offsetmust be between -1 and 6.BASICcannot be written. Notification validation errors name
fields in proto form (smtp_host,use_tls).- 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.
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
- @HocVoNgThai made their first contribution in #6506
- @brandon1024 made their first contribution in #6496
Full Changelog: v0.31.0...26.10.0