Self-hosted service
Rabithua/Rote avatar
Rabithua/Rote

Rote: a self-hosted notes backend where AI is off until an admin turns it on

A personal note repository that looks different🤔

1,037 stars69 forksTypeScriptMIT

At a glance

What is it?
Rote is a TypeScript note repository you deploy yourself with Docker Compose, built around an open API, an optional iOS client, and a Memory feature that indexes your notes for AI chat only after an administrator explicitly enables it. The interesting part is the default: nothing AI-related runs until someone with admin rights configures a provider and switches it on.
Who is it for?
Adopt Rote if you want your notes in a PostgreSQL database you control, you are comfortable running Docker Compose and a reverse proxy, and you want an HTTP API as the primary integration surface rather than a plugin ecosystem. Do not adopt it if you need real-time collaborative editing, an offline-first desktop client, or a migration path that does not involve running a database.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository received new commits within the last day.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 15, 2026, and from our analysis. They are not legal advice.

DEEP OPEN-SOURCE ANALYSIS

The problem Rote solves is data custody, not note-taking

Most note apps ask you to trust someone else's server with years of writing. Rote's README frames the pitch directly: self-hosted deployment, free data export, and the phrase "no data hostage." That is a custody argument, not a features argument. The target user is someone who already runs a VPS or a homelab, is willing to own a PostgreSQL instance, and wants a note store that other tools can read and write over HTTP. The README also lists an iOS client and a hosted demo, so the project is not purely a backend exercise. But the deployment story is the center of gravity. If you would rather not think about databases, this is the wrong project and the rest of this article will not change that.

Separated frontend and backend, with PostgreSQL underneath

The repository topics name the stack: bun, hono, drizzle, postgresql, react, docker. The README describes a "separated architecture" where frontend and backend are distinct services and you "deploy only the services you need." Drizzle is the ORM layer over PostgreSQL. The default database image is pgvector/pgvector:pg17-trixie, which the README says behaves like PostgreSQL 17 and adds the optional vector extension. That detail matters because it means the AI feature is not bolted on as a separate service. Vectors live in the same database as your notes. The README warns that plain postgres:17 is "a temporary compatibility path" and "may not be supported by future Rote versions." Treat that as a migration deadline, not a footnote. The data flow for Memory, as described, is: notes and articles get indexed into vector storage, semantic search runs against that storage, and chat responses stream back with source references. The README states that AI conversations stay in the browser session and are not persisted to the database, so the transcript is not part of your data set.

Getting it running: two environment variables and one command

The README gives two deployment paths. The Docker Hub path is the concrete one. Copy docker-compose.yml to a server with Docker and Docker Compose, then create a .env file beside it. The README's own example sets VITE_API_BASE to http://YOUR_SERVER_IP:18000 and POSTGRES_PASSWORD to a placeholder. Then docker compose up -d. The web UI listens on port 18001, and the first visit walks you through a setup page that creates the administrator account. Two constraints in the README are worth repeating. First, POSTGRES_PASSWORD must be URL-safe: avoid @ : / # %. Second, once the database volume is initialized, the password must not change. Both are the kind of thing you discover by breaking a working deployment. Optional keys include IMAGE_TAG (v1.0.0, develop, or latest) and POSTGRES_IMAGE for a non-pgvector database. The second path is Dokploy, which the README calls recommended and which deploys from a template. If you use a reverse proxy, VITE_API_BASE must point at the backend address as seen through that proxy, which is the single most common misconfiguration implied by the README's own note.

Memory is opt-in at three separate levels

This is the design choice that separates Rote from tools that turn on indexing by default. The README states that AI, vector storage, automatic indexing, and public semantic discovery are all disabled by default and must be explicitly enabled by an administrator. Beyond the global switch, access is gated by an ai.chat permission that admins grant by role or per user. And indexing is scoped: notes and articles are indexed only for users who hold that permission, and only when vector storage and automatic indexing are enabled. So a self-hosted instance with no AI configuration sends nothing to any provider and indexes nothing. The provider list is OpenAI-compatible: OpenAI, OpenRouter, Ollama and LM Studio, DeepSeek, SiliconFlow, DashScope and Qwen, Zhipu GLM, Moonshot and Kimi, Volcengine Ark, Tencent Hunyuan, Baidu Qianfan, plus custom endpoints. The README also points to a Chinese-language guide for running Gemma on the user's own machine so model requests never pass through the Rote server. That combination is a coherent privacy posture: local models are a supported configuration, not a workaround.

