itsnotes is a free, open source note taking & knowledge management project written in JavaScript and released under MIT. It has 32 GitHub stars, 3 forks and 0 open issues, and was last pushed 13 days ago. On this registry it ranks #25 of 25 tracked projects in Note Taking & Knowledge Management, with 5 head-to-head comparisons available. It gained 1 stars over the last 6 tracked days.

What is itsnotes?

itsnotes is a self-hosted, MIT-licensed Google Keep replacement — built with React, Node.js, PostgreSQL and Socket.io — for people who like the sticky-note masonry layout but need better navigation and organization, and who want their notes to stay on their own hardware.

What it is

itsnotes is a note-taking application that keeps the familiar Google Keep aesthetic while replacing the parts that break down at scale. Notes still appear as colored cards in a masonry grid, but the feed is broken up by month markers, and quick-access panels give shortcuts to colors, tags, saved searches and a calendar, so a large collection does not decay into an endless wall of text. The project lives in the self-hosted note-taking ecosystem and is written in JavaScript, with a React frontend and a Node.js server backed by PostgreSQL, using Socket.io for live updates.

The concrete problem it solves is organization and exit. Google Keep offers no self-hosting, no folders, no proper list view and no real portability beyond Google Takeout. itsnotes replaces that with basic folders, internal note linking, renameable color labels and three view modes — masonry grid, stacked view and a dense list view — plus native import from a Google Takeout .zip and bulk upload of .txt and .md files.

Key capabilities

  • Markdown mirror: two-way sync between notes and a folder of .md files. Every note is written out with a metadata header covering tags, color, reminders and pin/archive/trash state, with images and attachments alongside; edits made in Obsidian or VS Code are pulled back, automatically if wanted.
  • Conflict and rename safety in the mirror: the database stays the source of truth, conflicting edits are kept in a conflicts/ folder, and renames are tracked by note ID so notes are never duplicated.
  • Timeline navigation: month markers break up the feed, alongside quick-access panels for colors, tags, saved searches and a calendar.
  • Three view modes: masonry grid, stacked view and dense list view.
  • Native import: Google Takeout .zip for Keep data, or bulk .txt and .md upload.
  • Note history for revisions, plus automatic metadata fetching for books and movies.
  • Optional AI hooks for auto-tagging and reminder parsing, and a built-in MCP server so external AI clients can query the database.

Who uses it and how

  • Self-hosters leaving Google Keep who want existing notes migrated rather than re-typed, using the Takeout .zip import.
  • Obsidian users who want a visual sticky-note front end over the same material, pointing the mirror at a folder for grep, git or backups.
  • Households and small teams running the three-container stack of client, server and PostgreSQL behind a reverse proxy.
  • Users who must share a domain with other apps, by setting BASE_PATH on the client container and putting a prefix-stripping proxy in front.
  • Anyone wanting HTTPS on a domain without manual certificate work, using docker-compose.caddy.example.yml with a Caddyfile.

Getting started

Deploy with Docker Compose: save the provided docker-compose.yml, which defines itsnotes-db (postgres:17-alpine), itsnotes-server and itsnotes-client from the ghcr.io/alexmicuplusfour/itsnotes-* images, change the database password, and run docker compose up -d. The app serves on port 80, and a hosted demo runs at https://try.itsnotes.app.

How it compares

Among the tools named in its own facts, itsnotes sits between Google Keep and Obsidian: it replaces Keep, which offers no self-hosting and no folders, while mirroring plain Markdown files two-way instead of competing with Obsidian as an editor. It is the option for someone who wants Keep's visual card layout, more organizing structure, and ownership of the underlying database.

When to use it — and when not to

A self-hoster must operate PostgreSQL 17, persistent volumes for uploads and backups, and a reverse proxy (Caddy if HTTPS is wanted), with a Chromium path supplied through PUPPETEER_EXECUTABLE_PATH for the server image and an MD_MIRROR_PATH mount if the mirror is enabled. The project is small at 32 stars and 3 forks and carries the vibecoded topic, so anyone who needs a large community, commercial support or a formal audit trail should look elsewhere. It is also a poor fit for someone who wants no container maintenance at all.

project readme (upstream, from github) — read inline

itsnotes

A self-hosted Google Keep alternative. It sticks to the familiar masonry layout but overhauls how you actually navigate and organize a large amount of notes.

Instead of an endless wall of text, the feed is broken down by month markers. There are quick-search panels for colors and tags, a basic folder implementation, and a proper list view. It also handles data import natively, so moving off Keep or importing text files is straightforward.

Try the demo →

itsnotes badge

Features:

  • Better navigation: The timeline has month markers to break up the list. There are quick-access panels for colors, tags, saved searches, and a calendar.
  • More ways to organize: Basic folders, internal note linking, and the ability to rename color labels to whatever makes sense to you.
  • View modes: The standard masonry grid, a stacked view, and a proper dense list view.
  • Customization: A heavy settings modal to tweak layouts, page backgrounds, and form behaviors.
  • Easy imports: Drop in a Google Takeout .zip to import Keep data, or bulk upload .txt and .md files directly.
  • Markdown mirror: Two-way sync between your notes and a folder of .md files. Every note is continuously written out with a metadata header (tags, color, reminders, pin/archive/trash state) and images/attachments alongside, and edits you make to the files in any editor (Obsidian, VS Code) are pulled back into your notes — automatically if you want. The database stays the source of truth: conflicting edits are kept safe in a conflicts/ folder and renames are tracked by note ID, never duplicated. Great for backups, grep, git, or living in Obsidian.
  • Quality of life: Built-in note history for revisions, plus automatic metadata fetching for books and movies.
  • Optional AI stuff: Hooks for auto-tagging and reminder parsing, plus a built-in MCP server so external AI clients can query your database.

