Memos on a VPS: Self-Hosted Twitter-Like Note-Taking for Daily Journaling and Quick Capture
Memos is a lightweight, open-source note-taking application with a Twitter/Mastodon-like feed interface — you write quick notes, thoughts, and journal entries, tag them for organization, and search them later. Unlike Obsidian (local files) or Notion (cloud SaaS), Memos is a self-hosted web app — accessible from any browser, with a mobile-friendly interface and a REST API for automation. It’s ideal for daily journaling, quick thought capture, and building a personal knowledge base of short notes.
Why Memos Instead of Obsidian or Notion
- Memos: Web-based, always accessible, chronological feed, quick capture, tag-based search, REST API. Best for short notes, journaling, and thought capture.
- Obsidian: Local files (Markdown), bi-directional links, plugin ecosystem. Best for long-form knowledge base and note graph.
- Notion: Structured pages, databases, team collaboration. Best for project documentation and team wikis.
- Choose Memos: If you want a private, self-hosted “Twitter for your thoughts” — fast to capture, easy to search, accessible everywhere.
Step 1: Docker Compose Setup
<code">mkdir -p /opt/memos && cd /opt/memos nano docker-compose.yml
<code">version: '3.8'
services:
memos:
image: neosmemo/memos:stable
container_name: memos
restart: always
ports:
- "127.0.0.1:5230:5230"
environment:
- MEMOS_MODE=prod
- MEMOS_PORT=5230
- MEMOS_DATA=/var/opt/memos
volumes:
- ./data:/var/opt/memos
<code">mkdir -p data docker compose up -d docker compose logs -f memos
Step 2: Nginx Reverse Proxy
<code">sudo nano /etc/nginx/sites-available/memos
<code">server {
listen 80;
server_name notes.yourdomain.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name notes.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/notes.yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/notes.yourdomain.com/privkey.pem;
client_max_body_size 20M;
location / {
proxy_pass http://127.0.0.1:5230;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
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;
}
}
<code">sudo ln -s /etc/nginx/sites-available/memos /etc/nginx/sites-enabled/ sudo certbot --nginx -d notes.yourdomain.com sudo systemctl reload nginx
Step 3: Initial Setup
- Visit
https://notes.yourdomain.com - Create your account (first user becomes admin)
- Settings → Profile → set display name and avatar
- Settings → Preferences → configure time zone, editor mode (Markdown or WYSIWYG)
Step 4: Taking Notes
<code"># Memos supports Markdown in notes:
# **Bold**, *italic*, `code`, ## Heading, - list items
# Tag syntax (searchable):
# Today's standup: worked on #nginx config and #deployment pipeline
# Links:
# Read this: https://yourdomain.com/article
# Code blocks:
```python
def hello():
return "world"
```
# Task list:
- [ ] Buy groceries
- [x] Call dentist
- [ ] Review PR #142
Step 5: Visibility and Sharing
<code"># Each memo has visibility: # Private — only you can see it (default) # Protected — logged-in users on your instance can see it # Public — anyone with the URL can see it # Public memos can be shared individually: # https://notes.yourdomain.com/m/MEMO_ID # Your public profile page (if enabled): # https://notes.yourdomain.com/u/YOUR_USERNAME # Disable public access entirely (personal instance): # Settings → Workspace → Disable Allow Sign Up # Settings → System → Set visibility policy
Step 6: REST API for Automation
<code"># Get your API token: Settings → My Account → Access Tokens → Create
# Create a memo via API
curl -X POST https://notes.yourdomain.com/api/v1/memos \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"content": "Daily standup: #work reviewed the API changes, deployed to staging",
"visibility": "PRIVATE"
}'
# Search memos
curl "https://notes.yourdomain.com/api/v1/memos?filter=tag:%23work" \
-H "Authorization: Bearer YOUR_TOKEN"
# Get all memos from last week
curl "https://notes.yourdomain.com/api/v1/memos?filter=created>=2025-01-01" \
-H "Authorization: Bearer YOUR_TOKEN"
Step 7: Automation Examples
Auto-capture to Memos from CLI
<code">nano /usr/local/bin/memo
<code">#!/bin/bash
# Quick memo from terminal: memo "Today I learned about TCP tuning #linux"
curl -s -X POST https://notes.yourdomain.com/api/v1/memos \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d "{\"content\": \"$*\", \"visibility\": \"PRIVATE\"}" | \
python3 -m json.tool | grep "name"
<code">chmod +x /usr/local/bin/memo memo "Deployed new nginx config, reduced latency by 20% #devops"
Daily Habit Tracker via n8n
<code"># n8n workflow: Cron at 9 PM → create daily check-in memo
# Body: "Daily check-in {{$now.toFormat('yyyy-MM-dd')}} #daily"
# Questions to answer inline:
# - What did I accomplish? #work
# - What did I learn? #learning
# - How was my energy? #health
Import from Telegram Bot
<code"># Telegram → n8n webhook → Memos API # When you message your Telegram bot, it creates a private memo # Great for capturing thoughts on mobile without opening browser
Multi-User Setup
<code"># Memos supports multiple users on one instance
# Admin panel: /admin
# Settings → Workspace → Allow sign-up:
# - Yes: anyone can register (family/team use)
# - No: admin manually creates accounts via API
# Create user via API (admin only):
curl -X POST https://notes.yourdomain.com/api/v1/users \
-H "Authorization: Bearer ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"username": "jane", "password": "SecurePassword!", "role": "USER"}'
Backup
<code"># Memos stores everything in SQLite at /var/opt/memos/memos_prod.db # Simple backup: cp /opt/memos/data/memos_prod.db /opt/backups/memos-$(date +%Y%m%d).db # Or with Restic: restic backup /opt/memos/data --tag memos
Getting Started
Memos uses 30–50 MB RAM — the smallest footprint of any self-hosted application. It runs alongside many other services on a 1 GB Ubuntu VPS at VPS.DO. The REST API makes it easy to build capture workflows from mobile (via Siri Shortcuts or Android Tasker), CLI, or n8n automations. Self-hosted Memos keeps all your notes private on your own infrastructure.
Conclusion
Memos provides a fast, private note-taking experience with a chronological feed, Markdown support, tag-based search, and a REST API for automation. At 30 MB RAM and SQLite storage, it’s the lightest self-hosted knowledge tool available. For daily journaling, thought capture, and personal knowledge management of short-form notes, Memos is the right self-hosted alternative to cloud apps like Notion or Apple Notes — private, searchable, and accessible from any browser.