Memos on a VPS: Self-Hosted Twitter-Like Note-Taking for Daily Journaling and Quick Capture

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

  1. Visit https://notes.yourdomain.com
  2. Create your account (first user becomes admin)
  3. Settings → Profile → set display name and avatar
  4. 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.

Fast • Reliable • Affordable VPS - DO It Now!

Get top VPS hosting with VPS.DO’s fast, low-cost plans. Try risk-free with our 7-day no-questions-asked refund and start today!