Skip to content
Go back

Memos: Self-Hosted Microblog Meets Daily Note

By SumGuy 7 min read
Memos: Self-Hosted Microblog Meets Daily Note

Your Brain Needs a Junk Drawer

Not every thought deserves an Obsidian vault. Not every link belongs in Notion. Sometimes you just need to write “check if Redis TTL is actually expiring in prod” at 11pm without spinning up a whole second brain.

That’s Memos. A self-hosted microblogging scratchpad that looks suspiciously like Twitter — if Twitter had no ads, no algorithm, no engagement metrics, and actually respected your privacy. One container. SQLite by default. Markdown with hashtags. It’s embarrassingly simple and that’s the entire point.

Full example: Clone the working files at github.com/KingPin/sumguy-examples/self-hosting/memos-self-hosted-notes


What Memos Actually Is

Memos (github.com/usememos/memos) is an open-source, self-hosted note-taking app built around the “memo” — a short, timestamped, Markdown-formatted entry. Think tweet-length thoughts that can be public or private, tagged with #hashtags, and browsed as a reverse-chronological timeline.

It’s not a wiki. It’s not a full document editor. It’s a place for:

The key insight: fleeting notes don’t deserve the ceremony of Obsidian. When you open Obsidian to write a quick thought, you end up reorganizing three folders, renaming a note, and creating two new tags. Forty minutes gone. Memos is the antidote — open, type, done.


Standing It Up in Five Minutes

One container, one volume, done. Here’s the Compose file:

docker-compose.yml
services:
memos:
image: neosmemo/memos:stable
container_name: memos
restart: unless-stopped
ports:
- "5230:5230"
volumes:
- ./data:/var/opt/memos
environment:
- MEMOS_MODE=prod
- MEMOS_PORT=5230
Terminal window
mkdir -p ~/memos/data
cd ~/memos
docker compose up -d

That’s it. Hit http://your-server:5230 and create your admin account. Memos bootstraps a SQLite database at ./data/memos_prod.db on first run.

Switching to Postgres

SQLite is perfectly fine for personal use — it’ll handle years of daily notes without breaking a sweat. But if you’re running a shared family instance or you’re paranoid about SQLite at scale, Postgres is one env var away:

docker-compose.yml
services:
memos:
image: neosmemo/memos:stable
container_name: memos
restart: unless-stopped
ports:
- "5230:5230"
volumes:
- ./data:/var/opt/memos
environment:
- MEMOS_MODE=prod
- MEMOS_DRIVER=postgres
- MEMOS_DSN=postgresql://memos:yourpassword@db:5432/memos
depends_on:
- db
db:
image: postgres:16-alpine
container_name: memos-db
restart: unless-stopped
environment:
- POSTGRES_DB=memos
- POSTGRES_USER=memos
- POSTGRES_PASSWORD=yourpassword
volumes:
- ./pgdata:/var/lib/postgresql/data

Reverse Proxy

Slap Caddy in front to get HTTPS without crying:

memos.yourdomain.com {
reverse_proxy memos:5230
}

Or Nginx if you’re loyal to suffering:

