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

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
| Task | What |
|---|---|
| Folder | ~/docker/memos/compose.yaml |
| Web | http://server-ip:5230 |
| First user | register in the UI → becomes admin; then disable sign-ups |
| Tags | #tag anywhere in a memo |
| Share | a memo → Share → public link |
| API | POST /api/v1/memos with a bearer token |
| Phone | the 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.
