Upgrade
Upgrade Memos safely across Docker, Docker Compose, and binary deployments.
Memos applies database migrations automatically on startup, so an upgrade is: back up, replace the version, start, verify. Downgrading after a migration has run is not supported — your backup is the rollback path.
Before every upgrade
- Back up the database and attachments — see Backup & Restore.
- Read the changelog for the versions you are skipping, especially across minor versions (0.x → 0.y), which can contain breaking changes.
- Note your current version so you can report it if something goes wrong.
API reference support window
The online API reference publishes the current main schema and the two newest
minor release series. When a new minor series is added, the oldest rendered
reference is retired. Historical OpenAPI YAML snapshots remain in the website
repository for reproducibility, but they are not maintained as supported online
documentation.
If your instance falls outside this window, upgrade it before developing or debugging an integration against the current API reference.
Upgrading to 0.31
These notes apply to 0.31.0-rc.1, a release candidate. Back up before testing it and pin the version explicitly; the stable image does not select this candidate. Read the release changelog.
Access and deployment
- A missing
ACCESSsetting is initialized once from the previous URL-based behavior: configured URL means public, empty URL means private. Later URL changes do not change access policy. - Upgrade or drain every older replica before changing access. Older binaries still use the URL to decide who may read anonymously.
MEMOS_INSTANCE_URLmust be absolute HTTP(S), without credentials, a query, or a fragment. Configure it separately from the access policy.- Replace blanket private-webhook access with
--webhook-private-network-allowlistorMEMOS_WEBHOOK_PRIVATE_NETWORK_ALLOWLIST. The older allow-private option remains compatible but is deprecated. - Building from source requires Go 1.27 or newer.
Data and ownership
- Existing memos remain Unassigned; no default Space is created. Their IDs, authors, visibility, and relations are preserved.
- Stored
Shortcutresources migrate to Views automatically. Named storage configurations and legacy storage settings migrate across SQLite, MySQL, and PostgreSQL; generated-ID high-water marks are retained. - Memo edits, attachments, references, and shares follow author and Space membership rules. Instance and Space admin roles no longer override another author's ownership. Users control their own reactions.
- Comments have independent visibility, placement, and lifecycle. Deleting a parent does not delete its comment memos. Deleting a Space permanently deletes every directly assigned memo and its owned resources; removing a member leaves contributions in place.
- Active Space memberships block account deletion, including with
force. - New tag grammar takes effect immediately in rendering and editing. Stored filter and statistics indexes adopt it when each memo is saved again; there is no automatic full backfill.
Integrations and links
- Update app bookmarks from
/shortcutsto/views. ReplaceShortcutService, shortcut resource paths, and MCP tool names with their Views equivalents. - Send comment visibility explicitly:
CreateMemoCommentdefaults an omitted value toPRIVATE.SetMemoRelationsrejectsCOMMENTrelations. - Stop reading
Reaction.content_id. Existing reactions migrate to internal memo IDs; orphaned reactions are removed. - Bind managed inline images before or during the memo mutation. Use authenticated Memos routes for S3 files instead of expecting presigned URLs in
externalLink. - Match username case exactly. Existing legacy spellings remain addressable, but unsupported spellings cannot be authored as new mentions.
- Allow unset message fields to be absent in gateway JSON while scalar defaults and empty lists remain present.
Removed features
Built-in Explore and user RSS feeds were removed. /explore/rss.xml and /u/:username/rss.xml return 404; there is no replacement built-in feed endpoint. Update feed readers and integrations. Use the API for reads or webhooks for user-scoped change events when those match your needs.
The global Cmd/Ctrl+K shortcut was removed. Open Quick Find from the sidebar search action.
Verify the upgrade
Check exact-case sign-in, intended anonymous access, existing memos and Views, old and new storage attachments, share links, and your API/MCP/webhook clients. In Spaces, test invitation acceptance, members-only visibility, and author permissions with separate accounts before inviting your team.
If an old memo's displayed tags and filter results differ, save that memo again. If a migrated setting or attachment fails, inspect startup logs and the preserved configuration before changing or deleting storage entries.
Upgrading to 0.30
These historical notes describe 0.30. For 0.31, apply the newer access, RSS, and Views changes above as well. Version 0.30 changes several public access and integration behaviors. Before deploying it:
- Back up the database and attachments.
- Set
MEMOS_INSTANCE_URLto the canonical public URL if the instance should remain publicly accessible. An empty value now enables private mode. - Update saved CEL shortcut expressions that use
now()or Unix timestamps. Use thenowtimestamp value, duration arithmetic such asnow - duration, and CEL timestamps instead. - Reconfigure MCP clients to use the
/mcpendpoint and service-prefixed tool names. The old aliases, prompts, resources, and unprefixed tools were removed. - Update clients that read shared memos from
GetMemoByShare(/api/v1/shares/{shareId}) toGetSharedMemo(/api/v1/shares/{shareToken}/memo). - Review shared-memo assumptions: a share token exposes the selected memo, attachments, and reactions, but not its parent, comments, or relations.
- Review tag display settings after the per-instance tag metadata migration. Tag colors and blur rules are now stored per user.
After the upgrade, verify sign-in, public memo and RSS access if enabled, shared links, and any MCP, webhook, or API integrations you operate.
Docker
docker pull neosmemo/memos:stable
docker stop memos
docker rm memos
# re-run your original docker run command — the data volume keeps your dataThe exact docker run flags are in the Docker guide.
Docker Compose
docker compose pull
docker compose up -dBinary
- Stop the service (
systemctl stop memosor your supervisor's equivalent). - Replace the binary with the new release from GitHub releases.
- Start the service and watch the logs for migration output.
See the Binary guide for service setup.
Pinning versions
neosmemo/memos:stable tracks the latest stable release, which is convenient but upgrades implicitly on every pull. For production, pin a specific version tag (for example neosmemo/memos:0.30.0) and upgrade deliberately.
Verify after upgrading
- the UI loads and you can sign in
- a new memo can be created and an existing one opens
- attachments load (storage config survived the upgrade)
Rolling back
Restore the pre-upgrade backup and start the previous version. Do not point an old version at a database that a newer version has already migrated.