server {
listen 443 ssl;
server_name memos.yourdomain.com;
location / {
proxy_pass http://memos:5230;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}

The Feature That Makes It Sticky: Hashtags as a Filing System

You don’t create categories ahead of time. You don’t drag things into folders. You just write #docker #debug at the end of a note and Memos auto-builds a sidebar tag tree. Click a tag, see every memo with that tag, sorted newest first.

This sounds basic until you’ve been using it for three months and you have 400 memos tagged by #linux, #homelab, #recipes, and #random-3am-thoughts. At that point it’s genuinely useful in a way that obsessively nested folders never are.

Public vs Private Per Memo

Every memo defaults to private. You can flip individual ones to public, which exposes them at your instance URL without auth. Useful for sharing a config snippet or a quick tip without standing up a whole blog post. It’s granular enough to be practical, simple enough that you’ll actually use it.


The Backup Story Is Beautifully Boring

This is the part where I have to resist the urge to tell you about rsync like it’s some secret trick. It’s not. The backup story for Memos with SQLite is:

Terminal window
rsync -avz user@your-server:~/memos/data/memos_prod.db /local/backup/

Run that on a cron. Done. One file. The entire history of every thought you’ve ever captured. SQLite’s single-file model is genuinely underrated for personal tools — no dump commands, no restore procedures, no pg_dump flags you’ll misremember at 2 AM when something is actually broken.

For Postgres you’re back in pg_dump territory, which is fine if you have that infra already, but for a solo scratchpad it’s like renting a forklift to move a filing cabinet.


Telegram Bot Bridge

Here’s the bit that actually makes Memos dangerous (in the good way). Memos has an open REST API. You can create a memo from a curl:

Terminal window
curl -X POST https://memos.yourdomain.com/api/v1/memos \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{"content": "check Redis TTL in prod #docker #todo", "visibility": "PRIVATE"}'

Which means you can build a dead-simple Telegram bot that forwards any message you send it straight into Memos. The practical result: you’re on your phone, you have a thought, you message your bot, it lands in your private timeline tagged and timestamped. No app context switches, no account creation, no Twitter algorithm deciding your shower thought deserved 3 ads.

The bot itself is maybe 30 lines of Python using python-telegram-bot. The API token is in your Memos profile under Settings → Access Tokens.


How It Compares to the Other Options

Let’s be honest about why you’d pick Memos over the alternatives, because there are several.

Twitter/X (you): You’re paying for engagement-brained dopamine hits and giving Elon your thought history. Memos is for thoughts you actually want to keep, not perform. Next.

Mastodon: Federated, social, ActivityPub-capable, and about 10x more infrastructure than you need to save a shell command. If you want social, run Mastodon. If you want a scratchpad, that’s overkill — like hiring a forklift to move a couch.

Bear / Drafts (iOS): Great apps. Mobile-first, polished, iCloud sync. Also: Apple-only, subscription-based for sync, and your data lives wherever Bear decides to put it. Memos runs on your server, syncs nowhere you don’t control, and works fine from any browser.

Standard Notes: More vault-style encrypted notes. Excellent for sensitive long-form content. Not the right tool for “here’s a random link I found at 11pm.” It’s a safe, not a junk drawer.

Notion: You’ve already opened the Memos tab by the time Notion finishes loading. Enough said.

Memos sits in the Goldilocks zone between “too formal to bother” (Obsidian, Notion) and “too public to be useful” (Twitter, Mastodon). It’s a private timeline for your own brain.


Daily Review Workflow

The pattern that makes Memos genuinely worth the 10 minutes to set up: a daily review habit.

Every morning, scroll back 24 hours. Anything tagged #todo gets moved into your actual task tracker. Anything tagged #blog becomes a potential post. Anything tagged #random-3am-thoughts gets a silent cringe and an archive.

You can filter by date range via the UI. You can search full-text. The API means you can script your own daily digest if you’re that kind of person (you probably are, you’re self-hosting notes software).


When to Skip Memos

It’s not the right tool for everything. Skip it if:

But if you’ve ever rage-quit a notes app because it wanted you to pick a folder before you could write a sentence — Memos is for you.


The Verdict

Memos is one of those tools that’s almost offensively simple. One container. One SQLite file. Hashtags and a timeline. No onboarding wizard, no 47-step setup guide, no premium tier that unlocks the ability to search your own notes.

It does one thing: gets your fleeting thoughts out of your head and into a private, searchable, backed-up timeline that you actually own. For that job, it’s close to perfect.

Your 2 AM self will appreciate it.


Share this post on:

Send a Webmention

Written about this post on your own site? Send a webmention and it'll show up above once verified.


Next Post
ModSecurity vs Coraza WAF

Discussion

Powered by Garrul . Sign in with GitHub or Google, or post anonymously.

Related Posts