Skip to content

Search

Memlog uses Whoosh for full-text search. The index is stored in MEMLOG_PATH/.memlog/ and updated automatically before each search — new or modified notes appear immediately.

Syntax

Query Matches
hello world Notes containing both words
"hello world" Notes containing the exact phrase
prog* Prefix wildcard — matches program, programming, etc.
* All notes
#work Notes tagged #work
#work meeting Notes tagged #work that also contain meeting

Search applies stemming and ASCII folding, so program, programming, and programmed all match the same query.

Tags

Tags are #word tokens in note content. They are case-insensitive. Use #tag as a standalone query to filter by tag, or combine with keywords.

Sort options

Results can be sorted by:

  • Score — relevance (default for keyword searches)
  • Last Modified — most recently changed first
  • Title — alphabetical

Semantic search finds notes by meaning rather than exact keywords. It uses vector embeddings stored in Qdrant.

Semantic search is optional and disabled by default. The Semantic toggle in the search UI only appears when it is configured and reachable at startup.

Requirements

  • A running Qdrant instance
  • An embedding provider: Voyage AI (cloud) or Ollama (local)

Voyage AI is a managed embeddings API with a free tier (200M tokens/month). No local GPU required.

MEMLOG_QDRANT_URL: http://qdrant:6333
MEMLOG_VOYAGE_API_KEY: your-voyage-api-key
MEMLOG_EMBEDDING_MODEL: voyage-3-lite

Add Qdrant to your docker-compose.yml:

services:
  memlog:
    image: ghcr.io/prysmakou/memlog:latest
    environment:
      MEMLOG_PATH: /data
      MEMLOG_QDRANT_URL: http://qdrant:6333
      MEMLOG_VOYAGE_API_KEY: your-voyage-api-key
      MEMLOG_EMBEDDING_MODEL: voyage-3-lite
      # ... other vars

  qdrant:
    image: qdrant/qdrant:latest
    volumes:
      - ./qdrant:/qdrant/storage

Get an API key at voyageai.com.

Option 2: Ollama (local)

Ollama runs models locally. Heavier on CPU; no API key needed.

MEMLOG_QDRANT_URL: http://qdrant:6333
MEMLOG_OLLAMA_URL: http://ollama:11434
MEMLOG_EMBEDDING_MODEL: nomic-embed-text

Add both Qdrant and Ollama to your compose file:

services:
  memlog:
    image: ghcr.io/prysmakou/memlog:latest
    environment:
      MEMLOG_PATH: /data
      MEMLOG_QDRANT_URL: http://qdrant:6333
      MEMLOG_OLLAMA_URL: http://ollama:11434
      MEMLOG_EMBEDDING_MODEL: nomic-embed-text
      # ... other vars

  qdrant:
    image: qdrant/qdrant:latest
    volumes:
      - ./qdrant:/qdrant/storage

  ollama:
    image: ollama/ollama:latest
    volumes:
      - ./ollama:/root/.ollama

Pull the embedding model before first use:

docker exec ollama ollama pull nomic-embed-text

Startup checks and fallback

At startup, Memlog checks that both Qdrant and the embedding provider (Voyage AI or Ollama) are reachable. If either check fails, semantic search is disabled with a log warning — the app continues to work normally with full-text search only. This means a misconfigured or unreachable dependency does not prevent the app from starting.

WARNING  Semantic search disabled: cannot reach Qdrant (...)

Switching embedding models

If you change from one provider to another (e.g., Ollama → Voyage AI), the vector dimensions may differ. Memlog detects this automatically at startup and recreates the Qdrant collection, re-embedding all notes on the next search.

Index management

Notes are embedded on first search and kept in sync automatically. Each search triggers a sync pass that:

  • Embeds new or modified notes (detected by file modification time)
  • Removes deleted notes from the index

To force a full re-index, delete the Qdrant collection or recreate the Qdrant volume.