The open-source workspace for people and AI agents. Docs, databases and realtime collaboration with an MCP server in the same binary, so agents work in the same workspace on the same permissions. One Go binary, one SQLite file, self-hosted. https://salt.md
  • Go 49.6%
  • TypeScript 33.3%
  • CSS 8.8%
  • JavaScript 7.6%
  • HTML 0.3%
  • Other 0.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Jeremia fbf5d79ca1
Language and time: automatic entries read flat, the wiki names 1.1.7
The dialog showed brackets inside brackets, Automatic (English (United
Kingdom)), and half-width ones in Chinese. All five entries read
"Automatic · value" now, and the name of a regional format comes from the
browser in one piece, so it carries the brackets of its own language. The short
form, because Chrome and Node disagree on the long name of Hong Kong and the
check has to hold in both.

The wiki's release examples name 1.1.7.

Fixes #131.
2026-11-06 15:00:31 +01:00
.github @Asuka109 has signed the CLA in saltmd/salt.md#124 2026-11-04 09:36:32 +00:00
deploy Document rootless Podman deployment and add a Quadlet service 2026-10-10 15:10:26 +02:00
desktop salt.md 2026-08-08 16:51:05 +02:00
docs Add Traditional Chinese support with machine-marked translations 2026-11-06 21:22:31 +08:00
scripts Take Excalidraw out again 2026-08-11 10:55:01 +02:00
server OAuth: a renewal that overlaps another one no longer ends the connection 2026-11-06 10:11:03 +01:00
web Language and time: automatic entries read flat, the wiki names 1.1.7 2026-11-06 15:00:31 +01:00
wiki Language and time: automatic entries read flat, the wiki names 1.1.7 2026-11-06 15:00:31 +01:00
.dockerignore Ignore node_modules and build artifacts in docker build 2026-10-29 13:08:58 +01:00
.gitignore A stray node_modules link is out of the repository 2026-10-23 10:08:18 +02:00
CLA.md Take out the em dash where it was only rhythm 2026-08-08 18:07:56 +02:00
CONTRIBUTING.md Take out the em dash where it was only rhythm 2026-08-08 18:07:56 +02:00
docker-compose.yml salt.md 2026-08-08 16:51:05 +02:00
Dockerfile Builds on Go 1.27.2 and Node 22, and the lockfile drops 23 advisories 2026-10-18 16:58:23 +02:00
go.mod Builds on Go 1.27.2 and Node 22, and the lockfile drops 23 advisories 2026-10-18 16:58:23 +02:00
go.sum salt.md 2026-08-08 16:51:05 +02:00
install.sh Install a service on a Linux server instead of holding the terminal 2026-08-09 00:45:46 +02:00
LICENSE salt.md 2026-08-08 16:51:05 +02:00
main.go salt backup says when files are missing from the archive (#109) 2026-10-29 13:23:10 +01:00
main_test.go Reject unknown CLI commands instead of starting the server 2026-10-10 15:38:26 +02:00
Makefile salt.md 2026-08-08 16:51:05 +02:00
README.md A README that looks like the product 2026-10-05 19:01:39 +02:00
SECURITY.md Take out the em dash where it was only rhythm 2026-08-08 18:07:56 +02:00
THIRD-PARTY-NOTICES.md Follow-ups to #123: a printed comment carries its passage 2026-11-05 07:47:21 +01:00

salt.md: One workspace. People and agents.

Docs, databases and realtime editing for your team. The same workspace is open to Claude, ChatGPT and Cursor, on exactly the access you grant them.
One binary, on your own server.

Website · Live demo · Documentation · Quickstart


A Tasks board in salt.md, cut in two: light mode on the left, dark mode on the right.

Quickstart

curl -fsSL https://raw.githubusercontent.com/saltmd/salt.md/main/install.sh | sh

One command downloads the binary for your platform, installs it, starts it and prints the address to open. On a Linux server it sets itself up as a systemd service, and running it again upgrades it. No curl on the machine? wget -qO- … | sh does the same.

Or with Docker:

docker run -d -p 8420:8420 -v salt-data:/data ghcr.io/saltmd/salt.md:latest

There is nothing else to install: no database server, no cache, no object store. Reverse proxies, TLS and backups are in the self-hosting guide.

People and agents in the same place

An agent is asked to organise the launch notes. A page appears, a database is created, the rows fill in. A person opens the same board a second later and carries on. Same pages, same permissions, same history.

Connect Claude, ChatGPT, Codex, Cursor, Gemini CLI or any other MCP client to /mcp and it works on the workspace you use:

  • Pages: create, edit, move, duplicate, trash and restore
  • Databases: create them, change the schema, add and query rows, set up views
  • Search with the same permission checks a person gets
  • Bulk imports from any JSON source, without the content passing through the agent
  • Comments, and an append-only note trail on every page
  • Presence: the page shows which agent is working on it, before you start typing

And a list it cannot touch. No agent can create or delete accounts, issue tokens, take or restore a backup, change instance settings or decide who is in a workspace, and the server tells every agent that connects. A credential carries its person's access and never more, every workspace decides what agents may do there, and the activity log keeps their changes apart from yours.

MCP tools · Agent access · Permissions

A whole workspace

A page in the block editor.

Write. A block editor with a slash menu, checklists, code, tables, callouts and diagrams. Page links, backlinks, covers and icons.

A collection as a table with typed columns.

Organise. Any page becomes a collection with typed properties: select, date, person, relation, rollup, formula and more.

The same collection as a month calendar.

Plan. Table, board, list, gallery, calendar, timeline or form, each with its own filters. Any date can be an iCal feed.

The search dialog with passage results.

Find. Full-text search over every page and the text inside uploaded PDFs, one shortcut away from anywhere.

A page with the comments panel open.

Together. Realtime editing with live cursors, comments, page history and an activity log.

The library showing pages as a graph of linked dots.

Connect. The library holds every page you can open, and the graph shows what links where.

Moving in? Markdown files, CSVs and a Notion export import from the same menu.

Under the hood

flowchart LR
    people(["People<br>browser · desktop · phone"]) --> salt
    agents(["Agents<br>Claude · ChatGPT · Cursor"]) -- MCP --> salt
    tools(["Your tools"]) -- "REST · webhooks · iCal" --> salt
    salt["salt.md<br>one Go binary"] --> data[("SQLite file<br>+ uploads")]

One Go process, built with CGO_ENABLED=0: a static binary with a pure-Go SQLite driver and the frontend embedded. No PostgreSQL, no Redis, no object store, no separate collaboration server.

  • Install: one binary, install.sh, or the Docker image
  • Data: one SQLite file plus an uploads directory
  • Update: swap the binary or pull the image, restart
  • Backup: stop, copy two paths, start
  • Platforms: Linux and macOS on amd64 and arm64, Windows on amd64

The desktop app for macOS and Linux is a window onto a server you run, not a second copy of the product.

Documentation

salt.md/wiki covers every screen, every property type, every tool an agent can call and every setting on the server. It is written next to this code and checked against it on every build: a tool name that no longer exists, an API path that is not a route or a screenshot whose screen has changed fails the build. Every page is also plain Markdown at the same address with .md on the end, indexed for agents at /wiki/llms.txt.

Contributing

Issues and pull requests are welcome. Pull requests need a signed CLA; CONTRIBUTING.md says what that means and why it exists. Security reports go to dev@salt.md, not to a public issue: see SECURITY.md.

License

AGPL-3.0. Use it, run it at work, change it. If you offer it to others over a network, publish your changes.

The components salt.md is built on, with their licences in full, are in THIRD-PARTY-NOTICES.md. A running instance serves the same list at /licenses.