The Problem

Read-later apps become graveyards. Saves pile into a list, the list becomes a backlog, and the backlog becomes guilt. Openmind addresses this by re-framing the problem: instead of managing a queue, it acts as a self-hosted commonplace book where the value comes from re-encountering saved items sideways—by color, fragment, or vibe—long after saving them.

What This Does

Openmind is a self-hosted, AI-optional read-later and knowledge management system. The core is a Go API (apps/api/) backed by Postgres and pgvector for hybrid full-text and semantic search. It handles capture, enrichment, feeds, and a "Drift" feature that resurfaced forgotten items for a daily ritual rather than a backlog.

The repo is a portfolio of four self-contained projects. Besides the Go API, there is a web frontend (apps/web/), a Tauri desktop app (apps/dock/), a browser extension (apps/extension/), and a mobile app (apps/mobile/). The README pitches the product as "Postgres + one Go binary" with docker compose up as the entire deployment, and AI calls going through a pluggable adapter (apps/api/internal/ai/) where the noop provider keeps the app fully functional.

How It Is Wired

Execution starts at main in apps/api/cmd/openmind/main.go, which reaches 150 functions. The Run function in apps/api/internal/enrich/pipeline.go is the workhorse, called from 55 places and reaching 136 functions. The shortest paths from entry to external effects are concrete: main -> run reads files via os.ReadFile; Run -> UpdateItemExtraction executes database queries; SearchItems -> ParseQuery calls a model via genai.Text. The API server logic is concentrated in apps/api/internal/api/server.go and gen.go, with NewServer called from 158 places—the widest blast radius in the codebase.

The most connected modules are apps/web/lib/api (39 modules depend on it, instability 0.03) and apps/web/lib/types (24 dependents, zero imports). The API is the hub: 150 functions read or write the database, 36 make outbound network calls, and 8 call models for inference. The wiring is not fully mapped for the web frontend's internal routing, but the Go API's control flow is well-defined.

How To Use It

  • Setup: Clone with git clone https://github.com/moses-y/open-mind, then use the Dockerfile (apps/api/Dockerfile) or docker compose up per the README.
  • Configuration: Copy .env.example to .env and set Postgres connection details and optional AI provider keys. The noop provider works with no configuration.
  • Running it: The Go binary starts via apps/api/cmd/openmind/main.go. The README documents docker compose up as the full deployment.

Real-World Use

A user saves a link via the browser extension. The API returns instantly (no AI in the save path). Background enrichment extracts the color palette and summary. Later, the user searches for "blue" and finds the item via pgvector semantic similarity. They pin it to the Desk, and the Drift feature surfaces it again days later for re-encountering.

Code Health & Issues

Static analysis found 32 findings (4 high, 28 medium). The high-severity items are:

  • High - Hub modules: apps/web/lib/api.ts and apps/web/lib/types.ts have 39 and 24 dependents respectively; churn here is high-blast-radius.
  • High - Duplicated code: 436 repeated 6-line blocks across 124 files, notably in apps/api/internal/ai/openai_test.go and apps/api/internal/enrich/pdf_test.go.
  • High - Oversized files: apps/api/internal/api/gen.go at 1502 lines and apps/dock/src/panel/Panel.tsx are hard to hold in one head.

SDLC observations: CI exists (GitHub Actions) but uses unpinned action tags (pnpm/action-setup@v4), no least-privilege token permissions declared, no Dependabot configured, and the Docker base image (golang:1.25-alpine) is a mutable tag. Tests and license are present.

The Bottom Line

Openmind is a well-architected self-hosted alternative to read-later apps, with a clean Go API separated from a pluggable AI layer. The codebase is a portfolio of four projects, not a monolith, and the Go API shows disciplined structure. The main risks are the hub modules and oversized files in the web app, plus CI hygiene gaps that are easily fixed. Suitable for developers who want a self-hosted, AI-optional knowledge base with a strong search and re-discovery model.