# Memos — Full content
> Memos is an open-source, self-hosted note-taking app for your everyday thoughts. It’s a place to write what’s on your mind as you go about your day. A single sentence can be a whole memo, or you can take your time with a longer entry, using Markdown to give your words more structure.
These moments of writing gradually become a personal record. Each memo stays with the day you wrote it, bringing your thoughts together in a timeline you can look back through. Tags connect related thoughts across those days, making it easy to pick up a topic again or find something you remember writing.
That record lives on your own server, and your data stays yours. You choose what stays private, what to share with family and friends, and what to publish on the web. In shared spaces, you can write alongside others while each person keeps their own memos.
# Documentation
URL: https://usememos.com/docs
Memos is an open-source, self-hosted note-taking app for your everyday thoughts. It’s a place to write what’s on your mind as you go about your day. A single sentence can be a whole memo, or you can take your time with a longer entry, using Markdown to give your words more structure.
These moments of writing gradually become a personal record. Each memo stays with the day you wrote it, bringing your thoughts together in a timeline you can look back through. Tags connect related thoughts across those days, making it easy to pick up a topic again or find something you remember writing.
That record lives on your own server, and your data stays yours. You choose what stays private, what to share with family and friends, and what to publish on the web. In shared spaces, you can write alongside others while each person keeps their own memos.
Start with Getting Started, then move into deployment, configuration, and daily use.
The usage and configuration guides cover **0.31.0**, the latest stable release. Read the [release changelog](/changelog/0-31-0) and [0.31 upgrade notes](/docs/operations/upgrade#upgrading-to-031) before upgrading. The API reference provides separate version selections.
## Popular Paths [#popular-paths]
Start a local instance with one Docker command and write your first memo.
Run Memos in a single container with a persistent data directory.
Use a checked-in Compose file for repeatable self-hosted deployments.
Put Memos behind your public domain with TLS and proxy headers.
Lock down authentication, public access, and deployment defaults.
Protect your memos with a clear recovery path before you need it.
Explore the REST and gRPC APIs for automation and integrations.
Connect Memos to the rest of your stack with event-driven automation.
## Browse All Docs [#browse-all-docs]
Start an instance with Docker and write your first memo.
Run Memos with Docker, Compose, source builds, or Kubernetes.
Configure runtime flags, database, storage, authentication, and security.
Instance settings and user management.
Write memos in Markdown, then find them again with search, tags, and Views.
Explore Bullet Journal, GTD, and Zettelkasten in Memos.
API access, MCP, webhooks, and community tools.
Plan backups, upgrade safely, and tune production performance.
Common issues and fixes.
Quick answers about licensing, data, and limits.
REST and gRPC API reference.
Set up a local environment, build Memos, test changes, and contribute.
---
# Admin
URL: https://usememos.com/docs/admin
Instance administration shapes how people join and use your Memos instance. Start here to manage shared settings and accounts, and to understand how instance roles relate to Space membership and memo ownership.
Manage access and registration policies, storage, notifications, and memo behavior across the instance.
Understand instance and Space roles, manage accounts, and resolve memberships before removing a user.
## Choose the question you need to answer [#choose-the-question-you-need-to-answer]
| If you want to know… | Start with… |
| ---------------------------------------------------- | -------------------------------------------------------------------- |
| How do I control registration and public access? | [Instance Settings](/docs/admin/instance-settings) |
| Where do I configure uploads, email, or memo limits? | [Instance Settings](/docs/admin/instance-settings) |
| What can an instance admin or a Space admin do? | [Users & Roles](/docs/admin/users-roles) |
| What must I check before removing an account? | [Users & Roles](/docs/admin/users-roles#removing-access-or-accounts) |
Active instance administrators can read and manage individual memos, including private and Space-only content. Collection listings still filter by audience, and administrators do not automatically become Space members. Review roles and membership together when deciding who needs access.
For server configuration and sign-in setup, continue to [Configuration](/docs/configuration). For creating and using a shared workspace, see [Spaces](/docs/usage/spaces).
---
# Instance Settings
URL: https://usememos.com/docs/admin/instance-settings
Instance settings control authentication, storage, and memo policies. Admins can update these settings in the app or via the Instance Settings API.
Common areas include:
* Instance access policy: public or private access, stored independently of the canonical instance URL.
* General access controls: user registration, password auth, username and nickname changes, week start day, and custom instance profile.
* Storage settings: named database, local filesystem, or S3-compatible configurations with stable IDs, a default for new uploads, file path templates, and upload limits.
* Memo-related settings: content length limits, double-click editing, and allowed reaction values.
* Notification settings: SMTP email delivery, sender details, reply-to address, and the email test endpoint.
* AI settings: instance-level OpenAI or Gemini providers and speech-to-text transcription defaults.
Tag colors and content-blur rules are user settings in Memos 0.30 and later, not instance settings. See [Tags](/docs/usage/tags).
## Access policy [#access-policy]
In 0.31, the `ACCESS` setting determines whether anonymous visitors may read public content. `MEMOS_INSTANCE_URL` supplies the canonical external address and no longer changes an existing access policy. Use [deployment-managed access configuration](/docs/configuration/deployment-configuration#access-policy) when infrastructure should own this setting.
Active instance admins manage these policies and can read and manage individual memos, including other authors' private and Space-only memos. They do not automatically become Space members, and collection listings still filter by audience. See [Users & Roles](/docs/admin/users-roles).
## Sensitive settings [#sensitive-settings]
Storage, notification, and AI settings can contain credentials. API responses do not return stored S3 secrets, SMTP passwords, or AI provider API keys in plaintext. When updating those settings, submit a new secret only when you intend to replace it.
## Related API [#related-api]
* [Get Instance Setting](/docs/api/latest/instanceservice/GetInstanceSetting)
* [Batch Get Instance Settings](/docs/api/latest/instanceservice/BatchGetInstanceSettings)
* [Update Instance Setting](/docs/api/latest/instanceservice/UpdateInstanceSetting)
* [Test Instance Email Setting](/docs/api/latest/instanceservice/TestInstanceEmailSetting)
---
# Users & Roles
URL: https://usememos.com/docs/admin/users-roles
Memos has two instance roles: **Admin** and **User**. The first account created during setup becomes an instance admin. Instance admins manage accounts, instance configuration, and access policy.
## Instance roles and Space roles [#instance-roles-and-space-roles]
Each [Space](/docs/usage/spaces) has its own accepted **Admin** and **User** memberships. Instance roles and Space roles are independent: an instance User can create and administer a Space, while an instance Admin has no automatic membership in another user's Space.
Space admins manage the Space's metadata, invitations, and members. A Space admin role does not grant editing rights to another author's memos. Active instance administrators can read and manage individual memos, including private and Space-only memos, without being the author or a Space member. Collection listings still filter by audience; instance administrators do not automatically join Spaces.
## Usernames [#usernames]
Sign-in and username lookup are case-sensitive: `Alice` and `alice` are different spellings. New and renamed usernames must contain 1–36 ASCII letters or digits, with hyphens allowed only inside the name. Underscores, email addresses, and non-ASCII usernames cannot be newly assigned.
Legacy usernames remain addressable with their exact spelling. Spellings outside the new grammar cannot be written as new mentions. See [Authentication](/docs/configuration/authentication) and [Mentions](/docs/usage/reactions-comments#mentions).
## Removing access or accounts [#removing-access-or-accounts]
Removing a Space member leaves their contributions in that Space. A Space must always retain an active admin, so assign another admin before removing or archiving the last one.
Deleting an account is blocked while it has active Space memberships, including when the API request sets `force`. Resolve those memberships first. Deleting a Space instead permanently deletes all directly assigned memos; it is not an equivalent way to remove one user's access.
---
# Configuration
URL: https://usememos.com/docs/configuration
Configure Memos around how your instance runs, where its data lives, and how people sign in. These pages explain startup options, deployment-managed settings, database and attachment storage, and access controls.
Set the listen address, port, data directory, database connection, and canonical instance URL.
Load selected instance settings and identity providers from mounted JSON files at startup.
Configure SQLite, MySQL, or PostgreSQL and understand the operational tradeoffs.
Choose where attachments live and manage named storage configurations for new and existing files.
Configure password sign-in, SSO providers, and personal access tokens.
Review HTTPS, credentials, sharing, and recovery as part of operating your instance.
## Choose the question you need to answer [#choose-the-question-you-need-to-answer]
| If you want to know… | Start with… |
| ------------------------------------------------------------------ | -------------------------------------------------------------------------------- |
| How do I change the port, data path, or external URL? | [Environment Variables](/docs/configuration/environment-variables) |
| How do I keep settings under deployment or secret-manager control? | [Deployment-Managed Configuration](/docs/configuration/deployment-configuration) |
| Which database fits my deployment? | [Database](/docs/configuration/database) |
| Where should uploads be stored? | [Storage](/docs/configuration/storage) |
| How do I set up SSO or authenticate an integration? | [Authentication](/docs/configuration/authentication) |
| What should I review before exposing the instance? | [Security](/docs/configuration/security) |
## Configuration layers [#configuration-layers]
Runtime flags and `MEMOS_*` environment variables control server startup. Instance settings manage policies and services through the UI or API. When a supported setting is supplied by a deployment-managed file, that file is authoritative for the server process; changes to it require a restart.
In Memos 0.31, the `ACCESS` instance setting selects public or private access independently of `MEMOS_INSTANCE_URL`. Set the URL to the canonical external HTTP(S) address, including for private instances behind a proxy. Manage access in instance settings or a [deployment-managed access file](/docs/configuration/deployment-configuration#access-policy).
For the installation itself, start with [Deploy](/docs/deploy). Once Memos is running, use [Admin](/docs/admin) for ongoing instance and account management, and [Reverse Proxy](/docs/deploy/reverse-proxy) for HTTPS and forwarded headers.
---
# Authentication
URL: https://usememos.com/docs/configuration/authentication
Memos supports three primary authentication mechanisms:
* password-based sign-in
* OAuth2 or SSO identity providers
* personal access tokens for API use
Use password sign-in for simple private instances. Use SSO when your team already has a central identity provider and you want Memos sign-in to follow that identity system. Use personal access tokens for scripts and integrations.
## Session model [#session-model]
| Token type | Lifetime | Storage | Notes |
| --------------------------- | --------------------------------------- | ------------------ | -------------------------------------- |
| Access token (JWT) | 15 min | Client memory | Stateless; verified without a DB query |
| Refresh token (JWT) | 30 days | HTTP-only cookie | Database-backed, revocable |
| Personal access token (PAT) | User-selected; no expiration by default | SHA-256 hash in DB | Format: `memos_pat_<32 random chars>` |
The plain PAT is shown only once at creation time. Only its SHA-256 hash is stored in the database.
For automation or external tools, use personal access tokens instead of browser-style cookie flows.
## Password authentication [#password-authentication]
Password authentication is enabled by default. It is simple and works well for single-user or small private instances.
Password auth is usually the right starting point when:
* the instance is personal or very small
* you do not already have a central identity provider
* you want minimal setup complexity
Users sign in with their Memos username and password. Archived users cannot sign in. Failed sign-in attempts use the same error message for unknown usernames and wrong passwords, so the login page does not reveal whether a username exists.
### Username spelling [#username-spelling]
In 0.31, sign-in and lookup use exact-case usernames. `Alice` and `alice` are distinct spellings. New or renamed usernames must contain 1–36 ASCII letters or digits, with hyphens only inside the name. Existing legacy names remain addressable, but unsupported spellings cannot be used for new mentions. When diagnosing a failed sign-in after upgrading, check the stored username and its case before resetting credentials.
### Disable password authentication [#disable-password-authentication]
Admins can disable password sign-in for regular users after SSO is configured. When password auth is disabled:
* regular users must sign in with SSO
* password-based registration is unavailable
* admins can still use password sign-in through the admin sign-in path
* the regular sign-in page hides the password form
Keep at least one admin account with a known password. This gives you a recovery path if an SSO provider is misconfigured or temporarily unavailable.
## OAuth2 and SSO [#oauth2-and-sso]
SSO is the right choice for team instances that already use a central identity system. Configure the provider in instance settings, then test login with a non-admin account before forcing the whole instance onto SSO-only behavior.
The OAuth2 callback URL for your Memos instance is:
```text
https:///auth/callback
```
Register that exact URL in the OAuth2 application for your identity provider.
### How SSO users are matched [#how-sso-users-are-matched]
Memos stores local users separately from external SSO accounts. When a user signs in through SSO, Memos reads the configured identifier field from the provider's user info response and looks for an existing linked identity.
If a matching linked identity already exists, Memos signs in to the same local user. If no match exists and registration is allowed, Memos creates a regular local user and links that external account. If user registration is disabled, first-time SSO sign-in is rejected until an account is created or linked by another flow.
For a new SSO user, Memos first tries to use the mapped external identifier as the local username when it satisfies the username rules and is not reserved. If that value is invalid or already belongs to another account, Memos generates a UUID-based username instead. It never links an SSO identity to an existing account merely because the usernames match.
### OAuth2 provider fields [#oauth2-provider-fields]
Each identity provider requires:
* `clientId` and `clientSecret` from the OAuth2 application
* `authUrl`, `tokenUrl`, and `userInfoUrl` for the provider's OAuth2 endpoints
* `scopes` the token should request
* `fieldMapping` to map the provider's user info fields to Memos fields (`identifier`, `displayName`, `email`, `avatarUrl`)
* optional `identifierFilter`, a regex applied to the identifier value; users that do not match are denied
The `identifier` mapping is the most important setting. It becomes the external identity key that Memos uses for future sign-ins. Choose a stable provider field such as a subject ID, username, or email address depending on how your provider guarantees identity stability.
Changing the provider UID or the `fieldMapping.identifier` value after users have signed in can prevent Memos from finding existing linked identities. Treat those settings as stable once SSO is in use.
Use `identifierFilter` to restrict who can sign in. For example, a filter can allow only users from a specific email domain. Test the regex carefully; a bad filter can block every SSO user.
Memos only reads string fields from the user info response. If your provider returns nested objects or non-string values for a field, adjust the provider configuration or expose a flat string claim.
### GitHub [#github]
```json
{
"title": "GitHub",
"type": "OAUTH2",
"config": {
"oauth2Config": {
"clientId": "",
"clientSecret": "",
"authUrl": "https://github.com/login/oauth/authorize",
"tokenUrl": "https://github.com/login/oauth/access_token",
"userInfoUrl": "https://api.github.com/user",
"scopes": ["read:user", "user:email"],
"fieldMapping": {
"identifier": "login",
"displayName": "name",
"email": "email",
"avatarUrl": "avatar_url"
}
}
}
}
```
GitHub's `email` field can be empty depending on the user's profile privacy and granted scopes. If you need a guaranteed identifier, use `login` or another stable field from your identity policy.
### Google [#google]
```json
{
"title": "Google",
"type": "OAUTH2",
"config": {
"oauth2Config": {
"clientId": "",
"clientSecret": "",
"authUrl": "https://accounts.google.com/o/oauth2/v2/auth",
"tokenUrl": "https://oauth2.googleapis.com/token",
"userInfoUrl": "https://www.googleapis.com/oauth2/v2/userinfo",
"scopes": ["openid", "profile", "email"],
"fieldMapping": {
"identifier": "email",
"displayName": "name",
"email": "email",
"avatarUrl": "picture"
}
}
}
}
```
Google `email` works well for many private deployments, especially when combined with an `identifierFilter` that limits access to your domain. If your organization can rename or recycle email addresses, prefer a stable subject field if your provider exposes one through user info.
### Safe SSO rollout [#safe-sso-rollout]
1. Create the OAuth2 application with `https:///auth/callback` as the callback URL.
2. Add the identity provider in Memos and save the client ID, client secret, endpoints, scopes, and field mappings.
3. Test SSO sign-in with a non-admin account.
4. Confirm first-time SSO behavior matches your registration policy.
5. Keep admin password access available as a recovery path.
6. Disable password authentication for regular users only after SSO is working.
## Linked identities [#linked-identities]
Users can link an external SSO account to their existing Memos account from account settings. After a provider is linked, signing in with that SSO account opens the same Memos user.
Each Memos user can link at most one external account per identity provider. The same external account cannot be linked to multiple Memos users.
Unlinking removes only the relationship between the Memos user and the external account. It does not delete the Memos user, the identity provider configuration, or the external account. Before unlinking, make sure the user still has another usable sign-in method.
See [Linked Identities](/docs/usage/linked-identities) for the end-user workflow.
## Personal access tokens [#personal-access-tokens]
PATs are intended for scripts, integrations, and external tools.
Use PATs when:
* calling the API from automation
* integrating with external services
* avoiding interactive browser login flows
Operational guidance:
* create a separate token for each application or integration
* choose an expiration when the integration does not need a permanent credential; new tokens default to no expiration
* review the last-used timestamp to find abandoned credentials
* rotate tokens periodically
* delete tokens that are no longer needed
* do not embed PATs into public clients or front-end code
## API references [#api-references]
* [Auth Service: SignIn](/docs/api/latest/authservice/SignIn)
* [Identity Provider Service: CreateIdentityProvider](/docs/api/latest/identityproviderservice/CreateIdentityProvider)
---
# Database
URL: https://usememos.com/docs/configuration/database
Memos supports three database backends:
* `sqlite` for the default single-instance setup
* `mysql` for managed or larger deployments
* `postgres` for managed or larger deployments
## SQLite [#sqlite]
SQLite is the default and the best fit for most personal deployments or small teams running a single node.
Useful defaults in Memos include WAL mode and a busy timeout, which help reduce common lock contention problems.
Typical SQLite setup:
```bash
MEMOS_DRIVER=sqlite MEMOS_DATA=/var/opt/memos memos
```
If you need an explicit file path:
```bash
MEMOS_DRIVER=sqlite MEMOS_DSN=/opt/memos/memos.db memos
```
SQLite is usually enough when:
* one instance handles all writes
* your dataset is modest
* operational simplicity matters more than cluster-style scaling
## MySQL and PostgreSQL [#mysql-and-postgresql]
Use MySQL or PostgreSQL when:
* you want managed backups and tooling
* you already operate a database server
* you expect larger datasets or more operational controls
* you do not want the application host to carry the database file locally
Examples:
```bash
MEMOS_DRIVER=mysql \
MEMOS_DSN="memos_user:password@tcp(db:3306)/memos?charset=utf8mb4&parseTime=True&loc=Local" \
memos
```
```bash
MEMOS_DRIVER=postgres \
MEMOS_DSN="postgres://memos_user:password@db:5432/memos?sslmode=disable" \
memos
```
## Selection guidance [#selection-guidance]
* choose SQLite for one-node simplicity
* choose MySQL or PostgreSQL for operational flexibility
* keep backups aligned with your database choice
* if you store attachments outside the database, back those up separately
## Performance implications [#performance-implications]
Database choice changes where bottlenecks show up:
* SQLite tends to surface write contention first
* MySQL and PostgreSQL push complexity into networked DB operations and tuning
* attachment storage can dominate recovery and backup time even when the DB is healthy
---
# Deployment-Managed Configuration
URL: https://usememos.com/docs/configuration/deployment-configuration
Memos 0.30 and later can load selected configuration from JSON files mounted under `/etc/secrets`. Use this when settings such as SSO, storage credentials, or registration policy should be controlled by Docker Compose, Kubernetes, GitOps, or a secret manager instead of the admin UI.
File-backed configuration is loaded once at startup and remains authoritative for that server process. Settings not supplied by files continue to use the database and can be managed normally in Memos.
## Quick start with Docker Compose [#quick-start-with-docker-compose]
Create a directory for the configuration files:
```text
.
├── compose.yaml
└── memos-secrets/
└── memos-instance-setting-general.json
```
Add `memos-secrets/memos-instance-setting-general.json`:
```json
{
"key": "GENERAL",
"generalSetting": {
"disallowUserRegistration": false,
"disallowPasswordAuth": false,
"additionalScript": "",
"additionalStyle": "",
"weekStartDayOffset": 1,
"disallowChangeUsername": false,
"disallowChangeNickname": false,
"customProfile": {
"title": "Team Memos",
"description": "Notes for our team",
"logoUrl": "https://example.com/logo.png"
}
}
}
```
Mount the directory read-only at `/etc/secrets`:
```yaml
services:
memos:
image: neosmemo/memos:stable
ports:
- "5230:5230"
volumes:
- ./memos-data:/var/opt/memos
- ./memos-secrets:/etc/secrets:ro
```
Make sure the files are readable by the Memos container user, then recreate the container:
```bash
docker compose up -d --force-recreate
docker compose logs memos
```
The startup log reports how many identity providers and instance settings were loaded. It does not print configuration values or secrets.
## Supported files [#supported-files]
Memos scans direct children of `/etc/secrets` and reads only these filename patterns:
| Resource | Filename | Stable key |
| ------------------------ | ------------------------------------------ | -------------- |
| OAuth2 identity provider | `memos-idp-.json` | `uid` |
| Access policy (0.31+) | `memos-instance-setting-access.json` | `ACCESS` |
| General settings | `memos-instance-setting-general.json` | `GENERAL` |
| Storage settings | `memos-instance-setting-storage.json` | `STORAGE` |
| Memo behavior | `memos-instance-setting-memo-related.json` | `MEMO_RELATED` |
| Email notifications | `memos-instance-setting-notification.json` | `NOTIFICATION` |
| AI providers | `memos-instance-setting-ai.json` | `AI` |
Use lowercase kebab case for ``, such as `primary-sso` or `company-login`. The label makes the filename readable; the `uid` or `key` inside the file identifies the resource.
Each matching file must:
* contain exactly one JSON resource;
* use the fields shown in this guide, with no unknown fields;
* be no larger than 1 MiB; and
* be a regular file or a symlink that resolves to a regular file.
A missing `/etc/secrets` directory is a normal no-op. Unrelated files in the directory are ignored. A matching file that cannot be read or validated prevents Memos from starting.
## OAuth2 identity provider [#oauth2-identity-provider]
An identity-provider file contains one OAuth2 provider. The `uid` is required and should remain stable after users begin signing in. Do not include a database-generated `id`.
Example `/etc/secrets/memos-idp-primary-sso.json`:
```json
{
"uid": "primary-sso",
"name": "Company SSO",
"type": "OAUTH2",
"identifierFilter": "",
"config": {
"oauth2Config": {
"clientId": "client-id",
"clientSecret": "client-secret",
"authUrl": "https://idp.example.com/oauth/authorize",
"tokenUrl": "https://idp.example.com/oauth/token",
"userInfoUrl": "https://idp.example.com/oauth/userinfo",
"scopes": ["openid", "profile", "email"],
"fieldMapping": {
"identifier": "sub",
"displayName": "name",
"email": "email",
"avatarUrl": "picture"
}
}
}
}
```
Required values include `uid`, `name`, the client ID and secret, all three OAuth2 endpoint URLs, at least one scope, and `fieldMapping.identifier`. Duplicate UIDs across files are rejected.
The OAuth2 callback URL remains:
```text
https:///auth/callback
```
See [Authentication](/docs/configuration/authentication) for provider setup and identity-mapping guidance.
## Instance settings [#instance-settings]
Each instance-setting file contains a `key` and the matching settings object. A file supplies the complete effective group: omitted scalar fields use their default values instead of inheriting values from the database. Empty secret fields are also treated as empty values.
### Access policy [#access-policy]
In 0.31, use `memos-instance-setting-access.json` to select access independently of the canonical instance URL:
```json
{
"key": "ACCESS",
"accessSetting": {
"accessMode": "INSTANCE_ACCESS_MODE_PRIVATE"
}
}
```
Use `INSTANCE_ACCESS_MODE_PUBLIC` to allow eligible anonymous public reads. The mode must be explicit; an omitted or unspecified mode is rejected. This setting does not revoke existing share links.
Set `MEMOS_INSTANCE_URL` separately to the canonical external HTTP(S) URL. Credentials, queries, and fragments are not allowed. A private instance can have a canonical URL behind a reverse proxy.
The first upgraded startup initializes a missing database access setting from the old URL-based behavior. Later URL changes do not change access. Upgrade every replica before changing the policy; older binaries still infer public access from the URL. See [Upgrading to 0.31](/docs/operations/upgrade#upgrading-to-031).
### General [#general]
Use `memos-instance-setting-general.json` with `key: "GENERAL"`. The complete format is shown in the [Docker Compose quick start](#quick-start-with-docker-compose).
`weekStartDayOffset` accepts `0` for Sunday through `6` for Saturday.
### Storage [#storage]
For 0.31, use named entries in `storages` and select one with `defaultStorageId`. Each entry has a stable ID; existing attachments continue to use the configuration identified at upload time.
In deployment files, `storages[].type` must be `STORAGE_TYPE_DATABASE`, `STORAGE_TYPE_LOCAL`, or `STORAGE_TYPE_S3`. The shorter values used by the instance API are not accepted for this field.
```json
{
"key": "STORAGE",
"storageSetting": {
"filepathTemplate": "assets/{timestamp}_{uuid}_{filename}",
"uploadSizeLimitMb": "30",
"defaultStorageId": "team-assets",
"storages": [
{
"id": "team-assets",
"name": "Team assets",
"type": "STORAGE_TYPE_S3",
"s3Config": {
"accessKeyId": "access-key",
"accessKeySecret": "secret-key",
"endpoint": "https://s3.example.com",
"region": "us-east-1",
"bucket": "memos-assets",
"usePathStyle": false,
"insecureSkipTlsVerify": false
}
}
]
}
}
```
Keep every configuration referenced by existing attachments when replacing this complete settings group. Changing the default affects new uploads only. Legacy `storageType` and top-level `s3Config` remain supported for compatibility, but new configurations should use the named format. This example requires 0.31 or later; use `neosmemo/memos:0.31.0` to pin the release.
Only enable `insecureSkipTlsVerify` for a trusted S3-compatible endpoint using a self-signed certificate. It disables TLS certificate verification.
### Memo behavior [#memo-behavior]
```json
{
"key": "MEMO_RELATED",
"memoRelatedSetting": {
"contentLengthLimit": 1048576,
"enableDoubleClickEdit": true,
"reactions": ["👍", "❤️", "🎉"]
}
}
```
`contentLengthLimit` is measured in bytes. `reactions` supplies the allowed reaction values for the instance.
### Notifications [#notifications]
```json
{
"key": "NOTIFICATION",
"notificationSetting": {
"email": {
"enabled": true,
"smtpHost": "smtp.example.com",
"smtpPort": 587,
"smtpUsername": "memos",
"smtpPassword": "smtp-secret",
"fromEmail": "memos@example.com",
"fromName": "Memos",
"replyTo": "support@example.com",
"useTls": true,
"useSsl": false
}
}
}
```
When email is enabled, `smtpHost`, a positive `smtpPort`, and `fromEmail` are required. Do not enable both `useTls` and `useSsl`.
### AI providers [#ai-providers]
Every provider needs an explicit, unique `id`, a title, a supported type (`OPENAI` or `GEMINI`), and an API key.
```json
{
"key": "AI",
"aiSetting": {
"providers": [
{
"id": "openai-main",
"title": "OpenAI",
"type": "OPENAI",
"endpoint": "https://api.openai.com/v1",
"apiKey": "api-key"
}
],
"transcription": {
"providerId": "openai-main",
"model": "gpt-4o-mini-transcribe",
"language": "en",
"prompt": ""
}
}
}
```
`transcription.providerId` must reference a provider in the same file. An empty OpenAI endpoint defaults to `https://api.openai.com/v1`; an empty Gemini endpoint defaults to `https://generativelanguage.googleapis.com/v1beta`.
The `BASIC` and `TAGS` setting groups cannot be deployment-managed.
## SSO-only deployment [#sso-only-deployment]
An SSO-only instance needs both:
1. an identity-provider file such as `memos-idp-primary-sso.json`; and
2. `memos-instance-setting-general.json` with `disallowPasswordAuth` set to `true`.
Keep `disallowUserRegistration` set to `false` if first-time SSO users should be created automatically. Memos refuses to start if regular password sign-in is disabled without an effective identity provider. The administrator password sign-in path remains available for recovery.
## Precedence and removal [#precedence-and-removal]
A file-backed identity provider shadows a stored provider with the same `uid`. A file-backed instance-setting group shadows the database row with the same `key`. Other stored resources remain active.
Memos does not copy the file into the database or delete the value underneath it. If you remove a file and restart Memos, the previous database value becomes effective again. Delete or update an obsolete stored value yourself if you do not want it to return.
Updates and deletions of active file-backed resources are rejected by the API. Update the file and restart Memos instead.
## Apply changes [#apply-changes]
Configuration is loaded once per server process. After editing, adding, or removing a file, restart every Memos replica.
For Docker Compose:
```bash
docker compose restart memos
```
For Kubernetes, restart the workload after the mounted Secret changes:
```bash
kubectl rollout restart deployment/memos
```
All replicas in one deployment should mount identical files. Avoid routing traffic to replicas using different authentication or storage configurations during a rollout.
## Security [#security]
Treat `/etc/secrets` and every matching file as sensitive plaintext:
* mount the directory read-only;
* restrict host and container file permissions;
* do not commit real credentials to source control;
* use Docker secrets, Kubernetes Secrets, or your platform's secret manager; and
* keep the same files available for disaster recovery without placing them in a public backup.
Memos redacts secrets from API responses, validation errors, and startup summaries. File contents are held only in the private runtime configuration snapshot and are not persisted by the loader.
## Upgrading from the earlier identity-provider bootstrap [#upgrading-from-the-earlier-identity-provider-bootstrap]
Older versions of the `memos-idp-*.json` bootstrap copied identity providers and their client secrets into the database. The current loader does not remove those stored rows automatically.
If startup warns that a file-backed provider shadows a stored provider:
1. Back up the database and confirm administrator password access.
2. Temporarily remove the identity-provider file and restart Memos.
3. Delete or update the stored provider through the admin UI or API.
4. Restore the file and restart Memos again.
Until the stored provider is cleaned up, it can reappear when the file is removed.
## Troubleshooting [#troubleshooting]
### A file is ignored [#a-file-is-ignored]
Check that it is directly under `/etc/secrets`, uses a supported lowercase filename, and ends in lowercase `.json`. Memos warns about unrecognized direct children beginning with `memos-`.
### Memos does not start [#memos-does-not-start]
Check the startup error for the filename and field name. Common causes include unreadable files, unknown or misspelled fields, a setting object that does not match its `key`, missing S3 or SMTP fields, duplicate stable keys, and disabling password login without an identity provider.
### An API or UI update fails [#an-api-or-ui-update-fails]
Active file-backed resources cannot be changed through the API. Edit the corresponding deployment file and restart Memos.
### An old value returns after removing a file [#an-old-value-returns-after-removing-a-file]
This is expected when a database value was shadowed. Update or delete the stored value if it should no longer be used.
---
# Environment Variables
URL: https://usememos.com/docs/configuration/environment-variables
Memos maps runtime flags to environment variables with the `MEMOS_` prefix. In production, environment variables are usually the cleanest way to keep deployment config explicit and repeatable.
## Reference [#reference]
All flags and their corresponding environment variables:
| Flag | Environment variable | Default | Purpose |
| ------------------------------------- | ----------------------------------------- | -------- | --------------------------------------------------------------------- |
| `--port` | `MEMOS_PORT` | `8081` | HTTP listen port |
| `--addr` | `MEMOS_ADDR` | \`\` | Bind address (empty = all interfaces) |
| `--unix-sock` | `MEMOS_UNIX_SOCK` | \`\` | Unix socket path |
| `--data` | `MEMOS_DATA` | auto | Data directory |
| `--driver` | `MEMOS_DRIVER` | `sqlite` | Database backend (`sqlite`, `mysql`, `postgres`) |
| `--dsn` | `MEMOS_DSN` | auto | Database connection string |
| `--instance-url` | `MEMOS_INSTANCE_URL` | \`\` | Canonical external URL; independent of access policy |
| `--demo` | `MEMOS_DEMO` | `false` | Demo mode |
| `--webhook-private-network-allowlist` | `MEMOS_WEBHOOK_PRIVATE_NETWORK_ALLOWLIST` | empty | Allowed private destinations: exact hostnames, IP addresses, or CIDRs |
| `--allow-private-webhooks` | `MEMOS_ALLOW_PRIVATE_WEBHOOKS` | `false` | Deprecated blanket exception for private webhook destinations |
| `--log-level` | `MEMOS_LOG_LEVEL` | `info` | Log verbosity (`debug`, `info`, `warn`, `error`) |
### Data directory defaults [#data-directory-defaults]
`MEMOS_DATA` resolves automatically when not set:
* **Windows**: `%ProgramData%\memos`
* **Docker**: `/var/opt/memos` (when writable)
* **Linux / macOS**: current directory (`.`)
### DSN defaults [#dsn-defaults]
When `MEMOS_DRIVER=sqlite` and `MEMOS_DSN` is empty, the database file defaults to `{MEMOS_DATA}/memos_prod.db`. For MySQL and PostgreSQL, `MEMOS_DSN` is required.
### Public and private mode [#public-and-private-mode]
In Memos 0.31, access is controlled by the `ACCESS` instance setting, through `accessSetting.accessMode`:
* `INSTANCE_ACCESS_MODE_PRIVATE`: anonymous visitors are sent to sign-in; anonymous API access is limited to endpoints such as setup, authentication, registration when allowed, and explicit shared memos.
* `INSTANCE_ACCESS_MODE_PUBLIC`: eligible public memos, profiles, and Explore can be read anonymously.
Configure access in instance settings or with a [deployment-managed JSON file](/docs/configuration/deployment-configuration#access-policy). It is not a runtime flag or environment variable.
`MEMOS_INSTANCE_URL` supplies the canonical external address, including for a private instance behind a proxy. It must be an absolute HTTP(S) URL without credentials, a query, or a fragment, such as `https://memos.example.com`.
When the access setting is first initialized, Memos preserves the earlier behavior: a configured URL initializes public access; an empty URL initializes private access. Once the setting exists, changing the URL never changes the access policy. See [Upgrading to 0.31](/docs/operations/upgrade#upgrading-to-031).
## Priority order [#priority-order]
1. Command-line flags (highest)
2. Environment variables
3. Default values (lowest)
An explicit flag always wins over the environment variable for the same setting.
## Practical guidance [#practical-guidance]
* select private or public access explicitly in the `ACCESS` instance setting
* set `MEMOS_INSTANCE_URL` to the canonical external URL when the app sits behind a proxy
* prefer explicit `MEMOS_DRIVER` and `MEMOS_DSN` when you are not using SQLite defaults
* allow only required private webhook destinations with `MEMOS_WEBHOOK_PRIVATE_NETWORK_ALLOWLIST`; leave the deprecated blanket option disabled
* keep secrets such as database credentials outside committed compose files
* treat these values as part of deployment config and back them up accordingly
## Common patterns [#common-patterns]
SQLite with explicit data directory:
```bash
export MEMOS_DRIVER=sqlite
export MEMOS_DATA=/var/opt/memos
./memos
```
External PostgreSQL:
```bash
export MEMOS_DRIVER=postgres
export MEMOS_DSN="postgres://user:password@db:5432/memos?sslmode=disable"
export MEMOS_INSTANCE_URL=https://memos.example.com
./memos
```
Unix socket with Nginx (useful for local reverse proxy):
```bash
export MEMOS_UNIX_SOCK=/var/run/memos.sock
export MEMOS_DATA=/var/lib/memos
export MEMOS_INSTANCE_URL=https://memos.example.com
./memos
```
Nginx upstream for the socket:
```nginx
upstream memos {
server unix:/var/run/memos.sock;
}
```
---
# Security
URL: https://usememos.com/docs/configuration/security
Memos is self-hosted by design. You control the infrastructure, storage, and access policies.
## Token security model [#token-security-model]
Three token types handle authentication:
| Token type | Lifetime | Storage | Notes |
| --------------------- | --------------------------------------- | ------------------ | -------------------------------------------------------------------- |
| Access token (JWT) | 15 minutes | Client memory | Stateless; no DB query needed to verify |
| Refresh token (JWT) | 30 days | HTTP-only cookie | Stored in DB, revocable; `SameSite=Lax`, `Secure=true` in production |
| Personal access token | User-selected; no expiration by default | SHA-256 hash in DB | Prefix `memos_pat_`; plain token shown only once at creation |
The JWT secret is auto-generated as a UUID on first run and stored in the database. In demo mode, the fixed secret `usememos` is used — never deploy demo mode as production.
## Core recommendations [#core-recommendations]
* select private access in the `ACCESS` instance setting when anonymous public access is not intended
* set `MEMOS_INSTANCE_URL` to the canonical URL used by your reverse proxy; changing this URL does not change access policy
* disable user registration if your instance is private
* disable public memo visibility if you do not want any public content
* use HTTPS in front of the instance
* review who can create personal access tokens and who can publish public memos
## Session and auth hygiene [#session-and-auth-hygiene]
* protect the host admin account carefully
* prefer SSO for team deployments when available
* rotate credentials and tokens that are exposed or no longer needed
* use a separate PAT for each integration and review its last-used timestamp
* add an expiration when an integration does not need a permanent credential
* never enable demo mode on a production instance (it uses a hardcoded JWT secret)
## Reverse proxy requirements [#reverse-proxy-requirements]
Your proxy should:
* terminate TLS
* preserve `Host` and `X-Forwarded-*` headers
* expose the same public URL configured in `MEMOS_INSTANCE_URL`
## Attachment and sharing considerations [#attachment-and-sharing-considerations]
Security is not only about login. Public memos may expose:
* memo body content
* attached files
* links and references embedded in the memo
Treat visibility and attachment review as part of your security model.
## Backup and recovery [#backup-and-recovery]
Security is also about recoverability. Keep regular backups of:
* the database
* attachment storage when it is not stored in the database
* deployment configuration needed to recreate the instance
---
# Storage
URL: https://usememos.com/docs/configuration/storage
Memos supports three storage backends for attachments:
* database storage
* local filesystem storage
* S3-compatible object storage
Storage is usually configured at the instance level rather than purely through startup flags.
## Named storage configurations [#named-storage-configurations]
In 0.31, storage settings contain named configurations with stable IDs. Choose a default for new uploads. Existing attachments retain their storage ID, so switching the default does not move old files or change where Memos reads them.
Keep configurations that existing attachments still reference, including their credentials and backing objects. A new default is not a storage migration. Legacy settings migrate automatically on upgrade.
API and deployment-file clients should use `storages` and `defaultStorageId`. The older `storageType` and top-level `s3Config` fields remain compatibility fields. See the [deployment configuration example](/docs/configuration/deployment-configuration#storage).
## Database storage [#database-storage]
Database-backed attachments are the default.
Pros:
* simplest backup story
* no extra object store or directory layout to manage
* good default for smaller deployments
Tradeoffs:
* larger database size
* heavier database backups
* less attractive for media-heavy instances
## Local filesystem storage [#local-filesystem-storage]
Use local storage when:
* you want attachments outside the database
* you control the host or persistent volume
* you do not need cloud object storage
This is common for Docker or Kubernetes setups with a persistent volume.
## S3-compatible storage [#s3-compatible-storage]
Use S3-compatible storage when:
* you already operate object storage
* you want asset storage independent from the app host
* you expect many uploads or larger files
* you want storage behavior that is easier to scale operationally
For an S3-compatible endpoint that uses a self-signed certificate, enable
`insecureSkipTlsVerify` in the storage configuration. This disables TLS
certificate verification for that connection, so use it only for an endpoint
you control and trust. Prefer installing a trusted certificate whenever
possible.
### Authenticated delivery [#authenticated-delivery]
Memos proxies managed S3 files through its file routes and checks authorization there. Range requests support seeking and partial media reads. Managed S3 attachments no longer return presigned object URLs in `externalLink`; clients should use the Memos file route and preserve any share authorization supplied for a shared memo.
Back up all referenced storage configurations alongside the database and file objects. Changing the default storage only affects new uploads.
## Operational reminders [#operational-reminders]
* set an upload limit appropriate for your environment
* if you use local storage, back up the asset directory
* if you use S3 storage, verify credentials, bucket policy, and public/private access expectations
* remember that visibility rules still matter when files are attached to public memos
## File path templates [#file-path-templates]
For local filesystem storage, path templates are useful for organization. Timestamp-based naming is a common pattern because it avoids collisions and keeps uploaded files roughly ordered.
---
# Deploy
URL: https://usememos.com/docs/deploy
Run Memos on infrastructure you control, using the deployment method that fits your environment. These guides take you from starting the application to keeping data persistent and serving your instance over HTTPS.
Start a single container with a persistent data directory and a restart policy.
Keep service settings, volumes, and environment variables in a repeatable deployment file.
Install a native release and run it under your host's service manager.
Fit Memos into an existing cluster with persistent storage, service routing, and ingress.
Compile Memos yourself for forks, custom patches, and pinned deployments.
Serve HTTPS with the correct external URL, forwarded headers, and authentication behavior.
## Choose the question you need to answer [#choose-the-question-you-need-to-answer]
| If you want to know… | Start with… |
| --------------------------------------------------------- | --------------------------------------------- |
| How do I start one instance with Docker? | [Docker](/docs/deploy/docker) |
| How do I keep the deployment easy to recreate and update? | [Docker Compose](/docs/deploy/docker-compose) |
| How do I run Memos directly on my host? | [Binary](/docs/deploy/binary) |
| How do I deploy into a cluster I already operate? | [Kubernetes](/docs/deploy/kubernetes) |
| How do I run a fork or a build from a specific revision? | [Build From Source](/docs/deploy/development) |
| How do I serve my instance at an HTTPS URL? | [Reverse Proxy](/docs/deploy/reverse-proxy) |
Choose one installation path, then configure the external URL and proxy for that deployment. Confirm that your database and attachments survive a restart before relying on the instance for daily use.
Continue to [Configuration](/docs/configuration) for database, storage, and sign-in choices, and [Operations](/docs/operations) for backups and upgrades. To work on the Memos codebase, start with [Development](/docs/development).
---
# Binary
URL: https://usememos.com/docs/deploy/binary
Running Memos as a binary is useful when you do not want Docker in the stack or when you already manage services directly on the host.
## Supported platforms [#supported-platforms]
Pre-built binaries are available for:
* Linux: `amd64`, `arm64`, `armv7`
* macOS: Intel and Apple Silicon
* Windows: `amd64`
Release artifacts are published from the upstream GitHub releases page.
## Typical flow [#typical-flow]
1. download the archive for your platform
2. extract the binary
3. choose a persistent data directory
4. set `MEMOS_*` variables or flags
5. run the binary under a service manager
## Basic run command [#basic-run-command]
```bash
./memos --port 5230 --data /var/lib/memos
```
Defaults worth knowing:
* port `8081`
* SQLite database
* local data directory for DB and assets
## External databases [#external-databases]
Examples:
```bash
./memos \
--driver mysql \
--dsn "user:password@tcp(localhost:3306)/memos"
```
```bash
./memos \
--driver postgres \
--dsn "postgres://user:password@localhost:5432/memos?sslmode=disable"
```
## Service management [#service-management]
Binary installs work best when paired with:
* `systemd` on Linux
* `launchd` on macOS
* a Windows service wrapper or supervisor
## Why choose the binary path [#why-choose-the-binary-path]
* no container runtime dependency
* easy to integrate with existing host-level process supervision
* straightforward debugging and local inspection
## What you must manage yourself [#what-you-must-manage-yourself]
* upgrades and rollbacks
* process supervision
* data directory ownership and permissions
* reverse proxy and HTTPS in production
---
# Build From Source
URL: https://usememos.com/docs/deploy/development
Build from source when you deploy a fork, a custom patch, or a build pinned to an exact revision. If you want to work on the Memos codebase itself, start with the [Development](/docs/development) section instead — this page only covers turning a source build into a deployment.
## Produce a release build [#produce-a-release-build]
Follow [Setup](/docs/development/setup) for the toolchain, then [Building](/docs/development/building) for the build commands. A release build embeds the frontend assets into a single binary, so the result deploys exactly like a downloaded release.
For deployments, always build from a tagged or pinned revision rather than `main`:
```bash
git clone https://github.com/usememos/memos.git
cd memos
git checkout v0.31.0 # pin the version you intend to run
```
## Run the result as a deployment [#run-the-result-as-a-deployment]
The self-built binary behaves like the official release binary. Memos listens on `http://localhost:8081` by default.
Follow the [Binary](/docs/deploy/binary) guide for the production concerns:
* process supervision (systemd or similar)
* data directory ownership and permissions
* reverse proxy and HTTPS
## Before production use [#before-production-use]
* set explicit environment variables for instance URL and database
* run a smoke test against the new binary before switching traffic
* keep a backup before deploying a new build — see [Backup & Restore](/docs/operations/backup-restore)
---
# Docker
URL: https://usememos.com/docs/deploy/docker
Docker is the simplest production-style deployment for a single Memos instance.
## Quick start [#quick-start]
```bash
docker run -d \
--name memos \
--restart unless-stopped \
-p 5230:5230 \
-v ~/.memos:/var/opt/memos \
neosmemo/memos:stable
```
* The container listens on port `5230`.
* Memos stores persistent data in `/var/opt/memos` inside the container.
* The host path `~/.memos` will contain the SQLite database and local assets.
## Image tags [#image-tags]
Common tag choices:
* `stable`: safest default for production
* versioned tags such as `0.31.0`: fully pinned deployment
* branch-like tags such as `0.30`: latest patch in that line
* `latest`: development-oriented and less suitable for production
## Platform support [#platform-support]
The image ships multi-arch manifests and automatically selects the right variant:
* `linux/amd64` — x86\_64 processors
* `linux/arm64` — ARM 64-bit (Apple Silicon, Raspberry Pi 4+)
* `linux/arm/v7` — ARM 32-bit (Raspberry Pi 2/3)
## Container user [#container-user]
Memos runs as a non-root user inside the container:
* UID `10001`, GID `10001`, username `nonroot`
* The entrypoint script automatically fixes ownership of mounted volumes
If your host volume requires a different UID or GID, override them:
```bash
docker run -d \
--name memos \
-p 5230:5230 \
-v ~/.memos:/var/opt/memos \
-e MEMOS_UID=1000 \
-e MEMOS_GID=1000 \
neosmemo/memos:stable
```
## Environment variables [#environment-variables]
All `MEMOS_*` variables correspond directly to command-line flags. Common ones:
| Variable | Default | Purpose |
| ----------------------------------------- | ---------------- | ------------------------------------------------------------------------------- |
| `MEMOS_PORT` | `8081` | HTTP listen port (image default: `5230`) |
| `MEMOS_ADDR` | \`\` | Bind address (empty = all interfaces) |
| `MEMOS_DATA` | `/var/opt/memos` | Data directory |
| `MEMOS_DRIVER` | `sqlite` | Database backend |
| `MEMOS_DSN` | auto | Database connection string |
| `MEMOS_INSTANCE_URL` | \`\` | Canonical external URL; independent of access policy |
| `MEMOS_DEMO` | `false` | Demo mode |
| `MEMOS_WEBHOOK_PRIVATE_NETWORK_ALLOWLIST` | empty | Exact hostnames, IP addresses, or CIDRs allowed as private webhook destinations |
| `MEMOS_ALLOW_PRIVATE_WEBHOOKS` | `false` | Deprecated blanket exception for private webhook destinations |
| `MEMOS_LOG_LEVEL` | `info` | Log verbosity (`debug`, `info`, `warn`, `error`) |
Typical example:
```bash
docker run -d \
--name memos \
--restart unless-stopped \
-p 5230:5230 \
-v ~/.memos:/var/opt/memos \
-e MEMOS_PORT=5230 \
-e MEMOS_DRIVER=sqlite \
-e MEMOS_INSTANCE_URL=https://memos.example.com \
neosmemo/memos:stable
```
On a fresh instance, the quick-start command initializes private access because it omits `MEMOS_INSTANCE_URL`. A configured URL initializes public access only when the access setting does not yet exist. In 0.31, select the desired `ACCESS` policy in instance settings or [deployment configuration](/docs/configuration/deployment-configuration#access-policy); changing the URL of an existing instance does not change that policy.
## External databases [#external-databases]
SQLite is the default and works well for a single-node deployment. If you need MySQL or PostgreSQL, provide:
* `MEMOS_DRIVER=mysql` or `MEMOS_DRIVER=postgres`
* `MEMOS_DSN` with the appropriate connection string
MySQL example:
```bash
docker run -d \
--name memos \
-p 5230:5230 \
-v ~/.memos:/var/opt/memos \
-e MEMOS_DRIVER=mysql \
-e MEMOS_DSN="user:password@tcp(mysql-host:3306)/memos" \
neosmemo/memos:stable
```
PostgreSQL example:
```bash
docker run -d \
--name memos \
-p 5230:5230 \
-v ~/.memos:/var/opt/memos \
-e MEMOS_DRIVER=postgres \
-e MEMOS_DSN="postgres://user:password@postgres-host:5432/memos?sslmode=disable" \
neosmemo/memos:stable
```
When using an external database, the mounted volume is still relevant for local assets and instance data.
## Secrets with `_FILE` suffix [#secrets-with-_file-suffix]
The entrypoint script supports `*_FILE` variable suffixes so you can pass credentials via Docker secrets instead of plain environment variables:
```bash
echo "postgres://user:password@host:5432/memos" | docker secret create memos_dsn -
docker run -d \
--name memos \
-p 5230:5230 \
-v ~/.memos:/var/opt/memos \
-e MEMOS_DRIVER=postgres \
-e MEMOS_DSN_FILE=/run/secrets/memos_dsn \
--secret memos_dsn \
neosmemo/memos:stable
```
This works for any `MEMOS_*` variable.
## Container management [#container-management]
```bash
docker logs -f memos
docker stop memos
docker start memos
docker restart memos
```
## Upgrades [#upgrades]
```bash
docker pull neosmemo/memos:stable
docker stop memos
docker rm memos
docker run -d \
--name memos \
--restart unless-stopped \
-p 5230:5230 \
-v ~/.memos:/var/opt/memos \
neosmemo/memos:stable
```
Because data is stored in the mounted volume, replacing the container is usually safe as long as you keep the same data directory and have backups.
---
# Docker Compose
URL: https://usememos.com/docs/deploy/docker-compose
Docker Compose is a good default when you want a checked-in deployment file, predictable restarts, and easier upgrades than a one-off `docker run` command.
## Basic setup [#basic-setup]
```yaml
services:
memos:
image: neosmemo/memos:stable
container_name: memos
restart: unless-stopped
ports:
- "5230:5230"
volumes:
- ./data:/var/opt/memos
environment:
MEMOS_PORT: 5230
MEMOS_DRIVER: sqlite
MEMOS_INSTANCE_URL: https://memos.example.com
```
Run it with:
```bash
docker compose up -d
```
## Why Compose is often better than raw Docker [#why-compose-is-often-better-than-raw-docker]
* declarative configuration you can review in git
* easier upgrades and restarts
* cleaner environment variable management
* straightforward volume and network definitions
## Common operational commands [#common-operational-commands]
```bash
docker compose logs -f
docker compose down
docker compose pull
docker compose up -d
```
## Production notes [#production-notes]
* keep your data directory on persistent storage
* place Memos behind a reverse proxy for HTTPS
* set `MEMOS_INSTANCE_URL` to the canonical external URL and configure private or public access separately through the [ACCESS setting](/docs/configuration/deployment-configuration#access-policy)
* back up both the database and any local assets if you do not use database-backed attachment storage
## When to add more services [#when-to-add-more-services]
Compose becomes more useful when you also want:
* a reverse proxy container
* a dedicated MySQL or PostgreSQL container for local evaluation
* explicit secret and environment file handling
---
# Kubernetes
URL: https://usememos.com/docs/deploy/kubernetes
Use Kubernetes only if you already operate a cluster and want Memos to fit into your existing deployment model. For a single instance, Docker Compose is usually simpler.
## Core resources [#core-resources]
A typical deployment includes:
* a `Deployment` for the Memos container
* a `Service` for cluster networking
* an `Ingress` or gateway for public access
* a `PersistentVolumeClaim` for data
* a `Secret` for sensitive values such as DSNs
## SQLite vs external databases [#sqlite-vs-external-databases]
SQLite works for a single replica and is the easiest option, but it ties you to one writable pod and one persistent volume. If you need stronger operational flexibility, use MySQL or PostgreSQL and keep only local assets in persistent storage.
## Recommended shape [#recommended-shape]
* one Memos replica when using SQLite
* a persistent volume mounted at `/var/opt/memos`
* `MEMOS_INSTANCE_URL` set to the canonical external URL, with private or public access selected separately through the [ACCESS setting](/docs/configuration/deployment-configuration#access-policy)
* TLS termination at the ingress layer
* standard forwarded headers preserved
## Avoid the `MEMOS_PORT` collision [#avoid-the-memos_port-collision]
If your `Service` is named `memos`, Kubernetes injects link-style environment variables into pods in the same namespace — including `MEMOS_PORT=tcp://10.x.x.x:5230`. Memos reads `MEMOS_PORT` as its listen port, fails to parse the injected value, and falls back to port `0`, so the server starts on a random port and logs `Server running on port 0`.
Prevent this in the pod spec — either disable service links, set the port explicitly, or both:
```yaml
spec:
enableServiceLinks: false
containers:
- name: memos
image: neosmemo/memos:stable
env:
- name: MEMOS_PORT
value: "5230"
```
An explicit container `env` entry always overrides the injected variable. Renaming the `Service` to something that does not expand to a `MEMOS_*` prefix also works.
## Practical guidance [#practical-guidance]
* prefer external MySQL or PostgreSQL before attempting multi-replica patterns
* back up both the database and local asset storage if assets are not stored in the database
* start with conservative resource requests and tune based on real usage
* keep public access behind HTTPS
## When Kubernetes is worth it [#when-kubernetes-is-worth-it]
* Memos must fit into an existing platform standard
* you already rely on ingress, secrets, and persistent volume workflows
* you want deployment automation aligned with the rest of your cluster workloads
---
# Reverse Proxy
URL: https://usememos.com/docs/deploy/reverse-proxy
For production, run Memos behind a reverse proxy such as Nginx, Caddy, or Traefik and serve HTTPS.
## Recommended settings [#recommended-settings]
* set `MEMOS_INSTANCE_URL` to the public URL of your instance
* forward standard proxy headers such as `Host`, `X-Forwarded-Proto`, and `X-Forwarded-For`
* restrict access to the admin interface as needed
* make sure the externally visible URL matches what Memos uses for links and cookies
In Memos 0.31, `MEMOS_INSTANCE_URL` and access policy are independent. A private instance can have a canonical URL behind a publicly reachable proxy. Select private or public access through the `ACCESS` instance setting; changing the URL does not change an existing access policy. The URL must be absolute HTTP(S), without credentials, a query, or a fragment.
## Why this matters [#why-this-matters]
A reverse proxy gives you:
* TLS termination
* stable public routing
* easier integration with existing infrastructure
* a place to apply access control, logging, and rate limiting
## Typical concerns to verify [#typical-concerns-to-verify]
* redirects point to the correct external URL
* public links generated by Memos use the correct hostname
* cookies and auth flows behave correctly over HTTPS
* uploaded assets are still accessible through the public route layout
---
# Development
URL: https://usememos.com/docs/development
Work on Memos from a local checkout through to a reviewable contribution. These pages cover the backend and frontend toolchains, building the application, choosing useful checks, and explaining changes to maintainers.
Prepare the Go and frontend toolchains, install dependencies, and get a local checkout ready.
Build the frontend assets and backend binary, then verify that they work together.
Choose backend tests, frontend checks, and smoke tests that match the behavior you changed.
Scope a code or documentation change and prepare the context reviewers need.
## Choose the question you need to answer [#choose-the-question-you-need-to-answer]
| If you want to know… | Start with… |
| -------------------------------------------------------------- | ---------------------------------------------- |
| What do I need to work on Memos locally? | [Setup](/docs/development/setup) |
| How do I turn the source into a runnable application? | [Building](/docs/development/building) |
| Which checks should I run for my change? | [Testing](/docs/development/testing) |
| What should I include in a code or documentation contribution? | [Contributing](/docs/development/contributing) |
For a first code change, get an unchanged checkout building before editing. Use a focused test loop while developing, then verify the built application and describe the resulting behavior in your pull request. Update the relevant docs when that behavior changes.
For an overview of the application layers, read [Architecture](/docs/operations/architecture). To deploy the build you produce, continue to [Build From Source](/docs/deploy/development).
---
# Building
URL: https://usememos.com/docs/development/building
Memos combines a frontend build with a backend binary. Local build work should confirm both pieces still fit together.
## Typical build sequence [#typical-build-sequence]
```bash
cd web
pnpm install
pnpm release
cd ..
go build -o build/memos ./cmd/memos
```
## What to verify [#what-to-verify]
* the frontend build completes cleanly
* the backend binary starts
* local configuration still works with your chosen database
* any generated assets or code are up to date
## Common variants [#common-variants]
* use `go build -o memos ./cmd/memos` for quick local builds
* use versioned linker flags for release-oriented builds
* cross-compile only when you actually need alternate target binaries
---
# Contributing
URL: https://usememos.com/docs/development/contributing
Good contributions reduce review friction and make intent obvious.
## Contribution basics [#contribution-basics]
* keep changes scoped
* explain why the change is needed
* include tests when behavior changes
* update docs when user-facing behavior changes
## Before opening a PR [#before-opening-a-pr]
* check whether the issue or request already exists
* sync with upstream expectations for branch and review workflow
* make sure the change can be reviewed commit by commit
## For docs work [#for-docs-work]
* prefer clear structure over maximum volume
* keep examples realistic
* link related pages so readers can move through the docs naturally
* avoid copying upstream reference content verbatim when a curated explanation is better
---
# Setup
URL: https://usememos.com/docs/development/setup
You need both the backend and frontend toolchains available locally.
## Core tools [#core-tools]
* Go 1.27+
* Node.js 24+
* pnpm 11+
* Git
* additional repo tooling such as `buf` when you work on generated API code
## Setup flow [#setup-flow]
1. clone the repository
2. install backend and frontend dependencies
3. confirm Go builds successfully
4. choose SQLite first unless you specifically need MySQL or PostgreSQL testing
## Typical commands [#typical-commands]
```bash
git clone https://github.com/usememos/memos.git
cd memos
go mod download
cd web
pnpm install
```
If you are working on protocol or generated API changes, also install the tooling required by the upstream repo for code generation and linting.
---
# Testing
URL: https://usememos.com/docs/development/testing
Testing should stay close to the kind of change you made.
## Common checks [#common-checks]
* backend tests for server or store changes
* frontend build and targeted UI checks for web changes
* formatting and linting where required by the repo
* a local smoke test with the built app when behavior changed
## Typical commands [#typical-commands]
```bash
go test ./...
go test ./store/...
go test -cover ./...
go test -race ./...
```
If frontend changes are involved, also run the relevant web checks used by the repo.
## Practical habit [#practical-habit]
Run the smallest useful test loop while developing, then run a broader validation pass before asking for review.
---
# FAQ
URL: https://usememos.com/docs/faq
## What is Memos? [#what-is-memos]
Memos is an open-source, self-hosted note-taking app that brings your everyday thoughts together in a personal timeline. Your data stays yours, and you choose what to keep private or share.
## Is Memos open source? [#is-memos-open-source]
Yes. Memos is released under the MIT License.
## Where is my data stored? [#where-is-my-data-stored]
Data is stored in your own database. Attachments can live in the database, on the local filesystem, or in S3-compatible storage.
## Does Memos have an API? [#does-memos-have-an-api]
Yes. Memos provides REST and gRPC APIs. See the [API reference](/docs/api).
## Is there a demo? [#is-there-a-demo]
Yes. You can try the live demo at [https://demo.usememos.com](https://demo.usememos.com).
## What is the easiest way to run it? [#what-is-the-easiest-way-to-run-it]
For most users, Docker with a mounted data directory is the simplest starting point. See [Getting Started](/docs/getting-started).
## Should I use SQLite or MySQL/PostgreSQL? [#should-i-use-sqlite-or-mysqlpostgresql]
SQLite is a strong default for a single-instance deployment. Use MySQL or PostgreSQL when you want an external managed database or more operational flexibility.
## Can I disable public memos? [#can-i-disable-public-memos]
Yes. Select private access in instance settings to require sign-in for ordinary memo pages and disable anonymous public discovery. In 0.31, access policy is independent of `MEMOS_INSTANCE_URL`. You can also disable `PUBLIC` memo visibility in instance settings. Explicit share links still grant access to their selected memo until revoked or expired. See [Sharing](/docs/usage/sharing).
---
# Getting Started
URL: https://usememos.com/docs/getting-started
The shortest path to a running instance is one Docker command with SQLite and a local data volume. Harden deployment and storage once the instance is up.
## Prerequisite [#prerequisite]
* Docker installed on the machine running Memos
## 1. Start a local instance [#1-start-a-local-instance]
```bash
docker run -d \
--name memos \
-p 5230:5230 \
-v ~/.memos:/var/opt/memos \
neosmemo/memos:stable
```
What this gives you:
* `5230` exposed on the host
* a persistent data directory at `~/.memos`
* SQLite by default
* one container that is easy to inspect and replace
On a fresh instance, this command initializes private access: ordinary memo pages require sign-in and anonymous Explore is unavailable. In 0.31, the saved `ACCESS` instance setting controls this policy independently of the canonical URL. The `stable` image follows stable releases; to pin this release explicitly, use `neosmemo/memos:0.31.0`.
If you want a checked-in deployment file, use [Docker Compose](/docs/deploy/docker-compose). If you need a custom or pinned build, use [Build From Source](/docs/deploy/development). Contributors should start with [Development](/docs/development).
## 2. Verify the instance [#2-verify-the-instance]
Open the UI after the container starts:
* Docker default: `http://localhost:5230`
* Binary default: `http://localhost:8081`
If you want to verify the service from the terminal first:
```bash
docker logs memos
```
## 3. Create the first admin account [#3-create-the-first-admin-account]
The first user becomes the host admin and can configure registration, authentication, storage, and other global settings.
Recommended first actions:
* use a strong password
* choose private or public access in instance settings; configure the canonical instance URL separately
* decide whether user registration should remain disabled or be opened later
* decide whether public memos should be allowed at all
## 4. Create your first memo [#4-create-your-first-memo]
Open the global composer from the sidebar. You can create a memo from any authenticated route. Check the selected Space and visibility, then try a memo that exercises the main features:
````markdown
# Welcome to Memos
This is my first memo.
## Tasks
- [x] Install Memos
- [ ] Write a real note
## Tags
Trying #memos and #getting-started
## Code
```ts
console.log("hello from memos");
```
````
Useful things to try immediately:
* choose `PRIVATE`, `PROTECTED`, `PUBLIC`, or `SPACE` visibility; `SPACE` requires an assigned Space
* add a checklist with `- [ ]`
* upload a screenshot or document
* create tags inline with `#tagname`
* pin an important memo so it stays visible
## 5. Understand visibility [#5-understand-visibility]
Each memo uses one of four visibility levels. New memos default to `PRIVATE`; you can change the default in your settings or pick a level in the editor.
* `PRIVATE`: only you can read it
* `PROTECTED`: authenticated users on the instance can read it
* `PUBLIC`: anonymous visitors can read it when public instance access is enabled
* `SPACE`: active members of the memo's assigned Space can read it
In private mode, ordinary `PUBLIC` memo pages still require sign-in. Explicit share links remain accessible without sign-in until revoked or expired. `SPACE` memos cannot have share links. Placement and visibility are independent; see [Spaces](/docs/usage/spaces).
## 6. Explore the core workflows [#6-explore-the-core-workflows]
After the first memo, the next high-value workflows are:
* [Writing Markdown](/docs/usage/writing-markdown)
* [Tags](/docs/usage/tags)
* [Spaces](/docs/usage/spaces)
* [Views](/docs/usage/views)
* [Sharing](/docs/usage/sharing)
* [Attachments](/docs/usage/attachments)
## Common first-run issues [#common-first-run-issues]
* If `http://localhost:5230` does not load, check `docker logs memos`.
* If the data directory is not writable, verify permissions on `~/.memos`.
* For anonymous public profiles and Explore, enable public access in instance settings. For a reverse proxy, set `MEMOS_INSTANCE_URL` to the canonical HTTP(S) URL independently of that policy.
* For version-specific changes, read [Upgrading to 0.31](/docs/operations/upgrade#upgrading-to-031).
---
# Guides
URL: https://usememos.com/docs/guides
Memos can support different ways of thinking without forcing every record into the same system. These guides combine the timeline, Markdown, tags, filters, pins, Relations, and Archive into complete practices you can adapt to your own needs.
Use rapid logging for tasks, events, and notes, then migrate what still matters through daily and monthly reflection.
Build a trusted system for next actions, projects, waiting items, and regular reviews.
Develop ideas from evidence into atomic claims and synthesis memos connected with Relations.
## Choose the question you need to answer [#choose-the-question-you-need-to-answer]
| If you want to know… | Start with… |
| -------------------------------------------------------------- | ------------------------------------------------------- |
| What happened, and what still deserves attention? | [Bullet Journal](/docs/guides/bullet-journal) |
| What is the next action, and where does each commitment stand? | [Getting Things Done](/docs/guides/getting-things-done) |
| How does this evidence change what I understand? | [Zettelkasten](/docs/guides/zettelkasten) |
Start with one primary practice instead of applying all three sets of tags to every memo. You can connect their outputs when useful: a journal observation may become a Zettelkasten idea, and a developed idea may create a concrete GTD action.
For individual product capabilities, return to [Usage](/docs/usage).
---
# Bullet Journal
URL: https://usememos.com/docs/guides/bullet-journal
Most days do not need a page prepared in advance. They need a quick place to record what happened, what it changed, and what deserves attention next. The [Bullet Journal method](https://bulletjournal.com/pages/how-to-bullet-journal)—often shortened to BuJo—builds that rhythm through rapid logging, reflection, and migration.
Memos gives the rhythm a simple home. The timeline becomes the Daily Log, a pinned memo becomes a focused Monthly Log, tags gather recurring subjects into Collections, and saved filters bring unfinished commitments back for a deliberate decision. The complete setup is one `#bujo` tag tree, one monthly compass, one future-decisions memo, and two filters.
## Adapt the Bullet Journal method to Memos [#adapt-the-bullet-journal-method-to-memos]
A digital Bullet Journal does not need to reproduce the geometry of a paper notebook. Translate each question in the practice into the Memos feature that answers it best:
| Question | Memos practice |
| --------------------------------- | ---------------------------------------------------- |
| What just happened? | Capture a short memo in the timeline |
| What matters this month? | Keep one monthly compass pinned |
| Where does this belong over time? | Add a Collection tag after a subject repeats |
| What still deserves attention? | Review incomplete tasks through a saved filter |
| When must I be interrupted? | Put the actual appointment or reminder in a calendar |
The important part is the return. Capturing should stay quick; reflection is where a record becomes a choice about what to finish, retain, schedule, or release.
## Let the timeline serve as your Daily Log [#let-the-timeline-serve-as-your-daily-log]
Write what happened, changed, or became clear as ordinary [Markdown](/docs/usage/writing-markdown). Add an unchecked `- [ ]` item only when the moment creates a real action, then check it with `- [x]` when finished. Supporting details stay beside the entry that gives them meaning. Memos can identify unfinished actions without making you maintain a separate symbol key.
Capture one moment while its context is still clear:
```markdown
Rain reached the inside of the east window this morning.
- [ ] Photograph the frame in daylight.
- [ ] Ask the building manager who handles exterior seals.
#bujo #collection/home-maintenance
```
The observation explains why the actions exist, and the memo's **Created at** timestamp places the whole record in the day's chronology. If the evidence matters, [attach the photograph](/docs/usage/attachments) to the same memo.
Related notes and tasks from one moment can stay together. Separate unrelated actions into their own memos, especially when they need different tags or will be reviewed independently. Fields such as `has_incomplete_tasks` describe the whole memo, not each checklist row, so a long daily page containing unrelated actions is harder to filter cleanly.
Use one tag from the `#bujo` tree on every memo in the practice. Ordinary log entries use `#bujo`; the monthly compass and later-decisions memo use `#bujo/monthly` and `#bujo/future`. A parent filter matches all three.
The timeline is already the running log. Use `#bujo` to isolate journal entries, and combine it with a date filter when you want to read one day; there is no need to add a date tag or prepare a master memo for every day. For a stable capture chronology, set **View options** to **Created at** and **Newest first**. Pinned memos remain the exception at the top when they match the current filter.
## Close the day with three questions [#close-the-day-with-three-questions]
A daily reflection can take two or three minutes:
1. **What actually finished?** Check the completed boxes.
2. **What changed because of today?** Create a new memo when the result happened later; update an existing memo only when clarifying the same moment.
3. **What deserves attention tomorrow?** Clarify the action and pin no more than three memos that genuinely need focus.
Unpin a memo when its action is completed, blocked, or no longer part of tomorrow's focus. Pins are a small focus set, not a permanent priority system.
Do not archive an ordinary log merely because one task inside it is complete; the record still belongs to the journal. Archive standalone operational memos when they remain worth keeping but no longer need to appear in active views.
## Use a pinned monthly compass as your Monthly Log [#use-a-pinned-monthly-compass-as-your-monthly-log]
In Memos, the Monthly Log becomes a compact compass that describes what a good month would look like:
```markdown
# September compass
## Direction
Make the flat ready for the wet season.
## This month is successful when
- [ ] The east-window leak is resolved.
- [ ] The power-outage kit has been tested.
## Protect
Keep two evenings each week free from household administration.
## Notice
Which maintenance problems keep returning instead of being solved?
#bujo/monthly
```
[Pin the current compass](/docs/usage/memos) and keep it small: one direction, one to three outcomes, one boundary to protect, and one pattern to notice. It is an orientation point, not a second copy of every task.
Keep the compass pinned until the monthly review; that review will decide what enters the next one.
## Keep a Future Log for later decisions [#keep-a-future-log-for-later-decisions]
Future intentions need somewhere to wait without pretending that every idea is a scheduled commitment. Keep one memo such as:
```markdown
# Later decisions
## Committed, but not active
- Renew the lease. The actual deadline is in the calendar.
## Worth reconsidering
- Replace the desk after the move.
## Waiting for a trigger
- Review storage options when the basement is cleared.
#bujo/future
```
Open `#bujo/future` during the monthly review. Move an item into its own task memo only when it becomes actionable.
Put appointments, hard deadlines, follow-up alerts, and the recurring review itself in a calendar or reminder app. Keep the Memos link with the calendar entry when it needs background. A date written in a memo remains context. Editing **Created at** changes where the memo appears when viewing or filtering by creation time; it does not set a due date or alert.
## Let Collections emerge from repetition [#let-collections-emerge-from-repetition]
Create a Collection when the same subject has appeared often enough that you want a reliable way back into it. In Memos, the right shape depends on how the subject grows:
* keep a bounded list, such as household emergency contacts, in one memo
* give an evolving subject, such as home maintenance or garden observations, a shared tag
Add a tag from the `#bujo` tree to a bounded Collection only when its checkboxes should appear in the Bullet Journal review. A reference-only list does not need to enter the unfinished-task view.
For an evolving Collection, add a focused tag such as `#collection/home-maintenance` to every relevant memo. Selecting the tag reconstructs the trail across observations, tasks, decisions, and attachments. When older entries have moved out of the active timeline, open [Archive and search for the same Collection tag](/docs/usage/search-archive) to recover them.
In a paper Bullet Journal, the Index points back to Collections by page number. In Memos, tags and search provide that route back without maintaining a manual page index.
Wait for repetition before creating a Collection. This keeps the [tag vocabulary](/docs/usage/tags) grounded in subjects you actually revisit instead of categories you may never use.
## Save two filters for reflection [#save-two-filters-for-reflection]
Create two reusable [Views](/docs/usage/views) to make the review repeatable. The first shows the recent journal:
```txt
tag in ["bujo"] && created_ts >= now - duration("168h")
```
The second shows Bullet Journal memos with unfinished tasks:
```txt
tag in ["bujo"] && has_incomplete_tasks
```
`tag in ["bujo"]` includes nested tags such as `#bujo/monthly` and `#bujo/future`. The task filter inspects Markdown checkboxes, so it does not depend on special symbols or task-state tags.
Keep these views broad. Capture time already lives in **Created at**, subjects live in Collection tags, and the monthly compass holds current direction.
## Make Migration a decision, not a copy [#make-migration-a-decision-not-a-copy]
[Migration](https://bulletjournal.com/pages/migration) creates a pause in which every unfinished commitment must justify following you forward. Memos can preserve that pause without manufacturing a duplicate entry each week or month.
During the monthly review, open the unfinished-task filter and decide what each memo deserves now:
* **Finished:** check the box and record the result when it adds useful context.
* **No longer relevant:** replace the checkbox with a plain line such as `Dropped — the building manager already owns this`, then archive the memo if it no longer belongs in active views.
* **Still vague:** rewrite the text of the unchecked checkbox as the next visible action.
* **Still important:** keep the task open and state which current compass outcome it supports. Pin it only when it belongs to the next day's three-item focus set.
* **Time-specific:** if the action was to schedule something, check it after creating the calendar entry. If the checkbox represented the future event itself, replace it with a plain line such as `Scheduled in calendar — inspection on October 8` so it leaves the unfinished-task view.
* **Becoming a recurring subject:** add a Collection tag so future observations join the same trail.
This is digital migration: the memo stays connected to its original context, while your latest decision becomes explicit. After the decisions are made, create the new monthly compass, unpin the old one, and archive anything that should leave active surfaces.
The review succeeds when stale tasks are gone and every remaining commitment has a clear reason to stay.
## Keep Bullet Journal, GTD, and Zettelkasten distinct [#keep-bullet-journal-gtd-and-zettelkasten-distinct]
All three practices can live in Memos, but they answer different questions:
| Practice | Use it to |
| ------------------------------------------------------- | ----------------------------------------------------------------------- |
| Bullet Journal | Record the day, notice patterns, and reconsider what deserves attention |
| [Getting Things Done](/docs/guides/getting-things-done) | Manage projects, next actions, waiting items, and delegated commitments |
| [Zettelkasten](/docs/guides/zettelkasten) | Develop sources and observations into connected, reusable knowledge |
Choose one primary practice for each memo. A journal observation can produce a separate Zettelkasten idea; a growing commitment can produce a separate GTD action. They may share a Collection or project tag without carrying every other system's state tags.
Keep personal journal entries `PRIVATE`, and do not create a share link unless sharing is intentional; a share link grants access to that one memo even when it is `PRIVATE`. If Memos becomes the long-term record of your days, [back up the database and attachments](/docs/operations/backup-restore) and test the restore process.
Try the practice for one week. Add a tag from the `#bujo` tree to every memo that belongs to it, keep one monthly compass pinned, and use the unfinished-task view during the daily close. Open the recent-journal view during the weekly or monthly review. Create a Collection only after a subject repeats. Keep the parts that help you notice, decide, and follow through.
---
# GTD
URL: https://usememos.com/docs/guides/getting-things-done
[Getting Things Done](https://gettingthingsdone.com/what-is-gtd/) is most reliable when capture is fast, next actions are visible, and every project has a clear place to resume. Memos gives that practice a simple foundation: quick memos for capture, Markdown checkboxes for actions, tags for project context, Views for reusable filters, and a searchable timeline that keeps the history.
This guide keeps the setup focused: one memo per commitment, one state tag for what happens next, and one project tag for related actions. Views keep next actions, waiting items, and active projects visible; checkboxes and Archive close the loop without discarding the record.
## Give every memo one clear GTD role [#give-every-memo-one-clear-gtd-role]
Start with four lifecycle states:
```markdown
#gtd/inbox
#gtd/next
#gtd/waiting
#gtd/someday
```
Use exactly one of those four states on a GTD memo. An item cannot need clarification and be ready to do at the same time. `#gtd/project` is not a state; use it only on an anchor memo that defines a project outcome.
There is no `#gtd/done` tag. A checked box already records completion, and Archive removes it from active surfaces. There is no `#gtd/reference` tag either. Reference is the rest of the searchable timeline: give useful material a topic or project tag, then archive it when it no longer needs to stay visible.
Keep system tags on the final line so the content remains easy to read. Memos recognizes [tags in ordinary Markdown text](/docs/usage/tags), but a consistent metadata line makes state changes obvious.
## Capture and clarify one commitment per memo [#capture-and-clarify-one-commitment-per-memo]
Capture should still feel like Memos: open the editor, write the thought, and move on. Add only `#gtd/inbox` so the item can return for a decision:
```markdown
Ask Mei whether the release screenshots are final.
#gtd/inbox
```
This tagged inbox is separate from the built-in [Memos Inbox](/docs/usage/inbox), which contains notifications about comments and mentions.
During a short daily sweep, decide what, if anything, must return. Delete what has no value. Give useful information a topic or project tag. Move an idea you may revisit to `#gtd/someday`. Turn a commitment you can advance into a concrete checkbox:
```markdown
- [ ] Ask Mei which release screenshots are approved.
#gtd/next #project/september-release
```
If someone else owns the next move, use `#gtd/waiting` instead. The state changes on the same open loop:
```txt
#gtd/inbox → #gtd/next → checked → archived
#gtd/inbox → #gtd/waiting → checked → archived
```
When the result you were waiting for arrives, close that Waiting memo and create a new Next memo for the action that follows. The expected result and your next action are different commitments, so they should not share one record.
The one-action rule comes from Memos itself. Tags, visibility, timestamps, and `has_incomplete_tasks` describe the whole memo, not individual checklist rows. A long memo containing calls, errands, and computer tasks cannot expose each row through a different context filter.
Keep a procedure or meeting record together when it reads as one document. When it creates several independent commitments, extract each commitment into its own action memo. The source can remain as project support.
## Connect each project through a shared tag [#connect-each-project-through-a-shared-tag]
A project does not need a folder or a master task document. Give it one anchor memo that defines the outcome:
```markdown
## Outcome
The September release post is live with reviewed screenshots and valid links.
## Done when
- The post is published.
- Metadata passes the site audit.
- The announcement links to the final URL.
#gtd/project #project/september-release
```
Every action, decision, waiting item, and useful reference for that outcome receives `#project/september-release`. Selecting the tag reconstructs the project's active trail instead of a checklist that must duplicate every detail. After records are archived, use [search and Archive](/docs/usage/search-archive) with the same tag to retrieve the closed history.
Every active project should show where progress resumes: at least one open `#gtd/next` memo or one open `#gtd/waiting` memo. When the next step is clear, create it before leaving the project; add several only for genuinely parallel actions.
A waiting memo should record the result you expect, not assign a task:
```markdown
- [ ] Mei confirms the approved screenshot set.
Requested September 1. Calendar reminder set for September 4.
#gtd/waiting #project/september-release
```
Writing `@mei` can send a real mention notification if that exact-case user exists and can read the memo. Use mentions for intentional collaboration, not as GTD contexts such as `@home` or `@phone`.
## Use Views for decisions and pins for focus [#use-views-for-decisions-and-pins-for-focus]
The home timeline tells you what was recorded recently. It should not also decide what deserves attention now. Save a few filters as [Views](/docs/usage/views), and let each one answer an operating question:
| Question | Filter |
| ---------------------------- | ----------------------------------------------- |
| What still needs a decision? | `"gtd/inbox" in tags` |
| What can I advance? | `"gtd/next" in tags && has_incomplete_tasks` |
| What am I waiting for? | `"gtd/waiting" in tags && has_incomplete_tasks` |
| Which outcomes are active? | `"gtd/project" in tags` |
The filter syntax is capable of much more, but these four questions are enough to run the system. `#gtd/someday` does not need a permanent place in the sidebar; selecting the tag during a monthly review is usually sufficient.
At the start of the day, choose no more than three memos from **What can I advance?** and pin them. A pin is a temporary focus limit, not a permanent priority label. Unpin an action when it is completed, blocked, or no longer part of today's focus.
Add a context only after the available-actions view becomes genuinely difficult to scan. For example:
```txt
"gtd/next" in tags && "context/computer" in tags && has_incomplete_tasks
```
If you can still choose the right action without that filter, the extra tag has not earned its maintenance cost.
## Run a daily reset and weekly review [#run-a-daily-reset-and-weekly-review]
A View can find a state, but it cannot prove that one memo in a project has a matching next action in another. Review exists to inspect those gaps.
A daily reset should take only a few minutes:
* bring **What still needs a decision?** to zero
* check, unpin, and archive completed action memos
* choose up to three pins from the available actions
Once a week, inspect the structure:
* open every active project anchor, select its `#project/...` tag, and confirm a current Next or Waiting memo exists
* review waiting items for responses that arrived or follow-ups that need scheduling
* archive finished projects and their closed action trail
Run this audit filter to catch unchecked tasks that have no GTD state:
```txt
has_incomplete_tasks && !tags.exists(t, t.startsWith("gtd/"))
```
Classify or archive anything it finds. Once a month, scan `#gtd/someday` and activate, retain, or discard each idea.
The goal is not to touch every memo. The review is complete when the decision queue is empty, the action queue is believable, and every active project shows where progress resumes.
## Pair Memos with a calendar for deadlines and reminders [#pair-memos-with-a-calendar-for-deadlines-and-reminders]
Memos owns the commitment, its context, and its history. It does not provide documented task due dates, recurring tasks, or task alarms. A date written in a memo is context. Editing a memo's creation time only moves it in the timeline and Calendar; it does not set a due date or alert.
Put appointments, hard deadlines, follow-up alerts, and the recurring review itself in a calendar or reminder app. Add the Memos URL to the event when it needs project context. The calendar decides when to interrupt you; Memos explains what the interruption is about.
Trust has an operational side too. Keep personal commitments `PRIVATE` unless sharing is intentional. If this becomes the only record of important commitments, [back up the database and attachments](/docs/operations/backup-restore) and test a restore.
GTD is strongest when it manages commitments rather than becoming a store for every idea. To develop research and observations alongside the action system, use a separate [Zettelkasten practice](/docs/guides/zettelkasten) and create a GTD memo only when knowledge produces a concrete next action.
For a chronological practice built around daily capture and reflection, use the [digital Bullet Journal guide](/docs/guides/bullet-journal).
Run the practice unchanged for one week. If the available-actions view is still easy to use, stop designing the system. Add a tag or view only when it answers a question you repeatedly struggle to answer.
The practice is healthy when the inbox reaches zero, the next-action list remains credible, and every active project shows where progress resumes. Everything else can become history.
---
# Zettelkasten
URL: https://usememos.com/docs/guides/zettelkasten
Good ideas rarely arrive as finished documents. The [Zettelkasten method](https://zettelkasten.de/overview/) develops them through focused notes that can be connected, tested, and reused. Memos gives the practice a simple home: the timeline keeps each observation close to its context, topic tags bring related material back into view, and Relations let you trace an answer to the claims and evidence behind it.
This guide uses one active question, three memo roles, and two saved filters. By the end, you will have a repeatable way to turn daily captures into a decision, draft, lesson, or plan.
## Start with a question worth returning to [#start-with-a-question-worth-returning-to]
Choose a real question connected to something you want to understand, decide, explain, or build. Create a synthesis memo for it:
```markdown
# What makes a backup genuinely recoverable?
## Current answer
A backup is recoverable when the database, attachments, and deployment configuration can be restored together and verified in a running instance.
## Still unclear
- Which failures can a database-only restore miss?
- How often should a restore drill run?
## Next thing to examine
Compare the documented restore steps with our current runbook.
#zk/synthesis #topic/backup-recovery
```
[Pin this memo](/docs/usage/memos) while the question is active. It is the main entry point to everything you learn about the subject. Pin only questions you are actively developing; the rest remain available through tags and search.
Beginning with a question makes the system useful on day one, even with only a handful of notes.
## Use three roles for knowledge memos [#use-three-roles-for-knowledge-memos]
Use a small vocabulary for the role each memo plays:
Here, `zk` is a short namespace that keeps the three role tags together; it is not a folder or a separate area of Memos.
| Role | What it contains | Tag |
| --------- | ---------------------------------------------------------------------------------- | --------------- |
| Evidence | A source, observation, result, or event with its original context | `#zk/evidence` |
| Idea | One claim that can be stated, supported, or challenged independently of its source | `#zk/idea` |
| Synthesis | The best current answer to a question, including tensions and gaps | `#zk/synthesis` |
These are roles, not folders. Add one broad [topic tag](/docs/usage/tags) such as `#topic/backup-recovery` to bring related memos into the same neighborhood. Keep the vocabulary deliberately small; a new tag should make a recurring body of knowledge easier to enter, not describe every detail in the memo.
In common Zettelkasten vocabulary, quick captures roughly correspond to fleeting notes, Evidence memos to source or literature notes, and Idea memos to permanent notes. A Synthesis memo acts as a structure note for one active question. The role matters more than the label.
Quick thoughts do not all need to become durable Zettelkasten notes. The Memos timeline already makes capture fast. Add a Zettelkasten role only when a record contributes evidence, develops an idea, or changes a synthesis.
## Preserve the source and record what it changed [#preserve-the-source-and-record-what-it-changed]
An evidence memo should let you recover both the observation and your interpretation. A bookmark alone preserves a location, but not why it mattered when you found it.
```markdown
## Observation
The restore process treats the database, attachments, and deployment configuration as one recovery set.
## Source
[Backup & Restore](https://usememos.com/docs/operations/backup-restore)
## Why it may matter
A database can import successfully while files or runtime settings remain unavailable.
#zk/evidence #topic/backup-recovery
```
Keep quotations short and use a Markdown link to the original source. For a conversation, experiment, or meeting, record enough context to understand who observed what and under which conditions. Attach a screenshot or document when the evidence depends on it; [attachments remain connected to their memo](/docs/usage/attachments).
**Why it may matter** is where a source becomes part of your thinking. It records which question the evidence could change, so you know why the memo deserves another look.
Keep the evidence memo intact. When it changes your view, create a separate `#zk/idea` memo and relate the new claim back to its evidence. Do not turn the evidence memo into the idea by replacing its role tag; the separation preserves provenance.
## Turn evidence into an atomic idea [#turn-evidence-into-an-atomic-idea]
An atomic note is not simply a short note. It makes one claim and contains enough reasoning to remain understandable when you encounter it from another topic or synthesis.
```markdown
# A backup is a recoverable system, not a database file
A restore is complete only when the database, referenced files, and required configuration function together in a running instance.
## Because
Each part can restore successfully on its own while links between them remain broken.
## What would change this view
Evidence that every dependency is embedded in one verified artifact.
#zk/idea #topic/backup-recovery
```
State the conclusion you currently hold, then explain why it follows from the evidence. If one source changes your thinking in three independent ways, create three idea memos. If an idea needs several paragraphs to explain one claim well, keep the paragraphs together. Atomicity is about conceptual focus, not a word limit.
Including **What would change this view** is optional, but it keeps important claims open to correction. The Zettelkasten becomes more valuable when notes can challenge one another instead of only accumulating support for what you already believe.
## Connect memos with an explicit reason [#connect-memos-with-an-explicit-reason]
Use [**Link memo** from the editor's add menu](/docs/usage/memos#linking-memos-with-relations) to search active memos you own and select one. After you save, the current memo's detail view shows the outgoing note under **Referencing**; the other memo shows the incoming connection under **Referenced by**.
A useful reading trail often looks like this:
```txt
synthesis → idea → evidence
```
Keep the direction consistent:
1. While creating or editing an Idea memo, open the add menu, choose **Link memo**, and select its Evidence memo.
2. While editing the Synthesis memo, link it to the Idea memo.
The resulting trail reads from the current answer into its reasoning: synthesis → idea → evidence.
Relations in Memos represent a general reference rather than a semantic label such as “supports” or “challenges.” State the reason for an important connection inside the memo:
```markdown
## Connection
Supports “A restore drill must cover every dependency”: attachments can fail independently of the database.
```
Useful connection verbs include **supports**, **challenges**, **narrows**, **explains**, and **gives an example of**. A handful of explained relations is more useful than many unexplained links.
Relations and [Markdown links](/docs/usage/writing-markdown) serve different purposes. A Markdown link puts a URL in the content; a Relation builds a navigable connection between two memos. Pasting a memo URL does not automatically create a Relation or an incoming reference. Use both when a link must remain visible in copied or shared content.
## Use tags for neighborhoods and Relations for arguments [#use-tags-for-neighborhoods-and-relations-for-arguments]
A topic tag helps you discover candidates that may belong together. A Relation records the specific connection you chose after reading them. Selecting `#topic/backup-recovery` may reveal ten nearby memos; the relation from one claim to one piece of evidence explains part of the argument.
[Search](/docs/usage/search-archive) by topic before finishing a new idea. Ask:
* Does an existing memo already make this claim?
* What supports or challenges it?
* Which synthesis would change if this is true?
If you are developing several questions, save a filter for active synthesis memos:
```txt
pinned && "zk/synthesis" in tags
```
A second [View](/docs/usage/views) can surface recent Zettelkasten memos for a connection pass:
```txt
tag in ["zk"] && created_ts >= now - duration("168h")
```
Do not use `has_link` to find memo Relations. That property detects Markdown links in the memo body, not structured relations.
## Revise the synthesis while the question is active [#revise-the-synthesis-while-the-question-is-active]
Return to the pinned synthesis whenever a new idea materially changes the answer. Update four things:
* the best answer you can give now
* the evidence or ideas that support it
* meaningful contradictions or uncertainty
* the next source, test, or question worth pursuing
Link the synthesis to the idea memos that carry the detailed reasoning. This keeps the synthesis readable while preserving a path into the evidence.
When a central claim changes completely, leave the earlier memo intact. Create a new Idea memo, state what changed and why, and relate it to the old one. The two memos preserve the earlier position and the reason it changed without relying on edit history.
A Synthesis memo is the current entry point for one live question. It fills the role often called a structure note without requiring a master index for every memo you have written. Create one when a topic needs an answer or output, not merely because it has accumulated many notes.
## Follow one reasoning trail into an output [#follow-one-reasoning-trail-into-an-output]
The backup example now has a visible path:
```txt
What makes a backup genuinely recoverable? #zk/synthesis
└─ A backup is a recoverable system #zk/idea
└─ Recovery covers data, files, and configuration #zk/evidence
```
The Synthesis holds the current answer. The Idea explains the conclusion, and its Evidence preserves the source context. Together they can become a restore-drill runbook with explicit checks for data, files, configuration, and access. For a reading project, the same pattern can connect a passage, an interpretation, and a developing essay argument.
The output could instead be a design decision, article, lesson plan, proposal, or experiment. The synthesis already contains the current answer; its Relations let you verify or revisit each part before you publish or act on it.
## Run a weekly connection pass [#run-a-weekly-connection-pass]
Once a week, open the recent-memos filter and spend ten to fifteen minutes moving one active question forward:
* Which recent evidence changed an existing claim or deserves a new one?
* Does each important Relation have a reason you can explain?
* Does a new idea support, challenge, or narrow something already in the system?
* Which pinned synthesis needs a better current answer?
* Which captures are duplicates or no longer useful enough to keep active?
[Archive](/docs/usage/search-archive) records that remain useful but no longer belong in daily views. The review is successful when at least one question becomes clearer or produces a next output—not when you reach a target number of notes, tags, or relations.
## Keep knowledge and commitments separate [#keep-knowledge-and-commitments-separate]
Zettelkasten and [Getting Things Done](/docs/guides/getting-things-done) can share one Memos instance without becoming one system. Zettelkasten develops ideas; GTD tracks commitments. Keep their namespaces separate:
```markdown
Knowledge memo: #zk/idea #topic/backup-recovery
Action memo: #gtd/next #project/restore-drill
```
When a synthesis creates an action, make a separate GTD memo and relate it to the relevant synthesis. Avoid adding a task checkbox to every knowledge memo simply because an idea could someday become actionable.
Keep personal research `PRIVATE` unless sharing is intentional. A standalone share link does not expose the surrounding relation graph, so put essential context and source URLs in the memo body when another reader needs them. If Memos becomes your long-term research record, [back up the database and attachments](/docs/operations/backup-restore) and test the restore process.
For a chronological practice that combines tasks, events, and observations, use the [digital Bullet Journal guide](/docs/guides/bullet-journal).
Start with one question for one week. Pin its synthesis, capture only evidence that changes the question, turn one or two observations into claims, and explain each Relation you add. Keep the practice if the answer becomes easier to defend or use.
---
# Integrations
URL: https://usememos.com/docs/integrations
Connect Memos to the tools you use to capture and work with notes. Use the API for scripts and applications, MCP for AI assistants, webhooks to react to memo events, or a separate Telegram integration to capture messages.
Create a personal access token, authenticate requests, and review client migration requirements.
Connect an assistant to the built-in MCP endpoint to search, create, and update memos.
Run Memogram to send text and images from Telegram into your Memos instance.
Receive memo events and implement signature verification and delivery responses.
## Choose the question you need to answer [#choose-the-question-you-need-to-answer]
| If you want to know… | Start with… |
| ----------------------------------------------------- | ----------------------------------------------- |
| How do I read or write memos from my own application? | [API Access](/docs/integrations/api-access) |
| How do I let an AI assistant work with my memos? | [MCP Server](/docs/integrations/mcp) |
| How do I capture a note from Telegram? | [Telegram Bot](/docs/integrations/telegram-bot) |
| How do I trigger another service when a memo changes? | [Webhooks](/docs/integrations/webhooks) |
API and MCP calls act with the permissions of the account behind the token. Create a separate token for each application so you can revoke its access independently. For webhook receivers, follow the signing and response requirements before processing events.
For request and response details, open the [API Reference](/docs/api) and choose the version that matches your instance; Latest tracks `main`. For instance-wide sign-in setup, see [Authentication](/docs/configuration/authentication).
---
# API Access
URL: https://usememos.com/docs/integrations/api-access
Every Memos feature is available over the API. To call it programmatically, create a personal access token and send it as a Bearer credential.
## Create a personal access token [#create-a-personal-access-token]
Create and revoke tokens from your **user settings** in the app. Tokens use the `memos_pat_` prefix, and the plain token value is shown only once at creation — store it somewhere safe.
New tokens default to no expiration; you can choose an expiration when creating one. The settings page shows whether each token has ever been used, its last-used time, and its expiration status. Use a separate token for each application so you can revoke one integration without disrupting another.
Tokens are scoped to your user: API calls made with a token can do what your user can do.
## Call the API [#call-the-api]
Pass the token in the `Authorization` header. Memos 26.10 and the Latest API on `main` use `/api`:
```bash
curl -H "Authorization: Bearer memos_pat_..." \
https://memos.example.com/api/memos
```
Memos 0.30 and 0.31 use `/api/v1` instead. Select the [API reference for your instance version](/docs/api) before using an endpoint in an integration.
When moving a client from 0.31 to 26.10, follow the [migration checklist](#2610-client-migration). The Latest API reference tracks `main` and may include later changes.
For browser-based integrations, bearer-token requests may be sent cross-origin. Cookie authentication remains same-origin; do not build third-party API clients around a user's browser session cookie.
## 26.10 client migration [#2610-client-migration]
These breaking changes apply to **26.10-rc.1**. Use the [tagged API changelog](https://github.com/usememos/memos/blob/26.10-rc.1/proto/api/CHANGELOG.md) and [OpenAPI specification](https://github.com/usememos/memos/blob/26.10-rc.1/proto/gen/openapi.yaml) for the exact release contract.
### Paths and encoding [#paths-and-encoding]
* REST routes change from `/api/v1/...` to `/api/...`; server-sent events use `/api/sse`.
* The proto package changes from `memos.api.v1` to `memos.api`. Connect and gRPC procedures use `/memos.api./`.
* Resource types use `memos.api/` and `google.rpc.ErrorInfo.domain` becomes `memos.api`.
* In this release, old REST and procedure paths return `410 Gone` with an `UNIMPLEMENTED` error. They are removed in the next release.
* Protobuf field numbers change. Regenerate clients that use binary protobuf encoding; JSON clients must update the renamed fields below. Proto field names are shown in `snake_case`; gateway JSON uses their `camelCase` equivalents.
### Renamed methods, fields, and types [#renamed-methods-fields-and-types]
| Area | Required client change |
| ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Memo child operations | `ListMemoAttachments`, `ListMemoRelations`, `ListMemoComments`, `CreateMemoComment`, `ListMemoReactions`, and `UpsertMemoReaction` take `parent` instead of `name`. `ListMemoCommentsResponse.memos` becomes `comments`. |
| Memo resources | `MemoRelation.Memo` becomes `MemoRelation.MemoRef`; the `MemoShare` singular/plural becomes `memoShare`/`memoShares`. |
| User statistics | `ListAllUserStats` becomes `ListUserStats`, with required `parent` (`users/-` for all users or `users/{user}` for one user). The all-user REST path becomes `GET /api/users/-/stats`; response `stats` becomes `user_stats`, and `UserStats.tag_count` becomes `tag_counts`. |
| Batch users | `BatchGetUsersRequest.usernames` becomes `names`, accepting `users/{user}` resource names instead of bare usernames. |
| Personal access tokens | `created_at`, `expires_at`, and `last_used_at` become `create_time`, `expire_time`, and `last_use_time`. |
| Linked identities | `LinkedIdentity.idp_name` and `extern_uid` become `identity_provider` and `external_uid`; `CreateLinkedIdentityRequest.idp_name` becomes `identity_provider`. |
| Views and notifications | Resource singulars become `memoView` and `userNotification`; `UserNotification.SpaceInvitationPayload.State` becomes `InvitationState`. |
| Imports | `MemoImportPlan`, `MemoImportReport`, and `MemoImportIssue` become `ImportMemosPlan`, `ImportMemosReport`, and `ImportMemosIssue`. Plan fields `memos`/`attachments` become `memo_count`/`attachment_count`; issue field `memo` becomes `memo_uid`. |
| Settings | `UpdateUserSettingRequest.setting` and `ListUserSettingsResponse.settings` become `user_setting` and `user_settings`. `UpdateInstanceSettingRequest.setting` and `BatchGetInstanceSettingsResponse.settings` become `instance_setting` and `instance_settings`. |
| Authentication | `SignInResponse.access_token_expires_at` and `RefreshTokenResponse.expires_at` become `access_token_expire_time`. `SignInRequest.SSOCredentials` becomes `SsoCredentials`, with `identity_provider` replacing `idp_name`. |
## 0.31 client migration [#031-client-migration]
Review these changes before pointing an existing integration at 0.31:
| Area | Required client change |
| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Views | Replace `ShortcutService` with the `MemoView` operations in `UserService`, shortcut resources with view resources, and `/api/v1/users/*/shortcuts/*` with `/api/v1/users/*/views/*`. Stored filters migrate automatically. |
| Authorization | Run mutations as the memo author. Assigned memo edits also require Space membership. Active instance administrators can read and manage individual memos without authorship or Space membership; Space admin roles do not override authorship. Users manage their own reactions. |
| Comments | Send visibility and placement intentionally. `CreateMemoComment` defaults omitted visibility to `PRIVATE`; `SetMemoRelations` rejects `COMMENT`. Parent deletion does not delete comment memos. |
| Reactions | Stop reading `Reaction.content_id` (`contentId` in JSON). Identify the memo from the request or the reaction resource name. |
| Inline images | Bind managed attachments to the memo before or during the same mutation that references them in Markdown. An uploaded but unbound attachment is not enough. |
| S3 files | Use the authenticated Memos file route. Managed S3 attachments no longer expose presigned object URLs through `external_link` (`externalLink` in JSON). Preserve share authorization on shared attachment and thumbnail URLs. |
| JSON responses | Allow absent unset protobuf message fields. Scalar defaults and empty lists are still emitted; do not depend on every message field appearing as `null`. |
| Usernames | Use the exact username case for lookup and authentication. See [Users & Roles](/docs/admin/users-roles#usernames). |
### Spaces in API clients [#spaces-in-api-clients]
A memo's `space` is a resource name such as `spaces/team-notes`, or absent when Unassigned. `visibility: "SPACE"` requires placement in a Space. Filters support `space == null`, `space == "spaces/team-notes"`, and `has_location`.
When moving a `SPACE` memo, include both `space` and `visibility` in the update mask and explicitly confirm `SPACE` visibility for the destination. When withdrawing it to Unassigned, select a non-Space visibility in the same update. Share links cannot be created for `SPACE` memos; revoke existing links before changing a memo to that audience.
The [Latest API reference](/docs/api/latest) tracks `main`, which may include changes after the latest stable release. The [0.31 reference](/docs/api/0-31) is generated from v0.31.0, and the [0.30 reference](/docs/api/0-30) covers the previous release series. For the exact 0.31.0 schema, use the [tagged OpenAPI specification](https://github.com/usememos/memos/blob/v0.31.0/proto/gen/openapi.yaml).
## Where to go next [#where-to-go-next]
* [API Reference](/docs/api) — every service and method, REST and gRPC
* [Webhooks](/docs/integrations/webhooks) — push events instead of polling
* [MCP Server](/docs/integrations/mcp) — connect AI assistants using the same tokens
* [Security](/docs/configuration/security) — the full token security model
---
# MCP Server
URL: https://usememos.com/docs/integrations/mcp
Memos includes a built-in [Model Context Protocol](https://modelcontextprotocol.io/) (MCP) server, available since v0.27.0. It lets AI assistants such as Claude search, create, and update your memos through a curated set of tools.
The server is part of the main Memos binary — there is nothing extra to install or enable. It runs at:
```
https:///mcp
```
## Upgrading older MCP clients [#upgrading-older-mcp-clients]
Memos 0.30 replaced the earlier MCP implementation with a stateless, tools-only endpoint generated from the OpenAPI schema. Existing clients must use `/mcp` and the service-prefixed tool names listed below.
The previous prompts, resources, tool-filtering headers, route aliases, and unprefixed tool names are no longer available. Tool failures now use the standard MCP `isError` result with readable text content.
### Migrating to 0.31 [#migrating-to-031]
Replace `shortcut_list_shortcuts` with `user_list_memo_views`. Existing saved filters migrate automatically, but client tool names and request mappings must change. Tool calls also follow the new author and Space membership permissions. Comments created without an explicit visibility default to `PRIVATE`. See [API migration notes](/docs/integrations/api-access#031-client-migration).
## Connecting a client [#connecting-a-client]
The server uses the **Streamable HTTP** transport. Point any MCP client that supports it at your instance's `/mcp` endpoint and authenticate with a [personal access token](/docs/integrations/api-access) as a Bearer credential:
```json
{
"mcpServers": {
"memos": {
"type": "http",
"url": "https:///mcp",
"headers": {
"Authorization": "Bearer "
}
}
}
}
```
With Claude Code, the equivalent one-liner is:
```bash
claude mcp add --transport http memos https:///mcp \
--header "Authorization: Bearer "
```
## Authentication [#authentication]
Tool calls run against the same REST API as the web app, with the same permissions:
* The token identifies you; tools can only see and change what your account can.
* Mutating tools (create, update, delete) require a valid token.
* Public reads may work without a token only when the instance access policy permits public reads and the underlying REST endpoint allows anonymous access. The canonical instance URL does not select that policy.
Create and revoke personal access tokens from your user settings in the app. See [API Access](/docs/integrations/api-access).
## Available tools [#available-tools]
The server exposes a curated, memo-focused toolset:
| Tool | Description |
| ------------------------------ | ----------------------------------------- |
| `memo_list_memos` | List and search memos |
| `memo_create_memo` | Create a memo |
| `memo_get_memo` | Get a single memo |
| `memo_update_memo` | Update a memo |
| `memo_delete_memo` | Delete a memo |
| `memo_list_memo_comments` | List comments on a memo |
| `memo_create_memo_comment` | Comment on a memo |
| `memo_list_memo_attachments` | List a memo's attachments |
| `memo_set_memo_attachments` | Set a memo's attachments |
| `memo_list_memo_reactions` | List reactions on a memo |
| `memo_upsert_memo_reaction` | Add or update a reaction |
| `memo_delete_memo_reaction` | Remove a reaction |
| `memo_list_memo_relations` | List a memo's relations |
| `memo_set_memo_relations` | Set a memo's relations |
| `attachment_list_attachments` | List attachments |
| `attachment_create_attachment` | Upload an attachment |
| `attachment_get_attachment` | Get an attachment |
| `attachment_delete_attachment` | Delete an attachment |
| `user_list_memo_views` | List the current user's Views |
| `auth_get_current_user` | Resolve the user represented by the token |
Each tool maps to an endpoint of the [REST API](/docs/api), so request and response shapes match the API reference. Tools carry standard MCP annotations (read-only, destructive, idempotent) so clients can ask for confirmation before destructive actions.
## Browser clients and origins [#browser-clients-and-origins]
Desktop MCP clients work out of the box. Browser-based clients are subject to an origin check: requests are accepted when the `Origin` header is absent, matches the instance's own host, or matches the configured instance URL. Anything else is rejected with `403` to protect against DNS rebinding.
## Troubleshooting [#troubleshooting]
* **`401` / permission errors** — the token is missing, expired, or lacks access to the resource. Create a fresh token in your user settings.
* **`403` on connect** — your client sends an `Origin` header that doesn't match the instance. Use a desktop client, or set the instance URL so it matches.
* **Tool errors** — API failures are returned with `isError: true` and readable text containing the HTTP status and message, so the assistant can react without trying to validate the error as a successful output schema.
---
# Telegram Bot
URL: https://usememos.com/docs/integrations/telegram-bot
Memogram is the Telegram integration for Memos. It syncs text and images from a Telegram bot into your Memos instance.
Repository and releases:
```text
https://github.com/usememos/telegram-integration
https://github.com/usememos/telegram-integration/releases
```
## Prerequisites [#prerequisites]
* A running Memos instance
* A Telegram bot token
## Configuration [#configuration]
Create a `.env` file and set:
```text
SERVER_ADDR=dns:localhost:5230
BOT_TOKEN=your_telegram_bot_token
BOT_PROXY_ADDR=https://api.your_proxy_addr.com
ALLOWED_USERNAMES=user1,user2,user3
```
### Configuration options [#configuration-options]
* `SERVER_ADDR`: gRPC address where Memos is running.
* `BOT_TOKEN`: Telegram bot token.
* `BOT_PROXY_ADDR`: Optional proxy for Telegram API.
* `ALLOWED_USERNAMES`: Optional comma-separated list of allowed usernames (without `@`).
When `ALLOWED_USERNAMES` is set, only those users can use the bot.
## Run Memogram [#run-memogram]
### Binary [#binary]
1. Download the release binary.
2. Put `.env` next to the binary.
3. Run:
```sh
./memogram
```
### Docker [#docker]
```sh
docker build -t memogram .
docker run -d --name memogram \
-e SERVER_ADDR=dns:localhost:5230 \
-e BOT_TOKEN=your_telegram_bot_token \
memogram
```
### Docker Compose [#docker-compose]
```yaml
services:
memogram:
env_file: .env
build: memogram
container_name: memogram
```
## Commands [#commands]
* `/start `: Authenticate with your Memos access token.
* Send text: Saves the message as a memo.
* Send files: Saves files as resources attached to a memo.
* `/search `: Search your memos.
---
# Webhooks
URL: https://usememos.com/docs/integrations/webhooks
Memos can send webhooks when memos change. Webhooks are configured per user in the Settings page and can be edited or deleted later.
## Events [#events]
Webhooks are dispatched on:
* Memo created
* Memo updated
* Memo deleted
* Memo comment created
## Payload [#payload]
Memos sends a JSON payload containing `activityType`, `creator`, and the affected `memo`. Comment-created payloads include the parent relation so receivers can identify the conversation.
Refer to the [API reference](/docs/api) for the current webhook-related endpoints.
## Signing and verification [#signing-and-verification]
New webhooks receive a Standard Webhooks-compatible signing secret in the form `whsec_`. Copy it when the webhook is created and store it as a secret in the receiving service. You can reveal an existing secret later from the edit dialog; older unsigned webhooks can generate one there.
Signed deliveries include:
| Header | Value |
| ------------------- | --------------------------------------- |
| `webhook-id` | Unique message ID beginning with `msg_` |
| `webhook-timestamp` | Unix timestamp in seconds |
| `webhook-signature` | `v1,` |
Verify the signature before parsing or acting on the payload:
1. Read the raw request body bytes.
2. Remove the `whsec_` prefix and Base64-decode the remaining secret.
3. Build the signed content as `..`.
4. Compute HMAC-SHA256 with the decoded secret and Base64-encode the result.
5. Compare `v1,` with `webhook-signature` using a constant-time comparison.
6. Reject timestamps outside a small tolerance window and deduplicate `webhook-id` values to reduce replay risk.
Do not reserialize parsed JSON before verification; even an equivalent JSON representation produces a different signature.
## Delivery response [#delivery-response]
The receiver must return a `2xx` response with a JSON body whose `code` is `0`, for example:
```json
{ "code": 0 }
```
Non-`2xx` responses, invalid JSON, or a nonzero `code` are treated as delivery failures.
## Network safety [#network-safety]
Webhook URLs must use `http` or `https` and must resolve successfully when they are created or updated.
By default, Memos rejects webhook targets that resolve to reserved or private IP ranges, including loopback, RFC 1918 private networks, link-local addresses, and IPv6 local ranges. This protects the instance from server-side request forgery.
In 0.31, allow only the private destinations your integration needs with `--webhook-private-network-allowlist` or `MEMOS_WEBHOOK_PRIVATE_NETWORK_ALLOWLIST`. Entries are exact hostnames, IP addresses, or CIDRs; hostnames are not wildcard patterns.
```bash
./memos --webhook-private-network-allowlist=hooks.internal.example,10.0.0.8,10.20.0.0/24
```
The equivalent environment variable is a comma-separated list:
```bash
export MEMOS_WEBHOOK_PRIVATE_NETWORK_ALLOWLIST="hooks.internal.example,10.0.0.8,10.20.0.0/24"
```
The default empty list keeps private-network protection enabled. The older `--allow-private-webhooks` / `MEMOS_ALLOW_PRIVATE_WEBHOOKS=true` option remains compatible but is deprecated because it allows every private destination. Replace it with the narrowest entries your receivers require.
---
# Operations
URL: https://usememos.com/docs/operations
Keep your Memos instance running as its data and usage grow. These pages connect the application's architecture to practical work: recovering memos and attachments, changing versions, and investigating slow or unreliable behavior.
Understand how the frontend, API, database, and attachment storage fit together.
Back up the database, attachments, and deployment configuration, then verify a restore.
Prepare for migrations, replace the running version, and check the instance after startup.
Investigate database contention, storage, and deployment constraints before changing settings.
## Choose the question you need to answer [#choose-the-question-you-need-to-answer]
| If you want to know… | Start with… |
| ---------------------------------------------------------- | --------------------------------------------------------- |
| Which parts of the system store data or handle requests? | [Architecture](/docs/operations/architecture) |
| What do I need to recover a complete instance? | [Backup & Restore](/docs/operations/backup-restore) |
| How do I move to a new version and prepare for migrations? | [Upgrade](/docs/operations/upgrade) |
| Where should I look when the instance becomes slow? | [Performance Tuning](/docs/operations/performance-tuning) |
Establish and test a restore procedure before your first upgrade. Memos applies database migrations at startup; after a migration, recovery depends on restoring a compatible backup rather than simply restarting the older binary. Include every attachment store still in use in that recovery plan.
For a specific failure, start with [Troubleshooting](/docs/troubleshooting). For planned database or storage changes, return to [Configuration](/docs/configuration).
---
# Architecture
URL: https://usememos.com/docs/operations/architecture
At a high level, Memos is a lightweight web application with a frontend UI, an API and service layer, a database backend, and optional attachment storage outside the database.
## Technology stack [#technology-stack]
| Layer | Technology |
| ------------------- | ----------------------------------- |
| Backend language | Go 1.27+ |
| HTTP router | Echo v5 |
| API protocol | gRPC + Connect RPC (dual) |
| Schema | Protocol Buffers v2 |
| Databases | SQLite (default), MySQL, PostgreSQL |
| Frontend framework | React 19 + TypeScript |
| Frontend build | Vite 8 |
| State management | React Query v5 + React Context |
| Frontend API client | Connect RPC |
| Frontend styling | Tailwind CSS v4 |
## Main layers [#main-layers]
* frontend UI for writing, browsing, and managing memos
* API and service layer for authentication, memo operations, and instance settings
* database layer for persistent content and metadata
* optional filesystem or object storage for attachments
## Dual-protocol API [#dual-protocol-api]
Memos exposes two API surfaces backed by the same service implementations:
* **Connect RPC** at `/memos.api./` — used by the browser frontend; speaks HTTP/JSON with type-safe generated clients
* **gRPC-Gateway** at `/api/*` — provides REST-compatible HTTP/JSON endpoints for external tools, CLI clients, and integrations
These are the paths on Memos `main`. Memos 0.30 and 0.31 use `/memos.api.v1./` and `/api/v1/*`.
Both go through the same interceptor chain (metadata extraction, request logging, panic recovery, auth validation).
## Authentication tokens [#authentication-tokens]
Three token types are in use:
| Type | Lifetime | Storage | Validated |
| --------------------- | --------------------------------------- | ------------------ | --------------------------- |
| Access token (JWT) | 15 minutes | Client memory | Stateless signature check |
| Refresh token (JWT) | 30 days | HTTP-only cookie | Database lookup (revocable) |
| Personal access token | User-selected; no expiration by default | SHA-256 hash in DB | Database lookup |
Personal access tokens use the prefix `memos_pat_` followed by 32 random characters and are stored only as their SHA-256 hash.
## In-memory cache [#in-memory-cache]
The store layer maintains an in-memory cache for hot data:
| Cached resource | Cache key | TTL |
| ----------------- | --------------------- | ------ |
| Instance settings | `setting_key` | 10 min |
| Users | `user_id` | 10 min |
| User settings | `user_id-setting_key` | 10 min |
Cache entries are evicted on write operations and after their TTL expires.
The database-backed `ACCESS` setting bypasses the ordinary settings cache so another replica observes an access-policy change on its next policy check. Deployment-file overrides remain fixed until that process restarts.
## Why the architecture matters [#why-the-architecture-matters]
Understanding these layers helps with:
* choosing SQLite versus MySQL or PostgreSQL
* planning backups correctly
* reasoning about storage and proxy configuration
* deciding where to troubleshoot performance problems first
## Practical deployment reading [#practical-deployment-reading]
For most teams, architecture questions become operational questions:
* where does data live
* which layer terminates TLS
* what happens to attachments during backup and restore
* how many instances need to write to the database
---
# Backup & Restore
URL: https://usememos.com/docs/operations/backup-restore
Your backup plan depends on both the database backend and the attachment storage backend.
To download or move only your own memos, use **Settings → Export & Import** instead. The [Export & Import guide](/docs/usage/export-import) explains the ZIP format, conflict choices, and Space handling. A personal export does not include other users' memo content, accounts, settings, or Space memberships, so it does not replace the instance backups described here.
## Default data directory layout [#default-data-directory-layout]
```
~/.memos/
├── memos_prod.db # SQLite database (default)
└── assets/ # Uploaded files and attachments
```
The location is controlled by `MEMOS_DATA`. Override it at runtime or use the default.
## What to back up [#what-to-back-up]
* the database itself
* local attachment storage when attachments are not stored in the database
* deployment configuration such as environment variables, compose files, and proxy config
## SQLite backup [#sqlite-backup]
The safest offline approach is to stop Memos and copy the database file:
```bash
sudo systemctl stop memos
tar -czf memos-backup-$(date +%Y%m%d).tar.gz -C ~/.memos .
sudo systemctl start memos
```
For online backups while Memos is running, use SQLite's built-in `.backup` command which handles WAL mode correctly:
```bash
sqlite3 ~/.memos/memos_prod.db ".backup ~/.memos/memos_backup.db"
```
Automated daily backup with 7-day retention:
```bash
#!/bin/bash
BACKUP_DIR="/var/backups/memos"
DATE=$(date +%Y%m%d-%H%M%S)
MEMOS_DATA="${MEMOS_DATA:-$HOME/.memos}"
mkdir -p "$BACKUP_DIR"
sqlite3 "$MEMOS_DATA/memos_prod.db" ".backup $BACKUP_DIR/memos-$DATE.db"
tar -czf "$BACKUP_DIR/assets-$DATE.tar.gz" -C "$MEMOS_DATA" assets
find "$BACKUP_DIR" -name "memos-*.db" -mtime +7 -delete
find "$BACKUP_DIR" -name "assets-*.tar.gz" -mtime +7 -delete
```
Add to cron: `0 2 * * * /usr/local/bin/backup-memos.sh`
## MySQL backup [#mysql-backup]
```bash
# Backup
mysqldump -u memos_user -p memos_db | gzip > memos-backup-$(date +%Y%m%d).sql.gz
tar -czf assets-backup-$(date +%Y%m%d).tar.gz -C ~/.memos assets
# Restore
gunzip < memos-backup.sql.gz | mysql -u memos_user -p memos_db
tar -xzf assets-backup.tar.gz -C ~/.memos
```
## PostgreSQL backup [#postgresql-backup]
```bash
# Backup
pg_dump -U memos_user -d memos_db -F c -f memos-backup-$(date +%Y%m%d).dump
tar -czf assets-backup-$(date +%Y%m%d).tar.gz -C ~/.memos assets
# Restore
pg_restore -U memos_user -d memos_db memos-backup.dump
tar -xzf assets-backup.tar.gz -C ~/.memos
```
## Recovery mindset [#recovery-mindset]
Backups only matter if restore is realistic. Keep enough information to answer:
* where the data lived
* which database driver was in use
* whether attachments were in the database, on disk, or in object storage
* how the instance URL, separate access policy, and proxy were configured
* every named storage configuration still referenced by attachments, including configurations no longer selected for new uploads
## Operational advice [#operational-advice]
* test restore at least once before you depend on the backup plan
* record the storage backend alongside the backup process
* treat attachment recovery as a first-class part of restore, not an afterthought
---
# Performance Tuning
URL: https://usememos.com/docs/operations/performance-tuning
Memos is lightweight by default, so performance work should stay targeted. Start with storage, database choice, and deployment shape before reaching for low-level tuning.
## Built-in caching [#built-in-caching]
Memos maintains an in-memory cache for frequently accessed data. The cache runs entirely in-process with no external dependency:
| Cached resource | TTL | Max items |
| ----------------- | ------ | ---------- |
| Instance settings | 10 min | — |
| Users | 10 min | 1000 total |
| User settings | 10 min | — |
Cache entries are invalidated immediately on write operations and automatically expired after their TTL.
The database-backed `ACCESS` setting bypasses the ordinary settings cache so another replica observes an access-policy change on its next policy check. Deployment-file overrides remain fixed until that process restarts.
## SQLite tuning [#sqlite-tuning]
Memos applies these SQLite pragmas by default:
| Pragma | Default value | Effect |
| -------------- | -------------- | ----------------------------------------------------------- |
| `journal_mode` | `WAL` | Write-Ahead Logging; allows concurrent reads during writes |
| `busy_timeout` | `10000` (10 s) | Waits up to 10 s for a write lock before returning an error |
| `foreign_keys` | `0` | Disabled for flexibility |
| `mmap_size` | `0` | Memory-mapping disabled to avoid OOM on some systems |
For higher write loads, you can extend the defaults through the DSN:
```bash
export MEMOS_DSN="/path/to/memos.db?_pragma=cache_size(-64000)&_pragma=synchronous(NORMAL)&_pragma=temp_store(MEMORY)"
```
SQLite limitations to keep in mind:
| Dimension | Recommendation |
| ------------------ | ----------------------------------------------------- |
| Concurrent writers | 1 (serialized through WAL) |
| Concurrent readers | Unlimited |
| Practical DB size | Up to \~100 GB |
| When to migrate | High concurrent writes or multi-server write patterns |
## Live updates and write contention [#live-updates-and-write-contention]
In 0.31, browser tabs coordinate one SSE connection through a visible tab instead of opening redundant streams. Keep reverse proxies compatible with long-lived event streams and avoid response buffering on the SSE route.
SQLite memo mutations begin with `BEGIN IMMEDIATE`, allowing concurrent writers to wait for the write lock earlier in the transaction. Writes are still serialized; this reduces intermittent `SQLITE_BUSY` failures without making SQLite a multi-writer database.
## First-order decisions [#first-order-decisions]
* SQLite is fine for many single-instance deployments
* move to MySQL or PostgreSQL when operational needs justify it
* choose the attachment backend based on file volume and backup expectations
* keep the instance behind a reverse proxy in production
## Where to look first [#where-to-look-first]
* database latency or lock contention
* slow storage volumes
* oversized attachment handling
* under-provisioned container or pod resources
## Tuning advice [#tuning-advice]
* measure first
* tune the database only after confirming the bottleneck
* keep caching and proxy behavior simple unless usage data says otherwise
* prefer structural fixes such as better storage placement before micro-tuning runtime flags
---
# Upgrade
URL: https://usememos.com/docs/operations/upgrade
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 [#before-every-upgrade]
1. Back up the database and attachments — see [Backup & Restore](/docs/operations/backup-restore).
2. Read the [changelog](/changelog) for the versions you are skipping. Both historical minor releases (0.x → 0.y) and calendar releases can contain breaking changes.
3. Note your current version so you can report it if something goes wrong.
## API reference support window [#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 26.10 [#upgrading-to-2610]
**26.10-rc.1 is a release candidate.** Back up before upgrading and pin `neosmemo/memos:26.10-rc.1` to test this release. It does not update the `stable` container tag. Read the [release changelog](/changelog/26-10-rc-1).
### Required upgrade path [#required-upgrade-path]
* From **0.31.0**, upgrade directly.
* From **0.22 through 0.30**, first upgrade to **0.31.0** and start it successfully, then install 26.10.
* From a version **earlier than 0.22**, first run **0.25.3**, then **0.31.0**, then install 26.10.
* Fresh installations can start with 26.10 directly.
### Clients and workflows [#clients-and-workflows]
* Update every API client from `/api/v1/...` to `/api/...`, and update Connect/gRPC procedure paths, renamed fields, and types. Regenerate binary protobuf clients. The old paths return `410 Gone` for this release and are removed in the next release. Use the [26.10 client migration checklist](/docs/integrations/api-access#2610-client-migration).
* Replace the removed built-in Tasks View with a [View](/docs/usage/views) using `has_task_list && has_incomplete_tasks`.
* Move a top-level memo by editing its Space in the audience menu, then saving. The separate Move to Space action is removed.
* Deleting a memo now deletes its comments and nested replies as well. Review a discussion before deleting its parent.
After upgrading, verify sign-in, existing memos, attachments, creator and Space filters, and API integrations. Check that Calendar and Map expose only the memos each signed-in user or visitor can read.
## Upgrading to 0.31 [#upgrading-to-031]
These notes apply to **0.31.0**, the latest stable release. Back up before upgrading and use `neosmemo/memos:0.31.0` to pin this release. Read the [release changelog](/changelog/0-31-0).
### Access and deployment [#access-and-deployment]
* A missing `ACCESS` setting 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_URL` must be absolute HTTP(S), without credentials, a query, or a fragment. Configure it separately from the [access policy](/docs/configuration/deployment-configuration#access-policy).
* Replace blanket private-webhook access with `--webhook-private-network-allowlist` or `MEMOS_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 [#data-and-ownership]
* Account emails remain optional, but are trimmed, lowercased, and unique per instance. The upgrade clears invalid addresses and keeps duplicate addresses only on the oldest account; affected usernames are logged.
* Existing memos remain Unassigned; no default Space is created. Their IDs, authors, visibility, and relations are preserved.
* Stored `Shortcut` resources 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. Active instance administrators can read and manage individual memos, including private and Space-only memos, without authorship or Space membership. Collection listings still filter by audience. Space admin roles do not override authorship. 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 [#integrations-and-links]
* Update app bookmarks from `/shortcuts` to `/views`. Replace `ShortcutService`, shortcut resource paths, and MCP tool names with their Views equivalents.
* Send comment visibility explicitly: `CreateMemoComment` defaults an omitted value to `PRIVATE`. `SetMemoRelations` rejects `COMMENT` relations.
* 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.
See [API migration details](/docs/integrations/api-access#031-client-migration).
### Removed features [#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](/docs/integrations/api-access) for reads or [webhooks](/docs/integrations/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 [#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 [#upgrading-to-030]
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_URL` to 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 the `now` timestamp value, duration arithmetic such as `now - duration`,
and CEL timestamps instead.
* Reconfigure MCP clients to use the `/mcp` endpoint 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}`) to
`GetSharedMemo` (`/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]
```bash
docker pull neosmemo/memos:stable
docker stop memos
docker rm memos
# re-run your original docker run command — the data volume keeps your data
```
The exact `docker run` flags are in the [Docker guide](/docs/deploy/docker).
## Docker Compose [#docker-compose]
```bash
docker compose pull
docker compose up -d
```
## Binary [#binary]
1. Stop the service (`systemctl stop memos` or your supervisor's equivalent).
2. Replace the binary with the new release from [GitHub releases](https://github.com/usememos/memos/releases).
3. Start the service and watch the logs for migration output.
See the [Binary guide](/docs/deploy/binary) for service setup.
## Pinning versions [#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.31.0`) and upgrade deliberately.
From 26.10 onward, release tags use calendar versions without a `v` prefix: `26.10` is a monthly release and `26.10.1` is a patch. Stable releases publish exact-version, monthly-series, and `stable` container tags. Release candidates publish only their exact tag, such as `26.10-rc.1`.
## Verify after upgrading [#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 [#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.
---
# Troubleshooting
URL: https://usememos.com/docs/troubleshooting
Work through the section that matches your symptom. Most problems trace back to ports, file permissions, database connection strings, or proxy headers.
## Port already in use [#port-already-in-use]
Change the port with `--port` or `MEMOS_PORT` and restart the server.
## Cannot write to the data directory [#cannot-write-to-the-data-directory]
Ensure the data directory exists and is writable by the Memos process. You can set it with `--data` or `MEMOS_DATA`.
## Database connection errors [#database-connection-errors]
Verify the driver and DSN:
* `MEMOS_DRIVER` should be `sqlite`, `mysql`, or `postgres`.
* `MEMOS_DSN` should use the correct DSN format for your database.
## Reverse proxy issues [#reverse-proxy-issues]
If you run behind a reverse proxy, make sure:
* `MEMOS_INSTANCE_URL` matches the public URL
* the proxy forwards standard headers (`Host`, `X-Forwarded-*`)
## Docker starts but the app does not respond [#docker-starts-but-the-app-does-not-respond]
Check:
* `docker logs memos`
* whether the host port is already occupied
* whether the mounted data directory is writable
## Attachments are missing after migration [#attachments-are-missing-after-migration]
Confirm which storage backend the instance uses. If attachments are stored outside the database, they must be migrated and backed up separately.
## Access changed unexpectedly after an upgrade [#access-changed-unexpectedly-after-an-upgrade]
In 0.31, inspect the effective `ACCESS` setting and any `memos-instance-setting-access.json` deployment override. Changing `MEMOS_INSTANCE_URL` does not change an existing access policy. Upgrade all replicas before changing the policy, and restart replicas when changing file-backed settings.
## Sign-in fails after upgrading to 0.31 [#sign-in-fails-after-upgrading-to-031]
Check the exact stored username, including capitalization. Username lookup and password sign-in are case-sensitive.
## A displayed tag is missing from filters [#a-displayed-tag-is-missing-from-filters]
Existing tag indexes are not rebuilt automatically for 0.31's grammar. Save the affected memo again so filters and statistics adopt the parsed tags.
## An integration returns permission or file errors [#an-integration-returns-permission-or-file-errors]
Check author identity and Space membership. Active instance administrators can read and manage individual memos without authorship or Space membership; Space admin roles do not grant that authority. For managed inline images, bind the attachment before or during the memo update, and use Memos file routes with the appropriate authentication or share token. See [API migration notes](/docs/integrations/api-access#031-client-migration).
## Still stuck? [#still-stuck]
Check the [FAQ](/docs/faq) or search [GitHub issues](https://github.com/usememos/memos/issues).
---
# Usage
URL: https://usememos.com/docs/usage
Capture a thought, find it again, and decide who can read or respond to it. These pages explain the individual Memos features you can combine into a daily practice, from writing and attachments to Views, Spaces, and sharing.
## Write and capture [#write-and-capture]
Write and edit memos, browse by date or location, and choose placement and visibility.
Add images and files to a memo, browse the attachment library, and review unused uploads.
Format plain-text notes with headings, checklists, tables, code blocks, and links.
## Organize and find [#organize-and-find]
Add searchable hashtags in memo content and organize related topics with tag hierarchies.
Name and reuse filter conditions to see the memos that currently match.
Find notes by content or metadata, archive older memos, and restore them when needed.
## Share and collaborate [#share-and-collaborate]
Bring members and memos together while keeping authorship, placement, and visibility independent.
Choose a memo's audience, manage share links, or export a memo as an image.
Acknowledge memos, participate in discussions, and mention other users with the right access.
Review comments and mentions, respond to Space invitations, and manage notifications.
Link an external SSO account so it signs in to your existing Memos user.
## Keep or move your data [#keep-or-move-your-data]
Download your memos and attachments as a ZIP, then import them into another account or instance.
## Choose the question you need to answer [#choose-the-question-you-need-to-answer]
| If you want to know… | Start with… |
| ------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------ |
| How do I write a note with a checklist or image? | [Memos](/docs/usage/memos), [Writing Markdown](/docs/usage/writing-markdown), and [Attachments](/docs/usage/attachments) |
| How do I return to the same set of related notes? | [Tags](/docs/usage/tags) and [Views](/docs/usage/views) |
| How do I find an older note or clear it from my timeline? | [Search & Archive](/docs/usage/search-archive) |
| How do I revisit notes from a date or place? | [Browsing your memos](/docs/usage/memos#browsing-your-memos) |
| How do I work with a group and control who can read a memo? | [Spaces](/docs/usage/spaces) and [Sharing](/docs/usage/sharing) |
| How do I join a discussion and keep track of replies? | [Reactions & Comments](/docs/usage/reactions-comments) and [Inbox](/docs/usage/inbox) |
| How do I connect SSO to the account I already use? | [Linked Identities](/docs/usage/linked-identities) |
| How do I download my memos or move them to another instance? | [Export & Import](/docs/usage/export-import) |
Start with a few memos and add tags or Views when you have something you want to revisit. When collaborating, check placement and visibility separately: assigning a memo to a Space does not automatically make it visible to that Space's members.
To combine these capabilities into a complete, repeatable practice, explore [Guides](/docs/guides).
---
# Attachments
URL: https://usememos.com/docs/usage/attachments
Attachments let you keep files close to the notes they belong to. This is useful for screenshots, design references, PDFs, exported data, and other supporting material.
## Typical attachment flow [#typical-attachment-flow]
* drag a file into the editor
* use the upload control in the toolbar
* paste screenshots directly from the clipboard when supported
The app uploads files in smaller chunks automatically. No separate setting is needed; the instance's file-size limits still apply.
## Inline images and drafts [#inline-images-and-drafts]
Images can be inserted at the cursor through upload, paste, drag and drop, or selection from existing attachments. They become Markdown images in the memo body. Other files remain attachments you can open from the memo.
Failed inline uploads can be retried. Returning to an unfinished draft restores its inline upload state so you can continue composing. Confirm uploads have completed before publishing, and keep the local draft until the memo is saved.
Removing an image from the Markdown body does not by itself prove the file is unused: attachment binding and inline references are separate. Use the attachment library's unused status when cleaning up.
## Optional media metadata [#optional-media-metadata]
Enable **Save media metadata** in your preferences to preserve normalized details from future uploads. This is off by default. Depending on the file, details can include dimensions, camera information, capture time, location, and video duration. Inspect available details in the attachment viewer.
The preference applies to future uploads; it does not backfill existing files. Location and capture details can reveal where and when media was recorded, so inspect them before sharing. Disabling metadata extraction is not a promise that embedded metadata has been stripped from the original file.
## Common attachment types [#common-attachment-types]
* images and screenshots
* PDFs and documents
* audio or video files when your storage policy allows them
* exported artifacts such as logs or data files
## Transcribing audio [#transcribing-audio]
If an admin has configured an AI provider with transcription (Admin → Instance Settings → AI), audio attachments can be transcribed into text.
* transcription is off until a provider is configured, so the option only appears on instances that have AI enabled
* in 26.10, open the memo editor and transcribe an existing audio attachment; the transcript is inserted into the draft for you to review and save, preserving the existing text and original audio
* providers are bring-your-own-key (OpenAI or Gemini), so transcription uses the instance's own AI account
This is useful for voice notes and recorded snippets you want to search later as plain text.
## The attachment library [#the-attachment-library]
In 26.10, the Attachments page includes files from memos you can read and identifies their uploaders. Its results follow the selected creator and Space, preserving that scope when you switch from Timeline, Calendar, or Map. File management remains subject to your permissions.
* files are grouped into **Media**, **Audio**, and **Documents** tabs, each with a live count
* media is shown as a grid grouped by month; images, videos, and motion photos open in a full-screen lightbox
* audio files play inline, with playback-speed choices including 0.5× and 0.75×; documents are listed as rows you can open in a new tab
* every attachment links back to the memo it belongs to, or is flagged when it isn't linked to any memo
* long lists load in pages with a **Load more** button
In image previews, pinch to zoom and drag to pan a zoomed image. At fit zoom, swipe to move between gallery images.
There is no upload control here — attachments are added from the memo editor. The library is for browsing, previewing, and cleanup.
## Cleaning up unused attachments [#cleaning-up-unused-attachments]
An attachment is **unused** when it is not bound to any memo, such as an upload you never attached to a saved memo. Deleting a memo removes its owned attachment resources; removing only an inline image reference does not necessarily remove the attachment binding.
When you have unused attachments, the library shows an expandable **Unused** panel listing them. From there you can **Delete all unused** in one action (with a confirmation step) to reclaim storage.
Deleting unused attachments is permanent, so review the list before confirming. Attachments that are still linked to a memo are never touched.
## Storage implications [#storage-implications]
Open **Settings → My Account** and look under **Statistics → Attachment storage** to see your account's attachment storage usage. Review unused uploads in the attachment library when you want to reclaim space.
Attachments depend on the storage backend chosen for the instance:
* database storage keeps everything together
* local filesystem storage keeps files on the host or volume
* S3-compatible storage separates files from the app host
Admins can configure multiple named storage backends. Changing the backend for new uploads does not move existing files. A [personal memo export](/docs/usage/export-import) includes the managed files attached to your exported memos, regardless of their storage backend.
## Access to managed files [#access-to-managed-files]
Managed files follow the memo's access rules. Memos serves S3-backed attachments through its authenticated file route, including range requests for media playback. A shared memo supplies authorized attachment URLs; preserve their share tokens when copying or rendering thumbnails.
API clients must bind a managed image to the memo before or during the mutation that references it in Markdown. Do not use a presigned S3 object URL from `externalLink`; managed S3 attachments no longer expose one there. See [API Access](/docs/integrations/api-access#031-client-migration).
## Operational guidance [#operational-guidance]
* match your backup plan to your attachment storage backend
* use sensible upload limits
* review public memo visibility carefully when attachments are involved
* remember that media-heavy instances need stronger storage planning than text-only instances
---
# Export & Import
URL: https://usememos.com/docs/usage/export-import
Use **Settings → Export & Import** to keep a portable copy of your memos or move them to another instance. Export and import are available starting in Memos 0.31.
## Export your memos [#export-your-memos]
1. Sign in to the account whose memos you want to export.
2. Open **Settings → Export & Import**.
3. Under **Export memos**, choose **Export memos** and wait for the ZIP download.
The file is named `memos-export--.zip`. It uses Memos Export Format, with Markdown content and JSON metadata for each memo, plus attached files. You can read the Markdown outside Memos; keep the original ZIP intact for importing.
The export includes all memos you authored across Spaces, regardless of the current sidebar filters:
* active and archived memos, including comments you wrote
* creation and update times, visibility, pinned state, location, and Space references
* memo Relations and comment-parent references
* files attached to those memos, including files stored in the database, on disk, or in S3-compatible storage
External attachment links remain links; their remote files are not downloaded into the ZIP. Unused uploads and other people's memo content are not included, even when you can read them. An export of your memos is therefore not a complete export of a shared Space or its discussions.
The ZIP can contain private notes and files and is not encrypted. Store it somewhere appropriate for that content.
## Import a Memos export [#import-a-memos-export]
1. Sign in to your account on the destination instance.
2. Open **Settings → Export & Import** and select **Choose file** under **Import memos**.
3. Select the Memos export ZIP. Memos uploads and validates it before showing a preview; this step does not create or replace memos.
4. Review the memo and attachment counts, existing-memo count, and warnings.
5. If matching memos already exist in your account, choose how to handle them.
6. Choose **Import … memos**, then review the result.
Older files using the `memos-archive` format name are also accepted. A ZIP containing arbitrary Markdown files is not a Memos export.
### Choose how to handle existing memos [#choose-how-to-handle-existing-memos]
Memos identifies an existing memo by its ID, not by identical text or title.
| Option | Result for a matching memo in your account |
| ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| **Keep mine** | Skip it and keep your current version. This is the default. |
| **Replace with the imported version** | Replace it with the exported content and settings. Export before using this if you need to retain the current version. |
| **Create a copy** | Leave it unchanged and create a separate memo with a new ID. Repeating this option creates more copies. |
Memos without a match are created in your signed-in account. An ID collision with another user's memo creates a new ID rather than replacing their memo.
### Spaces, visibility, and discussions [#spaces-visibility-and-discussions]
Import does not create Spaces or memberships. It tries to match each exported Space to one you actively belong to, first by ID and then by name. If you want to keep that placement, create or join the destination Spaces before importing.
If no Space matches, the memo becomes **Unassigned**. A `SPACE` memo without a matching Space becomes `PRIVATE`, and the import reports a warning. Other visibility values are preserved, so review the audience before importing into an instance with different users or public-access settings.
Relations and comment threads are restored when their target memos can be resolved. A missing parent causes a new comment to become a top-level memo; missing references are omitted, with warnings. Replacing an existing memo does not change its comment parent. Reactions are recorded in the export for reference but are not recreated by import.
### Review the result [#review-the-result]
The report lists **Created**, **Updated**, **Skipped**, and **Failed** counts, plus warnings and individual failures. Some memos can succeed while others fail, so inspect the report before deciding whether to retry. Destination content and attachment limits still apply.
If the uploaded file expires before you confirm the import, choose the file again. Keep the source account and ZIP until you have checked the imported content, attachments, placement, and visibility.
## Personal exports and instance backups [#personal-exports-and-instance-backups]
Use this feature for your own memo content. It does not transfer user accounts, account or instance settings, access tokens, share links, revision history, or Space membership. For recovery of an entire instance, back up its database, attachment storage, and configuration following [Backup & Restore](/docs/operations/backup-restore).
To share a picture of one memo instead, use [Share as image](/docs/usage/sharing#share-as-image).
---
# Inbox
URL: https://usememos.com/docs/usage/inbox
The inbox is your notification center for collaboration activity. It collects events that involve you so you don't have to revisit memos to find replies.
## What shows up [#what-shows-up]
The inbox surfaces collaboration notifications:
* **Comments** — someone commented on one of your memos
* **Mentions** — someone mentioned you with `@` in a memo or comment
* **Space invitations** — someone invited you to join a Space on this instance
Rows show the sender, activity, and time, with memo context when available. The sidebar Inbox action carries an unread-count badge. Inbox remains global when you select a Space.
## Reading and filtering [#reading-and-filtering]
Open the inbox to see notifications newest-first. The contextual sidebar filters the list:
* **All** — every notification
* **Unread** — notifications you haven't opened yet
* **Archived** — notifications you've cleared
Clicking a comment or mention notification opens the related memo or comment and marks the notification read.
## Respond to a Space invitation [#respond-to-a-space-invitation]
An invitation shows the Space, sender, and proposed role. Choose **Accept** to join or **Decline** to dismiss the invitation. After accepting, choose **Open space** to browse it.
You do not gain membership until you accept. Archiving or deleting the notification does not accept the invitation; you can also manage pending invitations in **Settings → Spaces**. See [Spaces](/docs/usage/spaces) for member roles and visibility rules.
## Managing notifications [#managing-notifications]
* **Archive** an unread notification to clear it without opening the memo
* **Delete** a read or archived notification to remove it permanently
* notifications whose required memo is missing or unreadable are omitted; deleting a memo does not itself delete independent inbox records
## Good habits [#good-habits]
* skim **Unread** regularly so mentions and comments don't pile up
* archive notifications once you've acted on them to keep the list focused
* pair the inbox with [reactions and comments](/docs/usage/reactions-comments) as your main collaboration loop
---
# Linked Identities
URL: https://usememos.com/docs/usage/linked-identities
Linked identities connect your Memos account to external SSO accounts from configured identity providers. After a provider is linked, you can use that SSO account to sign in to the same Memos user.
## Sign in with SSO [#sign-in-with-sso]
If your instance has SSO providers configured, the sign-in page shows a button for each provider. Choose a provider, finish the authorization flow on the provider's site, and return to Memos.
The first time you sign in with an SSO account, one of two things happens:
* if the external account is already linked, Memos signs in to the linked user
* if the external account is new and registration is allowed, Memos creates a regular local user and links the SSO account
* if registration is disabled, the sign-in is rejected until the account is created or linked another way
For a new SSO user, Memos uses the mapped external identifier as the local username when it is valid, non-reserved, and available. In 0.31, new usernames allow 1–36 ASCII letters or digits and interior hyphens; lookup is case-sensitive. Otherwise it generates a UUID-based username. Your display name, email, and avatar can still come from the SSO provider when those fields are available.
## Link an SSO account [#link-an-sso-account]
Use account settings when you already have a Memos account and want to connect it to an external SSO account.
1. Sign in to Memos with your existing account.
2. Open account settings.
3. Find the linked identities or SSO account section.
4. Choose the provider you want to link.
5. Complete the provider authorization flow.
6. Return to Memos and confirm that the provider now appears as linked.
After linking, signing in with that provider account will open your existing Memos account instead of creating a separate user.
## Linking rules [#linking-rules]
Memos keeps local users and external identities separate. A linked identity records which provider account belongs to which Memos user.
The current rules are:
* one Memos user can link multiple SSO providers
* one Memos user can link only one external account per provider
* one external account can be linked to only one Memos user
* linking the same provider account again is treated as already linked
If you try to link a provider account that is already connected to another Memos user, Memos rejects the link. If your Memos account already has a different account linked for the same provider, unlink the current provider first or use the existing linked account.
## Unlink an SSO account [#unlink-an-sso-account]
Unlinking removes the connection between your Memos account and the external provider account. It does not delete:
* your Memos account
* the external provider account
* the identity provider configuration for the instance
* any memos, attachments, or settings in your account
Before unlinking, make sure you still have another way to sign in. You may lock yourself out if you unlink your only SSO account while password sign-in is disabled or unavailable for your account.
Admins can also remove linked identities for users when cleaning up accounts or recovering from a mistaken link.
## Troubleshooting [#troubleshooting]
If an SSO sign-in creates a different Memos user than expected, sign out and ask an admin to check which provider account is linked to each Memos user.
If SSO sign-in used to work but now fails, the identity provider configuration may have changed. Provider UID, identifier mapping, and identifier filters all affect whether Memos can match your external account to the existing linked identity.
For administrator setup details, see [Authentication](/docs/configuration/authentication).
---
# Memos
URL: https://usememos.com/docs/usage/memos
A memo is one thought, written down: short, untitled, and saved to your timeline in the order it happened. A good memo practice keeps writing quick while still making memos readable and searchable later.
## Core actions [#core-actions]
* create a memo from the global composer on any authenticated route
* edit content inline
* link related memos with Relations
* pin important memos
* set visibility before sharing
* archive memos that are no longer active
## Navigation and creation [#navigation-and-creation]
The resizable sidebar contains [Calendar](#calendar), [Map](#map), Views, tags, Quick Find, and navigation for the current route. Open the global composer from the sidebar to write without returning to Home.
Selecting a Space scopes browsing and memo creation to that Space. Check placement and visibility before saving; assigning a memo does not change its audience. Existing memos remain Unassigned after upgrading. See [Spaces](/docs/usage/spaces) for scope and membership rules.
Authors can edit their own memos; editing an assigned memo also requires active membership in its Space. Active instance administrators can read and manage individual memos without authorship or Space membership. Space admin roles do not grant editing rights to another author's content.
## What the editor supports [#what-the-editor-supports]
* Markdown formatting
* decorated source editing that keeps Markdown syntax directly editable
* a formatting toolbar and keyboard shortcuts
* focus mode for a quieter writing surface
* list indentation with `Tab` and `Shift+Tab`
* inline tags such as `#project-x`
* code blocks and checklists
* file attachments
* memo visibility controls
* tag suggestions when you type `#`
* auto-saved drafts cached locally so content is not lost on page reload
In 26.10, new drafts offer optional tag, checklist, and visibility suggestions based on your current filters or selected View. Apply a suggestion to add it to the draft; it disappears once fulfilled. Choose the Space and visibility together in the audience menu, then save the memo.
## Browsing your memos [#browsing-your-memos]
In 26.10, Timeline, Calendar, Map, and Attachments retain the selected creator and [Space](/docs/usage/spaces) when you switch between them. Combine that scope with a [View](/docs/usage/views) or tag filters to narrow readable memos. Select the main **Memos** context to browse across Spaces. Archived memos are available separately under [Archived](/docs/usage/search-archive#archive).
Calendar and Map also support signed-out visitors when public access is enabled; visitors only see memos they can read. Photos and author avatars help distinguish entries when browsing several creators.
### Feed [#feed]
Choose one, two, three, or automatic columns in your display preferences.
Compact mode and link previews are configurable there too, and the choices are
saved for your account. Link previews discover metadata from oEmbed, Open Graph, Twitter Cards, JSON-LD, and ordinary HTML when the linked site supplies it. Sites without usable metadata may still appear as plain links. The single-column layout shows full memo content by
default; multi-column and compact layouts favor faster scanning.
Single-creator feeds show pinned memos with a corner marker; mixed-author feeds stay chronological. When you return from a memo detail
page, Memos restores your previous feed position so you can continue where you
left off.
### Calendar [#calendar]
Open **Calendar** from the sidebar to revisit a day's notes or review a month. Use the previous and next month controls, or select the month heading to choose another month and year. **Today** returns to the current month.
Select a day to read its memos in a panel on desktop or below the grid on mobile. Days show counts and previews when available. The calendar uses your local time zone and the selected creation or update time setting, with creation time as the default.
To fill in an entry for a particular date, open that day and choose **New memo on this day**. The composer starts with that date as the creation and update time and uses the current Space. Check the date, placement, and visibility before saving. Later edits can move a memo to a different day when browsing by update time; use creation time to review a journal by its entry dates.
Calendar groups notes by their timestamps; it does not assign due dates to checklist items. If a day looks empty, check the active filters and time setting.
### Map [#map]
Open **Map** from the sidebar to browse memos with saved locations. Select a marker to read the notes at that location, or choose **Show all results** to fit the matching locations into view. With a single location selected, **Write here** starts a memo with that location and the current Space filled in.
To add a location to a memo:
1. Create or edit the memo and choose **Add location** from the editor's add menu.
2. Select a point on the map or enter latitude and longitude. Allowing browser location access can help set your current position; you can also choose manually.
3. Enter a location label, choose **Confirm**, and save the memo.
Writing a place name or attaching a photo with location metadata does not by itself place the memo on Map. Anyone who can read the memo can see its saved location, so check visibility before sharing.
If no markers appear, check for saved locations and active filters; use **Clear filters** when offered. A newly saved memo may fall outside the current filters. If the map background fails to load, use **Retry**; your memo results remain available.
## Memo detail [#memo-detail]
Opening a memo shows its full content and discussion alongside a property rail
for metadata and actions such as visibility, tags, relations, attachments,
reactions, and sharing. On smaller screens, the same controls remain available
in a responsive layout.
## Memo properties [#memo-properties]
Memos automatically computes properties from memo content. These can be used in filter expressions:
| Property field | Meaning |
| ---------------------- | ------------------------------------- |
| `has_link` | Contains one or more Markdown links |
| `has_code` | Contains code blocks or inline code |
| `has_task_list` | Contains at least one task list item |
| `has_incomplete_tasks` | Contains unchecked `- [ ]` task items |
| `has_location` | Has location data attached |
## Linking memos with Relations [#linking-memos-with-relations]
Choose **Link memo** from the editor's add menu, search active memos you own, and select one. After you save, the current memo displays the outgoing connection under **Referencing**; the selected memo displays the incoming connection under **Referenced by**.
Relations are separate from Markdown links. Pasting a memo URL into the content creates a normal link but does not create a Relation or an incoming reference. Use Relations to connect memos to each other, and use Markdown links when the URL itself should be part of the memo.
A Relation does not grant access to either memo. Each side keeps its own visibility, and readers only see connections to memos they can already access.
## Useful memo metadata [#useful-memo-metadata]
* placement: Unassigned or exactly one [Space](/docs/usage/spaces)
* visibility: `PRIVATE`, `PROTECTED`, `PUBLIC`, or `SPACE`
* tags extracted from inline hashtags
* attachments such as screenshots and documents
* checklist items for lightweight task tracking
* creation and update times — the timeline and Calendar order and group memos by one of them (creation time by default); when editing a memo, select the timestamp at the top of the editor to change either time
## Good habits [#good-habits]
* keep each memo focused on one topic or update
* use headings when a memo gets long
* add tags while writing, not later
* archive stale memos instead of leaving everything active forever
* pin only the memos that truly deserve persistent attention
## Related guides [#related-guides]
* [Use Memos as a Digital Bullet Journal](/docs/guides/bullet-journal) for rapid logging and reflection.
* [Use Memos for GTD](/docs/guides/getting-things-done) for action management.
* [Build a Zettelkasten in Memos](/docs/guides/zettelkasten) to develop ideas from evidence.
* [Export & Import](/docs/usage/export-import) to download your memos and attachments or move them to another instance.
---
# Reactions & Comments
URL: https://usememos.com/docs/usage/reactions-comments
Beyond writing your own notes, Memos supports lightweight collaboration on memos: emoji reactions, threaded comments, and user mentions. Participation requires sign-in and read access. For a memo assigned to a Space, commenting and reacting also require active membership in that Space.
## Reactions [#reactions]
React to a memo with an emoji from the reaction selector in the memo header.
* reactions are available on readable, non-archived memos when you have permission to participate
* each reaction belongs to the user who added it; administrators cannot remove someone else's reaction merely because of their role
* click an emoji to add your reaction; click it again to remove it
* the set of allowed reactions is configured by admins in **Settings → Memo**
Reactions are a fast way to acknowledge a memo without writing a comment.
## Comments [#comments]
Open a memo's detail page to read and add comments.
* commenting requires sign-in, read access, and membership when the context memo is assigned to a Space
* comments support the full Markdown editor, just like memos
* each comment is an independent, author-owned memo connected to its context memo, so it can be reacted to and linked directly
* each comment has its own placement and visibility; a relation does not grant access to either memo
* in 26.10, deleting the context memo also deletes its comments and nested replies
* the memo's author is notified in their [inbox](/docs/usage/inbox) when a new comment is posted
Comments live on the memo's detail page rather than in the main timeline, which keeps feeds focused on top-level notes.
### Comment visibility and API behavior [#comment-visibility-and-api-behavior]
A discussion only includes comments the reader can independently access. Check the comment's placement and audience before posting; they are not inherited by the API. `CreateMemoComment` defaults omitted visibility to `PRIVATE`.
Use `CreateMemoComment` to create a comment and its context relation together. `SetMemoRelations` rejects `COMMENT` relations. In 26.10, removing a parent memo deletes the comment subtree; in 0.31, parent deletion only removed its incident relations. An eligible comment can also be shared independently through the API; its share exposes only that comment.
## Mentions [#mentions]
Reference another user inside a memo or comment with `@`, for example `@alice`. Mentions use exact-case usernames: `@Alice` does not refer to `alice`. New usernames contain 1–36 ASCII letters or digits, with hyphens only inside the name. Mentions respect Markdown context, so code, links, and escaped text do not create ordinary mentions. Legacy names outside the supported grammar, including email-like names, underscores, or non-ASCII spellings, cannot be authored as new mentions.
Mentioned users with access to the memo receive a notification in their [inbox](/docs/usage/inbox) linking back to the memo, which makes mentions useful for looping someone into a note or comment thread.
## Good habits [#good-habits]
* use reactions for quick acknowledgement and comments for anything that needs a reply
* keep comment threads on-topic with the parent memo
* mention people sparingly so notifications stay meaningful
* anonymous viewers can read reactions and comments on normal public memo pages when public mode is enabled
* a share-token page includes the selected memo and its reactions, but not the surrounding comment thread or relation graph
---
# Search & Archive
URL: https://usememos.com/docs/usage/search-archive
## Search [#search]
Use search to narrow memos by:
* content text
* tags
* visibility
* time range
* whether location data is present
* reusable filters with Views
A memo has no separate title field, so search works best when you keep opening lines, headings, and tags consistent.
## Quick Find and browsing scope [#quick-find-and-browsing-scope]
Open Quick Find with the sidebar search action. The global Cmd/Ctrl+K shortcut was removed in 0.31.
* **Text** searches for words in memo content. Matching text is highlighted in the results.
* **Expression** accepts the same [CEL filter syntax as Views](/docs/usage/views#filter-expression-syntax), for example `has_location && tag in ["travel"]` or `space == null && has_incomplete_tasks`.
Press **Enter** to search. In Expression mode, **Shift+Enter** adds a new line. Check the scope shown at the top of Quick Find: the current collection, Space, View, and filters can narrow the results. To reuse an expression, copy it into a new [View](/docs/usage/views#create-a-view).
Searching from Calendar, Map, or Attachments opens the matching memo list in Home within the same Space context.
Home and Explore filters follow the selected Space. [Views](/docs/usage/views) reuse CEL expressions, including `has_location`, `space == null` for Unassigned memos, and `visibility == "SPACE"` for members-only memos.
## Archive [#archive]
Archived is global across Spaces. Archived memos are kept but hidden from the main timeline. Use archiving when a memo is still worth keeping but no longer belongs in active daily views.
Typical archive routine:
* archive finished projects or stale references
* restore a memo when it becomes relevant again
* combine archive review with search when looking for older material
## Public sharing and discovery [#public-sharing-and-discovery]
Search only returns memos you can read. The instance access policy determines whether anonymous visitors can discover `PUBLIC` memos; the canonical instance URL does not control that policy. Use `PRIVATE` for author-only notes, `SPACE` for members of the assigned Space, or `PROTECTED` for signed-in instance users. See [Sharing](/docs/usage/sharing).
## Related guides [#related-guides]
* The [Memos Bullet Journal guide](/docs/guides/bullet-journal) uses recent-log and incomplete-task filters for daily and monthly reflection.
* The [Memos GTD guide](/docs/guides/getting-things-done) shows how checking and archiving completed actions keeps active views focused without discarding their history.
* The [Memos Zettelkasten guide](/docs/guides/zettelkasten) uses search to find nearby ideas before creating meaningful Relations.
---
# Sharing
URL: https://usememos.com/docs/usage/sharing
Sharing in Memos has two layers: **visibility**, which decides who can reach a memo through the app, and **share links**, which create a standalone URL for a single memo.
## Visibility levels [#visibility-levels]
Every memo has one of four visibility levels, set from the editor before or after posting:
* `PRIVATE`: only you can read the memo
* `PROTECTED`: any signed-in user on the instance can read it
* `PUBLIC`: anonymous visitors can read it when the instance is in public mode
* `SPACE`: active members of the memo's assigned Space can read it
The `ACCESS` instance setting controls public or private access independently of `MEMOS_INSTANCE_URL`. With public access enabled, public memos can be discovered through Explore and public profiles. In private mode, ordinary `PUBLIC` memo pages require sign-in.
Placement and visibility are independent. Putting a memo in a Space does not change its audience: an assigned `PRIVATE` memo stays author-only, and an assigned `PROTECTED` memo remains readable by other signed-in users. `SPACE` visibility requires a Space assignment. See [Spaces](/docs/usage/spaces).
## Share links [#share-links]
Open a memo's detail page and use the **Share** section in the sidebar to create a public link for that single memo:
* **Open share panel** — create, list, and revoke share links. Each link can be set to expire **never, after 1 day, 7 days, or 30 days**.
* A share link resolves without sign-in, including for `PRIVATE` and `PROTECTED` memos, and signs attachment URLs so images and files load for anonymous viewers.
* The token exposes only the selected memo, its attachments, and its reactions. It does not expose the surrounding parent memo, comments, or relation graph.
* Revoke a link at any time to immediately stop access.
Only the memo's author can manage its share links; assigned memos also require active Space membership. The API can share a comment independently, exposing that comment alone rather than the parent or discussion.
`SPACE` memos cannot have share links. Revoke active links before changing a memo's visibility to `SPACE`. An existing share link is a separate grant of access, so switching the instance to private mode does not revoke it.
## Share as image [#share-as-image]
The same **Share** section offers **Open image**, which renders the memo as a self-contained image you can download and post anywhere — handy for chat apps or social media where a link would not render the content.
## What viewers can and can't do [#what-viewers-can-and-cant-do]
Anonymous public-mode viewers can follow the normal public memo page, including its readable discussion context. A share-token viewer receives the narrower standalone representation described above. Neither anonymous route allows editing, reacting, commenting, or managing shares.
## Safe sharing habits [#safe-sharing-habits]
* choose visibility intentionally before posting, especially for operational or sensitive notes
* review attachments before publishing a memo openly or minting a share link
* prefer time-limited share links over `PUBLIC` when you only need to share temporarily
* disable public memos entirely (Admin → Instance Settings) if your instance is private
---
# Spaces
URL: https://usememos.com/docs/usage/spaces
Spaces bring members and memos together inside one Memos instance. Each memo still belongs to its author. A Space provides a shared place to contribute and browse; it does not grant shared editing rights.
## Create or join a Space [#create-or-join-a-space]
1. Open the Space switcher in the sidebar and choose **Create Space**.
2. Enter a name and an optional description. Memos generates a stable ID, or you can supply a custom ID during creation.
3. Open **Settings → Spaces** to manage the Space. Its creator becomes the first Space admin.
4. In the members section, invite an existing user and choose the **User** or **Admin** role.
5. The invited user opens **Inbox** and chooses **Accept** or **Decline** on the invitation. Invitations are also available in **Settings → Spaces**. After accepting, choose **Open space** or select it from the sidebar switcher.
An invitation grants no access until accepted. It is an invitation to an existing account on the instance, not an email invitation or an account registration link.
A Space's ID stays stable when its name changes. Newly generated IDs use UUIDv4. Custom IDs contain 1–36 ASCII letters or digits, with hyphens allowed inside the ID. Spaces can have the same display name, so use their IDs to distinguish them in integrations.
Space admins can change the name, description, and icon from **Settings → Spaces**. Use the icon picker to choose an icon or emoji so the Space is easier to recognize in the sidebar and invitations.
## Placement and visibility [#placement-and-visibility]
A memo is either **Unassigned** or assigned to exactly one Space. Unassigned means it has no Space; it is not a default Space or a visibility level. Upgrading to 0.31 leaves existing memos Unassigned.
Choose placement and visibility separately:
| Visibility | Who can read the memo through normal memo access |
| ----------- | ------------------------------------------------------------------------------- |
| `PRIVATE` | Its author |
| `PROTECTED` | Signed-in users on the instance |
| `PUBLIC` | Signed-in users, plus anonymous visitors when public instance access is enabled |
| `SPACE` | Active members of its assigned Space |
Active instance administrators can also read and manage individual private and Space-only memos without Space membership. Collection listings still filter by audience.
`SPACE` requires a Space assignment. Assigning a `PRIVATE` memo does not make it visible to the other members. Assigning a `PROTECTED` or `PUBLIC` memo does not restrict it to members. A non-member who can read such a memo does not gain access to the Space feed, membership list, or settings.
Choose the Space when composing a memo, or change placement on a memo you authored. You must be a member of the destination Space. Moving a memo preserves its identity and relations. For a `SPACE` memo, confirm the destination audience when moving it; choose a different visibility when returning it to Unassigned.
### Move an existing memo [#move-an-existing-memo]
In 26.10, Space placement is part of the editor's audience menu:
1. Open a top-level memo you can edit and choose **Edit**.
2. Open the audience menu and choose a destination Space or **Unassigned**.
3. Review visibility in the same menu. Moving a members-only memo changes which members can read it; Unassigned memos cannot use `SPACE` visibility.
4. Save the memo to apply content, Space, and visibility changes together.
This replaces the separate **Move to Space** action available in 0.31.
Existing reactions stay with the memo. Comments and linked memos keep their own placement and access rules; moving one memo does not move a whole discussion.
`SPACE` memos cannot have share links. Revoke active share links before changing a memo to `SPACE`. See [Sharing](/docs/usage/sharing).
## Browse in context [#browse-in-context]
Select a Space from the sidebar switcher to scope browsing, new memo creation, statistics, filters, and attachments to that Space. Choose the main **Memos** context to browse across the memos available to you. In 26.10, switching between Timeline, [Calendar](/docs/usage/memos#calendar), [Map](/docs/usage/memos#map), and Attachments preserves both the creator and Space selection; Calendar and Map can show readable memos from several creators.
Opening a memo and returning to its collection preserves the Space and filters, so you can continue browsing where you left off.
Archived, Inbox, user profiles, and Settings remain global. Selecting a Space does not restrict these pages to that Space. The [global composer](/docs/usage/memos) remains available on authenticated routes; check its placement and visibility before saving.
[Views](/docs/usage/views) and tags still organize and filter memos within the current browsing scope. A Space feed only shows assigned memos that you can read, and excludes comment memos from the main timeline.
## Roles and authorship [#roles-and-authorship]
| Role | Responsibilities |
| ----------- | ----------------------------------------------------------------------------------------------------------------- |
| Space User | Browse readable Space memos and contribute their own memos, comments, and reactions |
| Space Admin | The same participation rights, plus Space metadata, invitations, member roles, member removal, and Space deletion |
Apart from active instance administrators, only a memo's author can edit its content or visibility and manage its attachments, references, and share links. For an assigned memo, these actions also require active membership. Reactions belong to the user who added them. Commenting or reacting to an assigned memo requires both read access and membership in its Space.
Active instance admins can read and manage individual memos without authorship or Space membership, but are not automatically Space members. Space admins govern the Space, but also cannot edit another author's memo. A Space must retain at least one active admin: promote another member before the last admin leaves, is removed, or is archived.
## Leave or delete a Space [#leave-or-delete-a-space]
Leaving a Space or removing a member keeps their memos in place. A former member loses members-only read access. As an author, they retain authority to delete their own memos or withdraw or move them; they cannot otherwise edit memos left in the former Space. Moving to another Space requires membership there.
**Deleting a Space permanently deletes every memo directly assigned to it**, including assigned comments and the resources those memos own. It does not follow relations into another Space or into Unassigned memos. There is no Space archive or restore action; a backup is the recovery path.
Accounts with active Space memberships cannot be deleted, even through an API request with `force`. Resolve memberships first. Removing membership and deleting the Space have different effects on contributed memos, so choose the action that matches your intent.
## Related pages [#related-pages]
* [Users & Roles](/docs/admin/users-roles)
* [Reactions & Comments](/docs/usage/reactions-comments)
* [Export & Import](/docs/usage/export-import) — how Space placement is handled when moving your memos between instances
* [Upgrading to 0.31](/docs/operations/upgrade#upgrading-to-031)
---
# Tags
URL: https://usememos.com/docs/usage/tags
Tags are created directly from memo content. Write `#tagname` in ordinary Markdown text and Memos extracts it automatically. The same grammar is used by rendering, editing, filtering, statistics, and the API.
## Tag basics [#tag-basics]
```markdown
Working on the #backend API today.
This relates to #project-alpha and #development.
Meeting with #team tomorrow to discuss #roadmap.
```
Tags can contain multilingual letters, combining marks, digits, underscores, emoji, `-`, `+`, and `&`. Numeric-only tags such as `#2026` are valid. Word-internal apostrophes work in tags such as `#O’Brien` and `#team's`.
Use `/` between non-empty segments for hierarchy: `#project/backend` also contributes the ancestor tag `project`. A slash cannot start or end a tag or separate empty segments. Tag values are case-sensitive; `#Work` and `#work` remain distinct.
Tags are recognized in ordinary text, including headings and list items. Code, links, images, URLs, and other opaque Markdown contexts do not create tags. Escape a literal hash with a backslash, such as `\#not-a-tag`. Spaces and unsupported punctuation end a tag: `#release.notes` produces `release`, while `#C++` and `#R&D` remain complete tag values.
### Existing memos after upgrading [#existing-memos-after-upgrading]
0.31 does not automatically rebuild stored tag indexes. Rendering and editing use the new grammar immediately, while filters, counts, and statistics adopt it as each memo is saved again. If an older memo displays a tag but does not yet appear in its filter, save that memo again.
## Personal tag appearance [#personal-tag-appearance]
Open your user settings to assign a background color or content-blur rule to a tag. These rules are personal: each user controls how matching tags and memo content appear in their own account.
Rules accept exact tag names or anchored regular-expression patterns. For example, `project/.*` applies to every tag under that prefix. Memos validates a pattern before saving it.
When upgrading to 0.30, existing instance-level tag metadata is copied to current users during migration. Later changes are stored per user.
## Good tag habits [#good-tag-habits]
* pick a consistent case style
* avoid near-duplicate tags for the same concept
* use hyphens for multi-word tags
* prefer a small, predictable vocabulary over endless one-off tags
## Filters [#filters]
Memos also supports richer filtering beyond plain text search. Views can combine tags with memo properties.
Examples:
```txt
tag in ["work"]
tag in ["work"] && visibility == "PRIVATE"
has_incomplete_tasks
has_link
tags.exists(t, t.startsWith("project"))
```
## When tags help most [#when-tags-help-most]
* ongoing projects
* meeting notes
* recurring areas of work
* public knowledge you want to group consistently
## Related guides [#related-guides]
* use [Views](/docs/usage/views) to save filters you run often
* combine tags with [search](/docs/usage/search-archive) when browsing older memos
* align tag naming with how your team expects to browse content
* let recurring subjects become Collections with the [digital Bullet Journal guide](/docs/guides/bullet-journal)
* build a complete GTD practice with the [GTD guide](/docs/guides/getting-things-done)
* use topic tags as entry points with the [Zettelkasten guide](/docs/guides/zettelkasten), while Relations carry specific connections
---
# Views
URL: https://usememos.com/docs/usage/views
A View is a named, reusable set of memo filter conditions. Opening a View shows the memos that currently match those conditions. A View does not store copies of memos or specify a display layout such as a list or cards.
Use Views for filters you revisit, such as work items, incomplete tasks, or recent public posts.
## Upgrading existing filters [#upgrading-existing-filters]
Views replace the legacy `Shortcut` resource in 0.31. Stored filters migrate automatically. Update bookmarks to `/views` and integrations to `UserService` (`MemoView` resources) and the MCP tool `user_list_memo_views`. REST paths use `/api/users/*/views/*` in 26.10 and `/api/v1/users/*/views/*` in 0.31.
In 26.10, the built-in Tasks View is removed. Create a View with `has_task_list && has_incomplete_tasks` to keep browsing unfinished tasks.
## Create a View [#create-a-view]
Views are created and managed on the **Views** page at `/views`, which you open from the sidebar.
1. open the Views page and choose **Create**
2. give the View a clear title and optionally choose a custom icon or emoji with the icon picker
3. enter a [filter expression](#filter-expression-syntax)
4. choose **Validate** to dry-run the expression — this checks the filter without saving, so you catch typos before committing
5. choose **Save**
Title and filter are both required, and an invalid expression is rejected on save.
Views appear in the sidebar. Select one to apply its filter to your memo list; the selection also syncs to the URL, so you can bookmark it. To keep a search you tried in [Quick Find](/docs/usage/search-archive#quick-find-and-browsing-scope), copy its expression into a new View.
## Edit and delete Views [#edit-and-delete-views]
The Views page lists every View with its title and filter. Each row has a menu to:
* **Edit** — load the View back into the form to change its title, icon, or filter
* **Delete** — remove a View you no longer use, after a confirmation step
## Filter expression syntax [#filter-expression-syntax]
Views use CEL (Common Expression Language) filter expressions. A View filter must evaluate to `true` for memos you want included.
### Supported fields [#supported-fields]
| Field | Type | Example |
| ---------------------- | --------------------- | ------------------------------------------------- |
| `content` | string | `content.contains("meeting")` |
| `creator` | string | `creator == "users/1"` |
| `creator_id` | integer | `creator_id == 42` |
| `created_ts` | timestamp | `created_ts >= now - duration("24h")` |
| `updated_ts` | timestamp | `updated_ts >= timestamp("2026-01-01T00:00:00Z")` |
| `visibility` | string | `visibility == "PUBLIC"` |
| `pinned` | boolean | `pinned` |
| `tags` | string list | `"project/backend" in tags` |
| `tag` | tag-tree alias | `tag in ["work"]` |
| `has_task_list` | boolean | `has_task_list` |
| `has_link` | boolean | `has_link` |
| `has_code` | boolean | `has_code` |
| `has_incomplete_tasks` | boolean | `has_incomplete_tasks` |
| `has_location` | boolean | `has_location` |
| `space` | resource name or null | `space == "spaces/team-notes"` |
### Operators and functions [#operators-and-functions]
* comparisons: `==`, `!=`, `<`, `<=`, `>`, `>=`
* logic: `&&`, `||`, `!`, and parentheses `()`
* membership: `tag in ["work", "team"]`, `"project/backend" in tags`, `visibility in ["PUBLIC", "PROTECTED"]`
* string functions: `contains()`, `startsWith()`, `endsWith()`, and `matches()`
* collection functions: `exists()`, `all()`, `exists_one()`, and `size()`
* set functions: `sets.contains()`, `sets.intersects()`, and `sets.equivalent()`
* time values: `now`, `duration("24h")`, and `timestamp(...)`
Boolean fields can be used directly without `== true`:
```
pinned && has_incomplete_tasks
```
### Tag matching [#tag-matching]
Use `tag in [...]` when you want to match one or more tag trees:
```txt
tag in ["work"]
tag in ["project", "team"]
```
`tag in ["project"]` also matches nested tags such as `project/backend`.
Use `tags.exists()` for more specific tag patterns:
```txt
tags.exists(t, t.startsWith("archive"))
tags.exists(t, t.endsWith("/bug"))
tags.exists(t, t.contains("todo"))
```
Other collection predicates and set operations are also available:
```txt
tags.all(t, t.startsWith("work/"))
tags.exists_one(t, t.startsWith("project/"))
sets.intersects(tags, ["work", "urgent"])
sets.equivalent(tags, ["inbox"])
size(tags) == 0
```
`tags.all()` matches only non-empty tag sets. Use `size(tags) == 0` when you specifically want untagged memos.
### String matching [#string-matching]
Content matching is case-insensitive for `contains()`, `startsWith()`, and `endsWith()`:
```txt
content.contains("meeting")
content.startsWith("TODO")
content.endsWith("done")
```
Use `matches()` for regular expressions:
```txt
content.matches("v[0-9]+")
```
Regular expressions are validated before a View is saved. Keep patterns portable: SQLite, PostgreSQL, and MySQL use different regular-expression engines.
### Time-based filters [#time-based-filters]
`created_ts` and `updated_ts` are CEL timestamps. `now` is a timestamp variable, not a function. Use durations for relative windows and `timestamp()` for fixed instants or Unix epoch seconds:
```txt
created_ts >= now - duration("1h")
created_ts >= now - duration("168h")
updated_ts >= timestamp("2026-01-01T00:00:00Z")
created_ts >= timestamp(1767225600)
```
Timestamp accessors support calendar filters:
```txt
created_ts.getFullYear() == 2026
created_ts.getMonth() == 0
created_ts.getDayOfWeek() == 0
created_ts.getMonth() == now.getMonth() && created_ts.getDate() == now.getDate()
```
Months are zero-based (`0` is January), and days of the week are zero-based (`0` is Sunday). Accessors are evaluated in UTC for SQLite and PostgreSQL; MySQL reads timestamp columns in the database session time zone.
## Example Views [#example-views]
| Name | Filter | | |
| ------------------ | ------------------------------------------------------------------------------------- | - | ------------ |
| Work TODOs | `tag in ["work"] && has_incomplete_tasks` | | |
| Public posts | `visibility == "PUBLIC"` | | |
| Posts with links | `has_link` | | |
| Recent notes | `created_ts >= now - duration("168h")` | | |
| Team updates | `tag in ["team"] && visibility == "PROTECTED"` | | |
| Unfinished tasks | `has_task_list && has_incomplete_tasks` | | |
| Pinned references | \`pinned && (has\_link | | has\_code)\` |
| Active projects | `tags.exists(t, t.startsWith("project")) && !tags.exists(t, t.startsWith("archive"))` | | |
| Untagged | `size(tags) == 0` | | |
| With location | `has_location` | | |
| Unassigned | `space == null` | | |
| Members-only notes | `visibility == "SPACE"` | | |
| One Space | `space == "spaces/team-notes"` | | |
| Release notes | `content.matches("v[0-9]+\\.[0-9]+")` | | |
## Good View patterns [#good-view-patterns]
* incomplete tasks for one project
* pinned or high-signal memos
* public notes you review before sharing
* recent memos from a time window
* resource collections with links or attachments
## Management tips [#management-tips]
* keep names short and obvious
* delete stale Views you no longer use
* update filters when your tag vocabulary changes
* prefer a few durable Views over dozens of narrow one-off views
## Limits to remember [#limits-to-remember]
Views are personal filters, not shared Space settings. They apply within the current browsing scope and never grant access to additional memos. If a Space filter conflicts with the selected Space, it can return no results. Switch to the main Memos context when you want to filter across available Spaces. Use the actual stable Space ID in a `spaces/...` filter; `team-notes` above is an example custom ID.
Memos supports a deliberate subset of CEL that can be translated consistently to SQLite, MySQL, and PostgreSQL. Use the **Validate** action before saving; it reports unsupported fields, type mismatches, invalid regular expressions, and operations that cannot be translated.
## Related guides [#related-guides]
* [Use Memos as a Digital Bullet Journal](/docs/guides/bullet-journal) with recent-log and unfinished-task filters.
* [Use Memos for GTD](/docs/guides/getting-things-done) with action, waiting, project, and review filters.
* [Build a Zettelkasten in Memos](/docs/guides/zettelkasten) with active-question and recent-memo filters.
---
# Writing Markdown
URL: https://usememos.com/docs/usage/writing-markdown
Memos stores memo content as plain text and renders it with Markdown. That keeps
content portable while still supporting rich formatting such as checklists,
tables, code blocks, links, and footnotes.
The editor keeps the Markdown source editable while decorating recognized
syntax. Use the formatting toolbar or keyboard shortcuts for common formatting,
and press `Tab` or `Shift+Tab` to indent or outdent list items.
## Core syntax [#core-syntax]
````markdown
# Heading 1
## Heading 2
**bold**
_italic_
~~strikethrough~~
- [ ] open task
- [x] completed task
```go
fmt.Println("hello from memos")
```
````
## Common patterns [#common-patterns]
* headings for longer notes
* task lists for planning
* fenced code blocks for snippets
* blockquotes for references
* tables when structure matters
* tags like `#project-x` inline in the memo body
## Inline images [#inline-images]
Place the cursor where the image belongs, then upload, paste, drop an image, or choose an existing attachment. The editor inserts its Markdown image reference into the text. You can mix prose and images in the order you need.
Retry a failed inline upload from the draft before publishing. See [Attachments](/docs/usage/attachments) for draft restoration, file access, and optional media metadata.
## Math and currency [#math-and-currency]
Ordinary currency amounts should remain text. Use supported explicit math delimiters for formulas; 0.31 no longer treats ordinary currency as inline math.
## Code blocks [#code-blocks]
Use fenced code blocks with a language identifier when useful:
````markdown
```ts
const visible = memo.visibility === "PUBLIC";
```
````
## Checklists [#checklists]
Task lists are especially useful in Memos because they turn ordinary notes into lightweight work queues:
```markdown
- [ ] Draft release notes
- [ ] Review production config
- [x] Create backup
```
## Footnotes [#footnotes]
Add a footnote reference in the text and define it elsewhere in the memo:
```markdown
This statement needs context.[^context]
[^context]: Supporting details can live at the end of the memo.
```
## Writing tips [#writing-tips]
* keep one memo focused on one topic or update
* use headings in longer memos so they remain readable
* prefer plain Markdown over screenshots of text
* use tags consistently so search and Views stay useful
* choose visibility carefully before sharing externally
* use code fences and blockquotes to make technical notes easier to scan later
## Related guides [#related-guides]
* [Use Memos as a Digital Bullet Journal](/docs/guides/bullet-journal) to rapid-log tasks, events, and notes with ordinary prose and Markdown checkboxes.
* [Build a Zettelkasten in Memos](/docs/guides/zettelkasten) to develop focused Markdown memos into connected ideas.
---
# 20k GitHub Stars in Just 2 Years 🤩
URL: https://usememos.com/blog/20k-github-stars-in-2-years
In early November 2023, we achieved a major milestone - Memos had reached 20,000 stars on GitHub. This achievement is a result of our continuous efforts and the support of our community. In this article, we'll look back at the journey of the past two years, dive into what led to this achievement, and see what's in store for the future.
## What We've Done in Two Years [#what-weve-done-in-two-years]
Over the past two years, Memos is more than just a note-taking service; it's an entire ecosystem designed to meet the evolving needs of its users. And it has incorporated a diverse range of enhancements:
* **Multilingual Support**: Memos now supports over 20 languages, making it accessible to a diverse global audience.
* **Flexible Database Options**: You have the choice between using the built-in SQLite for a single-file setup or opting for the popular MySQL, providing you with more control and versatility in managing your data.
* **Impressive Features**: We've introduced a range of amazing features, including support for AWS S3 storage, Single Sign-On (SSO), and integration with Telegram Bot. These enhancements have made Memos even more powerful and advanced.
* **Simplified Note-Taking**: Memos primarily focuses on plain text note-taking while also providing support for common markdown formatting for those who like to stylize their notes.
* **Enhancing Social Interaction**: We've boosted the social aspect by introducing personal profiles, memo comments and RSS feeds. This allows you to share your greate ideas with others simply.
* **Robust Community**: The Memos community offers a range of services, including mobile apps, browser extensions, and integration with other software applications. This enhances Memos' user-friendliness and usability.
## Letting the Data Tell the Story [#letting-the-data-tell-the-story]
The statistics and data surrounding Memos serve as a compelling testament to the incredible journey this project has embarked on. They paint a vivid picture of its progress and success. These numbers aren't just figures; they are the milestones that reflect the dedication, hard work, and passion of the Memos community.
* **Over 800,000 Downloads**: The Docker image of Memos has been downloaded over 800,000 times, underlining its broad popularity within the community.
* **53 Releases in Two Years**: Memos has been released 53 versions, with an impressive average release interval of just 13.77 days. This consistent improvement ensures that this project stays up-to-date.
* **Contributions from 150+ Developers**: Over 150+ contributors have actively participated in the project, resulting in over 1,200+ pull requests. Memos is not just a project; it's a collective effort.
* **Thriving Community of 4,000+**: Memos has built a thriving community with over 4,000 members, drawing from platforms such as Telegram, Discord, GitHub, and others. This diverse community is a testament to Memos' broad appeal and active user base.
* **20,000 GitHub Stars**: Memos achieved 1,000 stars within its first year and continued its ascent to a remarkable 20,000 GitHub stars in its second year.
## What's Next? [#whats-next]
As we peer into the future, Memos remains unwavering in its commitment to a set of fundamental principles that will continue to guide its journey:
* **Exploring More Possibilities in Note-taking and Social Interaction**: We're excited to discover new possibilities in note-taking and social engagement. Mainly, we'll focus on enhancing the connectivity between notes and making social features more user-friendly.
* **Optimizing Functionality While Preserving Code Quality**: While we work on expanding and enhancing features, our primary goal is to ensure that every line of code contributes meaningfully to the user experience.
* **Staying True to Our Roots**: Memos will continue to uphold its core values, remaining permanently free and supporting private self-hosted, just as it has from the very beginning.
* **Heading to v1.0.0**: Our ultimate goal is the formal release of Memos' v1.0.0, a significant milestone in its ongoing journey. We are committed to achieving this goal and will continue to work towards it. 🦦
## In the End [#in-the-end]
Memos' success isn't just about the star numbers. It's proof of dedication, progress, and the impact of open source. If you haven't tried Memos yet, now's a great time. 🌟✨
---
# Best practices to write a TAG
URL: https://usememos.com/blog/best-practices-to-write-tag
In Memos, the tag is written in the content and displayed by a regex parser. If you have some misrecognized tags, you need a good way to manage your tags accurately, especially where they are written.
## Best practices [#best-practices]
Put tags always in the first or last line of content.
```markdown
#Mark #Website
The place for anyone from anywhere to build anything
Whether you’re scaling your startup or just learning how to code, GitHub is your home.
Join the world’s largest developer platform to build the innovations that empower humanity.
Let’s build from here.
```
```markdown
GitHub Copilot is your AI pair programmer that empowers you to complete tasks 55% faster by turning natural language prompts into coding
suggestions.
#Mark #Utils
```
## Not a good practice [#not-a-good-practice]
DO NOT add tags in the middle of the content. For example, in the GitHub markdown codeblock, the tag syntax will not be recognized.
```markdown
GitHub Actions automates your build, test, and deployment workflow with simple and secure CI/CD. #Mark
```
```markdown
GitHub Mobile fits your projects in your pocket, #Mark
so you never miss a beat while on the go.
```
---
# Choosing a Storage for Your Resource: Database, S3 or Local Storage?
URL: https://usememos.com/blog/choosing-a-storage-for-your-resource
In Memos v0.12.0, we introduces a new feature for saving resources into local file system, which means that there are now three storage options available: database, S3, and local storage. Each option has its own advantages and disadvantages, and choosing the right one depends on your specific needs.
## Database storage [#database-storage]
Database storage is designed to take advantage of SQLite's single-file database, making it easy to manage and integrate with other data. Transactions ensure data consistency, and it's good for small binary files. However, it has poor performance for large binary files, increases database size, and slows down backups, which can increase fragmentation in the database file.
## S3 cloud storage [#s3-cloud-storage]
S3 is a cloud storage service provided by Amazon that can store various types of files and offers high availability and scalability. It's also cost-effective for storing large files, making it a good choice for applications that need to store a lot of files. However, retrieving files can be slower than database or local storage, and it may require additional configuration and maintenance, as well as additional costs for data transfer and requests.
Related GitHub issue: [GitHub/121](https://github.com/usememos/memos/issues/121)
## Local storage [#local-storage]
Local storage is a simple data storage solution that can store various types of files and offers efficient data access and querying. It's good for small to medium-sized files and doesn't require additional costs or setup. However, it has limited space available, depending on the device and file system, and it's not suitable for large files or large numbers of files. It's also not as durable or reliable as database or S3 storage.
Related GitHub issue: [GitHub/344](https://github.com/usememos/memos/issues/344)
## Conclusion [#conclusion]
* If you mainly use text and have few files, use the default database storage.
* If you already have S3 object cloud storage, configure your S3 into Memos.
* If you don't have S3 and use a lot of images, use local storage.
Choose the storage option that best suits your needs. Remember, the right storage option can make a big difference in your application's performance and efficiency.
---
# Choosing Between SQLite and MySQL: The Database Dilemma
URL: https://usememos.com/blog/choosing-between-sqlite-and-mysql
In Memos v0.16.1, we've introduced support for MySQL as an alternative to the previously used SQLite database. This addition expands your choices for managing your data. In this article, we'll discuss the reasons behind our initial choice of SQLite and why we added MySQL support. We'll also explore the key differences between the two and offer guidance on which one you should choose for your specific needs.
## Why We Started with SQLite [#why-we-started-with-sqlite]
### Lightweight and Widely Supported [#lightweight-and-widely-supported]
At the inception of Memos, we selected SQLite as our primary database due to its lightweight nature and widespread use. SQLite's single-file design allows for easy deployment and integration across various systems. This makes it an excellent choice for applications that prioritize simplicity and compatibility.
### Versatile on Any Machine [#versatile-on-any-machine]
SQLite is well-suited for use on diverse hardware and software environments. Its small footprint and low resource requirements mean you can run it on virtually any machine, from resource-constrained devices to high-performance servers.
## Presenting MySQL Support [#presenting-mysql-support]
After Memos was launched, there were numerous user requests for support for other database types to enable seamless integration with popular cloud database services: [GitHub Issue #163](https://github.com/usememos/memos/issues/163), [GitHub Issue #1816](https://github.com/usememos/memos/issues/1816). With the primary focus being on MySQL support, we also took a moment to highlight its advantages.
### Cloud Compatibility [#cloud-compatibility]
The addition of MySQL support aligns with the evolving landscape of cloud computing and serverless architectures. MySQL offers seamless integration with cloud databases, allowing you to leverage the scalability and reliability of cloud infrastructure. This is especially beneficial if your application needs to operate in a serverless environment or if you require cloud-based data storage for better redundancy and accessibility.
### Improved Performance for Large Datasets [#improved-performance-for-large-datasets]
MySQL outperforms SQLite when it comes to handling large datasets and complex queries. If your application deals with substantial volumes of data or demands intricate database operations, MySQL might be the superior choice.
## The Key Differences [#the-key-differences]
### Performance and Scalability [#performance-and-scalability]
* SQLite: Suitable for lightweight applications and smaller datasets, but can struggle with larger volumes of data.
* MySQL: Well-suited for larger databases and applications with demanding performance requirements, particularly when hosted in the cloud.
### Cloud Integration [#cloud-integration]
* SQLite: Not inherently designed for cloud environments but can be used with additional configurations.
* MySQL: Built for cloud compatibility, making it a seamless choice for cloud-based applications.
### Resource Requirements [#resource-requirements]
* SQLite: Minimal resource usage, making it suitable for resource-constrained devices.
* MySQL: Requires more resources, ideal for applications with substantial computing power and memory available.
### Backup and Redundancy [#backup-and-redundancy]
* SQLite: Backup can be slower and may result in database fragmentation.
* MySQL: Offers robust backup solutions and better data redundancy.
## How to Choose [#how-to-choose]
When deciding between MySQL and SQLite for Memos, it's essential to consider your specific use case and existing infrastructure. Here's a tailored guideline to help you make the choice:
* If you have a clear understanding of the advantages MySQL can bring to your Memos instance, and you already have the necessary cloud server resources, opting for MySQL is a viable choice.
* Furthermore, you can always use SQLite as your database.
***
## References [#references]
* [Using MySQL as the Database Driver](/docs/configuration/database)
---
# New in Memos: Deployment-Managed Configuration
URL: https://usememos.com/blog/deployment-managed-configuration-in-memos
A while ago, I redeployed [demo.usememos.com](https://demo.usememos.com) for a reason that had nothing to do with a new release: someone had changed the login settings again.
Our demo is intentionally open so people can explore Memos without installing anything first. In an earlier version of the demo, that also meant a visitor could disable a login method or change an identity provider. The server was still healthy, yet the next person could no longer sign in. One of us then had to restore the configuration and redeploy.
It happened often enough that the problem became obvious: the login policy for our demo was stored in the wrong place.
In Memos 0.30, we added deployment-managed configuration to fix this. Our public demo is already using it, and the same feature is now available to self-hosters.
## What changed [#what-changed]
Memos can now load selected configuration from JSON files mounted under `/etc/secrets`. This includes OAuth2 identity providers and instance settings for general policy, storage, memo behavior, notifications, and AI providers.
Memos reads and validates every matching file during startup, before it begins serving requests. A resource supplied by a file takes precedence over the same resource in the database and cannot be changed through the UI or API. Settings not supplied by files continue to work as before.
This follows a familiar self-hosting pattern. [Mastodon](https://docs.joinmastodon.org/admin/config/), our clearest reference, loads deployment configuration when a process starts and keeps it authoritative for that process. The application does not copy it into an administrator-editable database record. Operators using Docker Compose, Kubernetes, or GitOps can therefore keep important policy and credentials with the deployment that owns them.
For a personal Memos instance, the admin UI remains the simplest option. Deployment-managed configuration is for the settings you do not want an in-app change to override.
## Try it with Docker Compose [#try-it-with-docker-compose]
Create `memos-secrets/memos-instance-setting-general.json`:
```json
{
"key": "GENERAL",
"generalSetting": {
"disallowUserRegistration": false,
"disallowPasswordAuth": false,
"customProfile": {
"title": "Team Memos",
"description": "Notes for our team"
}
}
}
```
Mount the directory read-only at `/etc/secrets`:
```yaml
services:
memos:
image: neosmemo/memos:stable
ports:
- "5230:5230"
volumes:
- ./memos-data:/var/opt/memos
- ./memos-secrets:/etc/secrets:ro
```
Then recreate the container so Memos loads the file:
```shell
docker compose up -d --force-recreate
docker compose logs memos
```
After startup, the file supplies the effective General settings. An administrator can still edit other, database-backed settings, but an attempt to update General settings is rejected by the API.
For an SSO-only deployment, add an identity-provider file such as `memos-idp-primary-sso.json` and set `disallowPasswordAuth` to `true`. Memos validates the two resources together and refuses to start if password login is disabled without an effective identity provider.
Kubernetes uses the same model: mount Secret-backed files at `/etc/secrets` and restart the workload after a change.
## A few details to remember [#a-few-details-to-remember]
* Files are loaded once. Updating one has no effect until Memos restarts.
* An invalid file stops startup instead of applying a partial configuration.
* A file-backed setting shadows the database value; it does not delete it. Removing the file and restarting reveals the stored value again.
* An instance-setting file supplies a complete group. Omitted fields use their defaults rather than values from the database.
There is no extra configuration table and no background reconciliation. Memos keeps one immutable snapshot in the running process and leaves the database untouched.
## Already running on our demo [#already-running-on-our-demo]
The public demo now receives its login-related configuration from mounted files. The current demo no longer exposes the administration experience, and the API also rejects attempts to change deployment-managed login resources.
This is the boundary we wanted. People can explore the product without accidentally removing the sign-in path for the next visitor, and every restart produces the same effective login configuration.
The full file formats and supported settings are available in the [deployment-managed configuration guide](/docs/configuration/deployment-configuration).
---
# Everything's Down. Why Self-Hosting Still Matters
URL: https://usememos.com/blog/everythings-down-why-self-hosting-still-matters
Early Monday morning, millions woke up to find their favorite apps had stopped working. Snapchat wouldn't load. Fortnite and Roblox were frozen. Signal messages sat undelivered. Even Amazon's own Ring doorbells and Alexa devices went silent.
The reason? Amazon Web Services went down.
For three hours, a huge chunk of the internet simply stopped. Not because those apps and services broke—but because they all ran on the same infrastructure. Someone else's infrastructure.
## When One Provider Controls Too Much [#when-one-provider-controls-too-much]
This keeps happening. AWS goes down. Google Cloud fails. Azure has issues. Cloudflare stumbles. And every time, the same thing occurs: one small problem snowballs into a worldwide crisis.
Cloud services were supposed to make everything more reliable. In many ways, they did. Deploying apps became easier. Scaling became simpler. Things worked great—until they didn't.
The real issue isn't that these companies are bad at what they do. It's that so much of the internet depends on so few providers. When one has a problem, everyone feels it.
Building your entire business on someone else's platform means accepting their risks:
* **Their downtime becomes your downtime** - When they're offline, so are you
* **Their price changes become your budget problem** - Rates go up, you pay more or migrate
* **Their decisions become your roadmap** - They sunset a service, you scramble to adapt
* **Their security issues become your crisis** - An attack on them affects you too
Your reliability, costs, and user experience now depend on decisions made by people you've never met, in buildings you've never seen.
## What Self-Hosting Gets You [#what-self-hosting-gets-you]
Self-hosting means running your own servers. It could be a cloud VPS, a physical server, or even a Raspberry Pi. The key difference is control.
When you control your infrastructure, you get:
* **Full decision power** - You pick when to upgrade, how to configure, when to roll back
* **Data ownership** - Your information lives where you choose
* **Spread-out risk** - Use multiple providers so one failure doesn't kill everything
* **Real independence** - Stay running when big platforms go red
This isn't about ditching the cloud entirely. It's about not putting all your eggs in one basket.
## What You Take On [#what-you-take-on]
Self-hosting means taking on more responsibility. Let's be clear about what that means:
* Keeping software updated and secure
* Watching systems and responding to alerts
* Creating and testing backup plans
* Fixing problems yourself when things break
But here's what you gain: control over your own fate.
Your site doesn't vanish because someone fat-fingered a config file. Your app doesn't slow down because a neighbor is hogging resources. You make decisions based on your needs, not theirs.
For many people, this isn't just about technology—it's about philosophy. Running your own infrastructure means you own your destiny.
## The Smart Middle Ground [#the-smart-middle-ground]
Monday's outage doesn't mean cloud services are terrible. It means relying completely on any single provider is risky.
The smart approach mixes both:
* **Use cloud services** for handling traffic spikes and global reach
* **Self-host critical systems** that need to run 24/7 no matter what
* **Spread across providers** so no single failure kills you
* **Keep local backups** as a safety net
This hybrid approach gives you the cloud's flexibility plus your own reliability. One outage can't take everything down.
## Building a Stronger Internet [#building-a-stronger-internet]
Every big outage sends the same message: spread out, diversify, own your core systems.
The internet wasn't designed to run on a handful of giant clouds. It was built to be distributed—many servers, many locations, many owners. The closer we get back to that vision, the more resilient everything becomes.
Next time a major service crashes, use it as motivation. Start that self-hosting project you've been putting off. Learn to run your own infrastructure. Build something that stays online when status pages turn red.
The cloud will always have its place. But the systems that last are the ones you truly control.
---
# Why Memos is switching to CalVer
URL: https://usememos.com/blog/moving-to-calendar-versioning
Memos is moving from Semantic Versioning to calendar versioning, or CalVer. Starting with the next release, our versions will carry the year and month. A release in October 2026, for example, will be named `26.10`.
We [shared the plan with the community](https://github.com/orgs/usememos/discussions/6351). The reason is straightforward: after years of `0.x` releases, a date gives people more useful information about the Memos version they are using.
## What our old version numbers told you [#what-our-old-version-numbers-told-you]
[Semantic Versioning](https://semver.org/) gives major, minor, and patch numbers specific meanings. Once a project declares a stable public API, those numbers distinguish incompatible changes, compatible additions, and compatible fixes. That makes SemVer useful when deciding which versions of a dependency an application can accept.
Memos has stayed in the `0.x` series since the beginning. SemVer treats that series as initial development, where the public API is not yet considered stable. It leaves room for incompatible changes before `1.0`.
That describes an important limit, but it gives someone using Memos little detail about an individual release. Seeing `0.31.0` after `0.30.0` tells you which came later. It does not tell you how recently either was released. You still need the release history to understand the time between them, and the release notes to understand the changes.
For Memos, the growing minor number had mostly become a sequence counter. We wanted the number itself to communicate something people could use.
## A date is easier to place [#a-date-is-easier-to-place]
`26.10` immediately places a release in October 2026. You can recognize its age without remembering our release history. It also gives a feature's arrival a date that is easier to recall than an arbitrary minor number.
This matters when you come back to Memos after a while. You may remember roughly when you last updated, or when you saw a feature discussed, without remembering the version attached to it. Calendar versions make those two ways of remembering line up.
The version becomes a useful starting point for reading the project's history. The changelog provides the details.
## It fits how Memos develops [#it-fits-how-memos-develops]
Our releases have a roughly monthly rhythm. Naming them by year and month reflects that rhythm directly. [CalVer](https://calver.org/) lets a project choose date components that fit its release cycle; for Memos, the month is a useful level of detail.
A daily identifier would add precision that most people would not need when looking through our releases. A year alone would group too much together. The year and month give each release a recognizable place while keeping the name short.
The date does not set a release deadline. We still need to finish and check the work before publishing it. It also does not describe how large a release is: a month can bring small refinements or changes that need more attention.
## Why we didn't simply move to 1.0 [#why-we-didnt-simply-move-to-10]
Beyond their technical meaning, versions like `1.0`, `2.0`, and `3.0` often carry the expectations of a major product launch. They can suggest a reinvention, a new product generation, or a big announcement. For us, that puts too much emphasis on the release as a marketing event.
Memos develops through steady improvements: making writing smoother, fixing problems, and refining what is already there. We want to publish those improvements when they are ready, without having to frame them as the next major milestone. Moving to `1.0` and later `2.0` would keep us thinking in those terms.
Calendar versioning suits that approach. The version tells you when a release shipped, and the release notes explain what changed. Each release can be useful on its own, without needing a bigger number to make it feel significant.
## Release notes still carry the details [#release-notes-still-carry-the-details]
A calendar version tells you when a release belongs. It cannot tell you everything an update changes, and it should not be read as a promise that consecutive releases are interchangeable.
We will continue to call out breaking changes under **Upgrade notes** in the changelog. A clear version number and clear release notes serve different purposes: one makes a release easy to identify; the other explains what it means for the people using it.
That is the reason for this change. We want Memos versions to be easier to place in time, while keeping the explanation of each release specific and readable.
---
# Syncing and Managing Data with GitHub
URL: https://usememos.com/blog/syncing-and-managing-data-with-github
In today's digital age, many of us use multiple devices, and it's crucial to keep our data synchronized across all of them. Whether it's your work laptop, personal computer, having access to the same information wherever you go can greatly enhance productivity. One excellent solution for this is GitHub, a platform initially designed for version control and code collaboration. However, GitHub's versatility extends to much more than just code. It's a powerful tool for syncing and managing data across various devices, making it an essential resource for modern users.
## Setting the Scene [#setting-the-scene]
Imagine you have different devices for work and personal use. You might want to access important files, notes, or documents from both your work and personal computers. GitHub can help you achieve this without the hassle of emailing files to yourself, using external drives, or relying on third-party cloud services.
## The GitHub Solution [#the-github-solution]
### Step 1: Creating a GitHub Repository [#step-1-creating-a-github-repository]
1. Begin by creating a GitHub account if you don't already have one. It's free and straightforward.
2. Once you're logged in, you can create a new repository. Give it a name that represents the type of data you want to sync, for example, "memos" or "my-memos." Ensure it's a **private repository** to keep your data secure.
### Step 2: Initializing Git on Your Devices [#step-2-initializing-git-on-your-devices]
1. On your computer, navigate to the folder where you store the data you want to sync. This could be your notes, documents, or any type of files.
2. Open your command line or terminal and initialize a Git repository in that folder:
```shell
git init
```
3. Connect this local Git repository to your GitHub repository:
```shell
git remote add origin
```
Replace `` with the URL of the GitHub repository you created in Step 1.
### Step 3: Syncing Your Data [#step-3-syncing-your-data]
Now you're set up to sync your data between devices. Here's how:
* **Uploading Data to GitHub:**
Whenever you have new data or updates on one device that you want to access on another, use the following commands:
```shell
git add .
git commit -m "Your commit message"
git push origin main
```
* **Downloading Data on Another Device:**
When you switch to another device, use this command to fetch the latest data from your GitHub repository:
```shell
git pull origin main
```
## Benefits and Considerations [#benefits-and-considerations]
* **Data Access Anywhere**: With your data on GitHub, you can access it from any device with an internet connection.
* **Version Control**: GitHub provides a version history, so you can always go back to previous versions of your files.
* **Data Security**: As a private repository, your data is secure and accessible only by you.
* **Collaboration**: In the future, if you need to collaborate with others, GitHub's collaboration features are readily available.
In summary, GitHub is a versatile platform that goes beyond code collaboration. It's a valuable resource for everyday users who want to keep their data in sync across multiple devices. Whether you need to access work documents, personal notes, or any other data, GitHub simplifies the process, ensuring your information is at your fingertips, no matter where you are or which device you're using.
---
# Syncing Data Across My MacBooks with iCloud
URL: https://usememos.com/blog/syncing-data-with-icloud
In all honesty, I don't have a suitable cloud service for deploying memos, but I do have two trusty MacBooks - a MacBook Air in home and a MacBook Pro in company. Each served its unique role, but the problem was keeping data in sync between them.
The solution began with the realization that the Memos' startup command could hold the key. The recommand command looked like this:
```shell
docker run -d --name memos -p 5230:5230 -v ~/.memos/:/var/opt/memos neosmemo/memos:stable
```
I had an idea - what if I replaced `~/.memos` with a folder in iCloud? This simple change held the promise of realizing multi-device data sharing, and potentially, it meant I could set up a memos instance on my work MacBook Pro without relying on external cloud servers. It was a challenge worth taking, so let's explore how I embarked on this endeavor.
## The Experiment [#the-experiment]
### Step 1: Creating an iCloud Shared Folder [#step-1-creating-an-icloud-shared-folder]
The journey started with a visit to my MacBook Air, where I aimed to create a shared space in iCloud that both my MacBooks could access. Here's how I did it:
1. I opened Finder and ventured into iCloud Drive.
2. A right-click later, I had a brand new folder in iCloud, aptly named `memos` in **Documents**.
3. Then came the sharing. A few more clicks, and I'd selected my work email to share the folder with, granting my MacBook Pro access.
### Step 2: Docker Configuration [#step-2-docker-configuration]
With the iCloud folder in place, I was eager to make use of it in my Memos setup. Here's where Docker came into play:
```shell
docker run -d --name memos -p 5230:5230 -v ~/Documents/memos/:/var/opt/memos neosmemo/memos:stable
```
With this new configuration, I replaced `~/.memos` in the Docker command with the path to the `~/Documents/memos/` folder I created in iCloud Drive. This change meant that Memos would now read and write data directly from iCloud, making it accessible from both my MacBook Air and MacBook Pro.
### Step 3: Sync in Action [#step-3-sync-in-action]
This creative twist set the stage for the grand experiment. Memos, now configured on my MacBook Air, began to sync data directly to the iCloud shared folder. The result? I could access these same notes seamlessly from my MacBook Pro at work, achieving the multi-device data sharing I had envisioned.
## The Benefits and Considerations [#the-benefits-and-considerations]
* **Seamless Transition**: This setup enabled me to switch effortlessly between personal and professional tasks without interruption, with all my notes at my fingertips.
* **No Cloud Servers Required**: I accomplished this without the need for an external cloud server, with iCloud taking care of all synchronization tasks.
* **Data Privacy**: My data's privacy and security remained under my control, using my own iCloud account.
* **Space Management**: Monitoring my iCloud storage space ensured it could comfortably handle my growing Memos database.
In summary, using iCloud to share Memos data between my MacBook Air and MacBook Pro, complemented by creative Docker modifications, has been transformative. It's a straightforward and efficient solution that seamlessly integrates both personal and professional note-taking needs. Now, my notes are always just a click away, and there's no need for a dedicated cloud server for my Memos database.
---
# Release v0.0.1
URL: https://usememos.com/changelog/0-0-1
***
**Full Changelog**: [v0.0.1](https://github.com/usememos/memos/releases/tag/v0.0.1)
---
# Release v0.1.0
URL: https://usememos.com/changelog/0-1-0
There are lots of markable changes at the code level in this release:
* new `memo_organizer` table to store pinned memos;
* add `row_status` field for `user` table;
* use `redux` as state container;
* use `axios` as HTTP client;
## What's Changed [#whats-changed]
* feat: seed data only in dev mode by @boojack in [https://github.com/usememos/memos/pull/61](https://github.com/usememos/memos/pull/61)
***
**Full Changelog**: [v0.1.0](https://github.com/usememos/memos/releases/tag/v0.1.0)
---
# Release v0.1.1
URL: https://usememos.com/changelog/0-1-1
Responsive view
[https://user-images.githubusercontent.com/24653555/174464926-e2bd5e4d-d30f-45d3-b4cf-a39a606fa785.mp4](https://user-images.githubusercontent.com/24653555/174464926-e2bd5e4d-d30f-45d3-b4cf-a39a606fa785.mp4)
## What's Changed [#whats-changed]
* fix: sort tags in creating shortcut by @boojack in [https://github.com/usememos/memos/pull/69](https://github.com/usememos/memos/pull/69)
* chore: find memo by tag by @boojack in [https://github.com/usememos/memos/pull/74](https://github.com/usememos/memos/pull/74)
* feat: responsive view by @boojack in [https://github.com/usememos/memos/pull/75](https://github.com/usememos/memos/pull/75)
* fix: tag regex by @boojack in [https://github.com/usememos/memos/pull/76](https://github.com/usememos/memos/pull/76)
***
**Full Changelog**: [v0.1.1](https://github.com/usememos/memos/releases/tag/v0.1.1)
---
# Release v0.1.2
URL: https://usememos.com/changelog/0-1-2
## What's Changed [#whats-changed]
* chore: show daily memos view in sidebar by @boojack in [https://github.com/usememos/memos/pull/79](https://github.com/usememos/memos/pull/79)
* chore: update memo action buttons style by @boojack in [https://github.com/usememos/memos/pull/80](https://github.com/usememos/memos/pull/80)
* feat: add `/api/tag` by @boojack in [https://github.com/usememos/memos/pull/82](https://github.com/usememos/memos/pull/82)
* chore: use markdown image syntax by @boojack in [https://github.com/usememos/memos/pull/83](https://github.com/usememos/memos/pull/83)
* chore: expand/fold memo content button by @boojack in [https://github.com/usememos/memos/pull/84](https://github.com/usememos/memos/pull/84)
* fix: content link style by @whoistiger in [https://github.com/usememos/memos/pull/86](https://github.com/usememos/memos/pull/86)
* chore: release v0.1.2 by @boojack in [https://github.com/usememos/memos/pull/88](https://github.com/usememos/memos/pull/88)
***
**Full Changelog**: [v0.1.2](https://github.com/usememos/memos/releases/tag/v0.1.2)
---
# Release v0.1.3
URL: https://usememos.com/changelog/0-1-3
## What's Changed [#whats-changed]
* fix: can not register in production by @hyoban in [https://github.com/usememos/memos/pull/91](https://github.com/usememos/memos/pull/91)
* chore: download image by one click by @boojack in [https://github.com/usememos/memos/pull/94](https://github.com/usememos/memos/pull/94)
* chore: get tags by openid by @boojack in [https://github.com/usememos/memos/pull/95](https://github.com/usememos/memos/pull/95)
* chore: update content parser by @boojack in [https://github.com/usememos/memos/pull/97](https://github.com/usememos/memos/pull/97)
***
**Full Changelog**: [v0.1.3](https://github.com/usememos/memos/releases/tag/v0.1.3)
---
# Release v0.10.0
URL: https://usememos.com/changelog/0-10-0
Supports to generate embedded code for public memo.
## What's Changed [#whats-changed]
* chore: add skipper in CSRF by @boojack in [https://github.com/usememos/memos/pull/885](https://github.com/usememos/memos/pull/885)
* chore: update GitHub action name by @boojack in [https://github.com/usememos/memos/pull/886](https://github.com/usememos/memos/pull/886)
* chore: update middleware skipper by @boojack in [https://github.com/usememos/memos/pull/887](https://github.com/usememos/memos/pull/887)
* feat: add `activity` table by @boojack in [https://github.com/usememos/memos/pull/888](https://github.com/usememos/memos/pull/888)
* feat: add Italian Translation by @Block2Paz in [https://github.com/usememos/memos/pull/890](https://github.com/usememos/memos/pull/890)
* chore: update activity payload by @boojack in [https://github.com/usememos/memos/pull/891](https://github.com/usememos/memos/pull/891)
* chore: update server activity by @boojack in [https://github.com/usememos/memos/pull/898](https://github.com/usememos/memos/pull/898)
* feat: update docker command description (#893) by @Helaxious in [https://github.com/usememos/memos/pull/900](https://github.com/usememos/memos/pull/900)
* feat: support code copy by @Zeng1998 in [https://github.com/usememos/memos/pull/901](https://github.com/usememos/memos/pull/901)
* feat: persistent session name by @boojack in [https://github.com/usememos/memos/pull/902](https://github.com/usememos/memos/pull/902)
* chore: update memo create activity by @boojack in [https://github.com/usememos/memos/pull/903](https://github.com/usememos/memos/pull/903)
* chore: update activity metrics by @boojack in [https://github.com/usememos/memos/pull/908](https://github.com/usememos/memos/pull/908)
* refactor: return jsx element instead of string in marked by @boojack in [https://github.com/usememos/memos/pull/910](https://github.com/usememos/memos/pull/910)
* feat: support embed memo with iframe by @boojack in [https://github.com/usememos/memos/pull/912](https://github.com/usememos/memos/pull/912)
* chore: add skipper for secure by @boojack in [https://github.com/usememos/memos/pull/913](https://github.com/usememos/memos/pull/913)
* fix: sort version by @boojack in [https://github.com/usememos/memos/pull/914](https://github.com/usememos/memos/pull/914)
***
**Full Changelog**: [v0.10.0](https://github.com/usememos/memos/releases/tag/v0.10.0)
---
# Release v0.10.1
URL: https://usememos.com/changelog/0-10-1
## What's Changed [#whats-changed]
* fix: missing creator id in shortcut cache by @hyoban in [https://github.com/usememos/memos/pull/915](https://github.com/usememos/memos/pull/915)
* fix: version compare by @boojack in [https://github.com/usememos/memos/pull/916](https://github.com/usememos/memos/pull/916)
* chore: fix renderer by @boojack in [https://github.com/usememos/memos/pull/917](https://github.com/usememos/memos/pull/917)
* chore: remove escape by @boojack in [https://github.com/usememos/memos/pull/918](https://github.com/usememos/memos/pull/918)
* fix: codeblock renderer by @boojack in [https://github.com/usememos/memos/pull/924](https://github.com/usememos/memos/pull/924)
* fix: tag generate in code block by @boojack in [https://github.com/usememos/memos/pull/925](https://github.com/usememos/memos/pull/925)
* feat: update German translation by @sfan5 in [https://github.com/usememos/memos/pull/926](https://github.com/usememos/memos/pull/926)
* chore: add `User stories` section to readme by @boojack in [https://github.com/usememos/memos/pull/932](https://github.com/usememos/memos/pull/932)
* feat: update memo resources style by @boojack in [https://github.com/usememos/memos/pull/933](https://github.com/usememos/memos/pull/933)
* feat: update renderer in list by @boojack in [https://github.com/usememos/memos/pull/935](https://github.com/usememos/memos/pull/935)
* chore: update funding with open collective by @boojack in [https://github.com/usememos/memos/pull/940](https://github.com/usememos/memos/pull/940)
* fix: skip api error for static middleware by @boojack in [https://github.com/usememos/memos/pull/941](https://github.com/usememos/memos/pull/941)
* chore: added translation for copy memo link by @jxpsert in [https://github.com/usememos/memos/pull/942](https://github.com/usememos/memos/pull/942)
* chore: debounce search text input by @boojack in [https://github.com/usememos/memos/pull/943](https://github.com/usememos/memos/pull/943)
* chore: remove existed tags in suggestion by @boojack in [https://github.com/usememos/memos/pull/944](https://github.com/usememos/memos/pull/944)
* chore: update GitHub sponsor by @boojack in [https://github.com/usememos/memos/pull/946](https://github.com/usememos/memos/pull/946)
* chore: remove sponsor with open collective by @boojack in [https://github.com/usememos/memos/pull/947](https://github.com/usememos/memos/pull/947)
* feat: support audio player by @boojack in [https://github.com/usememos/memos/pull/948](https://github.com/usememos/memos/pull/948)
* chore: upgrade version to `0.10.1` by @boojack in [https://github.com/usememos/memos/pull/949](https://github.com/usememos/memos/pull/949)
***
**Full Changelog**: [v0.10.1](https://github.com/usememos/memos/releases/tag/v0.10.1)
---
# Release v0.10.2
URL: https://usememos.com/changelog/0-10-2
# 🎉 Happy Spring Festival 🎉 [#-happy-spring-festival-]
## What's Changed [#whats-changed]
* fix: delete tag api by @boojack in [https://github.com/usememos/memos/pull/950](https://github.com/usememos/memos/pull/950)
* feat: update Spanish translation by @AmadeusGraves in [https://github.com/usememos/memos/pull/954](https://github.com/usememos/memos/pull/954)
* feat: issue translator workflow by @jxpsert in [https://github.com/usememos/memos/pull/956](https://github.com/usememos/memos/pull/956)
* feat: support empty content memo by @Zeng1998 in [https://github.com/usememos/memos/pull/963](https://github.com/usememos/memos/pull/963)
* feat: update Vietnamese translation by @vietanhdev in [https://github.com/usememos/memos/pull/965](https://github.com/usememos/memos/pull/965)
* feat: add qrcode in share dialog by @Zeng1998 in [https://github.com/usememos/memos/pull/964](https://github.com/usememos/memos/pull/964)
* feat: add customized logo in share dialog by @Zeng1998 in [https://github.com/usememos/memos/pull/969](https://github.com/usememos/memos/pull/969)
* fix: use input instead of textfield by @boojack in [https://github.com/usememos/memos/pull/973](https://github.com/usememos/memos/pull/973)
* fix: round corner issue in resource blocks by @Wujiao233 in [https://github.com/usememos/memos/pull/979](https://github.com/usememos/memos/pull/979)
* feat: support swipe to switch img on touchscreen by @Wujiao233 in [https://github.com/usememos/memos/pull/970](https://github.com/usememos/memos/pull/970)
* feat: scrool to memo after editing by @hyoban in [https://github.com/usememos/memos/pull/907](https://github.com/usememos/memos/pull/907)
* fix: video and audio can't play on safari by @Wujiao233 in [https://github.com/usememos/memos/pull/980](https://github.com/usememos/memos/pull/980)
* chore: update resource dialog style by @boojack in [https://github.com/usememos/memos/pull/982](https://github.com/usememos/memos/pull/982)
* chore: upgrade version to `0.10.2` by @boojack in [https://github.com/usememos/memos/pull/983](https://github.com/usememos/memos/pull/983)
***
**Full Changelog**: [v0.10.2](https://github.com/usememos/memos/releases/tag/v0.10.2)
---
# Release v0.10.3
URL: https://usememos.com/changelog/0-10-3
## What's Changed [#whats-changed]
* chore: format SQL by @boojack in [https://github.com/usememos/memos/pull/987](https://github.com/usememos/memos/pull/987)
* feat: support creating resource with external link by @boojack in [https://github.com/usememos/memos/pull/988](https://github.com/usememos/memos/pull/988)
* chore: get resource blob optional by @boojack in [https://github.com/usememos/memos/pull/991](https://github.com/usememos/memos/pull/991)
* chore: clean `package.json` by @boojack in [https://github.com/usememos/memos/pull/993](https://github.com/usememos/memos/pull/993)
* feat: update Traditional Chinese translation by @WY-WY-W in [https://github.com/usememos/memos/pull/994](https://github.com/usememos/memos/pull/994)
* chore: update Uffizzi GHA for better error-handling by @ShrutiC-git in [https://github.com/usememos/memos/pull/996](https://github.com/usememos/memos/pull/996)
* chore: remove unused flags for sqlite by @boojack in [https://github.com/usememos/memos/pull/997](https://github.com/usememos/memos/pull/997)
* fix: show copy button on hover by @hyoban in [https://github.com/usememos/memos/pull/1002](https://github.com/usememos/memos/pull/1002)
* fix: pdf resource preview by @Zeng1998 in [https://github.com/usememos/memos/pull/1008](https://github.com/usememos/memos/pull/1008)
* feat: graceful shutdown server by @boojack in [https://github.com/usememos/memos/pull/1016](https://github.com/usememos/memos/pull/1016)
* chore: update zh-Hant.json by @den13501 in [https://github.com/usememos/memos/pull/1023](https://github.com/usememos/memos/pull/1023)
* Use official Uffizzi reusable action by @ShrutiC-git in [https://github.com/usememos/memos/pull/1027](https://github.com/usememos/memos/pull/1027)
* more translation correction to traditional Chinese by @den13501 in [https://github.com/usememos/memos/pull/1028](https://github.com/usememos/memos/pull/1028)
* feat: support enter to signin by @Zeng1998 in [https://github.com/usememos/memos/pull/1014](https://github.com/usememos/memos/pull/1014)
* fix: url encode for tag name by @boojack in [https://github.com/usememos/memos/pull/1031](https://github.com/usememos/memos/pull/1031)
* chore: update code owners by @boojack in [https://github.com/usememos/memos/pull/1041](https://github.com/usememos/memos/pull/1041)
* fix: scroll when clicking expand button by @hyoban in [https://github.com/usememos/memos/pull/1035](https://github.com/usememos/memos/pull/1035)
* fix: parse chrome or edge urls in plain link by @hyoban in [https://github.com/usememos/memos/pull/1034](https://github.com/usememos/memos/pull/1034)
* feat: tag filter in explore by @Zeng1998 in [https://github.com/usememos/memos/pull/1032](https://github.com/usememos/memos/pull/1032)
* chore: update seed data by @boojack in [https://github.com/usememos/memos/pull/1042](https://github.com/usememos/memos/pull/1042)
* feat: add setting for double-click of memos by @Zeng1998 in [https://github.com/usememos/memos/pull/1036](https://github.com/usememos/memos/pull/1036)
* fix: editor cursor not in view after smart editing by @hyoban in [https://github.com/usememos/memos/pull/1043](https://github.com/usememos/memos/pull/1043)
* fix: DatePicker should say Wed instead of Web by @nitinthewiz in [https://github.com/usememos/memos/pull/1046](https://github.com/usememos/memos/pull/1046)
* chore: update readme by @boojack in [https://github.com/usememos/memos/pull/1047](https://github.com/usememos/memos/pull/1047)
* chore: setup project workspace for better DX by @hyoban in [https://github.com/usememos/memos/pull/1048](https://github.com/usememos/memos/pull/1048)
* chore: update readme with dark mode demo by @boojack in [https://github.com/usememos/memos/pull/1049](https://github.com/usememos/memos/pull/1049)
* feat: more rss info by @hyoban in [https://github.com/usememos/memos/pull/1052](https://github.com/usememos/memos/pull/1052)
* fix: can not input chinese by @hyoban in [https://github.com/usememos/memos/pull/1053](https://github.com/usememos/memos/pull/1053)
* fix: patch resource id by @boojack in [https://github.com/usememos/memos/pull/1055](https://github.com/usememos/memos/pull/1055)
* chore: update resource select dialog by @boojack in [https://github.com/usememos/memos/pull/999](https://github.com/usememos/memos/pull/999)
* chore: update rss icon style by @boojack in [https://github.com/usememos/memos/pull/1056](https://github.com/usememos/memos/pull/1056)
* fix: pass empty condition in rss by @boojack in [https://github.com/usememos/memos/pull/1058](https://github.com/usememos/memos/pull/1058)
* chore: remove resource cache by @boojack in [https://github.com/usememos/memos/pull/1059](https://github.com/usememos/memos/pull/1059)
* chore: upgrade version to `0.10.3` by @Zeng1998 in [https://github.com/usememos/memos/pull/1060](https://github.com/usememos/memos/pull/1060)
***
**Full Changelog**: [v0.10.3](https://github.com/usememos/memos/releases/tag/v0.10.3)
---
# Release v0.11.1
URL: https://usememos.com/changelog/0-11-1
## What's Changed [#whats-changed]
* fix: function name typo by @jaywhen in [https://github.com/usememos/memos/pull/1148](https://github.com/usememos/memos/pull/1148)
* fix: find memo list order by @boojack in [https://github.com/usememos/memos/pull/1149](https://github.com/usememos/memos/pull/1149)
* fix: remove memo list api by @boojack in [https://github.com/usememos/memos/pull/1151](https://github.com/usememos/memos/pull/1151)
* chore: fix dispatch memo pinned by @boojack in [https://github.com/usememos/memos/pull/1152](https://github.com/usememos/memos/pull/1152)
* chore: update translations from Hosted Weblate by @weblate in [https://github.com/usememos/memos/pull/1150](https://github.com/usememos/memos/pull/1150)
* chore: remove validators on the frontend by @Zeng1998 in [https://github.com/usememos/memos/pull/1156](https://github.com/usememos/memos/pull/1156)
* fix: correct comments for exported functions and variables by @hezhizhen in [https://github.com/usememos/memos/pull/1158](https://github.com/usememos/memos/pull/1158)
* feat: use accent color when confirming deletion by @H3arn in [https://github.com/usememos/memos/pull/1161](https://github.com/usememos/memos/pull/1161)
* chore: remove username click event by @boojack in [https://github.com/usememos/memos/pull/1167](https://github.com/usememos/memos/pull/1167)
* fix: omission of long filename by @Zeng1998 in [https://github.com/usememos/memos/pull/1170](https://github.com/usememos/memos/pull/1170)
* fix: z-index of image preview by @Zeng1998 in [https://github.com/usememos/memos/pull/1171](https://github.com/usememos/memos/pull/1171)
* chore: open url in other tabs by @Zeng1998 in [https://github.com/usememos/memos/pull/1173](https://github.com/usememos/memos/pull/1173)
* fix: model fields are unconsistent with the data queried from the database by @tonghs in [https://github.com/usememos/memos/pull/1179](https://github.com/usememos/memos/pull/1179)
* Translations update from Hosted Weblate by @weblate in [https://github.com/usememos/memos/pull/1154](https://github.com/usememos/memos/pull/1154)
* feat: add visibility field to resource by @boojack in [https://github.com/usememos/memos/pull/1185](https://github.com/usememos/memos/pull/1185)
* chore: add my account entry in user dropdown by @boojack in [https://github.com/usememos/memos/pull/1187](https://github.com/usememos/memos/pull/1187)
* feat: add resource visibility to user setting by @boojack in [https://github.com/usememos/memos/pull/1190](https://github.com/usememos/memos/pull/1190)
* feat: update en locale by @fiumad in [https://github.com/usememos/memos/pull/1195](https://github.com/usememos/memos/pull/1195)
* fix: Incorrect sharing image gerneration (#1157) by @CorrectRoadH in [https://github.com/usememos/memos/pull/1205](https://github.com/usememos/memos/pull/1205)
* fix: corner style after scaling by @hyoban in [https://github.com/usememos/memos/pull/1199](https://github.com/usememos/memos/pull/1199)
* Translations update from Hosted Weblate by @weblate in [https://github.com/usememos/memos/pull/1196](https://github.com/usememos/memos/pull/1196)
* fix: corners not rounded on memos-editor-wrapper by @fiumad in [https://github.com/usememos/memos/pull/1209](https://github.com/usememos/memos/pull/1209)
* chore: fix unknown at rule @applyless(unknownAtRules) by @hyoban in [https://github.com/usememos/memos/pull/1221](https://github.com/usememos/memos/pull/1221)
* refactor: declare variable for devProxyServer by @unliar in [https://github.com/usememos/memos/pull/1220](https://github.com/usememos/memos/pull/1220)
* fix: action button container not overflowing memo by @Rethora in [https://github.com/usememos/memos/pull/1218](https://github.com/usememos/memos/pull/1218)
* For Issue #981 Create CustomThemes.md by @fiumad in [https://github.com/usememos/memos/pull/1210](https://github.com/usememos/memos/pull/1210)
* fix - login security issue by @thareekanvar in [https://github.com/usememos/memos/pull/1198](https://github.com/usememos/memos/pull/1198)
* Fix: Markdown hyperlinks with parenthesis take first closing parenthesis as final by @TheRealJd3 in [https://github.com/usememos/memos/pull/1213](https://github.com/usememos/memos/pull/1213)
* I added Turkish Translation file by @mehmetaltugakgul in [https://github.com/usememos/memos/pull/1202](https://github.com/usememos/memos/pull/1202)
* add support for s3 path by @zhaochunqi in [https://github.com/usememos/memos/pull/1233](https://github.com/usememos/memos/pull/1233)
* feat: update home layout by @boojack in [https://github.com/usememos/memos/pull/1242](https://github.com/usememos/memos/pull/1242)
* chore: update links reference by @boojack in [https://github.com/usememos/memos/pull/1243](https://github.com/usememos/memos/pull/1243)
* feat: implement openai integration by @boojack in [https://github.com/usememos/memos/pull/1245](https://github.com/usememos/memos/pull/1245)
* chore: update demo screenshot by @boojack in [https://github.com/usememos/memos/pull/1246](https://github.com/usememos/memos/pull/1246)
* chore: upgrade version to `v0.11.1` by @boojack in [https://github.com/usememos/memos/pull/1247](https://github.com/usememos/memos/pull/1247)
***
**Full Changelog**: [v0.11.1](https://github.com/usememos/memos/releases/tag/v0.11.1)
---
# Release v0.11.2
URL: https://usememos.com/changelog/0-11-2
## What's Changed [#whats-changed]
* fix: s3 custom path by @boojack in [https://github.com/usememos/memos/pull/1249](https://github.com/usememos/memos/pull/1249)
* revert: Fix: Markdown hyperlinks with parenthesis take first closing parenthesis as final by @boojack in [https://github.com/usememos/memos/pull/1251](https://github.com/usememos/memos/pull/1251)
* chore: add heat map to sidebar by @boojack in [https://github.com/usememos/memos/pull/1255](https://github.com/usememos/memos/pull/1255)
* chore: update demo url by @boojack in [https://github.com/usememos/memos/pull/1256](https://github.com/usememos/memos/pull/1256)
* chore: update location store handler by @boojack in [https://github.com/usememos/memos/pull/1273](https://github.com/usememos/memos/pull/1273)
* chore: simplify readme by @boojack in [https://github.com/usememos/memos/pull/1275](https://github.com/usememos/memos/pull/1275)
* chore: remove metrics plugin by @boojack in [https://github.com/usememos/memos/pull/1276](https://github.com/usememos/memos/pull/1276)
* chore: rename common to base component by @boojack in [https://github.com/usememos/memos/pull/1279](https://github.com/usememos/memos/pull/1279)
* fix: overflow of dialog-content-container by @Juskinbo in [https://github.com/usememos/memos/pull/1277](https://github.com/usememos/memos/pull/1277)
* feat: automatically change language on first launch by @CorrectRoadH in [https://github.com/usememos/memos/pull/1278](https://github.com/usememos/memos/pull/1278)
* fix: missing prop key by @unliar in [https://github.com/usememos/memos/pull/1291](https://github.com/usememos/memos/pull/1291)
* fix: correct the storage service state by @Zeng1998 in [https://github.com/usememos/memos/pull/1288](https://github.com/usememos/memos/pull/1288)
* fix: patch user with nil password by @Zeng1998 in [https://github.com/usememos/memos/pull/1290](https://github.com/usememos/memos/pull/1290)
* feat(s3): customize filenames via placeholders by @Zeng1998 in [https://github.com/usememos/memos/pull/1285](https://github.com/usememos/memos/pull/1285)
* feat: support set openai api host by @Wujiao233 in [https://github.com/usememos/memos/pull/1292](https://github.com/usememos/memos/pull/1292)
* feat: add root layout by @boojack in [https://github.com/usememos/memos/pull/1294](https://github.com/usememos/memos/pull/1294)
* fix: fix the typo of openai by @xiaoluoboding in [https://github.com/usememos/memos/pull/1298](https://github.com/usememos/memos/pull/1298)
* fix: navigate faild silently by @unliar in [https://github.com/usememos/memos/pull/1300](https://github.com/usememos/memos/pull/1300)
* feat: add GitLab OAuth2 template by @kimw in [https://github.com/usememos/memos/pull/1302](https://github.com/usememos/memos/pull/1302)
* fix: Ask-AI history list reversed when loading answer by @jaywhen in [https://github.com/usememos/memos/pull/1301](https://github.com/usememos/memos/pull/1301)
* feat: allow to filter memos with resources by @Zeng1998 in [https://github.com/usememos/memos/pull/1299](https://github.com/usememos/memos/pull/1299)
* feat: auto focus search bar when sidebar is shown (close #1269) by @jas0ncn in [https://github.com/usememos/memos/pull/1304](https://github.com/usememos/memos/pull/1304)
* feat: update responsible layout by @boojack in [https://github.com/usememos/memos/pull/1306](https://github.com/usememos/memos/pull/1306)
* Fix for GO-2023-1571 vulnerability by @andrewpollock in [https://github.com/usememos/memos/pull/1308](https://github.com/usememos/memos/pull/1308)
* fix: request body format in openai api by @boojack in [https://github.com/usememos/memos/pull/1309](https://github.com/usememos/memos/pull/1309)
* chore: update style of home sidebar by @boojack in [https://github.com/usememos/memos/pull/1311](https://github.com/usememos/memos/pull/1311)
* chore: remove part of less files by @boojack in [https://github.com/usememos/memos/pull/1314](https://github.com/usememos/memos/pull/1314)
* chore: update ask AI trigger by @boojack in [https://github.com/usememos/memos/pull/1316](https://github.com/usememos/memos/pull/1316)
* fix: Update markdown hyperlink regex by @BapRx in [https://github.com/usememos/memos/pull/1315](https://github.com/usememos/memos/pull/1315)
* Update README.md by @xudaolong in [https://github.com/usememos/memos/pull/1317](https://github.com/usememos/memos/pull/1317)
* feat: Allow users to customize the refresh time for Daily Reviews by @titanventura in [https://github.com/usememos/memos/pull/1313](https://github.com/usememos/memos/pull/1313)
* chore: expose port in dockerfile by @Cologler in [https://github.com/usememos/memos/pull/1319](https://github.com/usememos/memos/pull/1319)
* feat: use react-hot-toast by @boojack in [https://github.com/usememos/memos/pull/1321](https://github.com/usememos/memos/pull/1321)
* fix: unified tag sorting logic by @unliar in [https://github.com/usememos/memos/pull/1323](https://github.com/usememos/memos/pull/1323)
* feat: update zh-tw translation to new file format by @den13501 in [https://github.com/usememos/memos/pull/1324](https://github.com/usememos/memos/pull/1324)
* refactor: build storage key by @Cologler in [https://github.com/usememos/memos/pull/1326](https://github.com/usememos/memos/pull/1326)
* feat: fold memo when content overflow by @boojack in [https://github.com/usememos/memos/pull/1327](https://github.com/usememos/memos/pull/1327)
* feat: update page router by @boojack in [https://github.com/usememos/memos/pull/1330](https://github.com/usememos/memos/pull/1330)
* refactor: filter store by @boojack in [https://github.com/usememos/memos/pull/1331](https://github.com/usememos/memos/pull/1331)
* fix: daily review page style by @boojack in [https://github.com/usememos/memos/pull/1332](https://github.com/usememos/memos/pull/1332)
* refactor: openAI config system setting by @boojack in [https://github.com/usememos/memos/pull/1333](https://github.com/usememos/memos/pull/1333)
* chore: remove editor shortcuts by @boojack in [https://github.com/usememos/memos/pull/1334](https://github.com/usememos/memos/pull/1334)
* chore: upgrade version to `0.11.2` by @boojack in [https://github.com/usememos/memos/pull/1336](https://github.com/usememos/memos/pull/1336)
***
**Full Changelog**: [v0.11.2](https://github.com/usememos/memos/releases/tag/v0.11.2)
---
# Release v0.12.0
URL: https://usememos.com/changelog/0-12-0
## What's Changed [#whats-changed]
* chore: fix cover bg color by @boojack in [https://github.com/usememos/memos/pull/1337](https://github.com/usememos/memos/pull/1337)
* chore: rename http getter package by @boojack in [https://github.com/usememos/memos/pull/1349](https://github.com/usememos/memos/pull/1349)
* fix: expand btn display in front of menu by @Wujiao233 in [https://github.com/usememos/memos/pull/1342](https://github.com/usememos/memos/pull/1342)
* feat: update find resource with linked memo amount by @boojack in [https://github.com/usememos/memos/pull/1354](https://github.com/usememos/memos/pull/1354)
* chore: typo by @unliar in [https://github.com/usememos/memos/pull/1355](https://github.com/usememos/memos/pull/1355)
* refactor: useTranslation in CreateTagDialog by @unliar in [https://github.com/usememos/memos/pull/1356](https://github.com/usememos/memos/pull/1356)
* feat: new resource dashboard by @CorrectRoadH in [https://github.com/usememos/memos/pull/1346](https://github.com/usememos/memos/pull/1346)
* chore: update resource dashboard style by @boojack in [https://github.com/usememos/memos/pull/1362](https://github.com/usememos/memos/pull/1362)
* fix: the incorrectly height of grid row in safari by @CorrectRoadH in [https://github.com/usememos/memos/pull/1366](https://github.com/usememos/memos/pull/1366)
* feat: allow resource title mutiple line by @CorrectRoadH in [https://github.com/usememos/memos/pull/1370](https://github.com/usememos/memos/pull/1370)
* refactor: use function findMatchingParser to reduce duplicate code by @unliar in [https://github.com/usememos/memos/pull/1367](https://github.com/usememos/memos/pull/1367)
* fix: handle IME mode in editor by @boojack in [https://github.com/usememos/memos/pull/1371](https://github.com/usememos/memos/pull/1371)
* fix: the dropdown be coverd by @CorrectRoadH in [https://github.com/usememos/memos/pull/1368](https://github.com/usememos/memos/pull/1368)
* build: update dockerfile for using cache to speed up by @unliar in [https://github.com/usememos/memos/pull/1372](https://github.com/usememos/memos/pull/1372)
* chroe: add ids for header elements by @Zeng1998 in [https://github.com/usememos/memos/pull/1374](https://github.com/usememos/memos/pull/1374)
* fix: show full content in detail page by @Zeng1998 in [https://github.com/usememos/memos/pull/1375](https://github.com/usememos/memos/pull/1375)
* chore: remove `{filetype}` in path template by @Zeng1998 in [https://github.com/usememos/memos/pull/1377](https://github.com/usememos/memos/pull/1377)
* fix: make creation time a link to the detail page by @gera2ld in [https://github.com/usememos/memos/pull/1379](https://github.com/usememos/memos/pull/1379)
* feat: support messages to ask AI by @boojack in [https://github.com/usememos/memos/pull/1380](https://github.com/usememos/memos/pull/1380)
* chore: update interface declare by @boojack in [https://github.com/usememos/memos/pull/1381](https://github.com/usememos/memos/pull/1381)
* chore: update project structure by @boojack in [https://github.com/usememos/memos/pull/1382](https://github.com/usememos/memos/pull/1382)
* feat: support local storage by @Zeng1998 in [https://github.com/usememos/memos/pull/1383](https://github.com/usememos/memos/pull/1383)
* chore: fix the typo by @CorrectRoadH in [https://github.com/usememos/memos/pull/1387](https://github.com/usememos/memos/pull/1387)
* Uffizzi Update Workflows by @ShrutiC-git in [https://github.com/usememos/memos/pull/1390](https://github.com/usememos/memos/pull/1390)
* fix: daily review page & setting dialog style by @xqa in [https://github.com/usememos/memos/pull/1392](https://github.com/usememos/memos/pull/1392)
* fix: markdown support in blockquote by @Zeng1998 in [https://github.com/usememos/memos/pull/1394](https://github.com/usememos/memos/pull/1394)
* feat: upload file by drag and drop by @CorrectRoadH in [https://github.com/usememos/memos/pull/1388](https://github.com/usememos/memos/pull/1388)
* fix: the expand button's z-index is the same as Header by @Steven-nagisa-Y in [https://github.com/usememos/memos/pull/1400](https://github.com/usememos/memos/pull/1400)
* chore: add rss button in user menu by @boojack in [https://github.com/usememos/memos/pull/1401](https://github.com/usememos/memos/pull/1401)
* chore: remove weblate badge by @boojack in [https://github.com/usememos/memos/pull/1402](https://github.com/usememos/memos/pull/1402)
* fix: image preview dialog overlapping by @hyoban in [https://github.com/usememos/memos/pull/1405](https://github.com/usememos/memos/pull/1405)
* chore: update logo assets by @boojack in [https://github.com/usememos/memos/pull/1407](https://github.com/usememos/memos/pull/1407)
* feat: update Korean translation by @nulta in [https://github.com/usememos/memos/pull/1414](https://github.com/usememos/memos/pull/1414)
* feat: add list style for resource dashboard by @CorrectRoadH in [https://github.com/usememos/memos/pull/1389](https://github.com/usememos/memos/pull/1389)
* fix: avatar is not rounded by @hyoban in [https://github.com/usememos/memos/pull/1415](https://github.com/usememos/memos/pull/1415)
* feat: add more resource cover icon by @CorrectRoadH in [https://github.com/usememos/memos/pull/1413](https://github.com/usememos/memos/pull/1413)
* chore: update list switch style by @boojack in [https://github.com/usememos/memos/pull/1417](https://github.com/usememos/memos/pull/1417)
* feat: add empty placeholder when search result is empty by @CorrectRoadH in [https://github.com/usememos/memos/pull/1416](https://github.com/usememos/memos/pull/1416)
* feat: add setup cmd by @dshemin in [https://github.com/usememos/memos/pull/1418](https://github.com/usememos/memos/pull/1418)
* feat: add docs for memos setup after deploying by @dshemin in [https://github.com/usememos/memos/pull/1419](https://github.com/usememos/memos/pull/1419)
* chore: update demo seed data by @boojack in [https://github.com/usememos/memos/pull/1421](https://github.com/usememos/memos/pull/1421)
* feat: empty selected resource when search resource by @CorrectRoadH in [https://github.com/usememos/memos/pull/1423](https://github.com/usememos/memos/pull/1423)
* feat: limit the num of lines for filename by @CorrectRoadH in [https://github.com/usememos/memos/pull/1424](https://github.com/usememos/memos/pull/1424)
* fix: logo img rounded by @fifsky in [https://github.com/usememos/memos/pull/1427](https://github.com/usememos/memos/pull/1427)
* feat: add URLSuffix resource option with S3 by @fifsky in [https://github.com/usememos/memos/pull/1428](https://github.com/usememos/memos/pull/1428)
* feat: Fix i18n and RU locale by @dshemin in [https://github.com/usememos/memos/pull/1422](https://github.com/usememos/memos/pull/1422)
* refactor: update import prefix with alias by @boojack in [https://github.com/usememos/memos/pull/1433](https://github.com/usememos/memos/pull/1433)
* chore: remove `useListStyle` hook by @boojack in [https://github.com/usememos/memos/pull/1434](https://github.com/usememos/memos/pull/1434)
* feat: The loaded resource for pagination by @CorrectRoadH in [https://github.com/usememos/memos/pull/1425](https://github.com/usememos/memos/pull/1425)
* Added slovenian translation. by @thehijacker in [https://github.com/usememos/memos/pull/1436](https://github.com/usememos/memos/pull/1436)
* chore: add Slovenian locale by @boojack in [https://github.com/usememos/memos/pull/1437](https://github.com/usememos/memos/pull/1437)
* feat: add test for user store by @boojack in [https://github.com/usememos/memos/pull/1438](https://github.com/usememos/memos/pull/1438)
* Updated Slovenian translation by @thehijacker in [https://github.com/usememos/memos/pull/1440](https://github.com/usememos/memos/pull/1440)
* feat: add jwt auth by @boojack in [https://github.com/usememos/memos/pull/1441](https://github.com/usememos/memos/pull/1441)
* chore: update logo by @boojack in [https://github.com/usememos/memos/pull/1442](https://github.com/usememos/memos/pull/1442)
* chore: add usage into heatmap by @boojack in [https://github.com/usememos/memos/pull/1443](https://github.com/usememos/memos/pull/1443)
* chore: revert resource visibility changes by @boojack in [https://github.com/usememos/memos/pull/1444](https://github.com/usememos/memos/pull/1444)
* chore: update auth form by @boojack in [https://github.com/usememos/memos/pull/1445](https://github.com/usememos/memos/pull/1445)
* chore: update user setting key convention by @boojack in [https://github.com/usememos/memos/pull/1447](https://github.com/usememos/memos/pull/1447)
* chore: update system setting name convention by @boojack in [https://github.com/usememos/memos/pull/1448](https://github.com/usememos/memos/pull/1448)
* chore: update store tests by @boojack in [https://github.com/usememos/memos/pull/1449](https://github.com/usememos/memos/pull/1449)
* feat: add public id field to resource by @boojack in [https://github.com/usememos/memos/pull/1451](https://github.com/usememos/memos/pull/1451)
* chore: update version and remove isDev flag by @boojack in [https://github.com/usememos/memos/pull/1452](https://github.com/usememos/memos/pull/1452)
* fix: system setting field name by @boojack in [https://github.com/usememos/memos/pull/1453](https://github.com/usememos/memos/pull/1453)
* chore: allow remove user avatar by @boojack in [https://github.com/usememos/memos/pull/1454](https://github.com/usememos/memos/pull/1454)
* chore: update learn more link by @boojack in [https://github.com/usememos/memos/pull/1455](https://github.com/usememos/memos/pull/1455)
* chore: delete resource related file by @boojack in [https://github.com/usememos/memos/pull/1456](https://github.com/usememos/memos/pull/1456)
* chore: add default local storage path by @boojack in [https://github.com/usememos/memos/pull/1457](https://github.com/usememos/memos/pull/1457)
* chore: update filename when creating resource by @boojack in [https://github.com/usememos/memos/pull/1460](https://github.com/usememos/memos/pull/1460)
***
**Full Changelog**: [v0.12.0](https://github.com/usememos/memos/releases/tag/v0.12.0)
---
# Release v0.12.1
URL: https://usememos.com/changelog/0-12-1
## What's Changed [#whats-changed]
* fix: return external link directly by @boojack in [https://github.com/usememos/memos/pull/1465](https://github.com/usememos/memos/pull/1465)
* feat: allow instance moderators to post public via the API by @cubuzz in [https://github.com/usememos/memos/pull/1464](https://github.com/usememos/memos/pull/1464)
* fix: unexpected reset of the storage setting by @Zeng1998 in [https://github.com/usememos/memos/pull/1475](https://github.com/usememos/memos/pull/1475)
* chore: update import path by @boojack in [https://github.com/usememos/memos/pull/1477](https://github.com/usememos/memos/pull/1477)
* chore: update locale file structure by @boojack in [https://github.com/usememos/memos/pull/1478](https://github.com/usememos/memos/pull/1478)
* chore: add "copy link" for each memo by @HappyZ in [https://github.com/usememos/memos/pull/1474](https://github.com/usememos/memos/pull/1474)
* chore: update store error handler by @boojack in [https://github.com/usememos/memos/pull/1479](https://github.com/usememos/memos/pull/1479)
* chore: update audience name by @boojack in [https://github.com/usememos/memos/pull/1484](https://github.com/usememos/memos/pull/1484)
* chore: update memo visibility display by @boojack in [https://github.com/usememos/memos/pull/1485](https://github.com/usememos/memos/pull/1485)
* chore: add timezone env to dockerfile by @boojack in [https://github.com/usememos/memos/pull/1490](https://github.com/usememos/memos/pull/1490)
* chore: add ignore version upgrade setting by @boojack in [https://github.com/usememos/memos/pull/1491](https://github.com/usememos/memos/pull/1491)
* chore: add file type to audio by @boojack in [https://github.com/usememos/memos/pull/1492](https://github.com/usememos/memos/pull/1492)
* chore: adjust header style by @boojack in [https://github.com/usememos/memos/pull/1493](https://github.com/usememos/memos/pull/1493)
* fix(css): reorder the font fallback list (#1495) by @chengluyu in [https://github.com/usememos/memos/pull/1496](https://github.com/usememos/memos/pull/1496)
* chore: update memo header by @boojack in [https://github.com/usememos/memos/pull/1497](https://github.com/usememos/memos/pull/1497)
* chore: update share memo buttons by @boojack in [https://github.com/usememos/memos/pull/1498](https://github.com/usememos/memos/pull/1498)
* chore: upgrade version to `0.12.1` by @boojack in [https://github.com/usememos/memos/pull/1499](https://github.com/usememos/memos/pull/1499)
***
**Full Changelog**: [v0.12.1](https://github.com/usememos/memos/releases/tag/v0.12.1)
---
# Release v0.12.2
URL: https://usememos.com/changelog/0-12-2
## What's Changed [#whats-changed]
* feat(ci): Add GHCR mirror and major/minor rolling tags by @gabe565 in [https://github.com/usememos/memos/pull/1503](https://github.com/usememos/memos/pull/1503)
* feat: update and refactor Korean translation data by @nulta in [https://github.com/usememos/memos/pull/1505](https://github.com/usememos/memos/pull/1505)
* feat: update Chinese translations in zh.json and zh-Hant.json using locale\_updater.py by @Oaklight in [https://github.com/usememos/memos/pull/1506](https://github.com/usememos/memos/pull/1506)
* fix(ci): fix release builds not having any tags by @gabe565 in [https://github.com/usememos/memos/pull/1507](https://github.com/usememos/memos/pull/1507)
* chore: update docker image source by @boojack in [https://github.com/usememos/memos/pull/1511](https://github.com/usememos/memos/pull/1511)
* feat: add e2e test by @CorrectRoadH in [https://github.com/usememos/memos/pull/1486](https://github.com/usememos/memos/pull/1486)
* feat: add resource backend unit test by @CorrectRoadH in [https://github.com/usememos/memos/pull/1521](https://github.com/usememos/memos/pull/1521)
* feat: add `HostnameImmutable` to aws endpoint config by @zhaochunqi in [https://github.com/usememos/memos/pull/1230](https://github.com/usememos/memos/pull/1230)
* fix: incorrect date parsing by @Zeng1998 in [https://github.com/usememos/memos/pull/1527](https://github.com/usememos/memos/pull/1527)
* feat: improve i18n support as a whole by @lincolnthalles in [https://github.com/usememos/memos/pull/1526](https://github.com/usememos/memos/pull/1526)
* chore: regenerate yarn lock file by @boojack in [https://github.com/usememos/memos/pull/1530](https://github.com/usememos/memos/pull/1530)
* fix: toast overload max size error by @Fog3211 in [https://github.com/usememos/memos/pull/1531](https://github.com/usememos/memos/pull/1531)
* chore: use pnpm by @boojack in [https://github.com/usememos/memos/pull/1533](https://github.com/usememos/memos/pull/1533)
* feat: add option to hide ask ai by @joaonunomota in [https://github.com/usememos/memos/pull/1515](https://github.com/usememos/memos/pull/1515)
* fix: rss link by @boojack in [https://github.com/usememos/memos/pull/1534](https://github.com/usememos/memos/pull/1534)
* chore: update window resize listener by @boojack in [https://github.com/usememos/memos/pull/1535](https://github.com/usememos/memos/pull/1535)
* chore: remove search key binding by @boojack in [https://github.com/usememos/memos/pull/1536](https://github.com/usememos/memos/pull/1536)
* chore: update resource link template by @boojack in [https://github.com/usememos/memos/pull/1537](https://github.com/usememos/memos/pull/1537)
* chore: update version to `0.12.2` by @boojack in [https://github.com/usememos/memos/pull/1538](https://github.com/usememos/memos/pull/1538)
* fix: revert hide ask ai button by @boojack in [https://github.com/usememos/memos/pull/1539](https://github.com/usememos/memos/pull/1539)
***
**Full Changelog**: [v0.12.2](https://github.com/usememos/memos/releases/tag/v0.12.2)
---
# Release v0.13.0
URL: https://usememos.com/changelog/0-13-0
## What's Changed [#whats-changed]
* chore: update save button style by @boojack in [https://github.com/usememos/memos/pull/1542](https://github.com/usememos/memos/pull/1542)
* fix: the broken install docs link by @m3nu in [https://github.com/usememos/memos/pull/1554](https://github.com/usememos/memos/pull/1554)
* feat: hiding dialog using X button should remove class "overflow-hidden" by @deEshu2002 in [https://github.com/usememos/memos/pull/1555](https://github.com/usememos/memos/pull/1555)
* feat: server tests by @boojack in [https://github.com/usememos/memos/pull/1556](https://github.com/usememos/memos/pull/1556)
* chore: add enclosure to rss by @boojack in [https://github.com/usememos/memos/pull/1559](https://github.com/usememos/memos/pull/1559)
* Add auto collapse feature for all memos issue #1463 by @polyeung in [https://github.com/usememos/memos/pull/1550](https://github.com/usememos/memos/pull/1550)
* feat: update zh-tw translation to latest file format by @den13501 in [https://github.com/usememos/memos/pull/1569](https://github.com/usememos/memos/pull/1569)
* chore: update memo style by @boojack in [https://github.com/usememos/memos/pull/1581](https://github.com/usememos/memos/pull/1581)
* docs: upgrade on fly.io by @Antzed in [https://github.com/usememos/memos/pull/1582](https://github.com/usememos/memos/pull/1582)
* chore: update readme with docs by @boojack in [https://github.com/usememos/memos/pull/1586](https://github.com/usememos/memos/pull/1586)
* chore: split memo resource api by @boojack in [https://github.com/usememos/memos/pull/1587](https://github.com/usememos/memos/pull/1587)
* feat: update Korean translation by @nulta in [https://github.com/usememos/memos/pull/1592](https://github.com/usememos/memos/pull/1592)
* chore: add memo\_relation by @boojack in [https://github.com/usememos/memos/pull/1585](https://github.com/usememos/memos/pull/1585)
* docs: update readme with MemosGallery by @BarryYangi in [https://github.com/usememos/memos/pull/1590](https://github.com/usememos/memos/pull/1590)
* feat: implement memo relation store by @boojack in [https://github.com/usememos/memos/pull/1598](https://github.com/usememos/memos/pull/1598)
* fix: memo content availability for visitor mode by @deEshu2002 in [https://github.com/usememos/memos/pull/1605](https://github.com/usememos/memos/pull/1605)
* feat: read content from search params by @benjick in [https://github.com/usememos/memos/pull/1607](https://github.com/usememos/memos/pull/1607)
* reappearing of dialog should add body scrolling class. by @deEshu2002 in [https://github.com/usememos/memos/pull/1602](https://github.com/usememos/memos/pull/1602)
* chore: add system setting cache by @boojack in [https://github.com/usememos/memos/pull/1609](https://github.com/usememos/memos/pull/1609)
* fix: only delete last file when select multiple files #1576 by @CorrectRoadH in [https://github.com/usememos/memos/pull/1578](https://github.com/usememos/memos/pull/1578)
* feat: add linux/arm/v7 to docker build action by @powersee in [https://github.com/usememos/memos/pull/1610](https://github.com/usememos/memos/pull/1610)
* fix: failed eslint checks by @joaonunomota in [https://github.com/usememos/memos/pull/1616](https://github.com/usememos/memos/pull/1616)
* feat: add infinite scroll for memos by @joaonunomota in [https://github.com/usememos/memos/pull/1614](https://github.com/usememos/memos/pull/1614)
* feat: update zh-Hans translations and minor fixes in locale\_updater.py by @Oaklight in [https://github.com/usememos/memos/pull/1615](https://github.com/usememos/memos/pull/1615)
* feat: implement memo relation server by @boojack in [https://github.com/usememos/memos/pull/1618](https://github.com/usememos/memos/pull/1618)
* chore: check allow sign up setting in sso by @boojack in [https://github.com/usememos/memos/pull/1620](https://github.com/usememos/memos/pull/1620)
* chore: update related time format by @boojack in [https://github.com/usememos/memos/pull/1621](https://github.com/usememos/memos/pull/1621)
* refactor: memo editor components by @boojack in [https://github.com/usememos/memos/pull/1625](https://github.com/usememos/memos/pull/1625)
* chore: lock pnpm version by @hyoban in [https://github.com/usememos/memos/pull/1628](https://github.com/usememos/memos/pull/1628)
* feat: support file sorting when uploading by @hyoban in [https://github.com/usememos/memos/pull/1627](https://github.com/usememos/memos/pull/1627)
* chore: update Chinese name translation by @Jonnyan404 in [https://github.com/usememos/memos/pull/1630](https://github.com/usememos/memos/pull/1630)
* feat: add preliminar Windows support by @lincolnthalles in [https://github.com/usememos/memos/pull/1636](https://github.com/usememos/memos/pull/1636)
* chore: add size for s3 resource by @Zeng1998 in [https://github.com/usememos/memos/pull/1638](https://github.com/usememos/memos/pull/1638)
* chore: show server name instead of "MEMOS" by @Zeng1998 in [https://github.com/usememos/memos/pull/1639](https://github.com/usememos/memos/pull/1639)
* chore: add vacuum memo relation to dev guard by @boojack in [https://github.com/usememos/memos/pull/1644](https://github.com/usememos/memos/pull/1644)
* fix: return pinned status after edit by @CorrectRoadH in [https://github.com/usememos/memos/pull/1629](https://github.com/usememos/memos/pull/1629)
* feat: improve Windows support by @lincolnthalles in [https://github.com/usememos/memos/pull/1645](https://github.com/usememos/memos/pull/1645)
* fix: wrong position of UsageStatItem's popup by @athurg in [https://github.com/usememos/memos/pull/1647](https://github.com/usememos/memos/pull/1647)
* fix: unexpected empty lines when copying-pasting by @CorrectRoadH in [https://github.com/usememos/memos/pull/1654](https://github.com/usememos/memos/pull/1654)
* chore: seed data for new user by @boojack in [https://github.com/usememos/memos/pull/1655](https://github.com/usememos/memos/pull/1655)
* feat: add max upload size setting to UI & UI improvements by @lincolnthalles in [https://github.com/usememos/memos/pull/1646](https://github.com/usememos/memos/pull/1646)
* chore: update help button style by @boojack in [https://github.com/usememos/memos/pull/1656](https://github.com/usememos/memos/pull/1656)
* feat: add build-artifacts.yml by @guanzi008 in [https://github.com/usememos/memos/pull/1583](https://github.com/usememos/memos/pull/1583)
* chore: update memo relation types by @boojack in [https://github.com/usememos/memos/pull/1658](https://github.com/usememos/memos/pull/1658)
* feat: filter support plain link by @CorrectRoadH in [https://github.com/usememos/memos/pull/1657](https://github.com/usememos/memos/pull/1657)
* chore: retire demo site by @boojack in [https://github.com/usememos/memos/pull/1659](https://github.com/usememos/memos/pull/1659)
* fix: File size exceeds allowed limit of 0 MiB by @lincolnthalles in [https://github.com/usememos/memos/pull/1664](https://github.com/usememos/memos/pull/1664)
* chore: add the default value of MaxUploadSizeMiB by @Zeng1998 in [https://github.com/usememos/memos/pull/1663](https://github.com/usememos/memos/pull/1663)
* feat: add support for image thumbnail by @athurg in [https://github.com/usememos/memos/pull/1641](https://github.com/usememos/memos/pull/1641)
* chore: update system setting default value by @boojack in [https://github.com/usememos/memos/pull/1665](https://github.com/usememos/memos/pull/1665)
* fix: resource url in rss by @hyoban in [https://github.com/usememos/memos/pull/1672](https://github.com/usememos/memos/pull/1672)
* feat: memo relation part1 by @boojack in [https://github.com/usememos/memos/pull/1677](https://github.com/usememos/memos/pull/1677)
* chore: initial gomark plugin by @boojack in [https://github.com/usememos/memos/pull/1678](https://github.com/usememos/memos/pull/1678)
* Show thumbnail in resource dashboard by @athurg in [https://github.com/usememos/memos/pull/1666](https://github.com/usememos/memos/pull/1666)
* Highlight the DatePicker's date with memos by @athurg in [https://github.com/usememos/memos/pull/1669](https://github.com/usememos/memos/pull/1669)
* Gen thumbnail while get and improve thumbnail quality by @athurg in [https://github.com/usememos/memos/pull/1680](https://github.com/usememos/memos/pull/1680)
* feat: update memo detail page by @boojack in [https://github.com/usememos/memos/pull/1682](https://github.com/usememos/memos/pull/1682)
* fix: initial system locale by @boojack in [https://github.com/usememos/memos/pull/1684](https://github.com/usememos/memos/pull/1684)
* feat: parse markdown to html format in rss by @boojack in [https://github.com/usememos/memos/pull/1683](https://github.com/usememos/memos/pull/1683)
* chore: upgrade version `0.13.0` by @boojack in [https://github.com/usememos/memos/pull/1685](https://github.com/usememos/memos/pull/1685)
***
**Full Changelog**: [v0.13.0](https://github.com/usememos/memos/releases/tag/v0.13.0)
---
# Release v0.13.1
URL: https://usememos.com/changelog/0-13-1
## What's Changed [#whats-changed]
* Fix fail to open file while generate thumbnail by @athurg in [https://github.com/usememos/memos/pull/1687](https://github.com/usememos/memos/pull/1687)
* feat: get or generate thumbnail image by @boojack in [https://github.com/usememos/memos/pull/1691](https://github.com/usememos/memos/pull/1691)
* chore: add available generator amount flag by @boojack in [https://github.com/usememos/memos/pull/1696](https://github.com/usememos/memos/pull/1696)
* fix: patch memo visibility by @boojack in [https://github.com/usememos/memos/pull/1695](https://github.com/usememos/memos/pull/1695)
* fix: md without search icon by @CorrectRoadH in [https://github.com/usememos/memos/pull/1699](https://github.com/usememos/memos/pull/1699)
* fix: pop search when touch textarea in Android Chrome by @CorrectRoadH in [https://github.com/usememos/memos/pull/1700](https://github.com/usememos/memos/pull/1700)
* fix: add thumbnail param using `URLSearchParams` by @Zeng1998 in [https://github.com/usememos/memos/pull/1701](https://github.com/usememos/memos/pull/1701)
* fix: concurrent counter operates by @athurg in [https://github.com/usememos/memos/pull/1706](https://github.com/usememos/memos/pull/1706)
* Fix system memo visibility was replace by user's setting by @athurg in [https://github.com/usememos/memos/pull/1707](https://github.com/usememos/memos/pull/1707)
* Add volume define in Dockerfile to avoid data lose by @athurg in [https://github.com/usememos/memos/pull/1718](https://github.com/usememos/memos/pull/1718)
* Replace filename to publicid by @athurg in [https://github.com/usememos/memos/pull/1713](https://github.com/usememos/memos/pull/1713)
* feat: add heading tokenizer by @boojack in [https://github.com/usememos/memos/pull/1723](https://github.com/usememos/memos/pull/1723)
* feat(gomark): add bold parser by @boojack in [https://github.com/usememos/memos/pull/1724](https://github.com/usememos/memos/pull/1724)
* feat: implement paragraph and italic parsers by @boojack in [https://github.com/usememos/memos/pull/1725](https://github.com/usememos/memos/pull/1725)
* feat: implement code parser by @boojack in [https://github.com/usememos/memos/pull/1727](https://github.com/usememos/memos/pull/1727)
* chore: move flags into env variables by @boojack in [https://github.com/usememos/memos/pull/1732](https://github.com/usememos/memos/pull/1732)
* fix: infinite loop while daily memos more than DEFAULT\_MEMO\_LIMIT by @athurg in [https://github.com/usememos/memos/pull/1730](https://github.com/usememos/memos/pull/1730)
* chore(revert): retire demo site by @boojack in [https://github.com/usememos/memos/pull/1733](https://github.com/usememos/memos/pull/1733)
* chore: add demo banner by @boojack in [https://github.com/usememos/memos/pull/1739](https://github.com/usememos/memos/pull/1739)
* refactor: memo store by @boojack in [https://github.com/usememos/memos/pull/1741](https://github.com/usememos/memos/pull/1741)
* chore: update vscode setting enforcement for go111module="on" by @deEshu2002 in [https://github.com/usememos/memos/pull/1738](https://github.com/usememos/memos/pull/1738)
* feat: resource store cache by @boojack in [https://github.com/usememos/memos/pull/1742](https://github.com/usememos/memos/pull/1742)
* chore: update demo banner style by @boojack in [https://github.com/usememos/memos/pull/1743](https://github.com/usememos/memos/pull/1743)
* feat: image and link parser by @boojack in [https://github.com/usememos/memos/pull/1744](https://github.com/usememos/memos/pull/1744)
* feat: tag parser by @boojack in [https://github.com/usememos/memos/pull/1745](https://github.com/usememos/memos/pull/1745)
* feat: implement telegram bot plugin by @athurg in [https://github.com/usememos/memos/pull/1740](https://github.com/usememos/memos/pull/1740)
* Add support for content search by @athurg in [https://github.com/usememos/memos/pull/1728](https://github.com/usememos/memos/pull/1728)
* Add Telegram bot config UI by @athurg in [https://github.com/usememos/memos/pull/1747](https://github.com/usememos/memos/pull/1747)
* chore: update telegram bot related section by @boojack in [https://github.com/usememos/memos/pull/1750](https://github.com/usememos/memos/pull/1750)
* fix: sso templates by @boojack in [https://github.com/usememos/memos/pull/1753](https://github.com/usememos/memos/pull/1753)
* feat(#1568): Added "ask ai" section session splitting function by @GodMeowIceSun in [https://github.com/usememos/memos/pull/1711](https://github.com/usememos/memos/pull/1711)
* chore: upgrade version `0.13.1` by @boojack in [https://github.com/usememos/memos/pull/1754](https://github.com/usememos/memos/pull/1754)
***
**Full Changelog**: [v0.13.1](https://github.com/usememos/memos/releases/tag/v0.13.1)
---
# Release v0.13.2
URL: https://usememos.com/changelog/0-13-2
## What's Changed [#whats-changed]
* fix: patch memo row status by @boojack in [https://github.com/usememos/memos/pull/1755](https://github.com/usememos/memos/pull/1755)
* feat: update korean localization by @nulta in [https://github.com/usememos/memos/pull/1758](https://github.com/usememos/memos/pull/1758)
* feat: display memo with updated ts by @boojack in [https://github.com/usememos/memos/pull/1760](https://github.com/usememos/memos/pull/1760)
* chore: order by updated ts in memo store by @boojack in [https://github.com/usememos/memos/pull/1761](https://github.com/usememos/memos/pull/1761)
* feat: add telegram proxy support by @athurg in [https://github.com/usememos/memos/pull/1764](https://github.com/usememos/memos/pull/1764)
* feat: disable CGO\_ENABLED by @athurg in [https://github.com/usememos/memos/pull/1766](https://github.com/usememos/memos/pull/1766)
* refactor: change all `Robot` to `Bot` by @athurg in [https://github.com/usememos/memos/pull/1767](https://github.com/usememos/memos/pull/1767)
* feat: add docker compose file for development by @athurg in [https://github.com/usememos/memos/pull/1769](https://github.com/usememos/memos/pull/1769)
* fix: infinite loop in home page by @athurg in [https://github.com/usememos/memos/pull/1773](https://github.com/usememos/memos/pull/1773)
* fix: add public base path (#1748) by @GenerQAQ in [https://github.com/usememos/memos/pull/1775](https://github.com/usememos/memos/pull/1775)
* feat: resource visibility by @athurg in [https://github.com/usememos/memos/pull/1777](https://github.com/usememos/memos/pull/1777)
* feat: memo editor dialog by @boojack in [https://github.com/usememos/memos/pull/1772](https://github.com/usememos/memos/pull/1772)
* fix: copy-to-clipboard not works well in Safari by @athurg in [https://github.com/usememos/memos/pull/1779](https://github.com/usememos/memos/pull/1779)
* chore: update zh-Hant.json by @den13501 in [https://github.com/usememos/memos/pull/1781](https://github.com/usememos/memos/pull/1781)
* chore: clean Dockerfile to exclude musl-dev by @athurg in [https://github.com/usememos/memos/pull/1787](https://github.com/usememos/memos/pull/1787)
* chore: update page routes by @boojack in [https://github.com/usememos/memos/pull/1790](https://github.com/usememos/memos/pull/1790)
* chore: update upgrade version view by @boojack in [https://github.com/usememos/memos/pull/1791](https://github.com/usememos/memos/pull/1791)
* fix: failed to upload OSS with S3 SDK by @athurg in [https://github.com/usememos/memos/pull/1792](https://github.com/usememos/memos/pull/1792)
* fix: user default 'Basic Setting' should follow server's setting by @s0urcelab in [https://github.com/usememos/memos/pull/1795](https://github.com/usememos/memos/pull/1795)
* revert: fix: add public base path (#1748) (#1775) by @athurg in [https://github.com/usememos/memos/pull/1806](https://github.com/usememos/memos/pull/1806)
* chore: modify the error message when registering a Host user by @2hangpeng in [https://github.com/usememos/memos/pull/1804](https://github.com/usememos/memos/pull/1804)
* feat: add japanese locale by @kakik0u in [https://github.com/usememos/memos/pull/1802](https://github.com/usememos/memos/pull/1802)
* fix: systemSetting in UI changed unexpectedly by @athurg in [https://github.com/usememos/memos/pull/1812](https://github.com/usememos/memos/pull/1812)
* feat: add support for download resource from link by @athurg in [https://github.com/usememos/memos/pull/1800](https://github.com/usememos/memos/pull/1800)
* chore: add classnames for easy logo/server name customizations via CSS. by @davidangel in [https://github.com/usememos/memos/pull/1828](https://github.com/usememos/memos/pull/1828)
* feat: add croatian locale by @diomed in [https://github.com/usememos/memos/pull/1822](https://github.com/usememos/memos/pull/1822)
* feat: set memo visibility in telegram by @athurg in [https://github.com/usememos/memos/pull/1824](https://github.com/usememos/memos/pull/1824)
* feat: support for tap to reload on PWA by @athurg in [https://github.com/usememos/memos/pull/1827](https://github.com/usememos/memos/pull/1827)
* chore: update hr.json by @diomed in [https://github.com/usememos/memos/pull/1832](https://github.com/usememos/memos/pull/1832)
* fix: use `??` in className use by @sedationh in [https://github.com/usememos/memos/pull/1829](https://github.com/usememos/memos/pull/1829)
* chore: upgrade pnpm version by @boojack in [https://github.com/usememos/memos/pull/1833](https://github.com/usememos/memos/pull/1833)
* refactor: migrate auth routes to v1 package by @boojack in [https://github.com/usememos/memos/pull/1841](https://github.com/usememos/memos/pull/1841)
* refactor: migration idp api by @boojack in [https://github.com/usememos/memos/pull/1842](https://github.com/usememos/memos/pull/1842)
* fix: schema migrate by @boojack in [https://github.com/usememos/memos/pull/1846](https://github.com/usememos/memos/pull/1846)
* chore: migrate user setting to api v1 package by @boojack in [https://github.com/usememos/memos/pull/1855](https://github.com/usememos/memos/pull/1855)
* chore: update idp store by @boojack in [https://github.com/usememos/memos/pull/1856](https://github.com/usememos/memos/pull/1856)
* chore: update store types name by @boojack in [https://github.com/usememos/memos/pull/1862](https://github.com/usememos/memos/pull/1862)
* chore: update setting page styles by @boojack in [https://github.com/usememos/memos/pull/1863](https://github.com/usememos/memos/pull/1863)
* chore: update dark mode style by @boojack in [https://github.com/usememos/memos/pull/1864](https://github.com/usememos/memos/pull/1864)
* chore: listMemos sort by id for memos post/update at the same time by @Vespa314 in [https://github.com/usememos/memos/pull/1866](https://github.com/usememos/memos/pull/1866)
* fix: validate access token by @CorrectRoadH in [https://github.com/usememos/memos/pull/1867](https://github.com/usememos/memos/pull/1867)
* fix: ignore internalpath field when creating resource by @CorrectRoadH in [https://github.com/usememos/memos/pull/1868](https://github.com/usememos/memos/pull/1868)
* chore: add jwt middleware in apiv1 by @boojack in [https://github.com/usememos/memos/pull/1869](https://github.com/usememos/memos/pull/1869)
* fix: pin memos of other people by @CorrectRoadH in [https://github.com/usememos/memos/pull/1870](https://github.com/usememos/memos/pull/1870)
* chore: remove unused kit components by @boojack in [https://github.com/usememos/memos/pull/1871](https://github.com/usememos/memos/pull/1871)
* chore: update dialog overflow style by @boojack in [https://github.com/usememos/memos/pull/1872](https://github.com/usememos/memos/pull/1872)
* chore: upgrade version to `v0.13.2` by @boojack in [https://github.com/usememos/memos/pull/1873](https://github.com/usememos/memos/pull/1873)
***
**Full Changelog**: [v0.13.2](https://github.com/usememos/memos/releases/tag/v0.13.2)
---
# Release v0.14.0
URL: https://usememos.com/changelog/0-14-0
## TL;DR [#tldr]
* API breaking changes and optimization, see more in [https://github.com/usememos/memos/tree/main/docs/api](https://github.com/usememos/memos/tree/main/docs/api)
* Improved memo content format from telegram message [https://github.com/usememos/memos/pull/1924](https://github.com/usememos/memos/pull/1924)
* Supported auto backup data file [https://github.com/usememos/memos/pull/1950](https://github.com/usememos/memos/pull/1950)
* Updated some i18n translations
## What's Changed [#whats-changed]
* chore: update user store names by @boojack in [https://github.com/usememos/memos/pull/1877](https://github.com/usememos/memos/pull/1877)
* chore: update vi.json locale by @doivjpxx in [https://github.com/usememos/memos/pull/1878](https://github.com/usememos/memos/pull/1878)
* refactor: migrate definition to api v1(part1) by @boojack in [https://github.com/usememos/memos/pull/1879](https://github.com/usememos/memos/pull/1879)
* chore: remove unused packages by @boojack in [https://github.com/usememos/memos/pull/1880](https://github.com/usememos/memos/pull/1880)
* chore: update memo seed data by @boojack in [https://github.com/usememos/memos/pull/1884](https://github.com/usememos/memos/pull/1884)
* fix: auto expand height of setting page by @athurg in [https://github.com/usememos/memos/pull/1885](https://github.com/usememos/memos/pull/1885)
* fix: header archived id by @Jiraiya8 in [https://github.com/usememos/memos/pull/1888](https://github.com/usememos/memos/pull/1888)
* fix: OpenID was disappear sometimes by @athurg in [https://github.com/usememos/memos/pull/1886](https://github.com/usememos/memos/pull/1886)
* fix: invalid orientation of image thumbnail in Apple devices by @athurg in [https://github.com/usememos/memos/pull/1891](https://github.com/usememos/memos/pull/1891)
* refactor: migrate storage to apiv1 by @boojack in [https://github.com/usememos/memos/pull/1890](https://github.com/usememos/memos/pull/1890)
* fix: escape on resource filename by @athurg in [https://github.com/usememos/memos/pull/1892](https://github.com/usememos/memos/pull/1892)
* fix: skip auth on /api/v1/status to avoid sign up while token invalid by @athurg in [https://github.com/usememos/memos/pull/1895](https://github.com/usememos/memos/pull/1895)
* feat: Add support for purged resource link by @athurg in [https://github.com/usememos/memos/pull/1897](https://github.com/usememos/memos/pull/1897)
* refactor: migrate resource to apiv1 by @boojack in [https://github.com/usememos/memos/pull/1901](https://github.com/usememos/memos/pull/1901)
* refactor: migrate memo to apiv1 by @boojack in [https://github.com/usememos/memos/pull/1907](https://github.com/usememos/memos/pull/1907)
* chore: update common utils by @boojack in [https://github.com/usememos/memos/pull/1908](https://github.com/usememos/memos/pull/1908)
* update zh-Hans & zh-Hant translations by @Oaklight in [https://github.com/usememos/memos/pull/1909](https://github.com/usememos/memos/pull/1909)
* chore: remove resource public id by @boojack in [https://github.com/usememos/memos/pull/1912](https://github.com/usememos/memos/pull/1912)
* chore: add data empty placeholder by @boojack in [https://github.com/usememos/memos/pull/1913](https://github.com/usememos/memos/pull/1913)
* chore: update auth page by @boojack in [https://github.com/usememos/memos/pull/1920](https://github.com/usememos/memos/pull/1920)
* chore: change dropdown's background color in dark mode by @Cyang39 in [https://github.com/usememos/memos/pull/1925](https://github.com/usememos/memos/pull/1925)
* chore: update seed data by @boojack in [https://github.com/usememos/memos/pull/1928](https://github.com/usememos/memos/pull/1928)
* chore: remove auto signout in auth page by @boojack in [https://github.com/usememos/memos/pull/1927](https://github.com/usememos/memos/pull/1927)
* chore: split Go binary and src for dev by @athurg in [https://github.com/usememos/memos/pull/1932](https://github.com/usememos/memos/pull/1932)
* feat: implement memos chat backend function by @CorrectRoadH in [https://github.com/usememos/memos/pull/1934](https://github.com/usememos/memos/pull/1934)
* fix: visibility param override the user auth state by @athurg in [https://github.com/usememos/memos/pull/1941](https://github.com/usememos/memos/pull/1941)
* fix: visibility param override the user auth state by @athurg in [https://github.com/usememos/memos/pull/1942](https://github.com/usememos/memos/pull/1942)
* chore: update MemoRelationListView\.tsx by @sergeivassiljev in [https://github.com/usememos/memos/pull/1933](https://github.com/usememos/memos/pull/1933)
* chore: update header style by @boojack in [https://github.com/usememos/memos/pull/1945](https://github.com/usememos/memos/pull/1945)
* chore: update readme by @boojack in [https://github.com/usememos/memos/pull/1947](https://github.com/usememos/memos/pull/1947)
* docs: fix typo in deploy-with-render.md by @eltociear in [https://github.com/usememos/memos/pull/1946](https://github.com/usememos/memos/pull/1946)
* feat: format message from telegram and upload attachments by @aatumaykin in [https://github.com/usememos/memos/pull/1924](https://github.com/usememos/memos/pull/1924)
* chore: split save resource asset by @athurg in [https://github.com/usememos/memos/pull/1939](https://github.com/usememos/memos/pull/1939)
* feat: memos chat frontend by @CorrectRoadH in [https://github.com/usememos/memos/pull/1938](https://github.com/usememos/memos/pull/1938)
* feat: add support for auto backup db file by @athurg in [https://github.com/usememos/memos/pull/1950](https://github.com/usememos/memos/pull/1950)
* fix: incorrect localization key for sign-up failure message by @Ajaykumbhare in [https://github.com/usememos/memos/pull/1953](https://github.com/usememos/memos/pull/1953)
* fix: exclude commas in tags by @pipe01 in [https://github.com/usememos/memos/pull/1957](https://github.com/usememos/memos/pull/1957)
* feat: update russian translate and new translate message by @aatumaykin in [https://github.com/usememos/memos/pull/1958](https://github.com/usememos/memos/pull/1958)
* chore: update db connection params by @boojack in [https://github.com/usememos/memos/pull/1960](https://github.com/usememos/memos/pull/1960)
* chore: add indexes by @boojack in [https://github.com/usememos/memos/pull/1959](https://github.com/usememos/memos/pull/1959)
* feat: add typeScript support to enforce valid translation keys by @Ajaykumbhare in [https://github.com/usememos/memos/pull/1954](https://github.com/usememos/memos/pull/1954)
* fix: add resource.clear to en.json by @aatumaykin in [https://github.com/usememos/memos/pull/1963](https://github.com/usememos/memos/pull/1963)
* chore: update detail styles by @boojack in [https://github.com/usememos/memos/pull/1964](https://github.com/usememos/memos/pull/1964)
* chore: add api docs by @boojack in [https://github.com/usememos/memos/pull/1965](https://github.com/usememos/memos/pull/1965)
* chore: update Traditional Chinese translation by @5idereal in [https://github.com/usememos/memos/pull/1967](https://github.com/usememos/memos/pull/1967)
* feat: save message to memo by @CorrectRoadH in [https://github.com/usememos/memos/pull/1940](https://github.com/usememos/memos/pull/1940)
* chore: add dev guard for memo chat by @boojack in [https://github.com/usememos/memos/pull/1968](https://github.com/usememos/memos/pull/1968)
* chore: upgrade version to `v0.14.0` by @boojack in [https://github.com/usememos/memos/pull/1970](https://github.com/usememos/memos/pull/1970)
***
**Full Changelog**: [v0.14.0](https://github.com/usememos/memos/releases/tag/v0.14.0)
---
# Release v0.14.1
URL: https://usememos.com/changelog/0-14-1
## TL;DR [#tldr]
* New language translation supported: Hindi 🇮🇳
* Added backup interval configuration in UI
* Fixed expired login session issue
* Fixed occasional "SQLite is locked" error
## What's Changed [#whats-changed]
* chore: disallow destructuring 't' from useTranslation by @Ajaykumbhare in [https://github.com/usememos/memos/pull/1973](https://github.com/usememos/memos/pull/1973)
* feat(security): disable access for anonymous users, when disablePublicMemos is true by @aatumaykin in [https://github.com/usememos/memos/pull/1966](https://github.com/usememos/memos/pull/1966)
* fix: copy code button toast message by @Ajaykumbhare in [https://github.com/usememos/memos/pull/1979](https://github.com/usememos/memos/pull/1979)
* fix: exclude all punctuation chars except underscore in tags by @pipe01 in [https://github.com/usememos/memos/pull/1974](https://github.com/usememos/memos/pull/1974)
* docs: add rowStatus parameter for memo api document by @EINDEX in [https://github.com/usememos/memos/pull/1984](https://github.com/usememos/memos/pull/1984)
* fix: disable selection of future dates in daily review section by @Ajaykumbhare in [https://github.com/usememos/memos/pull/1983](https://github.com/usememos/memos/pull/1983)
* fix: access token will expired after 24h by @NicoleRobin in [https://github.com/usememos/memos/pull/1988](https://github.com/usememos/memos/pull/1988)
* fix: delete multiple resources, close #1986 by @0x-jerry in [https://github.com/usememos/memos/pull/1987](https://github.com/usememos/memos/pull/1987)
* feat: add AutoBackupInterval in SystemSetting by @athurg in [https://github.com/usememos/memos/pull/1989](https://github.com/usememos/memos/pull/1989)
* feat: use username instead of uid by @aatumaykin in [https://github.com/usememos/memos/pull/1977](https://github.com/usememos/memos/pull/1977)
* fix: database is locked by @lincolnthalles in [https://github.com/usememos/memos/pull/1992](https://github.com/usememos/memos/pull/1992)
* chore: remove unused transaction in store by @boojack in [https://github.com/usememos/memos/pull/1995](https://github.com/usememos/memos/pull/1995)
* chore: update ja.json by @kusanaginoturugi in [https://github.com/usememos/memos/pull/1996](https://github.com/usememos/memos/pull/1996)
* fix: add resource.clear to translate by @aatumaykin in [https://github.com/usememos/memos/pull/1999](https://github.com/usememos/memos/pull/1999)
* feat: add hindi language translation for i18n support by @Ajaykumbhare in [https://github.com/usememos/memos/pull/2001](https://github.com/usememos/memos/pull/2001)
* chore: upgrade version to `0.14.1` by @boojack in [https://github.com/usememos/memos/pull/2004](https://github.com/usememos/memos/pull/2004)
***
**Full Changelog**: [v0.14.1](https://github.com/usememos/memos/releases/tag/v0.14.1)
---
# Release v0.14.2
URL: https://usememos.com/changelog/0-14-2
## TL;DR [#tldr]
* Fixed rendering for multi-level tags;
* Fixed filter memos by tag;
## What's Changed [#whats-changed]
* fix: rss route by @boojack in [https://github.com/usememos/memos/pull/2008](https://github.com/usememos/memos/pull/2008)
* chore: fix rss route by @boojack in [https://github.com/usememos/memos/pull/2010](https://github.com/usememos/memos/pull/2010)
* chore: fix request path by @boojack in [https://github.com/usememos/memos/pull/2014](https://github.com/usememos/memos/pull/2014)
* fix: empty state display issue with resourceList style Grid by @Ajaykumbhare in [https://github.com/usememos/memos/pull/2018](https://github.com/usememos/memos/pull/2018)
* /api/v1/auth/signup json format by @sqxccdy in [https://github.com/usememos/memos/pull/2021](https://github.com/usememos/memos/pull/2021)
* fix: hashtag filter for Unicode characters by @Ajaykumbhare in [https://github.com/usememos/memos/pull/2017](https://github.com/usememos/memos/pull/2017)
* feat: update chinese translate by @imaegoo in [https://github.com/usememos/memos/pull/2023](https://github.com/usememos/memos/pull/2023)
* feat: add search bar in archived and explore pages by @tranquanghuy0801 in [https://github.com/usememos/memos/pull/2025](https://github.com/usememos/memos/pull/2025)
* chore: update ja.json by @kusanaginoturugi in [https://github.com/usememos/memos/pull/2030](https://github.com/usememos/memos/pull/2030)
* chore: update ja.json by @kusanaginoturugi in [https://github.com/usememos/memos/pull/2032](https://github.com/usememos/memos/pull/2032)
* revert: fix: exclude all punctuation chars except underscore in tags by @boojack in [https://github.com/usememos/memos/pull/2033](https://github.com/usememos/memos/pull/2033)
* fix: get user by username api by @boojack in [https://github.com/usememos/memos/pull/2034](https://github.com/usememos/memos/pull/2034)
* chore: upgrade version to `0.14.2` by @boojack in [https://github.com/usememos/memos/pull/2035](https://github.com/usememos/memos/pull/2035)
***
**Full Changelog**: [v0.14.2](https://github.com/usememos/memos/releases/tag/v0.14.2)
---
# Release v0.14.3
URL: https://usememos.com/changelog/0-14-3
## TL;DR [#tldr]
* 👋 **Removed shortcuts**. Shortcut was an experimental feature with flaws in its design, and had not been updated for a long time. We will improve search related logic and performance in upcoming versions, to gradually achieve the design goals of shortcut.
* Added tag suggestions popup in memo editor; Thanks @maciej-ka
* Improved the display style of images;
* Fixed page crushed when rendering large amount of memos;
* Fixed error when updating memo content;
## What's Changed [#whats-changed]
* fix: show full content in detail page by @gera2ld in [https://github.com/usememos/memos/pull/2041](https://github.com/usememos/memos/pull/2041)
* fix: avoid content flash on auto collapse by @gera2ld in [https://github.com/usememos/memos/pull/2042](https://github.com/usememos/memos/pull/2042)
* chore: update build docker image actions by @boojack in [https://github.com/usememos/memos/pull/2045](https://github.com/usememos/memos/pull/2045)
* revert: chore: update build docker image actions by @boojack in [https://github.com/usememos/memos/pull/2046](https://github.com/usememos/memos/pull/2046)
* refactor: user v1 store by @boojack in [https://github.com/usememos/memos/pull/2047](https://github.com/usememos/memos/pull/2047)
* feat: add proto and buf configuration files by @boojack in [https://github.com/usememos/memos/pull/2048](https://github.com/usememos/memos/pull/2048)
* chore: add tag service proto definition by @boojack in [https://github.com/usememos/memos/pull/2049](https://github.com/usememos/memos/pull/2049)
* chore: update github actions by @boojack in [https://github.com/usememos/memos/pull/2050](https://github.com/usememos/memos/pull/2050)
* feat: add grpc gateway tempalte with tag service by @boojack in [https://github.com/usememos/memos/pull/2051](https://github.com/usememos/memos/pull/2051)
* chore: add docs generator by @boojack in [https://github.com/usememos/memos/pull/2052](https://github.com/usememos/memos/pull/2052)
* feat: implement part of user service by @boojack in [https://github.com/usememos/memos/pull/2053](https://github.com/usememos/memos/pull/2053)
* feat: add add user setting field by @boojack in [https://github.com/usememos/memos/pull/2054](https://github.com/usememos/memos/pull/2054)
* feat: add system setting to disable password-based login by @traumweh in [https://github.com/usememos/memos/pull/2039](https://github.com/usememos/memos/pull/2039)
* feat: tag suggestions by @maciej-ka in [https://github.com/usememos/memos/pull/2036](https://github.com/usememos/memos/pull/2036)
* feat: impl auth interceptor by @boojack in [https://github.com/usememos/memos/pull/2055](https://github.com/usememos/memos/pull/2055)
* chore: update auth middleware by @boojack in [https://github.com/usememos/memos/pull/2057](https://github.com/usememos/memos/pull/2057)
* feat: add prettier sort import plugin by @boojack in [https://github.com/usememos/memos/pull/2058](https://github.com/usememos/memos/pull/2058)
* chore: regenerate pnpm lock file by @boojack in [https://github.com/usememos/memos/pull/2056](https://github.com/usememos/memos/pull/2056)
* feat: add command to move blob from local to db by @athurg in [https://github.com/usememos/memos/pull/2026](https://github.com/usememos/memos/pull/2026)
* chore: remove shortcuts in frontend by @boojack in [https://github.com/usememos/memos/pull/2071](https://github.com/usememos/memos/pull/2071)
* chore: remove shortcut related api by @boojack in [https://github.com/usememos/memos/pull/2072](https://github.com/usememos/memos/pull/2072)
* chore: remove memo chat components by @boojack in [https://github.com/usememos/memos/pull/2073](https://github.com/usememos/memos/pull/2073)
* chore: update commands by @boojack in [https://github.com/usememos/memos/pull/2074](https://github.com/usememos/memos/pull/2074)
* chore: update id type to int32 by @boojack in [https://github.com/usememos/memos/pull/2076](https://github.com/usememos/memos/pull/2076)
* chore: initial memo service definition by @boojack in [https://github.com/usememos/memos/pull/2077](https://github.com/usememos/memos/pull/2077)
* chore: update get memo api by @boojack in [https://github.com/usememos/memos/pull/2079](https://github.com/usememos/memos/pull/2079)
* fix: remove translate hook in code block by @boojack in [https://github.com/usememos/memos/pull/2080](https://github.com/usememos/memos/pull/2080)
* chore: update resource type checks by @boojack in [https://github.com/usememos/memos/pull/2081](https://github.com/usememos/memos/pull/2081)
* feat: add system service by @boojack in [https://github.com/usememos/memos/pull/2083](https://github.com/usememos/memos/pull/2083)
* chore: remove openai setting section by @boojack in [https://github.com/usememos/memos/pull/2084](https://github.com/usememos/memos/pull/2084)
* feat: add lazy rendering in home page by @boojack in [https://github.com/usememos/memos/pull/2085](https://github.com/usememos/memos/pull/2085)
* chore: upgrade version `0.14.3` by @boojack in [https://github.com/usememos/memos/pull/2086](https://github.com/usememos/memos/pull/2086)
***
**Full Changelog**: [v0.14.3](https://github.com/usememos/memos/releases/tag/v0.14.3)
---
# Release v0.14.4
URL: https://usememos.com/changelog/0-14-4
## TL;DR [#tldr]
* Translation updates for some supported language;
* Updated api v1 documentation; [https://github.com/usememos/memos/blob/main/docs/api/v1.md](https://github.com/usememos/memos/blob/main/docs/api/v1.md)
* Some known bug fixes;
## What's Changed [#whats-changed]
* fix: get all memo api by @boojack in [https://github.com/usememos/memos/pull/2091](https://github.com/usememos/memos/pull/2091)
* chore: update image checks by @boojack in [https://github.com/usememos/memos/pull/2092](https://github.com/usememos/memos/pull/2092)
* chore: update image displays by @boojack in [https://github.com/usememos/memos/pull/2093](https://github.com/usememos/memos/pull/2093)
* chore: update docs by @boojack in [https://github.com/usememos/memos/pull/2094](https://github.com/usememos/memos/pull/2094)
* fix: minor spelling and wording changes for en and de by @dareiff in [https://github.com/usememos/memos/pull/2096](https://github.com/usememos/memos/pull/2096)
* feat: use user avatar in ShareMemoDialog by @akring in [https://github.com/usememos/memos/pull/2102](https://github.com/usememos/memos/pull/2102)
* Update de.json by @Ghost108 in [https://github.com/usememos/memos/pull/2101](https://github.com/usememos/memos/pull/2101)
* updated Dutch translation by @jxpsert in [https://github.com/usememos/memos/pull/2107](https://github.com/usememos/memos/pull/2107)
* feat: update Korean localization by @nulta in [https://github.com/usememos/memos/pull/2105](https://github.com/usememos/memos/pull/2105)
* Fixed heat map colors, updated it.json by @Bodyes26 in [https://github.com/usememos/memos/pull/2106](https://github.com/usememos/memos/pull/2106)
* chore: update en locale by @boojack in [https://github.com/usememos/memos/pull/2109](https://github.com/usememos/memos/pull/2109)
* chore: update zh-Hans translations for "Tag suggestions" by @akring in [https://github.com/usememos/memos/pull/2110](https://github.com/usememos/memos/pull/2110)
* feat: add SwaggerUI and v1 API docs by @lincolnthalles in [https://github.com/usememos/memos/pull/2115](https://github.com/usememos/memos/pull/2115)
* chore: update apiv1 docs by @boojack in [https://github.com/usememos/memos/pull/2117](https://github.com/usememos/memos/pull/2117)
* chore: update server tests by @boojack in [https://github.com/usememos/memos/pull/2118](https://github.com/usememos/memos/pull/2118)
* feat: add header into resource response by @NicoleRobin in [https://github.com/usememos/memos/pull/2120](https://github.com/usememos/memos/pull/2120)
* chore: minor cleanup by @qazxcdswe123 in [https://github.com/usememos/memos/pull/2124](https://github.com/usememos/memos/pull/2124)
* feat: add helm chart by @oslo254804746 in [https://github.com/usememos/memos/pull/2095](https://github.com/usememos/memos/pull/2095)
* chore: update zh-Hans.json by @YuzeTT in [https://github.com/usememos/memos/pull/2127](https://github.com/usememos/memos/pull/2127)
* chore: add acl config by @boojack in [https://github.com/usememos/memos/pull/2128](https://github.com/usememos/memos/pull/2128)
* fix: lazy rendering checks by @boojack in [https://github.com/usememos/memos/pull/2130](https://github.com/usememos/memos/pull/2130)
* fix: fetch tags in memo editor by @boojack in [https://github.com/usememos/memos/pull/2131](https://github.com/usememos/memos/pull/2131)
* chore: upgrade version to `0.14.4` by @boojack in [https://github.com/usememos/memos/pull/2132](https://github.com/usememos/memos/pull/2132)
***
**Full Changelog**: [v0.14.4](https://github.com/usememos/memos/releases/tag/v0.14.4)
---
# Release v0.15.0
URL: https://usememos.com/changelog/0-15-0
## Upgrade Overview [#upgrade-overview]
This release contains upgrade notes that deviate from the norm:
* Warning: Requires database migrations: `user.open_id` will be removed.
* The default storage setting for resources will be `local` instead of `database`.
## Features [#features]
* Improved the account security with **access tokens**.
* You can remove the access token to disable the login state from other devices;
* You can generate access tokens to call APIs, and they can never expire;
* ... learn more in [Access Tokens](/docs/admin/tokens).
* Two new pages:
* **User profile**: A separate home page for yourself.

* **Resources with timeline view**: Display the resource according to the timeline to solve the problem of disorganization. And you can also quickly find related memos.

* Added support for parsing LaTeX syntax. Thanks @kadaliao for #2209
* Added cache for editor content when creating or editing.
---
# Release v0.15.1
URL: https://usememos.com/changelog/0-15-1
## Changes [#changes]
* Bug fixes and minor improvements;
* If your profile page fails to load, please update your username. It should only contain letters, numbers, and dashes.
---
# Release v0.15.2
URL: https://usememos.com/changelog/0-15-2
## Changes [#changes]
* Improved memo detail view;
* Updated dark mode styles;
* Auto-delete access tokens on logout;
* Fixed failed to create access token with no expiration;
---
# Release v0.16.0
URL: https://usememos.com/changelog/0-16-0
## Upgrade Overview [#upgrade-overview]
This release contains upgrade notes that deviate from the norm:
Warning: Requires database migrations: `memo_resource` and `shortcut` tables will be removed.
## Changes [#changes]
* Introduced memo comments;

* Updated memo layout for better readability;

* New branding with a cute cockatiel.
---
# Release v0.16.1
URL: https://usememos.com/changelog/0-16-1
## Changes [#changes]

* New timeline mode of Daily Review: view and create your daily ideas quickly;
* Update and view references and backlinks;
* MySQL supported, learn more in [Using MySQL as the Database Driver](/docs/configuration/database);
* New `Remember me` option in auth page;
---
# Release v0.17.0
URL: https://usememos.com/changelog/0-17-0
## Changes [#changes]
* New **[Documentation](/docs)** and **[Blogs](/blog)**;

* New **inbox** page;

* New locale supported: **Arabs**;
* Minor bugfixes and enhancements;
## Related Content [#related-content]
* [Choosing Between SQLite and MySQL](https://www.usememos.com/blog/choosing-between-sqlite-and-mysql)
* [Syncing Data Across My MacBooks with iCloud](https://www.usememos.com/blog/syncing-data-with-icloud)
See the **[Full Changelog](https://github.com/usememos/memos/releases/tag/v0.17.0)**.
---
# Release v0.17.1
URL: https://usememos.com/changelog/0-17-1
## Changes [#changes]
* Minor bugfixes and enhancements;
## Related Content [#related-content]
* [20k GitHub Stars in Just 2 Years ](/blog/20k-github-stars-in-2-years)
See the **[Full Changelog](https://github.com/usememos/memos/releases/tag/v0.17.1)**.
---
# Release v0.18.0
URL: https://usememos.com/changelog/0-18-0
## New Features [#new-features]
* PostgreSQL: **PostgreSQL** is supported, learn more in [Database Driver](/docs/configuration/database);
* Webhook: **Webhook** introduced, learn more in [Webhook](/docs/integrations/webhooks).
## Changes [#changes]
* fix: correct some Chinese translation inaccuracy by @Kellermaan in [https://github.com/usememos/memos/pull/2536](https://github.com/usememos/memos/pull/2536)
* chore: remove invalid access token from db by @athurg in [https://github.com/usememos/memos/pull/2539](https://github.com/usememos/memos/pull/2539)
* chore: remove the max height limit for single media by @athurg in [https://github.com/usememos/memos/pull/2545](https://github.com/usememos/memos/pull/2545)
* fix: remove ACL when set URLPrefix by @Hou-Xiaoxuan in [https://github.com/usememos/memos/pull/2532](https://github.com/usememos/memos/pull/2532)
* chore: update manifest.json by @webysther in [https://github.com/usememos/memos/pull/2568](https://github.com/usememos/memos/pull/2568)
* feat: support Postgres by @Irvingouj in [https://github.com/usememos/memos/pull/2569](https://github.com/usememos/memos/pull/2569)
* fix: field type of row\_status for table webhook by @athurg in [https://github.com/usememos/memos/pull/2579](https://github.com/usememos/memos/pull/2579)
* fix: detail page user-avatar size have unexpected height by @Tyangs in [https://github.com/usememos/memos/pull/2576](https://github.com/usememos/memos/pull/2576)
* fix: visibility of memo editor is empty by @athurg in [https://github.com/usememos/memos/pull/2580](https://github.com/usememos/memos/pull/2580)
* feat: tables support by @shagr4th in [https://github.com/usememos/memos/pull/2573](https://github.com/usememos/memos/pull/2573)
* fix: visibility of user preference is empty by @athurg in [https://github.com/usememos/memos/pull/2581](https://github.com/usememos/memos/pull/2581)
* chore: bump actions in workflows by @kbdharun in [https://github.com/usememos/memos/pull/2588](https://github.com/usememos/memos/pull/2588)
**Full Changelog**: [https://github.com/usememos/memos/compare/v0.17.1...v0.18.0](https://github.com/usememos/memos/compare/v0.17.1...v0.18.0)
---
# Release v0.18.1
URL: https://usememos.com/changelog/0-18-1
## Changes [#changes]
* Introducing instance-level SEO(Search Engine Optimization), learn more in [Instance Settings](/docs/admin/instance-settings);
* Introducing our markdown parser for memo content. Already used in RSS rendering and will be used for frontend rendering in the future.
* Fixed PostgreSQL related SQL statement issue;
**Full Changelog**: [https://github.com/usememos/memos/compare/v0.17.1...v0.18.0](https://github.com/usememos/memos/compare/v0.17.1...v0.18.0)
---
# Release v0.18.2
URL: https://usememos.com/changelog/0-18-2
## Changes [#changes]
* Enhanced UI and New Timeline Page:
* Improved user interface, and a better dark mode;
* New timeline page for organized content exploration.
* Upgraded Markdown Parser:
* Upgraded markdown parser to support more syntax, including table and LaTeX.
* Nodes can now be accessed in the API for custom rendering. e.g., /api/v1/memos
**Full Changelog**: [https://github.com/usememos/memos/releases/tag/v0.18.2](https://github.com/usememos/memos/releases/tag/v0.18.2)
---
# Release v0.19.0
URL: https://usememos.com/changelog/0-19-0
## Upgrade Overview [#upgrade-overview]
Warning: This release contains upgrade notes that deviate from the norm:
* Requires database migrations;
* Use short UUIDs instead of auto-incrementing IDs for memo and resource in API and frontend;
* The docker image tag `latest` will be deprecated, use `stable` instead;
## New Features [#new-features]
* Added new syntax for embedding content: `![[memos/memoid]]`;
* Supported rendering HTML directly with codeblock `__html`;
* Supported renaming tag;
* Supported collapse and expand navigator;
**Full Changelog**: [https://github.com/usememos/memos/releases/tag/v0.19.0](https://github.com/usememos/memos/releases/tag/v0.19.0)
---
# Release v0.19.1
URL: https://usememos.com/changelog/0-19-1
## Changes [#changes]
* feat: pre-signed URL for S3 storage;
* fix: month grouping error in timeline page;
* feat: export all user Memos as a .zip of Markdown files
* feat: add notice when sharing private links
* fix: the same-storage check in the new `pre-sign` feature
* chore: add en-GB language
* chore: greatly speed up migrator and lower memory usage
* fix: role error in api/v2 when the first user registers
* fix: wrong order of the timeline in the resource page & add webhook when create memos using Telegram bot
**Full Changelog**: [https://github.com/usememos/memos/releases/tag/v0.19.1](https://github.com/usememos/memos/releases/tag/v0.19.1)
---
# Release v0.2.0
URL: https://usememos.com/changelog/0-2-0
## What's Changed [#whats-changed]
* feat: toggle todo status by clicking by @boojack in [https://github.com/usememos/memos/pull/99](https://github.com/usememos/memos/pull/99)
* feat: schema migration handler by @boojack in [https://github.com/usememos/memos/pull/100](https://github.com/usememos/memos/pull/100)
* chore: add test github action by @boojack in [https://github.com/usememos/memos/pull/102](https://github.com/usememos/memos/pull/102)
* feat: support multi platforms docker image by @boojack in [https://github.com/usememos/memos/pull/103](https://github.com/usememos/memos/pull/103)
* fix: banner text click not work by @hyoban in [https://github.com/usememos/memos/pull/104](https://github.com/usememos/memos/pull/104)
* feat: personal memos page by @hyoban in [https://github.com/usememos/memos/pull/105](https://github.com/usememos/memos/pull/105)
* chore: reorder imports manually by @boojack in [https://github.com/usememos/memos/pull/106](https://github.com/usememos/memos/pull/106)
* refactor: visitor view by @boojack in [https://github.com/usememos/memos/pull/107](https://github.com/usememos/memos/pull/107)
* chore: rename user role by @boojack in [https://github.com/usememos/memos/pull/108](https://github.com/usememos/memos/pull/108)
* feat: add `visibility` field to memo by @boojack in [https://github.com/usememos/memos/pull/109](https://github.com/usememos/memos/pull/109)
* chore: add `latest` docker tag by @boojack in [https://github.com/usememos/memos/pull/113](https://github.com/usememos/memos/pull/113)
***
**Full Changelog**: [v0.2.0](https://github.com/usememos/memos/releases/tag/v0.2.0)
---
# Release v0.2.1
URL: https://usememos.com/changelog/0-2-1
## What's Changed [#whats-changed]
* add **Focus Editting Mode**;
* update create memo api with optional `visibility` field;
***
**Full Changelog**: [v0.2.1](https://github.com/usememos/memos/releases/tag/v0.2.1)
---
# Release v0.2.2
URL: https://usememos.com/changelog/0-2-2
## What's Changed [#whats-changed]
* feat: add relative time format for memo createdTs;
* chore: update icons with fontawesome;
* chore: update memo badge styles;
* fix: generate html image in safari by @boojack in [https://github.com/usememos/memos/pull/123](https://github.com/usememos/memos/pull/123)
***
**Full Changelog**: [v0.2.2](https://github.com/usememos/memos/releases/tag/v0.2.2)
---
# Release v0.20.0
URL: https://usememos.com/changelog/0-20-0
## New Features [#new-features]
* Added reactions feature: allow to interact with content by expressing your sentiment through emoji icons.
* Introduced two new syntaxes: `Mermaid` and `Spoiler`. Learn more in [https://www.usememos.com/docs/getting-started/content-syntax](https://www.usememos.com/docs/getting-started/content-syntax)
* `Mermaid` supports rendering mermaid diagrams. To do this, use `mermaid` as langauge in codeblock;
* `Spoiler` allows you to hide some content. e.g., `||Invisible text||`
## Changes [#changes]
* chore: fix typo in About.tsx by @eltociear in [https://github.com/usememos/memos/pull/2899](https://github.com/usememos/memos/pull/2899)
* fix: signin error notification is not shown by @athurg in [https://github.com/usememos/memos/pull/2908](https://github.com/usememos/memos/pull/2908)
* fix: displaying archived memos by @Kaz205 in [https://github.com/usememos/memos/pull/2933](https://github.com/usememos/memos/pull/2933)
* Compact Mode Setting (Proto) by @MehadND in [https://github.com/usememos/memos/pull/2934](https://github.com/usememos/memos/pull/2934)
* Compact Mode Setting (Backend) by @MehadND in [https://github.com/usememos/memos/pull/2935](https://github.com/usememos/memos/pull/2935)
* chore: improve docker-compose.dev by @lincolnthalles in [https://github.com/usememos/memos/pull/2938](https://github.com/usememos/memos/pull/2938)
* feat: add notice when sharing private links in MemoDetail by @moehanabi in [https://github.com/usememos/memos/pull/2942](https://github.com/usememos/memos/pull/2942)
* feat: add visibility select in ShareMemoDialog by @moehanabi in [https://github.com/usememos/memos/pull/2941](https://github.com/usememos/memos/pull/2941)
* chore: allow all 20x response status code in webhook by @ImSingee in [https://github.com/usememos/memos/pull/2947](https://github.com/usememos/memos/pull/2947)
* chore: update ja.json by @Somme4096 in [https://github.com/usememos/memos/pull/2966](https://github.com/usememos/memos/pull/2966)
* feat: add new line if the cursor is on a character when adding a tag by @Kaz205 in [https://github.com/usememos/memos/pull/2960](https://github.com/usememos/memos/pull/2960)
* feat: add mermaid support in codeblock by @C1C0 in [https://github.com/usememos/memos/pull/2971](https://github.com/usememos/memos/pull/2971)
* chore: update vi.json by @hoangsvit in [https://github.com/usememos/memos/pull/2980](https://github.com/usememos/memos/pull/2980)
**Full Changelog**: [https://github.com/usememos/memos/releases/tag/v0.20.0](https://github.com/usememos/memos/releases/tag/v0.20.0)
---
# Release v0.20.1
URL: https://usememos.com/changelog/0-20-1
## Changes [#changes]
* fix: incorrectly checking whether registration is allowed in the login v1 api by @Cufoon in [https://github.com/usememos/memos/pull/2998](https://github.com/usememos/memos/pull/2998)
* fix: firefox/safari to redirect to /explore in HomeLayout by @zhzy0077 in [https://github.com/usememos/memos/pull/3001](https://github.com/usememos/memos/pull/3001)
* fix: telegram callback query handler dereferencing nil pointer if memo not found by @ericd23 in [https://github.com/usememos/memos/pull/3003](https://github.com/usememos/memos/pull/3003)
* fix: dark mode tag selection and suggestion by @xyl1t in [https://github.com/usememos/memos/pull/3004](https://github.com/usememos/memos/pull/3004)
* chore: fix typo in build script's if statement by @ayan0312 in [https://github.com/usememos/memos/pull/3017](https://github.com/usememos/memos/pull/3017)
* fix: ignore "Tab" key down event when is composing in editor(#3026) by @jjaychen1e in [https://github.com/usememos/memos/pull/3027](https://github.com/usememos/memos/pull/3027)
* feat: improve theming by @Dubzer in [https://github.com/usememos/memos/pull/3032](https://github.com/usememos/memos/pull/3032)
* fix: check disallow public memo in Telegram(#3036) by @redsubmarine in [https://github.com/usememos/memos/pull/3037](https://github.com/usememos/memos/pull/3037)
* chore: settings page improvements by @Dubzer in [https://github.com/usememos/memos/pull/3034](https://github.com/usememos/memos/pull/3034)
* chore(i18n): update translation files by @michaelien in [https://github.com/usememos/memos/pull/3042](https://github.com/usememos/memos/pull/3042)
* chore: translated using Weblate (Portuguese (Brazil)) by @michaelien in [https://github.com/usememos/memos/pull/3050](https://github.com/usememos/memos/pull/3050)
* chore: translated using Weblate (Korean) by @michaelien in [https://github.com/usememos/memos/pull/3060](https://github.com/usememos/memos/pull/3060)
* fix: body overflow styles by @zty42 in [https://github.com/usememos/memos/pull/3056](https://github.com/usememos/memos/pull/3056)
**Full Changelog**: [https://github.com/usememos/memos/releases/tag/v0.20.1](https://github.com/usememos/memos/releases/tag/v0.20.1)
---
# Release v0.21.0
URL: https://usememos.com/changelog/0-21-0
## New Features [#new-features]
* Link preview;

## Changes [#changes]
* chore: update i18n with Weblate by @michaelien in [https://github.com/usememos/memos/pull/3079](https://github.com/usememos/memos/pull/3079)
* chore: fix typo by @thirdkeyword in [https://github.com/usememos/memos/pull/3080](https://github.com/usememos/memos/pull/3080)
* chore: fix spanish typos by @magomzr in [https://github.com/usememos/memos/pull/3083](https://github.com/usememos/memos/pull/3083)
* chore: update build scripts by @lincolnthalles in [https://github.com/usememos/memos/pull/3085](https://github.com/usememos/memos/pull/3085)
* feat: implemented link previews (proto files) by @MehadND in [https://github.com/usememos/memos/pull/3072](https://github.com/usememos/memos/pull/3072)
* feat: implemented link previews (server files) by @MehadND in [https://github.com/usememos/memos/pull/3073](https://github.com/usememos/memos/pull/3073)
* chore: update i18n with Weblate by @boojack in [https://github.com/usememos/memos/pull/3090](https://github.com/usememos/memos/pull/3090)
* feat: implemented link previews (frontend files) by @MehadND in [https://github.com/usememos/memos/pull/3074](https://github.com/usememos/memos/pull/3074)
* chore: fix typo by @sunxunle in [https://github.com/usememos/memos/pull/3106](https://github.com/usememos/memos/pull/3106)
* feat: add shortcut to edit the previous memo by @Dubzer in [https://github.com/usememos/memos/pull/3122](https://github.com/usememos/memos/pull/3122)
* removed sanitization logic by @YohannKovacs in [https://github.com/usememos/memos/pull/3147](https://github.com/usememos/memos/pull/3147)
* chore: update Vietnamese translation by @ntheanh201 in [https://github.com/usememos/memos/pull/3155](https://github.com/usememos/memos/pull/3155)
* fix: link embedded content to uid instead of name by @ntheanh201 in [https://github.com/usememos/memos/pull/3164](https://github.com/usememos/memos/pull/3164)
* feat: handle restore memo when is in archived memo detail page by @ntheanh201 in [https://github.com/usememos/memos/pull/3165](https://github.com/usememos/memos/pull/3165)
* cmd: use the built-in slices library by @stayweek in [https://github.com/usememos/memos/pull/3172](https://github.com/usememos/memos/pull/3172)
* chore: fix memo link by @ntheanh201 in [https://github.com/usememos/memos/pull/3173](https://github.com/usememos/memos/pull/3173)
* Set navigation icons to not shrink by @imikod in [https://github.com/usememos/memos/pull/3186](https://github.com/usememos/memos/pull/3186)
* improve localization by @imikod in [https://github.com/usememos/memos/pull/3190](https://github.com/usememos/memos/pull/3190)
**Full Changelog**: [https://github.com/usememos/memos/compare/v0.20.1...v0.21.0](https://github.com/usememos/memos/compare/v0.20.1...v0.21.0)
---
# Release v0.22.0
URL: https://usememos.com/changelog/0-22-0
## Upgrade Overview [#upgrade-overview]
Warning: This release contains upgrade notes that deviate from the norm:
* Requires database migrations;
* Some settings(including resource storage) need to be reset on the UI;
If you're ready to upgrade, it's **recommended** to back up your data first
## Breaking Changes [#breaking-changes]
* **API v1** incompatibility update. Learn more with [https://memos.apidocumentation.com/reference](https://memos.apidocumentation.com/reference)
* **Telegram integration** has been moved to a [new standalone project](https://github.com/usememos/telegram-integration) that is much easier to use. Learn more in [usememos/telegram-integration](https://github.com/usememos/telegram-integration)
* **S3 Storage** related resources will be using [pre-signed url](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html) and supports synchronized deletion.
* **Tags refactored** to support displaying the amount of related memos and provide more accurate search functionality.

## Improvements [#improvements]
* Supported modifying display time when editing a memo.
* Added Linux/Darwin binary files to the release note.
* Timeline: display daily memos in chronological order.

---
# Release v0.22.1
URL: https://usememos.com/changelog/0-22-1
## Improvements [#improvements]
* Support to quickly filter specified content: links, to-dos, codes
> In order to use this feature, you need to regenerate the memo properties, which can be done via the Refresh button in the top right corner of user statistics panel.
* Added more memo-related settings:
* Support for enabling auto-collapse.
* Support for enabling double-click content editing.
* Support for reopening the last visited page: home or timeline.
## Full Changelog [#full-changelog]
* chore: add last visited page
* chore: fix content search
* chore: fix editor autocomplete
* chore: fix imports
* chore: fix memo cache key
* chore: fix memo editor cache
* chore: implement memo property endpoint
* chore: regenerate dependencies
* chore: remove access token after sign out
* chore: remove unused
* chore: tweak comments
* chore: tweak common function
* chore: tweak error message
* chore: tweak goreleaser
* chore: tweak memo definition
* chore: tweak memo property
* chore: tweak refresh button
* chore: tweak version
* chore: tweak webhook payload
* chore: update build artifacts
* chore: update general setting
* chore: update i18n
* chore: update memo related settings
* chore: update resource binary endpoint
* chore: update tag section
* chore: update timeline filters
* chore: update translation files (#3481)
* chore: update user access token checks
* feat(i18n): added marathi(mr) translations (#3449)
* feat: add more memo settings
* feat: add panic recovery middleware for grpc and echo server (#3459)
* feat: update search memo filter
* feat: update statistics view
* fix: create idp in postgres
* fix: link hover handler
* fix: update resource with id (#3405)
---
# Release v0.22.2
URL: https://usememos.com/changelog/0-22-2
## Changes [#changes]
* Supports display of unfinished todo records in statistics;

* Fixes HTML rendering to prevent XSS attacks;
* Supports for Thai language ;
---
# Release v0.22.3
URL: https://usememos.com/changelog/0-22-3
## New Features [#new-features]
* Support editing memos directly in the inline editor instead of a dialog.

* Support displaying tags in a tree structure.

## Improvements [#improvements]
* Tables now support rendering additional syntax;
* HTML elements rendering supported, now including ` `;
* Added a setting to enable link previews(*disabled by default*);
* Access token will be correctly deleted upon logout;
* Disable user registration has been moved to startup options/environment variables `--public`.
---
# Release v0.22.4
URL: https://usememos.com/changelog/0-22-4

## Improvements [#improvements]
* Added `password-auth` flag to control whether username and password login is enabled.
* Support changing the date when editing memos.
* Updated the default value of `public` to false, meaning user registration is not enabled by default.
* Added calendar view on Home page to better review recent activities.
* Removed the Timeline page.
---
# Release v0.22.5
URL: https://usememos.com/changelog/0-22-5
## Features [#features]
* Support configuring the start day of the week.
* Support sorting by time in ascending order.
* Support disabling memo comments to create a cleaner note-taking experience.
* New settings to disable user registration and account password login.
## Improvements [#improvements]
* Updated frontend dependencies and optimized image size, reducing it by 21.3MB.
* Tweaked the styles and UI details of various components, including icon buttons, load more buttons, and menu styles.
## Bug Fixes [#bug-fixes]
* Fixed text color display issues in dark mode.
* Fixed search memos with tags issue of MySQL.
---
# Release v0.23.0
URL: https://usememos.com/changelog/0-23-0
### Features [#features]
* **Memo Relation Graph**: Introduced a new feature to visualize memo relations in a graph view
* **Location Support**: Added support for adding location to memos
* **Pull to Refresh for PagedMemoList**: Added pull-to-refresh functionality for memo lists.
* **Disable Username and Nickname Changes**: Added support to disable username and nickname modifications.
### Improvements [#improvements]
* **Show Less for Expanded Memos**: Introduced a "show less" option for expanded memos. (#4143)
* **Remove RSS Titles**: Removed RSS titles for a cleaner feed display. (#4140)
* **Calendar Translations**: Applied translations for calendar day names. (#3895)
### Bug Fixes [#bug-fixes]
* **Case-Insensitive Memo Search**: Resolved memo search issues for PostgreSQL to make it case-insensitive. (#3938)
* **Future Relative Dates**: Fixed the display of future relative dates. (#3946)
* **UTC Date for Calendar Filter**: Ensured UTC dates are used in calendar filters. (#4046)
* **List Indentation**: Automatic indentation now correctly follows the previous lines in lists. (#4050)
* **Dynamic Theme Application**: Fixed system theme application to dynamically reflect changes. (#4010)
---
# Release v0.23.1
URL: https://usememos.com/changelog/0-23-1
* fix: panic on arm v5-v6-v7 builds
* fix: limit the size of the resource list viewer
* chore: fix css location compatibility issues on Safari
* refactor: move tags from property to payload
* feat: add sh entrypoint to allow MEMOS\_DSN\_FILE to load variable from secret
* feat: persist memo filters with url query
* feat: scroll to top
---
# Release v0.24.0
URL: https://usememos.com/changelog/0-24-0
**Shortcuts** have been introduced, allowing you to easily filter memos based on conditions like tags, visibility, and timestamps. Quickly create reusable filters with comparison, set, string, and logical operators, making it faster and more efficient to find the memos you need. For more details, check out the [documentation](https://www.usememos.com/docs/getting-started/shortcuts).
## Changes [#changes]
* fix: use correct separator in migration file name
* fix: internal error on pin/unpin
* chore: cancel out of no changes save
* fix: migrate sql error
* fix: show loader icon while refreshing
* feat: search for multiple words
* fix: calendar coloring issue
* feat: add Farsi(Persian) localazation
---
# Release v0.24.1
URL: https://usememos.com/changelog/0-24-1

## Features [#features]
* Polished homepage layout
* Masonry view(*beta*)
* Match sublist indentation when adding a new item by @mbaum0 in [https://github.com/usememos/memos/pull/4433](https://github.com/usememos/memos/pull/4433)
And more...
* chore: add datepicker to calendar month by @shungiku in [https://github.com/usememos/memos/pull/4379](https://github.com/usememos/memos/pull/4379)
* feat: allow storing resource references >256 chars long in mysql by @cdzombak in [https://github.com/usememos/memos/pull/4408](https://github.com/usememos/memos/pull/4408)
* feat: prevent attackers from exploiting redirect attack GetLinkMetadata API by @CallMeMhz in [https://github.com/usememos/memos/pull/4428](https://github.com/usememos/memos/pull/4428)
* feat: support YouTube video thumbnail in link preview by @CallMeMhz in [https://github.com/usememos/memos/pull/4427](https://github.com/usememos/memos/pull/4427)
* feat: optimize initial load performance by implementing lazy loading and code splitting by @nbb2025 in [https://github.com/usememos/memos/pull/4445](https://github.com/usememos/memos/pull/4445)
* chore(i18n): update pt-BR by @lincolnthalles in [https://github.com/usememos/memos/pull/4471](https://github.com/usememos/memos/pull/4471)
* feat: add loading spinner during file upload process by @sawatkins in [https://github.com/usememos/memos/pull/4491](https://github.com/usememos/memos/pull/4491)
---
# Release v0.24.2
URL: https://usememos.com/changelog/0-24-2
## Changes [#changes]
* chore: always show full content when pinned
* chore: update i18n for resource page (#4505)
* feat: implement grpc health service checking database connection (#4499)
* fix: BrandBanner to use NavLink (#4536)
* fix: allow admins to uncheck disallow password if applicable (#4532)
* fix: prevent double effect on image modal wheel event (#4522)
* fix: use valid query parameters for postgres (#4515)
* fix: user stats changes based on selected tab (#4504)
---
# Release v0.24.3
URL: https://usememos.com/changelog/0-24-3
## Changes [#changes]
* chore: Czech locale update (#4685)
* chore: add action cache
* chore: add deepwiki badge
* chore: add dockerfile.demo
* chore: implement memo filter in list memo relations
* chore: update alt text of deepwiki badge
* feat: add norwegian bokmal (nb) translation (#4561)
* feat: enhance site.webmanifest in chrome (#4676)
* feat: improve visual feedback in MemoEditor for drag/drop file uploads (#4634)
* feat: set locale based on browser language when user is not logged in (#4635)
* feat: support child tags in NSFW blur feature (#4640)
* feat: support listening on a UNIX socket (#4654)
* feat: support mapping avatar url from oauth2
* feat: update ItalicNode to use repeated children instead of content (#4566)
* fix: aws-chunked encoding is not supported with the specified x-amz-content-sha256 value for some s3 providers (#4575)
* fix: codeblock highlight
* fix: filter args of postgres
* fix: incorrect checkbox state after removing checked items #4549 (#4552)
* fix: list memo comments
* fix: list memo relations
* fix: memo filter for postgres
* fix: preview image window proportion error (#4689)
* fix: remove errors.Wrap(nil) (#4576)
* fix: shutdown gRPC server gracefully (#4626)
* fix: user avatar url
---
# Release v0.24.4
URL: https://usememos.com/changelog/0-24-4
## Changes [#changes]
* feat: automatically add a new table row in the editor when pressing enter
* feat: add infinite scrolling for memos
* fix: make the save button disabled after a successful update
* fix(editor): Prevent race condition and ensure correct list continuation on Enter
* feat(rss): Use server title and description for RSS feed, if configured
* fix: inherits memo visibility for default comment visibility
* refactor: memo editor
---
# Release v0.25.0
URL: https://usememos.com/changelog/0-25-0
> The version includes changes to the database and API. Please be careful to upgrade, and it's recommended to backup your data first. Learn more in [https://github.com/usememos/memos/compare/v0.24.4...v0.25.0](https://github.com/usememos/memos/compare/v0.24.4...v0.25.0).
## Changes [#changes]
* feat: support user sessions with sliding window for improved security
* feat: moved webhook data storage to user settings (requires reconfiguration)
* feat: variant colors
* feat: themes
* feat: highlight pinned memos
* fix: broken resource urls in RSS feed
* fix: trim queryText and split
* fix: dayjs - ISO 8601 compatible DATE\_TIME\_FORMAT
* fix: correct avatar URL generation to resolve 404 errors
* refactor: use the built-in max/min to simplify the code
## New Contributors [#new-contributors]
* @maya-doshi made their first contribution
* @3zmana made their first contribution
* @jinjingroad made their first contribution
* @Copilot made their first contribution
* @Cadavanaugh made their first contribution
* @KevinStaude made their first contribution
* @unuunn made their first contribution
* @dedyf5 made their first contribution
* @amarsinghrathour made their first contribution
* @antcoop096 made their first contribution
**Full Changelog**: [https://github.com/usememos/memos/compare/v0.24.4...v0.25.0](https://github.com/usememos/memos/compare/v0.24.4...v0.25.0)
---
# Release v0.25.1
URL: https://usememos.com/changelog/0-25-1
This release focuses on bug fixes, performance optimizations, and several quality-of-life improvements based on community feedback.
## New Features [#new-features]
### Editor Enhancements [#editor-enhancements]
* **Text-based autocompleting commands** - New command system for faster memo creation
* **Editor button tooltips** - Helpful tooltips to guide new users
* **Auto-expand subtags in tree mode** - Option to automatically expand nested tags for better navigation
### Inbox Improvements [#inbox-improvements]
* **Better error handling** - Improved error messages when fetching inbox items
* **Delete inbox items** - Added ability to remove items from inbox
### Enhanced Filtering [#enhanced-filtering]
* **More filter factors** - Extended filtering capabilities for better memo discovery
* **Reaction filtering** - Filter memos by reaction content
* **Calendar filter fixes** - Improved date-based filtering
## Improvements [#improvements]
### User Experience [#user-experience]
* **Memo comments enabled by default** - Comments are now enabled out of the box
* **Unified visibility selector** - Merged visibility options into the save button for cleaner UI
* **Dark theme improvements** - Enhanced dark mode appearance
* **Mobile reaction selector** - Always visible reaction buttons on mobile devices
### Performance & Security [#performance--security]
* **HTML content sanitization** - Added DOMPurify for safer code block rendering
* **Optimized reactions queries** - Only fetch reactions when memos actually exist
* **Production profiler disabled** - Better performance in production environments
* **Stacktrace logging option** - New `LOG_STACKTRACES` configuration option
### Configuration [#configuration]
* **Instance URL for "Copy Link"** - Uses `MEMOS_INSTANCE_URL` for generating shareable links
* **Better MIME type checking** - Enhanced file type validation for uploads
## Bug Fixes [#bug-fixes]
### Core Functionality [#core-functionality]
* **Theme saving issues** - Fixed theme preferences not being saved properly
* **Preference overwrites** - Resolved preferences being reset unexpectedly
* **Boolean filters** - Fixed filtering with boolean values
* **Pinned shortcut operators** - Corrected comparison operators for shortcuts
### API & Integration [#api--integration]
* **OpenAPI parameter conflicts** - Resolved DeleteMemoTag endpoint parameter issues
* **SSO redirect encoding** - Fixed SSO login flow with proper URL encoding
* **gRPC Gateway connections** - Resolved connection issues when server address is empty
* **SQL query formatting** - Fixed JSON array elements in tag queries
### User Interface [#user-interface]
* **Sheet focus behavior** - Prevented unwanted focus changes when opening/closing sheets
* **Syntax highlighting** - Added missing CSS imports for proper code highlighting
## Links & Resources [#links--resources]
* **Installation Guide** - Updated documentation links
* **Docker README** - Enhanced Docker setup documentation
## New Contributors [#new-contributors]
Welcome to our new contributors who made their first contributions in this release:
* @clnhlzmn - Instance URL improvements
* @einho - Database optimizations
* @varsnotwars - Performance enhancements
* @chaoliu719 - gRPC fixes
* @aarohee-he - UI improvements
* @bcspragu - Logging enhancements
* @twaslowski - Editor features
* @SaraVieira - File validation
* @chojs23 - Shortcut fixes
* @amazingca - SSO improvements
* @giacomocerquone - Mobile UX
## Download [#download]
Download the latest release from [GitHub](https://github.com/usememos/memos/releases/tag/v0.25.1) or pull the Docker image:
```bash
docker pull neosmemo/memos:0.25.1
# or
docker pull neosmemo/memos:latest
```
***
**Full Changelog**: [v0.25.0...v0.25.1](https://github.com/usememos/memos/compare/v0.25.0...v0.25.1)
---
# Release v0.25.2
URL: https://usememos.com/changelog/0-25-2
This release brings significant user experience improvements with automatic thumbnail generation, masonry layout for memos, system theme detection, and numerous quality-of-life enhancements.
## New Features [#new-features]
### Visual Enhancements [#visual-enhancements]
* **Automatic thumbnail generation** - S3-stored images now generate thumbnails automatically for faster loading
* **Masonry layout** - Beautiful responsive column layout adapts to different screen sizes
* **System theme detection** - Automatic dark/light mode switching based on your system preferences
* **Theme-aware syntax highlighting** - Code blocks now properly adapt to your selected theme
### Location & Tagging [#location--tagging]
* **Manual latitude/longitude input** - Add precise location coordinates manually for location tagging (#5152)
* **Improved geolocation handling** - Enhanced LocationSelector with better accuracy and reliability
### User Experience [#user-experience]
* **Copy memo content** - Quickly copy memo text directly from the action menu
* **Enhanced reaction selector** - Improved hover effects and mobile-friendly scrolling for reactions
* **Accessible confirmation dialogs** - Better accessibility with markdown support (#5111)
## Improvements [#improvements]
### Performance & Architecture [#performance--architecture]
* **Enhanced store architecture** - Improved state management for better performance
* **Streamlined memo filtering** - Refactored filtering logic for faster memo discovery
* **Simplified concurrent operations** - Better handling of simultaneous actions (#5162)
### Localization [#localization]
* **Improved Traditional Chinese translations** - Enhanced language support (#5159)
## Bug Fixes [#bug-fixes]
### Security [#security]
* **User authentication checks** - Added security checks to prevent unauthorized access
### User Interface [#user-interface]
* **Theme colors in calendar** - Fixed incorrect theme colors in calendar cells
* **Dialog state management** - Prevented dialog state from leaking between sessions
* **Markdown parser compatibility** - Improved markdown parsing for better content rendering
## Sponsors [#sponsors]
### 💎 Featured Sponsor [#-featured-sponsor]
[**Warp - The terminal reimagined with AI and collaborative tools for developers**](https://go.warp.dev/memos)
## New Contributors [#new-contributors]
Welcome to our new contributors who made their first contributions in this release:
* @nicolasluckie - Accessible confirmation dialogs (#5111)
* @asttool - Concurrent operations improvements (#5162)
* @bmitchinson - Manual location input (#5152)
* @simoncarrignon - Bug fixes and improvements
* @FloDwld - Enhancement contributions
***
**Full Changelog**: [v0.25.1...v0.25.2](https://github.com/usememos/memos/compare/v0.25.1...v0.25.2)
---
# Release v0.25.3
URL: https://usememos.com/changelog/0-25-3
This release introduces a distraction-free focus mode for writing, enhanced attachment management capabilities, and improved markdown parsing with CommonMark/GFM compliance.
## New Features [#new-features]
### Writing Experience [#writing-experience]
* **Focus mode** - New writing mode that minimizes distractions for focused memo creation
* **Improved markdown list auto-completion** - Fixed auto-completion to properly create new lines (#5238)
### Attachment Management [#attachment-management]
* **Delete unused attachments** - Ability to delete unused attachments to reclaim storage space (#5272)
* **Attachments page pagination** - Load more button and pagination added for better navigation (#5258)
### Theme System [#theme-system]
* **System theme sync** - Theme now syncs with system preferences automatically (#5231)
## Improvements [#improvements]
### Technical Enhancements [#technical-enhancements]
* **CommonMark and GFM compliance** - Markdown parser/renderer now adheres to CommonMark and GFM specifications for enhanced compatibility
* **Memory optimization** - Prevented memory exhaustion during thumbnail generation processes
## Bug Fixes [#bug-fixes]
### User Interface [#user-interface]
* **Tag sidebar improvements** - Resolved tag sidebar filtering and reactivity issues for proper sidebar categorization
* **Markdown list formatting** - Corrected markdown list auto-completion behavior
***
**Full Changelog**: [v0.25.2...v0.25.3](https://github.com/usememos/memos/compare/v0.25.2...v0.25.3)
---
# Release v0.26.0
URL: https://usememos.com/changelog/0-26-0
> This version includes significant changes to authentication and the database. Please backup your data before upgrading. Learn more in [https://github.com/usememos/memos/compare/v0.25.3...v0.26.0](https://github.com/usememos/memos/compare/v0.25.3...v0.26.0).
## Major Features [#major-features]
* feat: refresh token rotation with sliding window sessions for enhanced authentication security
* feat: streaming for video/audio files to fix memory exhaustion issues
* feat: EXIF metadata stripping for image uploads (privacy enhancement)
* feat: role refactor - HOST role migrated to ADMIN for clearer terminology
* feat: React Query migration for improved frontend state management and caching
* feat: memo map in user profile with Google Maps integration
* feat: HDR image and video support
* feat: midnight theme option
## Other Improvements [#other-improvements]
* feat: new locale - Galician (gl, gl\_ES)
* feat: iframe support for embedded videos in markdown content
* feat: enhanced attachment handling with MIME type validation
* feat: glassmorphism map controls with Google Maps integration
* feat: slash commands tooltip to InsertMenu
* refactor: migrate to connect-rpc
* refactor: user auth improvements
* refactor: consolidate MemoEditor components
* refactor: remove legacy session cookie authentication
* style: improve code block styling and formatting
* perf: optimize memory usage for statistics and image processing
* perf: optimize backend tests with parallel execution
## Bug Fixes [#bug-fixes]
* fix: add access control checks for attachments, comments, and reactions
* fix: math render issues
* fix: correct calendar header month parsing
* fix: editor auto-scroll and Safari IME handling
* fix: prevent browser cache from serving stale memo data
* fix: return Unauthenticated instead of PermissionDenied on token expiration
* fix: apply theme and locale changes immediately on login screen
* fix: allow public memo API access without authentication
* fix: KaTeX math rendering with underscores
* fix: ensure attachments are properly linked when creating memos
* fix: improve text contrast in default dark mode
* fix: disable setext header syntax
* fix: todo command does nothing
* fix: clean up memo\_relation and attachments when deleting memo
* fix: allow guests to view public memo comments
## Localization [#localization]
* Updated British English, Chinese, Korean, German, French, Polish, and Italian translations
**Full Changelog**: [https://github.com/usememos/memos/compare/v0.25.3...v0.26.0](https://github.com/usememos/memos/compare/v0.25.3...v0.26.0)
---
# Release v0.26.1
URL: https://usememos.com/changelog/0-26-1
> This is a patch release focused on stability and upgrade reliability.
## Bug Fixes [#bug-fixes]
* fix: avoid inbox crashes by gracefully handling deleted memos in the activity service
* fix: correctly parse environment variables that contain underscores
* fix: return consistent gRPC-style errors instead of Echo HTTP errors
* fix: video attachment handling
* fix: prevent 401 errors on window focus when an access token expires
* fix: ensure the shortcut edit button opens edit mode instead of create mode
* fix: block `Ctrl+Enter` from saving while editor content is still loading
* fix: nested task list rendering and checkbox interactions
* fix: make OAuth PKCE optional during sign-in
* fix: prevent private memos from disappearing during token refresh
* fix: add Unicode case-insensitive search support for SQLite
* fix: correct handling of pasted files in the memo editor
* fix: restore the access token creation flow
* fix: preserve tag case when extracting Markdown tags
* fix: auto-fix permission issues when upgrading from v0.25.3 to v0.26.0
**Full Changelog**: [https://github.com/usememos/memos/compare/v0.26.0...v0.26.1](https://github.com/usememos/memos/compare/v0.26.0...v0.26.1)
---
# Release v0.26.2
URL: https://usememos.com/changelog/0-26-2
> This is a patch release focused on stability, security, and usability improvements.
## Notable Changes [#notable-changes]
* feat: add ampersand support in tags for compound tag functionality
* feat: replace EditableTimestamp with a timestamp popover component
* feat: extend calendar year picker navigation back to 1970
* feat: improve PAT PostgreSQL handling with better error management
## Bug Fixes [#bug-fixes]
* fix: spurious logout on page reload with expired access token
* fix: cross-tab session loss via localStorage persistence improvements
* fix: calendar navigation and month label language support
* fix: memo visibility defaults not correctly applied
* fix: query invalidation for comment reactions and deletions
* fix: SSRF vulnerability in webhook dispatcher
* fix: explore page privacy filtering for tags
* fix: task list item scoping to memo containers
* fix: attachment and memo deletion resilience when local files are missing
* fix: memo batch attachment truncation
* fix: MemoEditor layout and styling corrections
* fix: redirect logic for expired sessions
* fix: eliminate redundant fetch operations when opening inline memo editor
**Full Changelog**: [https://github.com/usememos/memos/compare/v0.26.1...v0.26.2](https://github.com/usememos/memos/compare/v0.26.1...v0.26.2)
---
# Release v0.27.0
URL: https://usememos.com/changelog/0-27-0
> This release adds real-time updates, richer memo authoring, AI transcription, and a new MCP integration. It also includes security hardening, attachment improvements, and many editor and API fixes.
## New Features [#new-features]
### Real-Time and Memo Creation [#real-time-and-memo-creation]
* **Live refresh** - Memo updates now arrive through Server-Sent Events, with a visual indicator for the connection state.
* **Voice notes** - The memo composer can record voice notes with a compact waveform panel.
* **AI transcription** - Audio transcription now supports instance-level providers, bring-your-own-key providers, and Gemini.
* **MCP integration** - The new MCP server supports PAT authentication, a standard protocol structure, expanded tools, and safer tool exposure.
* **Memo mentions** - Memos can mention other memos, render those mentions, and send related notifications.
* **Memo sharing** - Private memos can be shared with links, and memo detail pages can share images directly.
### Reading and Navigation [#reading-and-navigation]
* **Detail outline** - Memo detail pages now include outline navigation in the sidebar.
* **Automatic titles** - The first H1 heading can be extracted into the memo title property.
* **Inline previews** - Memo lists can show comment previews, and memo previews understand comment metadata.
* **Media browsing** - Image previews support arrow-key navigation, Live Photo playback is improved, audio attachments render inline, and SVG attachments can be previewed.
### Tags and Metadata [#tags-and-metadata]
* **Tag metadata controls** - Instance admins and users can configure tag metadata, including canonical tags and blur rules.
* **Anchored matching** - Tag setting keys are treated as anchored regular expressions for more predictable matching.
* **Better snippets** - Memo snippets include plain URLs and tags, and tag parsing now preserves emoji variation selectors.
## Admin and Security [#admin-and-security]
* **Webhook controls** - Memos can dispatch webhooks for comment creation, attachment changes, and relation changes.
* **Private webhook opt-in** - The `--allow-private-webhooks` flag allows intentionally sending webhooks to private targets.
* **Storage default** - The default storage type is now local filesystem.
* **Notification transport** - Instance settings now include notification transport configuration.
* **Sensitive settings** - Credentials are write-only, sensitive settings are restricted to admins, and user emails are visible only to the user and admins.
* **Access hardening** - Archived memos are restricted to their creator, memo content iframes and HTML sanitization are hardened, local attachment uploads cannot overwrite files, and Unix socket permissions are reduced from `755` to `660`.
## Authentication and API Reliability [#authentication-and-api-reliability]
* **Identity resources** - Identity provider resource names now use UIDs, and user resource names now use usernames.
* **Token refresh** - Access token refresh is more reliable in the web app and across browser tabs.
* **Session recovery** - Sessions can recover from the refresh cookie when local storage is empty.
* **Public routing** - Unauthenticated users are redirected to `/explore` when public visibility is enabled.
* **API resilience** - Memo conversion tolerates missing related users, legacy installations with empty schema versions are detected, MySQL custom timestamps are handled correctly, and CEL filter syntax is enforced.
## User Interface Fixes [#user-interface-fixes]
* **Editor reliability** - Drafts are preserved across tab suspension and editor remounts, `Cmd+Enter` only saves the active editor, and newly linked memos appear while editing memos with attachments.
* **Comment layout** - Comments span the full memo detail width, and the comment editor appears above the comment list.
* **Markdown rendering** - KaTeX and Mermaid errors are handled more gracefully, Markdown image `height` and `width` attributes are supported, and memo content prop leaks are prevented.
* **Navigation polish** - Selecting a shortcut clears the content search filter, focus mode no longer resets editor height, and memo detail cache refreshes after saving.
* **Visual polish** - Metadata styling is unified across memo views and the editor, map styling is refined for dark mode, and the HTML `lang` attribute syncs with the active locale.
## Performance and Maintenance [#performance-and-maintenance]
* **Faster memo lists** - Memo relations are batch loaded when listing memos.
* **Lower memory pressure** - Backend paths use less memory.
* **SSE reliability** - SSE broadcasts avoid duplicate comment events, and clients close cleanly during server shutdown.
* **Deployment resilience** - Chunk load errors after redeployment trigger automatic reloads.
* **Project maintenance** - Sitemap and robots routes were restored, and installer compatibility and documentation were improved.
**Full Changelog**: [v0.26.2...v0.27.0](https://github.com/usememos/memos/compare/v0.26.2...v0.27.0)
---
# Release v0.27.1
URL: https://usememos.com/changelog/0-27-1
> This patch release fixes user resource naming edge cases introduced around identity provider handling and ensures release artifacts carry the correct build version.
## Bug Fixes [#bug-fixes]
* **Mixed-case user names** - User resource names now support mixed-case values.
* **Identity provider subjects** - User resource names can now be UUIDv4 values from identity provider `sub` claims.
* **Release artifacts** - Build versions are now injected into release artifacts.
**Full Changelog**: [v0.27.0...v0.27.1](https://github.com/usememos/memos/compare/v0.27.0...v0.27.1)
---
# Release v0.28.0
URL: https://usememos.com/changelog/0-28-0
> This release improves SSO account handling by linking external provider identities to local Memos users instead of treating provider identifiers as local usernames. It also refreshes account and SSO management, adds memo time display controls, and includes several authentication and editor fixes.
## Breaking Change [#breaking-change]
* **Existing SSO users must link their identity again** - If you previously signed in through SSO, sign in once with your username and password after upgrading, then go to Account Settings to link your SSO identity. After the identity is linked, future SSO sign-ins will resolve to your existing Memos account.
## New Features [#new-features]
### SSO User Identity Linkage [#sso-user-identity-linkage]
* **Linked SSO identities** - Memos now stores external SSO subjects in a dedicated `user_identity` model and links them to local users.
* **Stable local usernames** - SSO sign-ins now resolve users through the identity linkage table, so external provider IDs no longer need to become local usernames.
* **Cleaner first-login flow** - New SSO users get usernames derived from profile data, with collision handling and cleanup for concurrent first-login races.
* **Linked identity management** - Account settings now include a clearer linked identity view so users can understand which SSO accounts are connected.
### Account and SSO Management [#account-and-sso-management]
* **Redesigned SSO settings** - SSO providers, linked identities, and members now use a clearer information-flow layout.
* **Improved provider editing** - The SSO create and update dialog is grouped into clearer sections with better create-versus-edit behavior.
* **Safer account deletion** - Account deletion moved into a dedicated danger area, and user deletion now cleans up related database resources transactionally before reporting attachment storage cleanup failures.
* **More reliable OAuth userinfo** - OAuth userinfo requests now propagate context, use timeout handling, and report non-2xx responses more clearly.
### Memo Display Controls [#memo-display-controls]
* **Shown time preference** - Memo lists can now use either created time or updated time as the displayed and ordered time basis, with created time remaining the default.
## Bug Fixes [#bug-fixes]
* **Authorization hardening** - Archived users are rejected in access-token flows, memo ownership is required before attachment changes, and Connect CORS origin checks are stricter.
* **Username validation** - Writable username validation is separated from legacy resource-name lookup, preserving legacy username auth flows while tightening new username changes.
* **Memo list performance** - List memo queries do less overhead.
* **Task checkbox state** - Task checkbox state is preserved in the web app.
* **Dropdown scrolling** - Dropdown menus no longer force scroll disappearance through modal behavior.
* **Markdown lists** - Mixed task and bullet lists are split more predictably.
**Full Changelog**: [v0.27.1...v0.28.0](https://github.com/usememos/memos/compare/v0.27.1...v0.28.0)
---
# Release v0.29.0
URL: https://usememos.com/changelog/0-29-0
> This release adds richer link previews, notification email settings, shortcut and memo workflow improvements, and a set of security, media, and editor fixes. It also adds new instance statistics APIs and performance improvements for the initial screen.
## New Features [#new-features]
### Link Previews and Metadata [#link-previews-and-metadata]
* **Link metadata APIs** - Memos now includes endpoints for fetching and batching metadata for links attached to memos.
* **Rendered link cards** - The web app can render metadata cards for shared links, making memo references easier to scan.
* **DNS rebinding protection** - Link metadata fetching now rejects DNS rebinding attempts.
### Notification and Transcription Settings [#notification-and-transcription-settings]
* **SMTP email settings** - Instance notification settings now include SMTP email configuration.
* **Email test endpoint** - Admins can test notification email settings through the instance API.
* **Explicit speech-to-text settings** - Transcription settings now expose provider, model, and prompt configuration.
### Memo and Workspace Improvements [#memo-and-workspace-improvements]
* **Task list quick actions** - Memos with task lists now support faster task interactions.
* **Calendar-aware memo creation** - Creating a memo from the calendar uses the selected calendar date.
* **Dedicated shortcuts page** - Shortcut management is available from a dedicated page.
* **About page and placeholder refresh** - The app includes a refreshed about page and new placeholder states.
### Administration and Statistics [#administration-and-statistics]
* **Instance resource statistics** - Admin instance stats now include resource statistics.
* **Filtered all-user stats** - All-user statistics can be filtered for more focused administration views.
* **Configurable log level** - The server now accepts a `--log-level` flag.
## Bug Fixes [#bug-fixes]
* **Attachment ownership enforcement** - Memo updates now enforce attachment ownership.
* **Comment visibility** - Comments now respect parent memo visibility.
* **User response privacy** - User list responses omit internal settings.
* **Memo creation events** - Creating memos with attachments no longer emits an extra update event.
* **Avatar sync** - Profile avatar changes sync immediately after update.
* **Release media handling** - HDR image metadata is preserved in thumbnails, and motion media payloads are preserved through S3 presigned uploads.
* **Editor and markdown polish** - URL paste wrapping and task-list alignment are improved.
* **Static cache and sitemap paths** - Frontend static cache headers and public memo sitemap paths are corrected.
* **SSE refresh behavior** - Initial SSE responses stream correctly and refresh tokens are handled.
## Performance Improvements [#performance-improvements]
* **Initial screen loading** - Heavy first-screen dependencies are lazy loaded.
**Full Changelog**: [v0.28.0...v0.29.0](https://github.com/usememos/memos/compare/v0.28.0...v0.29.0)
---
# Release v0.29.1
URL: https://usememos.com/changelog/0-29-1
> This patch release tightens up memo rendering and media previews. It improves task-list layout in markdown, reads standard meta description tags for link previews, and restores video attachment posters on mobile devices.
## Bug Fixes [#bug-fixes]
* **Markdown task lists** - Task item content now stays in a single grid column, keeping checkbox rows aligned with the rest of the memo body.
* **Link preview descriptions** - Link metadata parsing now supports ` `, improving preview summaries for sites that use standard description metadata.
* **Mobile video posters** - Video attachment posters now render correctly on mobile, making media attachments easier to identify before playback.
**Full Changelog**: [v0.29.0...v0.29.1](https://github.com/usememos/memos/compare/v0.29.0...v0.29.1)
---
# Release v0.3.0
URL: https://usememos.com/changelog/0-3-0
* Add a new visibility value `PROTECTED` to memo. So the `visibility` field is the same as [the access specifiers in C++](https://en.cppreference.com/w/cpp/language/access);
* Allow the host user to achieve/delete members;
## What's Changed [#whats-changed]
* chore: update error message by @boojack in [https://github.com/usememos/memos/pull/129](https://github.com/usememos/memos/pull/129)
* chore: show inline image in daily review dialog by @boojack in [https://github.com/usememos/memos/pull/135](https://github.com/usememos/memos/pull/135)
***
**Full Changelog**: [v0.3.0](https://github.com/usememos/memos/releases/tag/v0.3.0)
---
# Release v0.3.1
URL: https://usememos.com/changelog/0-3-1
## What's Changed [#whats-changed]
* feat: add resource dialog;
* chore: update icons with `react-feather`;
***
**Full Changelog**: [v0.3.1](https://github.com/usememos/memos/releases/tag/v0.3.1)
---
# Release v0.30.0
URL: https://usememos.com/changelog/0-30-0
> Memos 0.30 delivers a major writing and navigation refresh centered on a rebuilt Markdown editor, richer memo details, configurable multi-column feeds, and faster feed rendering. It also replaces the MCP integration with an OpenAPI-driven tool surface, expands deployment-time configuration, and strengthens authentication, sharing, and private-instance access boundaries.
## Breaking Changes [#breaking-changes]
* **Private mode by default** - Instances without `--instance-url` or `MEMOS_INSTANCE_URL` now run in private mode. Anonymous visitors are redirected to sign-in, anonymous API access is limited to setup, authentication, and shared-memo routes, and RSS feeds are unavailable. Set the instance URL to retain the previous public behavior.
* **Shared memo API** - `GetMemoByShare` and `GET /api/v1/shares/{shareId}` have been replaced by `GetSharedMemo` and `GET /api/v1/shares/{shareToken}/memo`. Share-token responses are now limited to the shared memo, attachments, and reactions; parent memos, comments, and relations are no longer exposed through the token.
* **CEL timestamp filters** - The `now()` function has been replaced by the `now` timestamp variable, and time fields now use CEL timestamps. Update saved shortcuts to use expressions such as `created_ts >= now - duration("24h")`.
* **New MCP endpoint and tool names** - MCP is now a stateless, tools-only endpoint generated from the OpenAPI schema. Clients must use `/mcp` and the new service-prefixed tool names. The previous prompts, resources, tool-filtering headers, route aliases, and unprefixed tool names have been removed.
## New Features [#new-features]
### Markdown Editing [#markdown-editing]
* **Decorated-source editor** - The editor has been rebuilt with CodeMirror 6, preserving Markdown verbatim while styling headings, formatting, tags, and mentions in place.
* **Formatting toolbar** - A toggleable toolbar provides controls for headings, lists, task lists, code blocks, bold, italic, strikethrough, and inline code.
* **Smarter authoring** - Tag completion, list indentation, improved keyboard shortcuts, and focus mode make it faster to write and organize memos.
* **GFM footnotes** - Markdown rendering now supports GitHub Flavored Markdown footnotes with footnote navigation.
### Memo Details and Feeds [#memo-details-and-feeds]
* **Redesigned detail sidebar** - Memo details now use a property rail with quick actions, editable visibility, metadata, attachments, relations, and a scroll-aware outline.
* **Flexible columns** - Memo feeds support one, two, three, or automatically fitted columns, with balanced layouts as cards resize.
* **Persisted display preferences** - Column count, compact mode, and link preview settings are saved between visits.
* **Restored feed position** - Returning to a feed after viewing another page restores the previous scroll position.
### MCP and API Tools [#mcp-and-api-tools]
* **OpenAPI-driven MCP server** - The hand-written MCP implementation has been replaced by a curated tool surface generated from the public API schema.
* **Expanded operations** - MCP tools cover memos, comments, relations, reactions, shortcuts, identities, and attachments, including attachment uploads.
* **Canonical resource names** - Canonical and nested resource names can be passed directly to follow-up tools.
### Webhooks and Deployment [#webhooks-and-deployment]
* **Signed webhooks** - Standard Webhooks HMAC-SHA256 secrets can be generated, revealed, and used to verify webhook payloads.
* **Webhook management** - Existing webhooks can be edited, and the interface shows whether signing is configured.
* **File-backed settings** - Identity providers and supported instance settings can be supplied as validated JSON files under `/etc/secrets`.
* **Protected runtime overrides** - File-backed settings cannot be changed through the UI or API until their files are removed.
* **Self-signed S3 support** - S3-compatible storage can use `insecureSkipTlsVerify` when connecting with self-signed certificates.
### Filters, Tags, and Settings [#filters-tags-and-settings]
* **More powerful CEL shortcuts** - Filters now support string matching, regular expressions, collection predicates, timestamp accessors, set operations, and an untagged-memos example.
* **Per-user tag settings** - Tag colors and content-blur rules are now user-specific. Existing instance tag settings are copied to current users during migration.
* **Refreshed settings** - Settings navigation and the access-token page now provide clearer guidance, safety notes, and last-used timestamps.
* **Searchable locale picker** - The locale selector is easier to navigate, European locale coverage has expanded, and missing Japanese and Simplified Chinese translations are complete.
## Improvements and Bug Fixes [#improvements-and-bug-fixes]
* **Authentication and SSO** - First-time SSO provisioning is now atomic across supported databases, valid external identifiers can become local usernames, and concurrent sign-ins no longer leave orphaned users.
* **Private-instance boundaries** - Access policy is consistently enforced across Connect, REST Gateway, files, RSS, and share-token routes.
* **MCP reliability** - Tool schemas, nested resource routing, error results, destructive-operation annotations, and oversized request handling have been hardened.
* **API compatibility** - New resource IDs and annotations follow AIP conventions while remaining compatible with legacy UUID identifiers, and user-stat resources now return canonical names.
* **Comments and tasks** - Memo details load every page of comments, expanded task-list state is preserved, and comment webhooks include the parent memo relation.
* **Tag parsing** - Tags inside links are ignored, literal tags can be escaped with a backslash, and tag names support Unicode combining marks.
* **Interface polish** - Loading feedback, mobile control spacing, long location labels, radio-group alignment, and tooltip positioning are improved.
* **Container startup** - The container entrypoint no longer restarts indefinitely when `MEMOS_UID=0`.
## Performance Improvements [#performance-improvements]
* **Faster feeds and Explore** - Fingerprinted assets are cached more effectively, media and rich renderers are deferred until needed, and feed content near the viewport is prioritized.
* **Shared data lookups** - User and memo lookups are reused across creators, reactions, comments, mentions, and relations to reduce duplicate requests.
**Full Changelog**: [v0.29.1...v0.30.0](https://github.com/usememos/memos/compare/v0.29.1...v0.30.0)
---
# Release v0.30.0-rc.1
URL: https://usememos.com/changelog/0-30-0-rc-1
> This release candidate rebuilds the Markdown editing experience, introduces a stateless OpenAPI-driven MCP server, and adds flexible memo feed layouts, signed webhooks, file-backed deployment settings, and more powerful filters. It also includes breaking changes to public access, CEL time filters, and MCP clients.
## Breaking Changes [#breaking-changes]
* **Private mode by default** - Instances without `--instance-url` or `MEMOS_INSTANCE_URL` now run in private mode. Anonymous visitors are redirected to sign-in, and anonymous API access is limited to setup, authentication, and shared-memo routes. Set the instance URL to retain the previous public behavior.
* **CEL timestamp filters** - The `now()` function has been replaced by the `now` timestamp variable, and time fields now use CEL timestamps. Update saved shortcuts to use expressions such as `created_ts >= now - duration("24h")` or `timestamp()` instead of comparing time fields with bare epoch values.
* **New MCP endpoint and tool names** - The MCP server is now a stateless, tools-only endpoint generated from the OpenAPI schema. Clients must use `/mcp` and the new service-prefixed tool names. The previous prompts, resources, tool-filtering headers, route aliases, and unprefixed tool names have been removed.
## New Features [#new-features]
### Markdown Editing [#markdown-editing]
* **Decorated-source editor** - The editor has been rebuilt with CodeMirror 6, preserving Markdown verbatim while styling headings, formatting, tags, and mentions in place.
* **Formatting toolbar** - A toggleable toolbar provides controls for headings, lists, task lists, code blocks, bold, italic, strikethrough, and inline code.
* **Smarter authoring** - Tag completion and list indentation make it faster to write and organize memos.
* **GFM footnotes** - Markdown rendering now supports GitHub Flavored Markdown footnotes with footnote navigation.
### MCP and API Tools [#mcp-and-api-tools]
* **OpenAPI-driven MCP server** - The hand-written MCP implementation has been replaced by a curated tool surface generated from the public API schema.
* **Expanded operations** - MCP tools cover memos, comments, relations, reactions, shortcuts, identities, and attachments, including attachment uploads.
* **Shared authorization** - MCP reuses the public API's authentication and authorization behavior for more consistent access control.
### Memo Feed Customization [#memo-feed-customization]
* **Flexible columns** - Memo feeds support one, two, three, or automatically fitted columns, with balanced layouts as cards resize.
* **Persisted display preferences** - Column count, compact mode, and link preview settings are saved between visits.
* **Predictable memo placement** - Newly created memos remain easy to find above pinned content.
* **Full content by default** - Compact rendering is now opt-in for single-column feeds.
### Webhooks and Deployment [#webhooks-and-deployment]
* **Signed webhooks** - Standard Webhooks HMAC-SHA256 secrets can be generated, revealed, and used to verify webhook payloads.
* **Webhook management** - Existing webhooks can be edited, and the interface shows whether signing is configured.
* **File-backed settings** - Identity providers and supported instance settings can be supplied as validated JSON files under `/etc/secrets`.
* **Protected runtime overrides** - File-backed settings cannot be changed through the UI or API until their files are removed.
* **Self-signed S3 support** - S3-compatible storage can use the `insecure_skip_tls_verify` option when connecting with self-signed certificates.
### Filters, Tags, and Localization [#filters-tags-and-localization]
* **More powerful CEL shortcuts** - Filters now support string matching, regular expressions, collection predicates, timestamp accessors, set operations, and an untagged-memos example.
* **Per-user tag settings** - Tag colors and content-blur rules are now user-specific. Existing instance tag settings are copied to current users during migration.
* **Searchable locale picker** - The locale selector is easier to navigate, European locale coverage has expanded, and missing Japanese and Simplified Chinese translations are complete.
## Improvements and Bug Fixes [#improvements-and-bug-fixes]
### Authentication and Security [#authentication-and-security]
* **More reliable SSO setup** - SSO option loading is more stable, and OAuth client authentication can be detected automatically.
* **Clearer instance setup state** - Setup now distinguishes new instances from populated instances that no longer have an administrator.
* **Cross-origin bearer authentication** - Cross-origin API requests work with bearer tokens while cookie authentication remains restricted to same-origin requests.
* **Consistent user pagination** - `ListUsers` now returns predictable paginated results.
### Editor and Memo Reliability [#editor-and-memo-reliability]
* **Editor polish** - Formatting toggles, keyboard shortcuts, file paste and drop handling, focus-mode layout, empty-space caret behavior, and CodeMirror spacing are improved.
* **Persistent task expansion** - Expanded task-list state is preserved.
* **Complete comment loading** - Memo detail views load every page of comments.
* **Richer webhook payloads** - Comment webhook events include the parent memo relation.
### Tags and Interface [#tags-and-interface]
* **More accurate tag parsing** - Tags inside links are ignored, literal tags can be escaped with a backslash, and tag names support Unicode combining marks.
* **Refreshed account pages** - Sign-in, sign-up, and About pages have updated layouts, with common controls aligned across the app.
* **Improved loading feedback** - Mismatched memo skeletons have been replaced by a delayed spinner.
* **Mobile and location polish** - Mobile control spacing is improved, and long location labels are truncated without hiding the full address.
* **Container startup fix** - The container entrypoint no longer restarts indefinitely when `MEMOS_UID=0`.
**Full Changelog**: [v0.29.1...v0.30.0-rc.1](https://github.com/usememos/memos/compare/v0.29.1...v0.30.0-rc.1)
---
# Release v0.30.0-rc.2
URL: https://usememos.com/changelog/0-30-0-rc-2
> This release candidate introduces the Memos Web Clipper, redesigns memo details and settings, and makes feeds and Explore faster. It also refreshes the demo experience and improves API compatibility, error messages, and interface polish.
## New Features [#new-features]
### Memos Web Clipper [#memos-web-clipper]
* **Capture from the browser** - Save pages, selected text, and images as Markdown directly to your Memos instance.
* **Review before saving** - Edit each clip, choose its visibility, and confirm exactly what will be added to Memos.
* **Custom Markdown templates** - Control how page content, titles, URLs, descriptions, and default tags are arranged in saved memos.
* **Chrome and Firefox support** - Install the extension from the [Chrome Web Store](https://chromewebstore.google.com/detail/memos-web-clipper/nebaoebnljalfegiidibihhkebeiklbl) or [Firefox Add-ons](https://addons.mozilla.org/en-US/firefox/addon/memos-web-clipper/). The source and setup details are available in the [Memos Web Clipper repository](https://github.com/usememos/web-clipper).
### Memo Details and Navigation [#memo-details-and-navigation]
* **Redesigned detail sidebar** - Memo details now use a property rail with quick actions, editable visibility, metadata, attachments, relations, and a scroll-aware outline.
* **Restored feed position** - Returning to a feed after viewing another page restores the previous scroll position, making it easier to continue where you left off.
### Settings and Access Tokens [#settings-and-access-tokens]
* **Refreshed settings navigation** - Settings are reorganized for clearer navigation across account and instance options.
* **Practical access-token guidance** - The access-token page now includes setup instructions, a copyable API example, security notes, and last-used timestamps.
* **Web Clipper discovery** - The About page and project documentation now link to the Memos Web Clipper.
## Performance Improvements [#performance-improvements]
* **Faster initial loading** - Fingerprinted assets are cached more effectively, while media and rich renderers are deferred until needed.
* **Viewport-aware feeds** - Feed content near the viewport is prioritized to reduce initial browser work.
* **Shared data lookups** - User and memo lookups are reused across creators, reactions, comments, mentions, and relations to reduce duplicate requests and improve Explore performance.
## Improvements and Bug Fixes [#improvements-and-bug-fixes]
### Demo Experience [#demo-experience]
* **More representative sample data** - Demo memos now showcase nested tags, references, comments, mentions, reactions, locations, attachments, and rich Markdown across public and protected content.
### API Compatibility and Errors [#api-compatibility-and-errors]
* **AIP-aligned resources** - New resource IDs and annotations follow AIP conventions while remaining compatible with legacy UUID-based identifiers.
* **Correct user-stat names** - User statistic resources now return canonical resource names.
* **Cleaner error messages** - User-facing errors no longer expose internal RPC prefixes.
### Interface Polish [#interface-polish]
* **Radio-group alignment** - Selection indicators are correctly aligned with their controls.
* **Tooltip arrows** - Tooltip arrows now sit outside their content panels for cleaner positioning.
**Full Changelog**: [v0.30.0-rc.1...v0.30.0-rc.2](https://github.com/usememos/memos/compare/v0.30.0-rc.1...v0.30.0-rc.2)
---
# Release v0.31.0
URL: https://usememos.com/changelog/0-31-0
> Memos 0.31 brings shared Spaces, Calendar and Map pages, and personal export and import. It also improves writing, search, attachments, and navigation.
## Upgrade notes [#upgrade-notes]
* **Administrator access** - Active instance administrators can read and manage individual memos, including private and Space-only memos, without being the author or a Space member. Collection listings still filter by audience, and administrators do not automatically join Spaces.
* **Views and API clients** - Existing Shortcuts migrate to Views. Integrations using the Shortcut API need to switch to the `UserService` View operations at `/api/v1/users/{user}/views`. The reaction API no longer accepts `contentId`; reactions belong to their memo.
* **Account emails** - Email is optional, but addresses are trimmed, lowercased, and unique within an instance. The upgrade clears invalid addresses and retains duplicate addresses only on the oldest account. Affected usernames appear in server logs.
* **RSS removal** - RSS is no longer supported, and existing feed URLs stop serving feeds.
## New features [#new-features]
### Spaces, Calendar, and Map [#spaces-calendar-and-map]
* **Shared Spaces** - Organize memos with other people, receive invitations in Inbox, move memos between Spaces, and choose custom icons or emoji. Space-only memos are visible to active members, with the administrator access described above.
* **Calendar** - Browse memos by month, open a date to read its entries, and write a memo for that day.
* **Map** - Explore memos with location data on a dedicated Map page.
### Views and search [#views-and-search]
* **Reusable filters** - Save filters as Views and give them custom icons.
* **More precise search** - Filter by Space or location, find memos outside any Space, and use expressions in Quick Find.
* **Highlighted matches** - See matching text highlighted within memo content.
### Export, import, and attachments [#export-import-and-attachments]
* **Move between instances** - Use Settings → Export & Import to download and import Memos Export Format ZIP files. Personal exports contain archived memos, comments you wrote, and attachment files. They exclude instance settings and other users' data. Older exports remain importable.
* **Flexible storage** - Configure multiple named attachment storage backends and check your storage usage in account settings.
* **Attachment uploads** - Upload files in smaller chunks and insert attachment images into memo content.
### Writing and navigation [#writing-and-navigation]
* **Faster capture** - Create memos from the sidebar and format Markdown with keyboard shortcuts.
* **Adjustable sidebar** - Resize the sidebar on desktop.
* **Preserved context** - Keep your Space and filters when opening a memo and returning to the previous page.
## Improvements and fixes [#improvements-and-fixes]
* **Editor input** - Improved IME and Windows emoji input, restored mobile text assistance, fixed pasted attachments and timestamp edits, and expanded tag autocomplete.
* **Markdown** - Improved tag recognition, fixed currency being parsed as inline math and numbered task-list toggles, and enabled telephone and SMS links.
* **Maps and media** - Restored OpenStreetMap tiles without an API key, fixed leaving Map after a WebGL failure, improved HEIC/HEIF detection, and added 0.5× and 0.75× audio playback.
* **Interface and languages** - Refined memo navigation and comment menus, fixed focus-mode and right-to-left layouts, and aligned the installed app's status bar with dark mode. Added Azerbaijani and Hebrew and updated translations.
## Administration and integrations [#administration-and-integrations]
* **Security and reliability** - Added rate limits and stricter request, image-processing, and import limits. Strengthened remote-fetch validation, prevented S3 object-key collisions, and fixed attachment cleanup.
* **Sessions and files** - Changing your password signs out your other sessions. An administrator password reset signs out all sessions for that account. S3 attachments use authenticated file routes.
* **Instance access** - Public/private access mode is stored separately from the instance URL.
* **MCP and CLI** - Added Space operations and corrected MCP tool schemas. Fixed scheduled-job day matching and added `-V` and `--version` CLI options.
**Release**: [v0.31.0 on GitHub](https://github.com/usememos/memos/releases/tag/v0.31.0)
**Full changelog**: [v0.30.0...v0.31.0](https://github.com/usememos/memos/compare/v0.30.0...v0.31.0)
---
# Release v0.31.0-rc.1
URL: https://usememos.com/changelog/0-31-0-rc-1
> This release candidate introduces first-class Spaces for collaboration while preserving individual memo ownership. It also unifies navigation and memo creation, adds inline attachment images and optional media metadata, migrates legacy filters to Views, enriches link previews, and strengthens access controls, database upgrades, and live-update performance.
## Breaking Changes [#breaking-changes]
* **Views replace legacy filters** - `ShortcutService`, shortcut resource names, MCP tools, persisted settings, and `/api/v1/users/*/shortcuts/*` have moved to `MemoViewService`, view resources, and `/api/v1/users/*/views/*`. The web route is now `/views`. Stored shortcuts migrate automatically, but API clients, MCP integrations, and saved links must be updated.
* **Author-controlled memo mutations** - Instance administrators are no longer implicit memo collaborators or Space members. Memo, attachment, reaction, relation, and share mutations are controlled by the memo author. Space administrators manage Space settings and membership but cannot edit another author's memo.
* **Independent comment lifecycle** - Comments now have their own visibility, placement, and lifecycle. `CreateMemoComment` no longer inherits the parent memo's visibility, so an omitted value defaults to `PRIVATE`. `SetMemoRelations` rejects `COMMENT` relations, and deleting a memo no longer cascades into comment memos.
* **Reaction API changes** - `Reaction.content_id` has been removed from the public API. Integrations must identify the memo from the request or reaction resource name. Existing reactions are migrated to internal memo IDs, while orphaned reactions are removed.
* **Managed attachment requirements** - Managed Markdown images must be bound to a memo before or during the same mutation. S3-backed attachments no longer expose presigned object URLs through `external_link`; clients should use the authenticated Memos file route.
* **Exact-case usernames and mentions** - Username lookup and authentication are now case-sensitive. New or renamed usernames must contain 1–36 ASCII letters, digits, or interior hyphens, and mentions use the same Markdown-aware grammar. Legacy usernames remain addressable, but unsupported legacy spellings cannot be authored as new mentions.
* **Quick Find shortcut removed** - The global Cmd/Ctrl+K keyboard shortcut has been removed. Quick Find remains available from the sidebar search action.
* **RSS feeds removed** - Explore and per-user RSS feeds are no longer available. `/explore/rss.xml` and `/u/:username/rss.xml` now return `404`.
## Upgrade Notes [#upgrade-notes]
* **Instance access is independent of the public URL** - Public or private access is now stored separately from `instance-url`. The first upgraded startup preserves previous behavior: instances with a configured URL become public, while those without one remain private. Later URL changes no longer change access policy. Upgrade every replica before changing the mode because older binaries still infer access from the URL.
* **Stricter instance URL validation** - `instance-url` must be an absolute HTTP or HTTPS URL without credentials, a query, or a fragment.
* **Existing memos remain Unassigned** - Upgrading does not create a default Space or move existing memos. Their identity, author, visibility, and relations are preserved.
* **Space deletion is destructive** - Deleting a Space permanently deletes every memo directly assigned to it and the resources owned by those memos. Removing a member leaves their contributions in place, and accounts with active Space memberships cannot be deleted, including with `force`.
* **Cross-database migrations** - SQLite, MySQL, and PostgreSQL migrations preserve existing memo data, migrate Views and legacy storage settings, and retain generated-ID high-water marks.
* **Tag indexes update incrementally** - Existing memo payloads are not rebuilt automatically for the new tag grammar. Rendering and editing use the new rules immediately, while filters and statistics adopt them after each memo is saved again.
* **Deployment changes** - Private webhook destinations can be restricted to exact hostnames, IP addresses, or CIDRs with `--webhook-private-network-allowlist`. The broader `--allow-private-webhooks` option remains compatible but is deprecated. Building Memos from source now requires Go 1.27.
## New Features [#new-features]
### Collaborative Spaces [#collaborative-spaces]
* **First-class collaboration** - Spaces support `ADMIN` and `USER` memberships while keeping every memo, including comments, owned by its author.
* **Independent placement and audience** - A memo can remain Unassigned or belong to exactly one Space without changing its identity. The new `SPACE` visibility limits reading to Space members independently of memo placement.
* **Space-aware browsing** - The Space switcher scopes Home, Explore, memo creation, statistics, filters, and attachments. Archived, Inbox, profiles, and Settings remain global.
* **Membership management** - Space administrators can manage metadata and roles and invite existing users. Invitations grant no access until accepted.
* **Stable identifiers** - New Spaces use UUIDv4 identifiers by default and can also use custom stable UIDs.
### Navigation and Writing [#navigation-and-writing]
* **Unified sidebar** - The previous dual navigation rails have been replaced by one route-aware, resizable sidebar containing the calendar, Views, tags, Quick Find, and contextual resource navigation.
* **Global composer** - Authenticated users can create a memo from any route without returning to the main feed.
* **Views** - Views are named, reusable Memo filters. Opening a View shows the Memos that currently match; it does not store Memo copies or choose a display layout. Existing filters migrate automatically.
### Attachments and Media [#attachments-and-media]
* **Inline image insertion** - Images can be inserted at the cursor from uploads, paste, drag and drop, or existing attachments.
* **Resilient drafts** - Inline uploads support retries and restoration when returning to an unfinished draft.
* **Optional media metadata** - Memos can preserve normalized dimensions, camera details, capture time, location, and video duration for inspection in the attachment viewer.
* **Stable storage configurations** - Named storage configurations use stable IDs so existing S3 attachments remain readable when storage settings change.
* **Authenticated S3 delivery** - Managed S3 files are proxied through authenticated Memos routes with range-request support.
### Discovery, Filtering, and Live Updates [#discovery-filtering-and-live-updates]
* **Unified tag parsing** - The backend, renderer, editor, filters, statistics, and API now share the same Markdown-aware tag grammar. Tags consistently support multilingual text, emoji, hierarchy, numeric values, `-`, `+`, `&`, and word-internal apostrophes.
* **Consistent mentions** - Mention parsing now follows the same exact-case username rules throughout the product.
* **Richer link previews** - Preview discovery now supports oEmbed, Open Graph, Twitter Cards, JSON-LD, HTML metadata, and semantic fallbacks, with bounded fetching, caching, request coalescing, and SSRF protection.
* **Location-aware filters** - Memo filtering can now include location data.
* **Efficient live updates** - Browser tabs share one visible-tab SSE connection, reducing redundant connections and server fanout work.
## Improvements and Bug Fixes [#improvements-and-bug-fixes]
* **Editor and Markdown** - IME composition is preserved, Windows emoji input works again, tag completion matches hierarchical path segments, task checkboxes remain controlled, currency is no longer parsed as inline math, outline links match rendered headings, and presentation toggles are scoped correctly.
* **Attachments and sharing** - Shared-memo thumbnails retain share tokens, attachment-library media links back to its source memo, and HEIC and HEIF uploads are detected reliably from filename extensions.
* **Database reliability** - SQLite memo mutations now begin with `BEGIN IMMEDIATE`, allowing concurrent writers to queue instead of intermittently returning `SQLITE_BUSY`. Upgrade handling is also hardened against malformed legacy settings and generated-ID reuse.
* **Navigation and layout** - Memo scope is preserved across global navigation, Archived remains outside Space scope, sidebar and outline behavior is restored, the resizable month calendar is constrained correctly, and select menus remain above parent popovers.
* **Maps and localization** - Keyless OpenStreetMap tiles are restored, Hebrew and comprehensive right-to-left layout support are added, Japanese, Traditional Chinese, and Russian translations are refreshed, and the French memo-link label is corrected.
* **API and settings** - Gateway JSON omits unset protobuf message fields while preserving scalar defaults and empty lists, and the configured memo-content length limit is enforced.
* **Security dependency** - `golang.org/x/crypto` is updated to 0.52.0 to address CVE-2026-39829.
**Full Changelog**: [v0.30.0...v0.31.0-rc.1](https://github.com/usememos/memos/compare/v0.30.0...v0.31.0-rc.1)
---
# Release v0.31.0-rc.2
URL: https://usememos.com/changelog/0-31-0-rc-2
> The second 0.31 release candidate adds Calendar and Map pages for browsing memos by date and location. It also makes moving between Spaces easier, adds icons for Views, improves writing and search, and tightens account email rules.
## Upgrade Notes [#upgrade-notes]
* **Unique account emails** - Email remains optional, but an address can belong to only one account per instance. During the upgrade, duplicate addresses stay on the oldest account and are cleared from the others. Administrators can find affected usernames in the server logs; those users can add a different address in account settings.
* **Upgrading from 0.30** - Review the [0.31.0-rc.1 upgrade notes](/changelog/0-31-0-rc-1) for the earlier API, access-control, and migration changes in this release series.
## New Features [#new-features]
### Calendar and Map [#calendar-and-map]
* **Calendar** - Browse a month of memos, open a date to read its entries, and create a memo for that day.
* **Dedicated Map page** - Explore memos that have location data on a map.
### Spaces, Views, and Search [#spaces-views-and-search]
* **Move memos between Spaces** - Change a memo's Space from the interface.
* **Invitations in Inbox** - Receive Space invitations alongside other notifications.
* **Custom icons** - Choose icons or emoji for Spaces and personalize Views with icons.
* **Keep your browsing context** - Switching Spaces preserves the current page and filters.
* **More precise search** - Find memos by Space and use filter expressions in Quick Find.
### Writing and Account Settings [#writing-and-account-settings]
* **Markdown shortcuts** - Apply formatting from the keyboard. On desktop, the Home editor receives focus when the page opens so you can start writing immediately.
* **Attachment storage usage** - See how much attachment storage your account uses in settings.
* **Slower audio playback** - Listen at 0.5× or 0.75× speed.
* **Azerbaijani support** - Use Memos in Azerbaijani.
## Improvements and Bug Fixes [#improvements-and-bug-fixes]
* **Navigation and memo details** - Refined the memo detail sidebar and compact navigation, with more visible active filters and adjusted spacing.
* **Editor behavior** - Improved mobile typing assistance and tag suggestions. Pasted files appear as attachments, and closing the date picker saves date edits.
* **Focus mode and blurred content** - Fixed focus mode in multi-column layouts. Memo headers and reactions remain interactive when content is blurred.
* **Appearance and translations** - Improved dark-mode status bar colors and Chinese translations.
* **Server reliability and security** - Added protections against abusive requests and unsafe webhook destinations, improved MCP compatibility, and fixed scheduled-job timing.
**Release**: [v0.31.0-rc.2 on GitHub](https://github.com/usememos/memos/releases/tag/v0.31.0-rc.2)
**Full Changelog**: [v0.31.0-rc.1...v0.31.0-rc.2](https://github.com/usememos/memos/compare/v0.31.0-rc.1...v0.31.0-rc.2)
---
# Release v0.4.0
URL: https://usememos.com/changelog/0-4-0
* Support multiple languages: English and 中文;
* Set the default memo visibility;
## What's Changed [#whats-changed]
* chore: update `i18nStore` by @lqwakeup in [https://github.com/usememos/memos/pull/141](https://github.com/usememos/memos/pull/141)
* chore: add docker-compose.yaml by @leopold7 in [https://github.com/usememos/memos/pull/142](https://github.com/usememos/memos/pull/142)
* feat: add `manifest.json` for pwa by @lqwakeup in [https://github.com/usememos/memos/pull/144](https://github.com/usememos/memos/pull/144)
* feat: add `user_setting` model by @boojack in [https://github.com/usememos/memos/pull/145](https://github.com/usememos/memos/pull/145)
***
**Full Changelog**: [v0.4.0](https://github.com/usememos/memos/releases/tag/v0.4.0)
---
# Release v0.4.1
URL: https://usememos.com/changelog/0-4-1
Set `mono` font style for editor.
## What's Changed [#whats-changed]
* fix: unescape filename by @boojack in [https://github.com/usememos/memos/pull/158](https://github.com/usememos/memos/pull/158)
* fix: Fix Typo (Editting -> Editing) by @limdingwen in [https://github.com/usememos/memos/pull/161](https://github.com/usememos/memos/pull/161)
* chore: update `word-break` style by @boojack in [https://github.com/usememos/memos/pull/164](https://github.com/usememos/memos/pull/164)
* chore: update golangci-lint config by @boojack in [https://github.com/usememos/memos/pull/168](https://github.com/usememos/memos/pull/168)
* fix: tag regexp by @boojack in [https://github.com/usememos/memos/pull/173](https://github.com/usememos/memos/pull/173)
* feat: set editor font style by @boojack in [https://github.com/usememos/memos/pull/174](https://github.com/usememos/memos/pull/174)
* feat: update memo created datetime: [https://github.com/usememos/memos/discussions/166](https://github.com/usememos/memos/discussions/166)
***
**Full Changelog**: [v0.4.1](https://github.com/usememos/memos/releases/tag/v0.4.1)
---
# Release v0.4.2
URL: https://usememos.com/changelog/0-4-2
## What's Changed [#whats-changed]
* chore: add `docker-compose` sample command into readme by @TheNexter in [https://github.com/usememos/memos/pull/179](https://github.com/usememos/memos/pull/179)
* chore: add mobile style by @zburu in [https://github.com/usememos/memos/pull/181](https://github.com/usememos/memos/pull/181)
* chore: add eslint check in action by @boojack in [https://github.com/usememos/memos/pull/185](https://github.com/usememos/memos/pull/185)
* fix: create shortcut input by @boojack in [https://github.com/usememos/memos/pull/186](https://github.com/usememos/memos/pull/186)
* fix: find latest migration history by @boojack in [https://github.com/usememos/memos/pull/190](https://github.com/usememos/memos/pull/190)
* chore: support uploads multi files by @boojack in [https://github.com/usememos/memos/pull/191](https://github.com/usememos/memos/pull/191)
***
**Full Changelog**: [v0.4.2](https://github.com/usememos/memos/releases/tag/v0.4.2)
---
# Release v0.4.3
URL: https://usememos.com/changelog/0-4-3
Add new page `/explore` for all public and protected (only when you are logged in) memos in the site.
## What's Changed [#whats-changed]
* fix: heatmap popover blink by @YuJianghao in [https://github.com/usememos/memos/pull/195](https://github.com/usememos/memos/pull/195)
* fix: upload resouces double time by @YuJianghao in [https://github.com/usememos/memos/pull/204](https://github.com/usememos/memos/pull/204)
* feat: add explore page by @boojack in [https://github.com/usememos/memos/pull/205](https://github.com/usememos/memos/pull/205)
* chore: update button entries by @boojack in [https://github.com/usememos/memos/pull/206](https://github.com/usememos/memos/pull/206)
* chore: support double-click to edit memo by @boojack in [https://github.com/usememos/memos/pull/207](https://github.com/usememos/memos/pull/207)
***
**Full Changelog**: [v0.4.3](https://github.com/usememos/memos/releases/tag/v0.4.3)
---
# Release v0.4.4
URL: https://usememos.com/changelog/0-4-4
Thanks @f97 for adding the Vietnamese locale and Emoji Picker. 💗
## What's Changed [#whats-changed]
* chore: update username validate config by @boojack in [https://github.com/usememos/memos/pull/209](https://github.com/usememos/memos/pull/209)
* feat: i18n for dialogs by @YuJianghao in [https://github.com/usememos/memos/pull/203](https://github.com/usememos/memos/pull/203)
* chore: vacuum db file after deleting resource by @boojack in [https://github.com/usememos/memos/pull/210](https://github.com/usememos/memos/pull/210)
* chore: update i18n by @ChasLui in [https://github.com/usememos/memos/pull/212](https://github.com/usememos/memos/pull/212)
* chore: fix copy to clipboard by @boojack in [https://github.com/usememos/memos/pull/214](https://github.com/usememos/memos/pull/214)
* update: i18n by @ChasLui in [https://github.com/usememos/memos/pull/215](https://github.com/usememos/memos/pull/215)
* feat: add vietnamese by @f97 in [https://github.com/usememos/memos/pull/218](https://github.com/usememos/memos/pull/218)
* chore: update i18n for UserBanner by @f97 in [https://github.com/usememos/memos/pull/219](https://github.com/usememos/memos/pull/219)
***
**Full Changelog**: [v0.4.4](https://github.com/usememos/memos/releases/tag/v0.4.4)
---
# Release v0.4.5
URL: https://usememos.com/changelog/0-4-5
## What's Changed [#whats-changed]
* feat: add emoji picker in editor by @f97 in [https://github.com/usememos/memos/pull/221](https://github.com/usememos/memos/pull/221)
* chore: hide the searchbar of emoji picker by @boojack in [https://github.com/usememos/memos/pull/222](https://github.com/usememos/memos/pull/222)
* chore: fix i18n vietnamese typos and update MemoCardDialog by @f97 in [https://github.com/usememos/memos/pull/228](https://github.com/usememos/memos/pull/228)
* chore: add `vite-plugin-pwa` by @boojack in [https://github.com/usememos/memos/pull/230](https://github.com/usememos/memos/pull/230)
* chore: update i18n for memo visibility by @boojack in [https://github.com/usememos/memos/pull/233](https://github.com/usememos/memos/pull/233)
* feat: float mobile editor by @f97 in [https://github.com/usememos/memos/pull/234](https://github.com/usememos/memos/pull/234)
* chore: support html form by @f97 in [https://github.com/usememos/memos/pull/236](https://github.com/usememos/memos/pull/236)
***
**Full Changelog**: [v0.4.5](https://github.com/usememos/memos/releases/tag/v0.4.5)
---
# Release v0.5.0
URL: https://usememos.com/changelog/0-5-0
Support uploading any type of file into memos.
## What's Changed [#whats-changed]
* chore: update emoji picker toggle logic by @boojack in [https://github.com/usememos/memos/pull/244](https://github.com/usememos/memos/pull/244)
* fix: mobile editor float style by @boojack in [https://github.com/usememos/memos/pull/247](https://github.com/usememos/memos/pull/247)
* fix: emoji picker position in fullscreen by @boojack in [https://github.com/usememos/memos/pull/251](https://github.com/usememos/memos/pull/251)
* feat: simple markdown parser by @boojack in [https://github.com/usememos/memos/pull/252](https://github.com/usememos/memos/pull/252)
* fix: tag regexp by @boojack in [https://github.com/usememos/memos/pull/253](https://github.com/usememos/memos/pull/253)
***
**Full Changelog**: [v0.5.0](https://github.com/usememos/memos/releases/tag/v0.5.0)
---
# Release v0.6.0
URL: https://usememos.com/changelog/0-6-0
## What's Changed [#whats-changed]
* fix: tag selector position by @boojack in [https://github.com/usememos/memos/pull/259](https://github.com/usememos/memos/pull/259)
* feat: update marked parsers by @boojack in [https://github.com/usememos/memos/pull/260](https://github.com/usememos/memos/pull/260)
* chore: update vietnamese i18n by @f97 in [https://github.com/usememos/memos/pull/261](https://github.com/usememos/memos/pull/261)
* fix: tag filter by @boojack in [https://github.com/usememos/memos/pull/266](https://github.com/usememos/memos/pull/266)
* feat: copy content by @f97 in [https://github.com/usememos/memos/pull/267](https://github.com/usememos/memos/pull/267)
* chore: update i18n for shortcut filter by @YuJianghao in [https://github.com/usememos/memos/pull/270](https://github.com/usememos/memos/pull/270)
* fix: filter i18n by @f97 in [https://github.com/usememos/memos/pull/275](https://github.com/usememos/memos/pull/275)
* 添加移动端点击自动关闭侧边栏 by @h2o2o in [https://github.com/usememos/memos/pull/271](https://github.com/usememos/memos/pull/271)
* 优化侧边按钮样式 by @zburu in [https://github.com/usememos/memos/pull/277](https://github.com/usememos/memos/pull/277)
* chore: hide user email by @boojack in [https://github.com/usememos/memos/pull/282](https://github.com/usememos/memos/pull/282)
* fix: create memo with visibility by @boojack in [https://github.com/usememos/memos/pull/281](https://github.com/usememos/memos/pull/281)
* 移动端侧边栏优化 by @h2o2o in [https://github.com/usememos/memos/pull/285](https://github.com/usememos/memos/pull/285)
* feat: update sidebar mask styles by @boojack in [https://github.com/usememos/memos/pull/287](https://github.com/usememos/memos/pull/287)
* feat: handle esc keyboard event for editor by @hyoban in [https://github.com/usememos/memos/pull/288](https://github.com/usememos/memos/pull/288)
* fix: can not click sidebar by @hyoban in [https://github.com/usememos/memos/pull/289](https://github.com/usememos/memos/pull/289)
* feat: add highlight for code block by @boojack in [https://github.com/usememos/memos/pull/291](https://github.com/usememos/memos/pull/291)
* feat: upload files by dropping by @boojack in [https://github.com/usememos/memos/pull/292](https://github.com/usememos/memos/pull/292)
***
**Full Changelog**: [v0.6.0](https://github.com/usememos/memos/releases/tag/v0.6.0)
---
# Release v0.6.1
URL: https://usememos.com/changelog/0-6-1
## What's Changed [#whats-changed]
* feat: support markdown table by @hyoban in [https://github.com/usememos/memos/pull/294](https://github.com/usememos/memos/pull/294)
* docs: docker compose tip by @hyoban in [https://github.com/usememos/memos/pull/296](https://github.com/usememos/memos/pull/296)
* docs: update docker-compose tip by @hyoban in [https://github.com/usememos/memos/pull/299](https://github.com/usememos/memos/pull/299)
* fix: blank line after table by @hyoban in [https://github.com/usememos/memos/pull/298](https://github.com/usememos/memos/pull/298)
* fix: close button z-index in setting dialog by @boojack in [https://github.com/usememos/memos/pull/303](https://github.com/usememos/memos/pull/303)
* chore: update `zh.json` by @whoistiger in [https://github.com/usememos/memos/pull/304](https://github.com/usememos/memos/pull/304)
* chore: update mask animation styles by @boojack in [https://github.com/usememos/memos/pull/306](https://github.com/usememos/memos/pull/306)
* fix: memo list auto scroll to top by @boojack in [https://github.com/usememos/memos/pull/313](https://github.com/usememos/memos/pull/313)
* chore: add issue template by @boojack in [https://github.com/usememos/memos/pull/314](https://github.com/usememos/memos/pull/314)
* chore: update bug report template by @boojack in [https://github.com/usememos/memos/pull/316](https://github.com/usememos/memos/pull/316)
* feat: editor tab support by @f97 in [https://github.com/usememos/memos/pull/309](https://github.com/usememos/memos/pull/309)
* feat: customize Memo list sorting rules by @Zeng1998 in [https://github.com/usememos/memos/pull/312](https://github.com/usememos/memos/pull/312)
* chore: update demo seeding data by @boojack in [https://github.com/usememos/memos/pull/318](https://github.com/usememos/memos/pull/318)
* feat: inline code within link by @YuJianghao in [https://github.com/usememos/memos/pull/321](https://github.com/usememos/memos/pull/321)
* chore: i18n in settings by @YuJianghao in [https://github.com/usememos/memos/pull/324](https://github.com/usememos/memos/pull/324)
* fix: bold and emphasis regex by @boojack in [https://github.com/usememos/memos/pull/323](https://github.com/usememos/memos/pull/323)
* chore: update marked by @boojack in [https://github.com/usememos/memos/pull/325](https://github.com/usememos/memos/pull/325)
* feat: update memo sort option setting by @boojack in [https://github.com/usememos/memos/pull/326](https://github.com/usememos/memos/pull/326)
* chore: update memo display time by @boojack in [https://github.com/usememos/memos/pull/327](https://github.com/usememos/memos/pull/327)
* fix: patch memo with resource list by @Zeng1998 in [https://github.com/usememos/memos/pull/328](https://github.com/usememos/memos/pull/328)
* feat: pagination for memo list by @boojack in [https://github.com/usememos/memos/pull/330](https://github.com/usememos/memos/pull/330)
* fix: user setting name by @boojack in [https://github.com/usememos/memos/pull/331](https://github.com/usememos/memos/pull/331)
***
**Full Changelog**: [v0.6.1](https://github.com/usememos/memos/releases/tag/v0.6.1)
---
# Release v0.7.0
URL: https://usememos.com/changelog/0-7-0
## What's Changed [#whats-changed]
* chore: update the translation by @Zeng1998 in [https://github.com/usememos/memos/pull/333](https://github.com/usememos/memos/pull/333)
* feat: add some hotkeys by @Mahoo12138 in [https://github.com/usememos/memos/pull/320](https://github.com/usememos/memos/pull/320)
* chore: update insert content in editor by @boojack in [https://github.com/usememos/memos/pull/336](https://github.com/usememos/memos/pull/336)
* feat: rss support by @hyoban in [https://github.com/usememos/memos/pull/343](https://github.com/usememos/memos/pull/343)
* feat: remove foreign key and triggers by @boojack in [https://github.com/usememos/memos/pull/345](https://github.com/usememos/memos/pull/345)
* fix: fetch memo with filter by @boojack in [https://github.com/usememos/memos/pull/346](https://github.com/usememos/memos/pull/346)
* feat: case-insensitive search by @boojack in [https://github.com/usememos/memos/pull/347](https://github.com/usememos/memos/pull/347)
* chore: update memo list api by @boojack in [https://github.com/usememos/memos/pull/350](https://github.com/usememos/memos/pull/350)
* feat: resource dialog enhancements by @Zeng1998 in [https://github.com/usememos/memos/pull/356](https://github.com/usememos/memos/pull/356)
* fix: typo by @Zeng1998 in [https://github.com/usememos/memos/pull/357](https://github.com/usememos/memos/pull/357)
* feat: add metric plugin by @boojack in [https://github.com/usememos/memos/pull/361](https://github.com/usememos/memos/pull/361)
* feat: patch resource filename by @Zeng1998 in [https://github.com/usememos/memos/pull/360](https://github.com/usememos/memos/pull/360)
* chore: update resource service by @boojack in [https://github.com/usememos/memos/pull/364](https://github.com/usememos/memos/pull/364)
* feat: add update version banner by @boojack in [https://github.com/usememos/memos/pull/365](https://github.com/usememos/memos/pull/365)
* feat: add blockquote regexp by @boojack in [https://github.com/usememos/memos/pull/366](https://github.com/usememos/memos/pull/366)
* chore: release `v0.7.0` by @boojack in [https://github.com/usememos/memos/pull/367](https://github.com/usememos/memos/pull/367)
***
**Full Changelog**: [v0.7.0](https://github.com/usememos/memos/releases/tag/v0.7.0)
---
# Release v0.7.1
URL: https://usememos.com/changelog/0-7-1
## What's Changed [#whats-changed]
* fix: missing column in resource table by @boojack in [https://github.com/usememos/memos/pull/368](https://github.com/usememos/memos/pull/368)
* fix: resource table migration by @boojack in [https://github.com/usememos/memos/pull/369](https://github.com/usememos/memos/pull/369)
* fix: get memo list order by @boojack in [https://github.com/usememos/memos/pull/370](https://github.com/usememos/memos/pull/370)
* feat: unpin button in the corner by @boojack in [https://github.com/usememos/memos/pull/374](https://github.com/usememos/memos/pull/374)
* chore: update readme by @boojack in [https://github.com/usememos/memos/pull/375](https://github.com/usememos/memos/pull/375)
* feat: dialog content enhancement by @Zeng1998 in [https://github.com/usememos/memos/pull/377](https://github.com/usememos/memos/pull/377)
* feat: remove unused resources by @Zeng1998 in [https://github.com/usememos/memos/pull/379](https://github.com/usememos/memos/pull/379)
* chore: update unpin memo by @boojack in [https://github.com/usememos/memos/pull/386](https://github.com/usememos/memos/pull/386)
* chore: update memo stats api by @boojack in [https://github.com/usememos/memos/pull/387](https://github.com/usememos/memos/pull/387)
* feat: cache editing memo id by @boojack in [https://github.com/usememos/memos/pull/388](https://github.com/usememos/memos/pull/388)
* feat: image preview enhancement by @Zeng1998 in [https://github.com/usememos/memos/pull/385](https://github.com/usememos/memos/pull/385)
* fix: memo list default value by @boojack in [https://github.com/usememos/memos/pull/390](https://github.com/usememos/memos/pull/390)
* fix: session max age by @boojack in [https://github.com/usememos/memos/pull/392](https://github.com/usememos/memos/pull/392)
* fix: heatmap data by @boojack in [https://github.com/usememos/memos/pull/394](https://github.com/usememos/memos/pull/394)
* chore: update resource dialog style by @boojack in [https://github.com/usememos/memos/pull/395](https://github.com/usememos/memos/pull/395)
* chore: update pagination for getting all memos by @boojack in [https://github.com/usememos/memos/pull/396](https://github.com/usememos/memos/pull/396)
* chore: update readme by @boojack in [https://github.com/usememos/memos/pull/397](https://github.com/usememos/memos/pull/397)
* chore: update corner width by @boojack in [https://github.com/usememos/memos/pull/398](https://github.com/usememos/memos/pull/398)
* chore: pin button color by @YuJianghao in [https://github.com/usememos/memos/pull/399](https://github.com/usememos/memos/pull/399)
* chore: fold/expand i18n by @YuJianghao in [https://github.com/usememos/memos/pull/400](https://github.com/usememos/memos/pull/400)
* chore: update gitignore by @hyoban in [https://github.com/usememos/memos/pull/402](https://github.com/usememos/memos/pull/402)
* feat: view all images of a memo by @hyoban in [https://github.com/usememos/memos/pull/393](https://github.com/usememos/memos/pull/393)
* fix: abnormal blockquote regexp by @Mahoo12138 in [https://github.com/usememos/memos/pull/404](https://github.com/usememos/memos/pull/404)
* feat: text filter regex support by @hyoban in [https://github.com/usememos/memos/pull/406](https://github.com/usememos/memos/pull/406)
* feat: add system setting to allow user signup by @boojack in [https://github.com/usememos/memos/pull/407](https://github.com/usememos/memos/pull/407)
* chore: enable `no-unused-vars` by @boojack in [https://github.com/usememos/memos/pull/408](https://github.com/usememos/memos/pull/408)
* fix: tag regexp by @boojack in [https://github.com/usememos/memos/pull/409](https://github.com/usememos/memos/pull/409)
* chore: update signin page by @boojack in [https://github.com/usememos/memos/pull/410](https://github.com/usememos/memos/pull/410)
***
**Full Changelog**: [v0.7.1](https://github.com/usememos/memos/releases/tag/v0.7.1)
---
# Release v0.7.2
URL: https://usememos.com/changelog/0-7-2
## What's Changed [#whats-changed]
* fix: tag compressed by @YuJianghao in [https://github.com/usememos/memos/pull/412](https://github.com/usememos/memos/pull/412)
* chore: allow skip version by @YuJianghao in [https://github.com/usememos/memos/pull/411](https://github.com/usememos/memos/pull/411)
* chore: add icon by @Zeng1998 in [https://github.com/usememos/memos/pull/414](https://github.com/usememos/memos/pull/414)
* fix: delete related resources by @Zeng1998 in [https://github.com/usememos/memos/pull/415](https://github.com/usememos/memos/pull/415)
* chore: update translation by @Zeng1998 in [https://github.com/usememos/memos/pull/417](https://github.com/usememos/memos/pull/417)
* feat: vacuum records manually by @boojack in [https://github.com/usememos/memos/pull/420](https://github.com/usememos/memos/pull/420)
* chore: update MemoResources props by @Zeng1998 in [https://github.com/usememos/memos/pull/432](https://github.com/usememos/memos/pull/432)
* fix: share memo with resource list by @Zeng1998 in [https://github.com/usememos/memos/pull/431](https://github.com/usememos/memos/pull/431)
* chore: update seed data by @boojack in [https://github.com/usememos/memos/pull/437](https://github.com/usememos/memos/pull/437)
* fix: route confusion entering from non-home page by @hyoban in [https://github.com/usememos/memos/pull/430](https://github.com/usememos/memos/pull/430)
* fix: parser regexp for special character by @boojack in [https://github.com/usememos/memos/pull/439](https://github.com/usememos/memos/pull/439)
* chore: update session key by @boojack in [https://github.com/usememos/memos/pull/440](https://github.com/usememos/memos/pull/440)
* feat: editing visibility selection by @Zeng1998 in [https://github.com/usememos/memos/pull/421](https://github.com/usememos/memos/pull/421)
* feat: add support for time-shortcut by @Zeng1998 in [https://github.com/usememos/memos/pull/434](https://github.com/usememos/memos/pull/434)
* feat: update visibility selector style by @boojack in [https://github.com/usememos/memos/pull/441](https://github.com/usememos/memos/pull/441)
* feat: additional style system setting by @boojack in [https://github.com/usememos/memos/pull/444](https://github.com/usememos/memos/pull/444)
* fix: parse tag list by @boojack in [https://github.com/usememos/memos/pull/446](https://github.com/usememos/memos/pull/446)
* fix: editor resource list by @boojack in [https://github.com/usememos/memos/pull/445](https://github.com/usememos/memos/pull/445)
* chore: update version 0.7.2 by @boojack in [https://github.com/usememos/memos/pull/447](https://github.com/usememos/memos/pull/447)
***
**Full Changelog**: [v0.7.2](https://github.com/usememos/memos/releases/tag/v0.7.2)
---
# Release v0.7.3
URL: https://usememos.com/changelog/0-7-3
## What's Changed [#whats-changed]
* fix: remove duplicate tag by @boojack in [https://github.com/usememos/memos/pull/450](https://github.com/usememos/memos/pull/450)
* feat: update editor style by @boojack in [https://github.com/usememos/memos/pull/454](https://github.com/usememos/memos/pull/454)
* chore: remove mobile editor style user setting by @boojack in [https://github.com/usememos/memos/pull/455](https://github.com/usememos/memos/pull/455)
* chore: update editor style by @boojack in [https://github.com/usememos/memos/pull/456](https://github.com/usememos/memos/pull/456)
* fix: image url extraction by @Zeng1998 in [https://github.com/usememos/memos/pull/453](https://github.com/usememos/memos/pull/453)
* chore: remove unused visibility selector by @boojack in [https://github.com/usememos/memos/pull/457](https://github.com/usememos/memos/pull/457)
* refactor: remove mixin colors by @boojack in [https://github.com/usememos/memos/pull/458](https://github.com/usememos/memos/pull/458)
* feat: add visibility filter by @Zeng1998 in [https://github.com/usememos/memos/pull/461](https://github.com/usememos/memos/pull/461)
* fix: route confusion entering from non-home page by @hyoban in [https://github.com/usememos/memos/pull/460](https://github.com/usememos/memos/pull/460)
* feat: visibility click filter by @Zeng1998 in [https://github.com/usememos/memos/pull/463](https://github.com/usememos/memos/pull/463)
* chore: change rss item title by @hyoban in [https://github.com/usememos/memos/pull/464](https://github.com/usememos/memos/pull/464)
* fix: duration query string by @Zeng1998 in [https://github.com/usememos/memos/pull/465](https://github.com/usememos/memos/pull/465)
* feat: folding options by @hyoban in [https://github.com/usememos/memos/pull/459](https://github.com/usememos/memos/pull/459)
* feat: additional script system setting by @boojack in [https://github.com/usememos/memos/pull/467](https://github.com/usememos/memos/pull/467)
* chore: change memo card's bg color by @Zeng1998 in [https://github.com/usememos/memos/pull/471](https://github.com/usememos/memos/pull/471)
* fix: clear query text by @Zeng1998 in [https://github.com/usememos/memos/pull/469](https://github.com/usememos/memos/pull/469)
* chore: update cancel edit button style by @boojack in [https://github.com/usememos/memos/pull/472](https://github.com/usememos/memos/pull/472)
* feat: update sharing memo image by @boojack in [https://github.com/usememos/memos/pull/473](https://github.com/usememos/memos/pull/473)
* fix: abnormal link regex by @Mahoo12138 in [https://github.com/usememos/memos/pull/474](https://github.com/usememos/memos/pull/474)
* chore: remove memo card dialog by @boojack in [https://github.com/usememos/memos/pull/475](https://github.com/usememos/memos/pull/475)
* chore: remove mark memo by @boojack in [https://github.com/usememos/memos/pull/476](https://github.com/usememos/memos/pull/476)
* feat: parser for horizontal rule by @hyoban in [https://github.com/usememos/memos/pull/477](https://github.com/usememos/memos/pull/477)
* feat: fold memos according to horizontal rule by @hyoban in [https://github.com/usememos/memos/pull/478](https://github.com/usememos/memos/pull/478)
* chore: update share memo image by @boojack in [https://github.com/usememos/memos/pull/482](https://github.com/usememos/memos/pull/482)
* chore: update emoji picker by @boojack in [https://github.com/usememos/memos/pull/483](https://github.com/usememos/memos/pull/483)
* chore: add toast to system settings by @boojack in [https://github.com/usememos/memos/pull/486](https://github.com/usememos/memos/pull/486)
* feat: add database filesize in UI by @boojack in [https://github.com/usememos/memos/pull/488](https://github.com/usememos/memos/pull/488)
***
**Full Changelog**: [v0.7.3](https://github.com/usememos/memos/releases/tag/v0.7.3)
---
# Release v0.8.0
URL: https://usememos.com/changelog/0-8-0
## What's Changed [#whats-changed]
* chore: update i18 for settings by @Zeng1998 in [https://github.com/usememos/memos/pull/490](https://github.com/usememos/memos/pull/490)
* chore: update dependencies version by @boojack in [https://github.com/usememos/memos/pull/491](https://github.com/usememos/memos/pull/491)
* feat: add crawler plugin by @boojack in [https://github.com/usememos/memos/pull/492](https://github.com/usememos/memos/pull/492)
* chore: update db filesize access control by @boojack in [https://github.com/usememos/memos/pull/493](https://github.com/usememos/memos/pull/493)
* fix: image scrollbar by @boojack in [https://github.com/usememos/memos/pull/494](https://github.com/usememos/memos/pull/494)
* feat: get image blob in backend by @boojack in [https://github.com/usememos/memos/pull/495](https://github.com/usememos/memos/pull/495)
* chore: update seed data by @boojack in [https://github.com/usememos/memos/pull/507](https://github.com/usememos/memos/pull/507)
* chore: add license to README by @boojack in [https://github.com/usememos/memos/pull/506](https://github.com/usememos/memos/pull/506)
* chore: bgcolor of memo share image by @Zeng1998 in [https://github.com/usememos/memos/pull/508](https://github.com/usememos/memos/pull/508)
* chore: update i18 for memo sharing by @Zeng1998 in [https://github.com/usememos/memos/pull/513](https://github.com/usememos/memos/pull/513)
* chore: code clean by @boojack in [https://github.com/usememos/memos/pull/516](https://github.com/usememos/memos/pull/516)
* chore: update issue template by @boojack in [https://github.com/usememos/memos/pull/517](https://github.com/usememos/memos/pull/517)
* fix: tag regexp by @boojack in [https://github.com/usememos/memos/pull/518](https://github.com/usememos/memos/pull/518)
* feat: extend validation config max length by @yardenshoham in [https://github.com/usememos/memos/pull/523](https://github.com/usememos/memos/pull/523)
* fix: update issue template by @Zeng1998 in [https://github.com/usememos/memos/pull/530](https://github.com/usememos/memos/pull/530)
* fix: empty filter value by @Zeng1998 in [https://github.com/usememos/memos/pull/529](https://github.com/usememos/memos/pull/529)
* feat: esc to cancel editing by @Zeng1998 in [https://github.com/usememos/memos/pull/532](https://github.com/usememos/memos/pull/532)
* chore: update i18n for visibility by @boojack in [https://github.com/usememos/memos/pull/537](https://github.com/usememos/memos/pull/537)
* chore: update data initial requests by @boojack in [https://github.com/usememos/memos/pull/538](https://github.com/usememos/memos/pull/538)
* feat: add username field by @boojack in [https://github.com/usememos/memos/pull/544](https://github.com/usememos/memos/pull/544)
* chore: addition of the French translation and small correction for the English by @baptiste313 in [https://github.com/usememos/memos/pull/546](https://github.com/usememos/memos/pull/546)
* feat: add French i18n item by @boojack in [https://github.com/usememos/memos/pull/547](https://github.com/usememos/memos/pull/547)
* chore: update readme by @boojack in [https://github.com/usememos/memos/pull/548](https://github.com/usememos/memos/pull/548)
* fix: cursor style by @Zeng1998 in [https://github.com/usememos/memos/pull/549](https://github.com/usememos/memos/pull/549)
* chore: fix typo by @boojack in [https://github.com/usememos/memos/pull/551](https://github.com/usememos/memos/pull/551)
* fix: icon style by @Zeng1998 in [https://github.com/usememos/memos/pull/555](https://github.com/usememos/memos/pull/555)
* chore: change memo created time by @boojack in [https://github.com/usememos/memos/pull/556](https://github.com/usememos/memos/pull/556)
* feat: add `Strikethrough` syntax by @boojack in [https://github.com/usememos/memos/pull/557](https://github.com/usememos/memos/pull/557)
* feat: support display video by @boojack in [https://github.com/usememos/memos/pull/558](https://github.com/usememos/memos/pull/558)
* chore: add test docker image by @boojack in [https://github.com/usememos/memos/pull/559](https://github.com/usememos/memos/pull/559)
* chore: add `SECURITY.md` by @boojack in [https://github.com/usememos/memos/pull/562](https://github.com/usememos/memos/pull/562)
* chore: fix name field in paragraph parser obj by @dmitriisurmin in [https://github.com/usememos/memos/pull/564](https://github.com/usememos/memos/pull/564)
* chore: fix vscode settings name by @hyoban in [https://github.com/usememos/memos/pull/565](https://github.com/usememos/memos/pull/565)
* chore: empty query text by @Zeng1998 in [https://github.com/usememos/memos/pull/566](https://github.com/usememos/memos/pull/566)
* fix: make tooltip text no-selecting by @dmitriisurmin in [https://github.com/usememos/memos/pull/567](https://github.com/usememos/memos/pull/567)
* chore: update tests by @boojack in [https://github.com/usememos/memos/pull/572](https://github.com/usememos/memos/pull/572)
* chore: update action name by @boojack in [https://github.com/usememos/memos/pull/573](https://github.com/usememos/memos/pull/573)
* chore: update dialog style by @boojack in [https://github.com/usememos/memos/pull/574](https://github.com/usememos/memos/pull/574)
* feat: highlight the searched text in memo content by @Zeng1998 in [https://github.com/usememos/memos/pull/514](https://github.com/usememos/memos/pull/514)
* fix: user patch with empty email by @boojack in [https://github.com/usememos/memos/pull/578](https://github.com/usememos/memos/pull/578)
***
**Full Changelog**: [v0.8.0](https://github.com/usememos/memos/releases/tag/v0.8.0)
---
# Release v0.8.1
URL: https://usememos.com/changelog/0-8-1
## What's Changed [#whats-changed]
* chore: disable metrics collector by @boojack in [https://github.com/usememos/memos/pull/580](https://github.com/usememos/memos/pull/580)
* fix: get markdown image from backend by @Zeng1998 in [https://github.com/usememos/memos/pull/581](https://github.com/usememos/memos/pull/581)
* chore: update i18n for account settings by @Zeng1998 in [https://github.com/usememos/memos/pull/582](https://github.com/usememos/memos/pull/582)
* feat: dark mode support for auth page by @hyoban in [https://github.com/usememos/memos/pull/569](https://github.com/usememos/memos/pull/569)
* feat: dark mode support for explore page by @hyoban in [https://github.com/usememos/memos/pull/584](https://github.com/usememos/memos/pull/584)
* fix: collapse btn cursor style by @Zeng1998 in [https://github.com/usememos/memos/pull/586](https://github.com/usememos/memos/pull/586)
* chore: fix some typos by @Zeng1998 in [https://github.com/usememos/memos/pull/587](https://github.com/usememos/memos/pull/587)
* fix: apperance select by @boojack in [https://github.com/usememos/memos/pull/585](https://github.com/usememos/memos/pull/585)
* fix: search bar dropdown disappearing by @dmitriisurmin in [https://github.com/usememos/memos/pull/593](https://github.com/usememos/memos/pull/593)
* chore: add .vscode to gitignore by @dmitriisurmin in [https://github.com/usememos/memos/pull/596](https://github.com/usememos/memos/pull/596)
* fix: tooltip overlaps a window border by @dmitriisurmin in [https://github.com/usememos/memos/pull/599](https://github.com/usememos/memos/pull/599)
* fix: initial database schema by @boojack in [https://github.com/usememos/memos/pull/601](https://github.com/usememos/memos/pull/601)
* chore: show content image by @boojack in [https://github.com/usememos/memos/pull/602](https://github.com/usememos/memos/pull/602)
* chore: update readme by @boojack in [https://github.com/usememos/memos/pull/606](https://github.com/usememos/memos/pull/606)
* fix: password field visible by @jxpsert in [https://github.com/usememos/memos/pull/609](https://github.com/usememos/memos/pull/609)
* fix: clear shortcut filter when delete this shortcut by @Wujiao233 in [https://github.com/usememos/memos/pull/611](https://github.com/usememos/memos/pull/611)
* fix: shoutcut tag filter handle mutiple tags by @Wujiao233 in [https://github.com/usememos/memos/pull/608](https://github.com/usememos/memos/pull/608)
* feat: create user repeat password by @Zeng1998 in [https://github.com/usememos/memos/pull/614](https://github.com/usememos/memos/pull/614)
* fix: change password max length validation by @Zeng1998 in [https://github.com/usememos/memos/pull/616](https://github.com/usememos/memos/pull/616)
* fix: selector dropdown position in fullscreen mod by @dmitriisurmin in [https://github.com/usememos/memos/pull/619](https://github.com/usememos/memos/pull/619)
* fix: no user settings returns when patch user by @Zeng1998 in [https://github.com/usememos/memos/pull/622](https://github.com/usememos/memos/pull/622)
* feat: dark mode support for memo detail by @hyoban in [https://github.com/usememos/memos/pull/604](https://github.com/usememos/memos/pull/604)
* fix: image url host missing by @boojack in [https://github.com/usememos/memos/pull/623](https://github.com/usememos/memos/pull/623)
* feat: member management enhancement by @Zeng1998 in [https://github.com/usememos/memos/pull/617](https://github.com/usememos/memos/pull/617)
* feat: new share dialog by @Zeng1998 in [https://github.com/usememos/memos/pull/618](https://github.com/usememos/memos/pull/618)
* chore: update readme me with contributors graph by @boojack in [https://github.com/usememos/memos/pull/626](https://github.com/usememos/memos/pull/626)
* docs: update readme by @eallion in [https://github.com/usememos/memos/pull/628](https://github.com/usememos/memos/pull/628)
* chore: add joyui tooltip for resources dialog by @Zeng1998 in [https://github.com/usememos/memos/pull/630](https://github.com/usememos/memos/pull/630)
* fix: add validation for user information update by @Zeng1998 in [https://github.com/usememos/memos/pull/633](https://github.com/usememos/memos/pull/633)
* feat: support resources reuse by @Zeng1998 in [https://github.com/usememos/memos/pull/620](https://github.com/usememos/memos/pull/620)
* chore: add theme file for joyui by @boojack in [https://github.com/usememos/memos/pull/635](https://github.com/usememos/memos/pull/635)
* chore: update i18n for validator message by @Zeng1998 in [https://github.com/usememos/memos/pull/636](https://github.com/usememos/memos/pull/636)
* feat: dark mode for main pages by @boojack in [https://github.com/usememos/memos/pull/637](https://github.com/usememos/memos/pull/637)
* feat: dynamic lazy loading route with simple loading page by @almoce in [https://github.com/usememos/memos/pull/632](https://github.com/usememos/memos/pull/632)
* fix: change folding option need reload by @hyoban in [https://github.com/usememos/memos/pull/641](https://github.com/usememos/memos/pull/641)
* fix: member menu dropdown position by @dmitriisurmin in [https://github.com/usememos/memos/pull/639](https://github.com/usememos/memos/pull/639)
* feat: dark mode for dialogs by @boojack in [https://github.com/usememos/memos/pull/643](https://github.com/usememos/memos/pull/643)
* fix: apperance can not auto switch by @hyoban in [https://github.com/usememos/memos/pull/644](https://github.com/usememos/memos/pull/644)
* feat: update appearance selector by @boojack in [https://github.com/usememos/memos/pull/645](https://github.com/usememos/memos/pull/645)
* fix: resource-container overflow by @hoi-lau in [https://github.com/usememos/memos/pull/649](https://github.com/usememos/memos/pull/649)
* Add a product for logseq plugin by @EINDEX in [https://github.com/usememos/memos/pull/652](https://github.com/usememos/memos/pull/652)
* chore: update user setting appearance by @boojack in [https://github.com/usememos/memos/pull/654](https://github.com/usememos/memos/pull/654)
* feat: upgrade dev version to `0.8.1` by @boojack in [https://github.com/usememos/memos/pull/656](https://github.com/usememos/memos/pull/656)
* chore: update global css by @boojack in [https://github.com/usememos/memos/pull/657](https://github.com/usememos/memos/pull/657)
* chore: update global css by @boojack in [https://github.com/usememos/memos/pull/658](https://github.com/usememos/memos/pull/658)
***
**Full Changelog**: [v0.8.1](https://github.com/usememos/memos/releases/tag/v0.8.1)
---
# Release v0.8.2
URL: https://usememos.com/changelog/0-8-2
## What's Changed [#whats-changed]
* fix: generate sharing memo image by @boojack in [https://github.com/usememos/memos/pull/663](https://github.com/usememos/memos/pull/663)
* chore: fix some typos of README by @Zeng1998 in [https://github.com/usememos/memos/pull/666](https://github.com/usememos/memos/pull/666)
* chore: remove emoji picker by @boojack in [https://github.com/usememos/memos/pull/667](https://github.com/usememos/memos/pull/667)
* feat: add swedish/svenska translation by @Mozzo1000 in [https://github.com/usememos/memos/pull/668](https://github.com/usememos/memos/pull/668)
* chore: remove table syntax by @boojack in [https://github.com/usememos/memos/pull/669](https://github.com/usememos/memos/pull/669)
* feat: support follow system appearance by @boojack in [https://github.com/usememos/memos/pull/670](https://github.com/usememos/memos/pull/670)
* chore: rename `enableFoldMemo` by @boojack in [https://github.com/usememos/memos/pull/671](https://github.com/usememos/memos/pull/671)
* chore: update demo image by @boojack in [https://github.com/usememos/memos/pull/672](https://github.com/usememos/memos/pull/672)
* feat: add German i18n item by @mauricebauer in [https://github.com/usememos/memos/pull/686](https://github.com/usememos/memos/pull/686)
* Dutch locale by @jxpsert in [https://github.com/usememos/memos/pull/687](https://github.com/usememos/memos/pull/687)
* feat: image preview enhancement by @Zeng1998 in [https://github.com/usememos/memos/pull/682](https://github.com/usememos/memos/pull/682)
* chore: update German translation by @mauricebauer in [https://github.com/usememos/memos/pull/691](https://github.com/usememos/memos/pull/691)
* feat: vacuum database in setting by @Zeng1998 in [https://github.com/usememos/memos/pull/694](https://github.com/usememos/memos/pull/694)
* chore: fix typo by @boojack in [https://github.com/usememos/memos/pull/695](https://github.com/usememos/memos/pull/695)
* fix: update UsageHeatMap.tsx to account for daylight savings by @apixandru in [https://github.com/usememos/memos/pull/696](https://github.com/usememos/memos/pull/696)
* feat: auto continuation list in editor by @Zeng1998 in [https://github.com/usememos/memos/pull/689](https://github.com/usememos/memos/pull/689)
* fix: code highlight in dark mode by @hyoban in [https://github.com/usememos/memos/pull/702](https://github.com/usememos/memos/pull/702)
* fix: correct priority of keys in editor by @Zeng1998 in [https://github.com/usememos/memos/pull/703](https://github.com/usememos/memos/pull/703)
* feat: add Uffizzi Integration by @ShrutiC-git in [https://github.com/usememos/memos/pull/655](https://github.com/usememos/memos/pull/655)
* Bump Version of reusable.yaml by @ShrutiC-git in [https://github.com/usememos/memos/pull/707](https://github.com/usememos/memos/pull/707)
* fix: break word by @boojack in [https://github.com/usememos/memos/pull/708](https://github.com/usememos/memos/pull/708)
* feat: responsive layout for create shortcut dialog by @OnlyPain-ctrl in [https://github.com/usememos/memos/pull/717](https://github.com/usememos/memos/pull/717)
* fix: html lang attr by @boojack in [https://github.com/usememos/memos/pull/718](https://github.com/usememos/memos/pull/718)
* added dark theme bg color to buttons by @OnlyPain-ctrl in [https://github.com/usememos/memos/pull/719](https://github.com/usememos/memos/pull/719)
* fix: auto complete in memo editor by @boojack in [https://github.com/usememos/memos/pull/720](https://github.com/usememos/memos/pull/720)
* feat: get image only when cors error by @boojack in [https://github.com/usememos/memos/pull/721](https://github.com/usememos/memos/pull/721)
* chore: update version to `0.8.2` by @boojack in [https://github.com/usememos/memos/pull/722](https://github.com/usememos/memos/pull/722)
***
**Full Changelog**: [v0.8.2](https://github.com/usememos/memos/releases/tag/v0.8.2)
---
# Release v0.8.3
URL: https://usememos.com/changelog/0-8-3
## What's Changed [#whats-changed]
* chore: remove lazy import component by @boojack in [https://github.com/usememos/memos/pull/724](https://github.com/usememos/memos/pull/724)
* fix: set resource list in memo editor by @boojack in [https://github.com/usememos/memos/pull/725](https://github.com/usememos/memos/pull/725)
* chore: remove ESC to close edit by @boojack in [https://github.com/usememos/memos/pull/726](https://github.com/usememos/memos/pull/726)
* chore: upgrade vite by @boojack in [https://github.com/usememos/memos/pull/728](https://github.com/usememos/memos/pull/728)
* feat: enable paste multiple resources by @Zeng1998 in [https://github.com/usememos/memos/pull/729](https://github.com/usememos/memos/pull/729)
* fix: reset image state in gallery by @Zeng1998 in [https://github.com/usememos/memos/pull/730](https://github.com/usememos/memos/pull/730)
* fix: fix order in resource dialog by @Zeng1998 in [https://github.com/usememos/memos/pull/733](https://github.com/usememos/memos/pull/733)
* chore: add vite plugin legacy by @boojack in [https://github.com/usememos/memos/pull/734](https://github.com/usememos/memos/pull/734)
* chore: update color scheme listener by @boojack in [https://github.com/usememos/memos/pull/735](https://github.com/usememos/memos/pull/735)
* fix: checklist auto continuation by @Zeng1998 in [https://github.com/usememos/memos/pull/737](https://github.com/usememos/memos/pull/737)
* fix: url resource filename decode by @Zeng1998 in [https://github.com/usememos/memos/pull/738](https://github.com/usememos/memos/pull/738)
* feat: add spanish locale by @PublicHer0 in [https://github.com/usememos/memos/pull/741](https://github.com/usememos/memos/pull/741)
* chore: update light bg color by @boojack in [https://github.com/usememos/memos/pull/744](https://github.com/usememos/memos/pull/744)
* feat: add 'theme' to translation by @jxpsert in [https://github.com/usememos/memos/pull/746](https://github.com/usememos/memos/pull/746)
* fix: add a span as wrapper to fix whitespace by @m-gschwandtner in [https://github.com/usememos/memos/pull/747](https://github.com/usememos/memos/pull/747)
* fix: hr in edited content do not trigger folding by @hyoban in [https://github.com/usememos/memos/pull/748](https://github.com/usememos/memos/pull/748)
* feat: add `visibility` field to resource by @boojack in [https://github.com/usememos/memos/pull/743](https://github.com/usememos/memos/pull/743)
* chore: revert "feat: add `visibility` field to resource (#743)" by @boojack in [https://github.com/usememos/memos/pull/751](https://github.com/usememos/memos/pull/751)
* feat: remove sticky style for memo editor by @boojack in [https://github.com/usememos/memos/pull/752](https://github.com/usememos/memos/pull/752)
* chore: update list style by @boojack in [https://github.com/usememos/memos/pull/754](https://github.com/usememos/memos/pull/754)
* chore: upgrade version to `0.8.3` by @boojack in [https://github.com/usememos/memos/pull/755](https://github.com/usememos/memos/pull/755)
***
**Full Changelog**: [v0.8.3](https://github.com/usememos/memos/releases/tag/v0.8.3)
---
# Release v0.9.0
URL: https://usememos.com/changelog/0-9-0
## What's Changed [#whats-changed]
* fix: watermark container width by @boojack in [https://github.com/usememos/memos/pull/758](https://github.com/usememos/memos/pull/758)
* fix: memo list padding bottom by @boojack in [https://github.com/usememos/memos/pull/759](https://github.com/usememos/memos/pull/759)
* fix: dialog close when draging from in to out by @hyoban in [https://github.com/usememos/memos/pull/760](https://github.com/usememos/memos/pull/760)
* fix: heatmap popup showing after logging out by @m-gschwandtner in [https://github.com/usememos/memos/pull/761](https://github.com/usememos/memos/pull/761)
* feat: editor enhancement by @Zeng1998 in [https://github.com/usememos/memos/pull/763](https://github.com/usememos/memos/pull/763)
* chore: simplify ordered list in editor by @boojack in [https://github.com/usememos/memos/pull/767](https://github.com/usememos/memos/pull/767)
* refactor: introducing `use{Module}Store` instead of service by @boojack in [https://github.com/usememos/memos/pull/768](https://github.com/usememos/memos/pull/768)
* docs: guide to deploy memos with render for beginners by @ajstephens1995 in [https://github.com/usememos/memos/pull/769](https://github.com/usememos/memos/pull/769)
* chore: update readme with deploy guides by @boojack in [https://github.com/usememos/memos/pull/771](https://github.com/usememos/memos/pull/771)
* feat: `esc` key to exit multiple dialogs by @Zeng1998 in [https://github.com/usememos/memos/pull/692](https://github.com/usememos/memos/pull/692)
* feat: customize system profile by @boojack in [https://github.com/usememos/memos/pull/774](https://github.com/usememos/memos/pull/774)
* chore: remove unused state by @Zeng1998 in [https://github.com/usememos/memos/pull/780](https://github.com/usememos/memos/pull/780)
* restrict the html file by @lujiefsi in [https://github.com/usememos/memos/pull/749](https://github.com/usememos/memos/pull/749)
* fix: max open conns for SQLite by @boojack in [https://github.com/usememos/memos/pull/781](https://github.com/usememos/memos/pull/781)
* chore: return raw text for html by @boojack in [https://github.com/usememos/memos/pull/782](https://github.com/usememos/memos/pull/782)
* chore: update tag regexp by @boojack in [https://github.com/usememos/memos/pull/785](https://github.com/usememos/memos/pull/785)
* feat: i18n chinese by @ChasLui in [https://github.com/usememos/memos/pull/790](https://github.com/usememos/memos/pull/790)
* feat: matching punctuation by @Zeng1998 in [https://github.com/usememos/memos/pull/791](https://github.com/usememos/memos/pull/791)
* feat: support `command + k` shortcuts insert []() by @ChasLui in [https://github.com/usememos/memos/pull/793](https://github.com/usememos/memos/pull/793)
* fix: shortcuts should exclude the shift judgment by @ChasLui in [https://github.com/usememos/memos/pull/796](https://github.com/usememos/memos/pull/796)
* fix: incorrect cursor when text is selected in range by @ChasLui in [https://github.com/usememos/memos/pull/797](https://github.com/usememos/memos/pull/797)
* feat: implement translation for days by @jxpsert in [https://github.com/usememos/memos/pull/784](https://github.com/usememos/memos/pull/784)
* feat: update spanish locale by @PublicHer0 in [https://github.com/usememos/memos/pull/786](https://github.com/usememos/memos/pull/786)
* feat: implement plurals for stats by @jxpsert in [https://github.com/usememos/memos/pull/783](https://github.com/usememos/memos/pull/783)
* feat: use shift+tab to unindent by @ChasLui in [https://github.com/usememos/memos/pull/799](https://github.com/usememos/memos/pull/799)
* feat: press cmd+f to focus on the search bar by @ChasLui in [https://github.com/usememos/memos/pull/800](https://github.com/usememos/memos/pull/800)
* feat: add arm/v7 to buildx platforms by @m-gschwandtner in [https://github.com/usememos/memos/pull/802](https://github.com/usememos/memos/pull/802)
* feat: show active panel when searchBar is in focus by @ChasLui in [https://github.com/usememos/memos/pull/806](https://github.com/usememos/memos/pull/806)
* feat: update marked by @boojack in [https://github.com/usememos/memos/pull/810](https://github.com/usememos/memos/pull/810)
* feat: tag table by @boojack in [https://github.com/usememos/memos/pull/811](https://github.com/usememos/memos/pull/811)
* feat: create tag dialog by @boojack in [https://github.com/usememos/memos/pull/814](https://github.com/usememos/memos/pull/814)
* feat: upsert tag based content by @boojack in [https://github.com/usememos/memos/pull/816](https://github.com/usememos/memos/pull/816)
* chore: update seed data for tag by @boojack in [https://github.com/usememos/memos/pull/817](https://github.com/usememos/memos/pull/817)
* chore: update create tag dialog style by @boojack in [https://github.com/usememos/memos/pull/818](https://github.com/usememos/memos/pull/818)
* fix: fix css of input placeholder in auth page by @Zeng1998 in [https://github.com/usememos/memos/pull/824](https://github.com/usememos/memos/pull/824)
* feat: prevent page jitter caused by the presence of scroll bars by @ChasLui in [https://github.com/usememos/memos/pull/808](https://github.com/usememos/memos/pull/808)
* feat: support heading syntax by @boojack in [https://github.com/usememos/memos/pull/827](https://github.com/usememos/memos/pull/827)
* feat: customize system profile by @boojack in [https://github.com/usememos/memos/pull/828](https://github.com/usememos/memos/pull/828)
* chore: update logo format to png by @boojack in [https://github.com/usememos/memos/pull/830](https://github.com/usememos/memos/pull/830)
* fix: disable decode patch id by @boojack in [https://github.com/usememos/memos/pull/831](https://github.com/usememos/memos/pull/831)
* feat: add secure middleware by @boojack in [https://github.com/usememos/memos/pull/832](https://github.com/usememos/memos/pull/832)
* chore: add escape to prevent XSS by @boojack in [https://github.com/usememos/memos/pull/833](https://github.com/usememos/memos/pull/833)
* chore: update dialog title by @boojack in [https://github.com/usememos/memos/pull/834](https://github.com/usememos/memos/pull/834)
* chore: upgrade version to `0.9.0` by @boojack in [https://github.com/usememos/memos/pull/835](https://github.com/usememos/memos/pull/835)
* fix: set csp header only for resource by @boojack in [https://github.com/usememos/memos/pull/836](https://github.com/usememos/memos/pull/836)
***
**Full Changelog**: [v0.9.0](https://github.com/usememos/memos/releases/tag/v0.9.0)
---
# Release v0.9.1
URL: https://usememos.com/changelog/0-9-1
* Fix lots of security issues 🛡️
* Add Ukrainian and Russian languages 🤝
* And Happy New Year 🎉
## What's Changed [#whats-changed]
* chore: remove secure flag by @boojack in [https://github.com/usememos/memos/pull/848](https://github.com/usememos/memos/pull/848)
* fix: prioritize user css by moving it to the body end by @m-gschwandtner in [https://github.com/usememos/memos/pull/847](https://github.com/usememos/memos/pull/847)
* feat: enable word break by @Zeng1998 in [https://github.com/usememos/memos/pull/849](https://github.com/usememos/memos/pull/849)
* feat: add setting for power editor by @Zeng1998 in [https://github.com/usememos/memos/pull/851](https://github.com/usememos/memos/pull/851)
* chore: hide host user email by @boojack in [https://github.com/usememos/memos/pull/856](https://github.com/usememos/memos/pull/856)
* chore: update dev config by @boojack in [https://github.com/usememos/memos/pull/857](https://github.com/usememos/memos/pull/857)
* feat: add ukrainian locale by @Tarik02 in [https://github.com/usememos/memos/pull/864](https://github.com/usememos/memos/pull/864)
* chore: update userinfo validator by @boojack in [https://github.com/usememos/memos/pull/868](https://github.com/usememos/memos/pull/868)
* fix: access control by @boojack in [https://github.com/usememos/memos/pull/870](https://github.com/usememos/memos/pull/870)
* fix: reload page when sign out by @boojack in [https://github.com/usememos/memos/pull/871](https://github.com/usememos/memos/pull/871)
* chore: update tip text for empty tag list by @boojack in [https://github.com/usememos/memos/pull/872](https://github.com/usememos/memos/pull/872)
* chore: fix XSS in renderer by @boojack in [https://github.com/usememos/memos/pull/875](https://github.com/usememos/memos/pull/875)
* chore: fix CSRF by @boojack in [https://github.com/usememos/memos/pull/876](https://github.com/usememos/memos/pull/876)
* fix: logic of email validation by @Zeng1998 in [https://github.com/usememos/memos/pull/877](https://github.com/usememos/memos/pull/877)
* feat: add russian locale by @iFaustov in [https://github.com/usememos/memos/pull/879](https://github.com/usememos/memos/pull/879)
* chore: fix XSS in renderer by @boojack in [https://github.com/usememos/memos/pull/880](https://github.com/usememos/memos/pull/880)
* chore: update create tag dialog by @boojack in [https://github.com/usememos/memos/pull/881](https://github.com/usememos/memos/pull/881)
* chore: update version to `0.9.1` by @boojack in [https://github.com/usememos/memos/pull/882](https://github.com/usememos/memos/pull/882)
***
**Full Changelog**: [v0.9.1](https://github.com/usememos/memos/releases/tag/v0.9.1)
---
# Release 26.10-rc.1
URL: https://usememos.com/changelog/26-10-rc-1
> The first 26.10 release candidate helps you write within your current filters, transcribe audio attachments, and browse readable memos by creator and Space. It also improves Markdown, Calendar, Map, and image previews.
## Upgrade notes [#upgrade-notes]
* **Upgrade path** - If you use a version earlier than 0.31.0, upgrade to 0.31.0 and start it successfully before installing this release. Versions earlier than 0.22 must first run 0.25.3, then 0.31.0. You can upgrade directly from 0.31.0; fresh installations need no intermediate release.
* **Calendar versions** - Releases now use names such as `26.10`, `26.10.1`, and `26.10-rc.1`, without a `v` prefix. This is a release candidate; install it with the exact container tag `neosmemo/memos:26.10-rc.1`. The `stable` tag continues to follow stable releases.
* **API clients** - REST paths move from `/api/v1/...` to `/api/...`, including `/api/sse`. Connect and gRPC procedures use `/memos.api./`. Clients must also update renamed fields and types; binary protobuf clients must regenerate from the new schema. Old paths return `410 Gone` for this release and will be removed in the next release. Follow the [26.10 API migration checklist](/docs/integrations/api-access#2610-client-migration).
* **Tasks View** - The built-in Tasks View is removed. Create a [View](/docs/usage/views) with `has_task_list && has_incomplete_tasks` to browse unfinished tasks.
* **Space placement** - To move a memo, edit it and choose its Space in the audience menu alongside visibility. The separate Move to Space action is removed.
See the [upgrade guide](/docs/operations/upgrade#upgrading-to-2610) before updating an existing installation.
## New features [#new-features]
### Writing in context [#writing-in-context]
* **Editor suggestions** - New drafts offer tags, checklist formatting, and visibility choices based on your current filters or selected View. Apply the suggestions you want; they disappear when the draft fulfills them.
* **Audio transcription** - Transcribe an existing audio attachment from the editor using your configured provider. Review the transcript in your draft before saving. Your existing text and original audio stay intact.
* **Space and visibility together** - Select a memo's Space and visibility from the editor's audience menu. Edit a top-level memo to add, change, or remove its Space, then save the changes together.
### Browsing by creator and Space [#browsing-by-creator-and-space]
* **Keep your scope** - Switch between Timeline, Calendar, Map, and Attachments while keeping the selected creator and Space.
* **Calendar and Map for visitors** - Signed-out visitors can browse memos they can read in Calendar and Map. Photos and author avatars help identify days and map pins across several authors; the desktop calendar makes room for its day panel.
* **Shared attachment browsing** - The attachment library includes files from readable memos and identifies their uploaders.
## Improvements and fixes [#improvements-and-fixes]
* **Markdown and editing** - Collapsible sections have clearer indicators and spacing, with keyboard controls and nested sections preserved. Headings match between editing and reading, block spacing is more consistent, and formatting shortcuts keep surrounding whitespace outside Markdown delimiters.
* **Image previews** - Pinch to zoom, drag to pan a zoomed image, and swipe between gallery images at fit zoom. Preview controls stay within the visible mobile viewport.
* **Memos and filters** - Pinned memos have a clearer corner marker in single-creator feeds; mixed-author feeds stay chronological. Filters such as `has_task_list == false` include memos without that property. Deleting a memo also deletes its comments and nested replies.
* **Navigation and appearance** - Open memo timestamps in a new tab. Theme and language controls use sidebar submenus that stay on screen in narrow viewports. Notifications follow the active theme, and reaction pickers close without flashing at the page corner.
* **Languages and link previews** - Norwegian Nynorsk is available, the Korean hidden-content label uses neutral wording, and large web pages produce more reliable preview titles and images.
Report regressions in [GitHub issues](https://github.com/usememos/memos/issues).
**Release**: [26.10-rc.1 on GitHub](https://github.com/usememos/memos/releases/tag/26.10-rc.1)
**Full changelog**: [v0.31.0...26.10-rc.1](https://github.com/usememos/memos/compare/v0.31.0...26.10-rc.1)