How to Install Memos (A Private Microblog for Quick Notes, Ideas and a Daily Log)

Memos: one page, a box at the top, your thoughts in a stream with tags. Quick notes, a daily log, from any device, on your server.

Joplin (132) is for notes you organise. Memos is for the ones you don't: a box at the top of a page, type a thought, a link, a #tag, drop a photo, post. It's a private Twitter-style stream of your own head — the shopping idea, the error message you'll want next week, what you did today, a quote. Search finds it later, tags group it, a calendar heatmap shows the days you wrote. One container, under 50 MB, SQLite inside.

Quick reference

TaskWhat
Folder~/docker/memos/compose.yaml
Webhttp://server-ip:5230
First userregister in the UI → becomes admin; then disable sign-ups
Tags#tag anywhere in a memo
Sharea memo → Share → public link
APIPOST /api/v1/memos with a bearer token
Phonethe web app on the home screen; MoeMemos (iOS/Android)

1. The compose file

mkdir -p ~/docker/memos/data && cd ~/docker/memos
nano compose.yaml

services:
memos:
image: neosmemo/memos:stable
container_name: memos
ports:
- "5230:5230"
volumes:
- ./data:/var/opt/memos
restart: unless-stopped

docker compose up -d
sudo ufw allow from 192.168.1.0/24 to any port 5230

Open http://192.168.1.50:5230, Sign up — the first account is the host/admin. Then Settings → System → Disallow user registration, and add family members under Member if they want their own streams.

2. Using it

Type in the box: Markdown works, #idea and #server become clickable tags, paste an image or drag a file, Save. The stream is newest-first; the left sidebar filters by tag; the top-right calendar shows a dot per day. Search covers everything. Each memo has a visibility: private, workspace (other users on your instance), or public.

Keyboard: Ctrl + Enter saves. A memo can be pinned, archived, or turned into a to-do with - [ ] checkboxes.

3. A daily log

The habit that makes Memos earn its place: one memo a day, tagged #log, with what you did on the server (which tutorial, what changed), what broke, what you learned. Six months later, #log plus search answers "when did I change the Nginx config" better than memory and faster than BookStack (88). The calendar heatmap nags you kindly.

4. Share a memo

⋯ → Share gives a public link to that one memo — a recipe, a how-to for a friend, a snippet — with a nice page and nothing else of yours visible. Embed for a blog.

5. From scripts and automations

Settings → My Account → Access tokens → Create. Then from anywhere:

curl -s -X POST https://memos.example.com/api/v1/memos \
-H "Authorization: Bearer TOKEN" -H "Content-Type: application/json" \
-d '{"content": "#log Backup finished in 4m12s", "visibility": "PRIVATE"}'

The backup script (23), the weekly report (156), a Healthchecks failure (104) via n8n (77), the ntfy message (93) copied into a memo — the stream becomes a journal the server writes to as well. A Telegram bot via n8n can post what you message it; Memos as an inbox for thoughts from the phone.

6. Export and back up

Settings → Export gives a zip of every memo as Markdown plus resources. The database and uploads are in ./data — nightly backup (23) covers it; it's tiny.

Behind the proxy

memos.example.com → 127.0.0.1:5230 (28), HTTPS, and keep sign-ups off. Public links work from outside; the rest is yours.

Troubleshooting

Uploads fail. ./data ownership, or the proxy's body size limit for photos.

Lost the admin password. docker compose exec memos memos --mode prod --reset-password (check the current flag in the docs), or edit the SQLite user row as a last resort.

Search slow with thousands of memos. Switch the database to Postgres (MEMOS_DRIVER=postgres, MEMOS_DSN) on the shared server (161).

MoeMemos won't log in. It needs an access token, not the password, on recent versions.

Wrapping up

One container, one page, one box. Thoughts, links, photos and a daily #log in a searchable stream you own, with a public link for the odd thing worth sharing and an API that lets the server keep the journal too.

Call us