Posthouse
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Posthousecatch me up on the project, then log where I left off"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Posthouse
Shared, versioned memory for all your AI agents. Claude, ChatGPT, Gemini, Claude Code, Codex, Gemini CLI, Cursor and others can all read and write the same project. When you open a new conversation with any of them, it can catch up on the project with a single call.
A posthouse (驿站) was a relay station where a courier handed over the mail and a fresh rider carried it on. Here every agent hands over at the workspace, and the next one picks it up.

More screenshots: change history · OAuth sign-in page
Why
Web chat apps cannot mount a file share or log in to WebDAV, and each app keeps its own separate memory. Posthouse gives every project a workspace: a folder of plain files on your server. Agents reach it in three ways:
MCP: Claude, ChatGPT, Gemini and the CLI agents add it as a remote MCP connector. The server has its own OAuth login page, where you sign in with a password.
REST + Skill: agents that have a shell (Claude Cowork, Claude Code, Codex, …) use the bundled skill,
posthouse.py, orcurl.Admin UI: you browse, edit, upload, restore old versions and manage access in a browser.
Claude.ai ─┐ ┌──────────── Posthouse ─────────────┐
ChatGPT ──┤ MCP (OAuth) │ /mcp MCP server (Streamable HTTP) │
Gemini ──┤ ─────────────────▶ │ /oauth OAuth 2.1 (password sign-in page) │──▶ data/workspaces/<name>/
Claude Code┤ │ /api REST API (+ /api/docs) │ AGENTS.md STATUS.md
Codex ─────┤ REST / Skill │ / Admin UI │ DECISIONS.md journal/
you ───────┘ ─────────────────▶ │ git history · SQLite index · activity log │ memory/ files/ (.git)
└─────────────────────────────────────────────────┘Related MCP server: Nolane Habitat
Features
Plain files, full history. Each workspace is a directory on disk and its own git repository. Every change becomes a commit authored by the agent that made it, so you can view old versions, diff them and restore them. History is packed automatically every day to save disk space. Deleted workspaces go to a trash first.
One-call onboarding.
start_sessionreturns the project guide, the current status, recent decisions, the latest hand-off notes, the file list and recent changes.Hand-off protocol. Each workspace starts with
AGENTS.md,STATUS.md,DECISIONS.md,journal/,memory/andfiles/.log_progresswrites a dated hand-off note and can updateSTATUS.mdat the same time.Conversation auto-save (Claude Code). One command installs hooks that save the conversation to the workspace before and after every turn, with secrets redacted. See docs/skill.md.
Safe concurrent edits. Writes can be optimistic: they fail if the file changed since you read it. Exact-text
edit_fileandappend_fileavoid rewriting whole files.Works with today's MCP clients. The server speaks the stateless 2026-07-28 protocol (
server/discover, per-request_meta) and the olderinitialize-based revisions (2024-11-05 … 2025-11-25) on the same endpoint. It is tested with the official MCP Python SDK v1 and v2.Auth the web apps accept. A built-in OAuth 2.1 authorization server: discovery, dynamic client registration, client ID metadata documents, PKCE (S256) and rotating refresh tokens. CLIs and scripts can also use HTTP Basic, revocable access tokens, or a secret token URL.
Three password levels. An admin password, an agent password, and an optional password per workspace (see below).
Admin UI. Workspaces, file browser and editor, upload, history and restore, access tokens, connected apps (revoke OAuth grants), activity log, trash, connection instructions, and a Settings page (disk use, compact all workspaces, effective configuration). English by default, with a language dropdown (English, 简体中文). See Translations to add more languages.
Easy to run. One Python process with SQLite and no external services. Run it with Docker, with optional automatic HTTPS through Caddy, or directly on any Linux server.
Quick start
With Docker (recommended)
git clone https://github.com/conscienceli/posthouse.git
cd posthouse
# Pick the line that matches your server (Claude/ChatGPT/Gemini on the web need public HTTPS):
./scripts/docker-start.sh --domain posthouse.example.com # ports 80/443 free: built-in HTTPS
./scripts/docker-start.sh --behind-proxy https://posthouse.example.com # nginx or Cloudflare already in front
./scripts/docker-start.sh --behind-proxy https://posthouse.example.com --tunnel-token <TOKEN> # Cloudflare Tunnel
./scripts/docker-start.sh # plain HTTP on :8080 for testingThe script creates .env with random admin and agent passwords, builds the image, starts the
container and prints the URLs and passwords. Other commands: logs, status, restart,
stop, update and passwords. Data lives in ./data. Step-by-step guides for an existing nginx
and for Cloudflare (Tunnel, Full (strict), Flexible) are in docs/deploy.md.
Without Docker
./scripts/install.sh # Python venv + dependencies + .env
./scripts/run.sh # run in the foreground
sudo ./scripts/install.sh --systemd --behind-proxy https://posthouse.example.com # systemd service behind nginxRequirements: Linux, Python 3.10+, and git (optional; it powers history). nginx examples:
deploy/nginx.conf.example and
deploy/nginx-cloudflare.conf.example.
Web apps need public HTTPS. Claude, ChatGPT and Gemini connect from their own cloud, so the server must be reachable at
https://…on port 443. See docs/deploy.md, which also has notes for servers in mainland China.
Access levels
Level | Credential | Can do |
Admin |
| Everything: admin UI, delete/rename workspaces, set passwords, tokens, revoke apps |
Agent |
| List and create workspaces; read/write files in all workspaces |
Workspace | that workspace's own password (optional) | Read/write files in that workspace only |
Ways to present a credential:
OAuth sign-in page. Web apps and most MCP clients open this page; you type a password there. Leave Workspace empty to grant the password's full level, or enter a workspace name to limit that connection to one workspace (this works with the admin or agent password too).
HTTP Basic. User
agent,adminor a workspace name, plus the password (for the skill, curl, CLI agents and Claude request headers).Access tokens (
ph_…). Created in the UI asAuthorization: Bearer ph_…, or as a secret URLhttps://…/mcp/t/ph_…for apps that only accept a URL. They are revocable and can be limited to one workspace.
Connect your agents
Your MCP URL is https://<your-domain>/mcp. The Connect agents page in the admin UI shows it
with copy buttons.
Agent | How to connect |
Claude (web, desktop, mobile, Cowork) | Settings → Connectors → Add custom connector → paste the URL → sign in with a password |
ChatGPT (web) | Settings → Security → enable Developer mode, then Apps/Plugins → + → paste the URL → OAuth → password. Select the app in each new chat. Requires a paid plan; write support depends on the plan (beta). |
Gemini (web) | Settings → Connected apps → Add a custom app (currently US-only, personal accounts) |
Claude Code |
|
Codex CLI |
|
Gemini CLI |
|
Anything with a shell | The skill / |
Apps that only take a URL | Create a token in the UI and use |
Step-by-step guides and troubleshooting are in docs/mcp.md. A good first message in a new chat:
You can use the "Posthouse" connector. Our project lives in the workspace "my-project". First call start_session(workspace="my-project") and read AGENTS.md and STATUS.md. Keep STATUS.md current and call log_progress before you stop.
MCP tools
Tool | Purpose |
| Workspaces you can access |
| New workspace with the standard layout (agent/admin) |
| Load guide, status, decisions, journal, file list, recent changes |
| Browse and read (with |
| Write (optionally with |
| Rename/move and delete (recoverable from history) |
| Full-text search; fetch by id (shape compatible with ChatGPT deep research) |
| Hand-off note in |
| Who changed what and when |
Skill and CLI
skills/posthouse holds a ready-made agent skill:
SKILL.md and scripts/posthouse.py, a CLI that uses only the
Python standard library.
export POSTHOUSE_URL=https://posthouse.example.com POSTHOUSE_USER=agent POSTHOUSE_PASSWORD=… POSTHOUSE_AGENT="Claude Code"
python3 posthouse.py start my-project
python3 posthouse.py read my-project STATUS.md
python3 posthouse.py log my-project --summary "Drafted section 2" --next "Review section 3"The quickest way to start a new Cowork or Claude Code task on a workspace: click Setup message on the workspace in the admin UI and paste the copied message into the task. It contains the server address and a new token for that workspace only; Claude installs the skill from your server, signs in and turns on conversation auto-save.
To do the same by hand (before and after each turn, secrets redacted):
python3 posthouse.py login --url https://posthouse.example.com --token ph_…
python3 posthouse.py install-hooks --workspace my-project./scripts/package-skill.sh builds dist/posthouse-skill.zip for upload to Claude.
To use the skill with Claude, Claude Code, Codex and Gemini CLI, see docs/skill.md.
REST API
Everything the UI and the skill do goes through /api. Interactive docs are at /api/docs, and a
summary is in docs/api.md. Curl-friendly raw endpoints:
curl -u agent:$PW https://posthouse.example.com/api/workspaces/my-project/raw/STATUS.md
curl -u agent:$PW -X PUT --data-binary @STATUS.md -H "If-Match: <version>" \
https://posthouse.example.com/api/workspaces/my-project/raw/STATUS.mdConfiguration
All settings come from environment variables or .env. See .env.example.
Variable | Default | Meaning |
| generated | Admin password (saved to |
| empty (disabled) | Agent password |
| from request | Public base URL, e.g. |
|
| Workspaces, trash and the SQLite database |
|
| Listen address (bare metal) |
| empty | Enables the bundled Caddy HTTPS profile (Docker) |
|
| Published port and bind address (Docker) |
|
| Maximum file size |
|
| Version every change with git |
|
| Compact each workspace's change history this often ( |
|
| OAuth access token lifetime (seconds) |
|
| OAuth refresh token lifetime (days, rotated on use) |
|
| Admin UI session lifetime |
|
| Password rate limit per client IP |
|
| Proxies allowed to set |
Security notes
Always serve it over HTTPS. Use long random passwords; the start scripts generate them.
Give agents the agent password, a workspace password, or a token, never the admin password. Revoke OAuth connections and tokens you no longer use in the UI.
Content written by one agent is read by others. The bundled instructions tell agents to treat file contents as data, not instructions. Git history lets you undo anything.
Failed password attempts are rate-limited per IP. The admin UI uses
HttpOnly/SameSite=Strictcookies plus a CSRF header. Files are never served as active HTML.You can optionally restrict access at your firewall to the platforms' published egress ranges (see docs/deploy.md). Back up the
data/directory.
Translations
UI strings live in posthouse/static/i18n/. To add a language, copy en.json to
<code>.json (for example ja.json or fr.json), translate the values, and add
{"code": "<code>", "name": "<native name>"} to languages.json. The admin UI dropdown and the
OAuth sign-in page (chosen from the browser's Accept-Language) use these files. Any missing keys
fall back to English.
Development
pip install -r requirements-dev.txt
pytest # unit + integration tests (REST, MCP, OAuth, CLI)
python -m posthouse --port 8080 # reads .env if presentCode layout: posthouse/storage.py (workspaces, files, git), posthouse/auth.py (passwords, tokens),
posthouse/oauth.py (authorization server), posthouse/mcp_server.py (MCP), posthouse/api.py (REST),
posthouse/static/ (admin UI, no build step).
License
This server cannot be deployed
Maintenance
Related MCP Connectors
Team memory for AI coding agents and code reviews, reviewed by humans and served over MCP.
Project management shared by people and AI agents, with persistent project state through MCP.
Agent-native notes, tasks, dev-docs, vaults, sync & handoffs. MCP + OpenAPI dual surface.
- WitWikiOAuthapp.witwiki
A shared team wiki your coding agents read and write — across every repo and every MCP client.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceCentralized multi-project state & handoff MCP server that lets AI agents save checkpoints in one session and resume in another with minimal token overhead, including git snapshots and code-graph integration.-

Nolane Habitatofficial
FlicenseNot gradedqualityBmaintenanceProvides coding agents with a durable, revision-aware project workspace for semantic context, governed source changes, verification, task checkpoints, and observability through an MCP interface.1-- AlicenseAqualityAmaintenanceEnables AI coding agents to share a persistent, git-backed team memory, automatically committing and syncing decisions, solutions, gotchas, statuses, and handoffs across projects and MCP clients.301MIT
- AlicenseNot gradedqualityAmaintenanceEnables AI agents to maintain Git-backed long-term project memory over MCP, supporting on-demand retrieval, curated writes, conflict-safe versioning, idempotency, and crash recovery so new sessions or machines can recover context and continue working.6Apache 2.0