↓ Skip to main content
  1. Posts/
  2. PKM/

Memos: Setting Up Self-Hosted Notes for Quick Thoughts

··729 words·4 mins· loading · loading · ·
Stilicho2011
Author
Stilicho2011
Writing about homelab, self-hosting, automation and open-source solutions
Table of Contents
PKM & Notes - This article is part of a series.
Part : This Article

If you don’t need a full-blown PKM system like Obsidian or Trilium, and just want to jot down a thought before you lose it, Memos fills that exact gap. It’s basically a self-hosted Google Keep: lightweight, no bloated interface, but with your own server under the hood and full control over your data.

I go through it in the video and do a full write-up alongside it - what it is, who it’s for, and how to get it running in Docker.

What Memos is
#

Memos is an open-source note-taking app built around a timeline. No page hierarchy, no databases inside notes, no block structures like you’d get in Notion or Obsidian - just a chronological feed of short entries written in Markdown, with tags right in the text and fast search.

If Obsidian or Trilium is a full-on knowledge base, Memos is closer to a technical microblog for yourself: drop a thought, slap a tag on it, move on.

Who it’s for
#

Memos makes sense if you don’t need nested structures, links between notes, kanban boards, or full wiki logic.

What you do need is a fast way to capture a thought, a project idea, or a quick technical note without opening a heavyweight PKM app. It’s essentially a self-hosted alternative to Google Keep or Apple Notes, except your notes stay on your own server instead of flying off to someone else’s.

Timeline and tags
#

Every entry lands in a single chronological feed - handy for jotting down ideas as you work through a project. Tags (#docker, #proxmox, #traefik) let you filter down to what you need later without scrolling through everything.

Multiple users
#

You can set up separate users with isolated data and roles - useful if you want one instance for the whole family or a small team instead of spinning up a Memos instance for each person.

Minimal requirements
#

No external PostgreSQL, no heavy dependencies, no complicated config out of the box - by default Memos runs on SQLite. That makes it a solid candidate for a mini PC, a single-board computer, or a small VPS where you have no reason to run anything heavier.

Sample docker compose file from the video
#

Here’s the config I used in the video - Memos behind Traefik, proxied through a domain:

services:
  memos:
    image: neosmemo/memos:stable
    container_name: memos
    #ports:
    #  - "5230:5230"
    volumes:
      - /home/user/docker/memos:/var/opt/memos
    environment:
      - MEMOS_PORT=5230
      - MEMOS_INSTANCE_URL=https://memos.domain.ru
    restart: unless-stopped
    networks:
      proxy:                              # Attach the container to the external "proxy" network (used by Traefik)
    labels:                               # Labels for Traefik integration (reverse proxy)
      - "traefik.enable=true"                                      # Turns on Traefik handling for this container
      - "traefik.http.routers.memos.entrypoints=web"             # Defines the HTTP entrypoint (port 80)
      - "traefik.http.routers.memos.rule=Host(`memos.domain.ru`)"  # Traffic for this domain gets routed to this container
      - "traefik.http.middlewares.memos-https-redirect.redirectscheme.scheme=https"         # Middleware for the HTTP-to-HTTPS redirect
      - "traefik.http.routers.memos.middlewares=memos-https-redirect"          # Apply the redirect middleware to the HTTP route
      - "traefik.http.routers.memos-secure.entrypoints=websecure"          # Defines the HTTPS entrypoint (port 443)
      - "traefik.http.routers.memos-secure.rule=Host(`memos.domain.ru`)"         # Same HTTPS route for the same domain
      - "traefik.http.routers.memos-secure.tls=true"          # Turns on TLS (HTTPS)
      - "traefik.http.routers.memos-secure.service=memos"     # Ties the HTTPS route to the memos service
      - "traefik.http.services.memos.loadbalancer.server.port=5230"          # Internal port memos listens on inside the container
      - "traefik.docker.network=proxy"          # Tells Traefik to look for the container on the "proxy" network

networks:
  proxy:                                  # External network definition for talking to Traefik
    external: true                        # Network already exists (don't recreate it)

A couple of nuances if you’re building this out for your own domain:

  • ports is commented out on purpose - the container doesn’t publish a port directly, all traffic comes in through Traefik over the proxy network.
  • Instead of MEMOS_MODE=prod, which shows up in older examples, I used MEMOS_INSTANCE_URL - the current variable from Memos’ documentation that sets the instance’s canonical external address. It matters specifically when running behind a reverse proxy: without it, links to shared notes can end up generated incorrectly.
  • Port 5230 here isn’t the default (recent versions of Memos listen on 8081 if no port is set explicitly), but since it’s spelled out in both MEMOS_PORT and the Traefik label, everything lines up.

Conclusion
#

If Obsidian or Trilium feels like overkill for what’s essentially a list of quick notes, Memos fills exactly that gap: self-hosted, lightweight, Markdown and tags, running in five minutes. It won’t become a full knowledge base, but as a self-hosted stand-in for Google Keep, it does the job perfectly.

PKM & Notes - This article is part of a series.
Part : This Article

Related

Obsidian Plugins I Use

··2543 words·12 mins· loading · loading
A rundown of 36 Obsidian plugins that replaced Trilium Notes’ built-in functionality after the move - from Templater and Bases to Excalidraw and Kanban. I compare the philosophy of the two systems and explain why the deciding factor was YAML Front Matter support for publishing articles via Hugo.