Your notes, on your server.

One container, one folder of Markdown files, your own model key. The server is the sync: open the same vault from any browser through the mino.ink relay or your own tunnel, without paying for a sync service or parking the folder in someone else's cloud.

Docker / PortainerPlain .md filesRelay tunnelNo open port needed

Plain files, with an index that rebuilds

The vault is a directory of Markdown files with YAML front matter, the same shape Obsidian uses, plus a SQLite index that exists purely to make search and link lookups fast. Delete the index and it rebuilds from the files; that asymmetry is deliberate. The files are the truth, the index is a convenience.

This is what makes a self-hosted notes app worth running: you can audit it with grep, sync it with rsync, version it with Git, and hand it to any editor that reads Markdown. No migration tool required, because there is nothing proprietary to migrate away from.

Up in one stack

The reference deployment is a compose file. Paste it into Portainer or run it with docker compose up -d, and the server bootstraps itself: first start generates the server ID, the admin API key and the pairing links, printed in the container log.

services:
  mino:
    image: ghcr.io/tomszenessy/mino-server:main
    restart: unless-stopped
    ports:
      - "127.0.0.1:3000:3000"
    volumes:
      - mino-data:/data
    environment:
      - MINO_DATA_DIR=/data
      - MINO_CONNECTION_MODE=relay
      - MINO_RELAY_URL=https://relay.mino.ink

volumes:
  mino-data:

The port is bound to 127.0.0.1 on purpose. In the default relay mode you do not need to publish the server at all: it keeps an outbound connection to the relay, and clients reach it through a pairing code. If you would rather expose it directly, switch to open-port mode and point the bind at 0.0.0.0 behind your own reverse proxy and TLS.

The same API the UI uses

Every note operation the interface performs is available over the HTTP API with an X-Mino-Key header: search, read, create, move, tree. An MCP bridge in the repository exposes the same operations to MCP clients, so an external agent can work in the same vault without scraping the UI.

The API is documented route by route, including the auth flow and the health endpoint, so wiring a script or a channel bot into it does not require reading the server source.

The honest cost of self-hosting

Running your own server is not free, and it is not zero-effort:

  • You own updates, backups and disk space. The volume is small, but unattended servers rot.
  • You need a model API key for the agent to do anything. Without one, Mino is a fast Markdown vault with search — which is still useful, just not the pitch.
  • You are the sysadmin when something breaks. The docs and the relay exist to keep that boring, not to make it disappear.

If that trade sounds wrong, the list is still there: one email when Mino launches, and you can decide then.

Get one email when Mino launches

The compose file, the walkthrough and the code are public today. The list is a launch announcement, nothing else.

One email when Mino launches, plus the confirmation for joining. Nothing else, and one click removes you.

Self-hosting questions

Do I need Docker to run Mino?

A container is the supported path and the one the docs walk through, because the server keeps a SQLite index next to the data volume. Running from source with Bun works too, but you maintain the runtime yourself.

Does the server phone home?

In the default relay mode the server keeps an outbound connection to relay.mino.ink, so a client reaches it without a port being opened. That connection is encrypted and the notes stay in your vault. Open-port mode skips the relay and listens behind your own proxy and TLS.

How do I back it up?

Copy the data volume. Notes are Markdown files and attachments inside it, with a rebuildable SQLite index alongside; there is no opaque database to dump and no export step to remember.

What happens to my notes if Mino stops being developed?

Nothing. They are .md files in a folder you control, readable by any editor, clipper or script. That is the entire point of choosing Markdown over a proprietary document store.