Built with React, Node.js, PostgreSQL, and Socket.io.

grid-dark

On mobile

Docker Setup

Save this as docker-compose.yml:

name: itsnotes

services:
  itsnotes-db:
    image: postgres:17-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: itsnotesuser
      POSTGRES_PASSWORD: change-this-password
      POSTGRES_DB: itsnotes
    volumes:
      - postgres_data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"]
      interval: 10s
      timeout: 5s
      retries: 5

  itsnotes-server:
    image: ghcr.io/alexmicuplusfour/itsnotes-server:latest
    restart: unless-stopped
    depends_on:
      itsnotes-db:
        condition: service_healthy
    environment:
      NODE_ENV: production
      PORT: 5000
      DB_HOST: itsnotes-db
      DB_PORT: 5432
      DB_USER: itsnotesuser
      DB_PASSWORD: change-this-password
      DB_NAME: itsnotes
      PUPPETEER_EXECUTABLE_PATH: /usr/bin/chromium-browser
      BACKUP_PATH: /app/backups
      # Markdown Mirror target — exported .md files appear in ./notes-mirror on the host
      MD_MIRROR_PATH: /data/notes-mirror
    volumes:
      - attachments_data:/app/uploads
      - backups_data:/app/backups
      # Browsable folder for the Markdown Mirror feature (turn it on in Settings)
      - ./notes-mirror:/data/notes-mirror

  itsnotes-client:
    image: ghcr.io/alexmicuplusfour/itsnotes-client:latest
    restart: unless-stopped
    depends_on:
      - itsnotes-server
    ports:
      - "80:80"

volumes:
  postgres_data:
  attachments_data:
  backups_data:

Change the database password (and set any optional values — see .env.example), then start it:

docker compose up -d

The app will be available on port 80.

With Caddy (HTTPS + domain)

For automatic HTTPS, use docker-compose.caddy.example.yml instead — it adds a Caddy service. You'll also need a Caddyfile (Caddyfile.example) with your domain. Then docker compose up -d; Caddy handles SSL certificates automatically.

Serving under a subpath

itsnotes can share a domain with other apps by living under a path prefix, e.g. https://example.com/itsnotes. Set BASE_PATH on the client container and put a reverse proxy in front that strips the prefix before forwarding. The normal published image is used — changing BASE_PATH only needs a restart, not a rebuild. Leave BASE_PATH unset to serve at the root as usual.

  itsnotes-client:
    image: ghcr.io/alexmicuplusfour/itsnotes-client:latest
    environment:
      BASE_PATH: /itsnotes

With Caddy, handle_path strips the prefix:

example.com {
    redir /itsnotes /itsnotes/
    handle_path /itsnotes/* {
        reverse_proxy itsnotes-client:80
    }
}

For an existing Traefik installation, docker-compose.traefik.example.yml is a complete example using Traefik's Docker provider — edit the placeholder domain, path, and network at the top of the file.

Configuration

All configuration is via the environment: blocks in docker-compose.yml. See .env.example for the full list of available options.

Optional AI features (auto-tagging, OCR, summarization, reminder parsing) work with three providers, configured under Settings → AI:

  • OpenAI or Anthropic — needs an API key (OPENAI_API_KEY / ANTHROPIC_API_KEY, or just paste it in Settings).
  • Ollama — fully local, no API key, and note content never leaves your server.

Local AI with Ollama

Pick Ollama in Settings → AI, set the base URL, hit ↻ Refresh models, and assign a model per feature:

  • itsnotes in Docker, Ollama on the host: http://host.docker.internal:11434
  • Ollama as a compose service (commented-out block in docker-compose.example.yml): http://ollama:11434
  • Elsewhere on your network: http://:11434

OCR requires a model with vision support. Quality depends entirely on the models you run — and if summaries seem to ignore the end of long notes, raise Ollama's context window setting.

REST API

The same API the frontend uses is available to external scripts and apps. Log in with your credentials, call POST /api/auth/api-token to get a long-lived token, then pass it as a Bearer header on any request:

curl https://your-instance/api/notes/search?query=yr:2024 \
  -H "Authorization: Bearer <token>"

See docs/api.md for the full reference: endpoints, query params, search operators, and the note object schema.

Chatting with your notes (MCP)

There's a built-in MCP server that lets Claude (and other AI clients) search and read your notes. Turn it on under Settings → AI → MCP Server and generate a token. To connect, paste the URL into Claude's custom connector, or run the claude mcp add command it gives you for Claude Code.

It's off by default, read-only, and won't work without the token.

Importing from Obsidia

readme truncated — read the full docs on github

Frequently asked questions

Is itsnotes free to use?

itsnotes is open source under the MIT licence. There is no licence fee and no seat count — you can self-host it or, where the project offers one, pay a vendor for a managed version instead.

What does itsnotes do?

Self-hosted sticky notes with better organization

What is itsnotes written in?

itsnotes is primarily written in JavaScript. Its source is publicly available at https://github.com/alexmicuplusfour/itsnotes, and it has 32 GitHub stars.