Memos — Personal Voice Journal

Self-hosted journaling app with REST API, Markdown support, and Home Assistant voice integration.

Quick Start

cd /mnt/apps/docker/memos
docker compose up -d

Access at: https://journal.haiven.site

Features

Architecture

Voice Satellite → Home Assistant → STT (haiven-transcribe)
  → Assist Pipeline → JournalEntry intent
  → llama-swap (format) → Memos API (save)
  → smart_announce ("Journal entry saved.")

Configuration

Setting Value
Image neosmemo/memos:0.26.2
Port 5230
Domain journal.haiven.site
Database SQLite at ./data/memos.db
Networks web, backend
Memory Limit 512MB
Traefik Label-based (no file-provider route)

Voice Commands

Say Result
"journal entry [anything]" Creates journal entry
"journal [anything]" Creates journal entry
"write in my journal [anything]" Creates journal entry
"add to my journal [anything]" Creates journal entry
"dear journal [anything]" Creates journal entry

API Usage

# Create entry (requires Bearer token from Memos UI → Settings → Access Tokens)
curl -s -X POST https://journal.haiven.site/api/v1/memos \
  -H "Authorization: Bearer <TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"content": "# My Entry\n\nSome text #journal", "visibility": "PRIVATE"}'

# List entries
curl -s -H "Authorization: Bearer <TOKEN>" \
  https://journal.haiven.site/api/v1/memos?limit=5

Backup

Daily automated backups via backup.sh:
- Daily: 7-day retention
- Weekly (Sunday): 4-week retention
- Monthly (1st): unlimited retention
- Location: /mnt/storage/memos/backups/

Manual backup: ./backup.sh

Initial Setup

  1. Navigate to https://journal.haiven.site
  2. Create admin account on first launch (credentials → Bitwarden)
  3. Go to Settings → Access Tokens → Generate token
  4. Add token to homeassistant/config/secrets.yaml:
    yaml memos_api_token_bearer: "Bearer YOUR_TOKEN_HERE"
  5. Reload Home Assistant configuration

Troubleshooting

# Container logs
docker logs -f memos

# Health check (image has wget only, not curl)
wget -qO- http://localhost:5230/healthz

# Check Traefik routing
curl -sk https://journal.haiven.site/healthz

# Check networks
docker inspect memos --format '{{range $k, $v := .NetworkSettings.Networks}}{{$k}}: {{$v.IPAddress}}{{end}}'