The Memory feature is not in the stable image yet

Read the README carefully and a versioning gap appears. Memory "is available in the develop image and will be available in stable images after the next release that includes Memory." The AI Vector Migration guide is listed as Chinese-only. So if you pull latest today and expect AI chat, the README suggests you may not get it. You would need IMAGE_TAG=develop, which also means running unreleased code against your notes database. That is a real trade-off: the feature most likely to draw new users is the one the README places behind a non-stable tag. There is also a migration cost for existing self-hosted instances, since moving to Memory and pgvector support requires upgrading the database, and the guide for that is not in English. None of this is a defect exactly. It is a project that shipped the infrastructure before the feature, and the documentation says so plainly.

Where Rote is the wrong tool

Rote is not a collaborative editor. Nothing in the README mentions multi-user editing, presence, or conflict resolution, and the permission model described is about AI access, not document sharing. If two people need to edit the same note simultaneously, look elsewhere. It is also not offline-first. The architecture is a browser frontend talking to a backend you host, so a network path to your server is assumed. The iOS app can point at your self-hosted backend by tapping the welcome text on the login page and setting API Base, but that is a client for a reachable server, not a local store that syncs later. And the operational surface is not small: PostgreSQL, a reverse proxy, a password that cannot change after volume initialization, and a database image you may need to migrate. Someone who wants a note app, not a service to operate, will spend more time on Docker than on writing.

How Rote differs from file-based note tools

The obvious comparison is Obsidian, which stores notes as Markdown files in a folder you own. Rote stores them in PostgreSQL and exposes them over an HTTP API with API keys, documented in doc/userguide/API-ENDPOINTS.md and doc/userguide/API-KEY-GUIDE.md. The difference in approach is where the data lives and how you reach it. With Obsidian, any text editor, git, or rsync can touch your notes, and there is no server to keep alive. With Rote, integration happens through HTTP, which is better for programmatic access from scripts and mobile clients and worse for anyone who wants to grep a directory. Rote also carries a server-side AI indexing layer that a local-files tool would implement differently or not at all. Choosing between them is choosing between a database you administer and a folder you sync. The README's own emphasis on export suggests the project understands that this is the question users will ask.

Licence, upgrades, and what maintenance actually costs

The licence is MIT, which permits commercial use, modification, and redistribution with the copyright notice preserved. That is permissive, and it means nothing here restricts how you run Rote internally. It does not, however, obligate anyone to maintain your deployment. The maintenance burden falls on you: watching release tags, deciding when to move from latest to a pinned version, and handling the pgvector migration the README flags as a future requirement. The release cadence visible in the material is fast, with v2.3.0, v2.4.0, and v2.4.1 all dated within about two days of each other. Frequent small releases are convenient for fixes and awkward for operators who want long stable windows. Pinning IMAGE_TAG to a specific version is the practical response, and it is a supported configuration the README documents. The open question is how the project handles the postgres:17 deprecation it announces, since every self-hosted instance running that compatibility path will eventually need to move.

Editorial conclusion

Adopt Rote if you want your notes in a PostgreSQL database you control, you are comfortable running Docker Compose and a reverse proxy, and you want an HTTP API as the primary integration surface rather than a plugin ecosystem. Do not adopt it if you need real-time collaborative editing, an offline-first desktop client, or a migration path that does not involve running a database. Before committing, verify three things on your own server: that your reverse proxy passes the backend address correctly through VITE_API_BASE, that your POSTGRES_PASSWORD survives the first database volume initialization, and whether your image tag actually contains Memory, since the README states it ships in develop and only reaches stable images after the next release.

Official sources

  1. License: MIT
  2. Project website
  3. Rabithua/Rote on GitHub
  4. README
  5. Releases
Community notes

Community notes