fatmux
v2026.5.20
Published
<img src="./app/web/static/logo_nobg_fm.svg" alt="fatmux logo" width="160" />
Readme
fatmux
Browser-first local workspace for project terminals, source control, and Claude/Codex chat sessions.
For Users
fatmux is a local web app for working inside a project folder without leaving the browser. It gives you:
- Per-project terminals backed by
node-pty - Git tools for status, diffs, staging, commits, branches, fetch, pull, and push
- Claude Code and Codex CLI chat sessions wired into the workspace
- A local SQLite-backed data store for projects, terminals, agent sessions, messages, and raw events
Install And Run
The published package exposes a fatmux CLI.
npx fatmuxBy default, fatmux binds to 0.0.0.0 and stores its data in ~/.fatmux.
If port 4173 is already in use, fatmux will automatically try the next available port and print the selected URL in the startup logs.
If you want to control the data directory explicitly:
FATMUX_HOME="$HOME/.fatmux" npx fatmuxIf you want to override the bind host through the environment, use FATMUX_HOST:
FATMUX_HOST=127.0.0.1 npx fatmuxRunning In LXC, Docker, VMs, Or Remote Hosts
fatmux binds to all interfaces by default. It will log the final URL, the selected port, and whether it had to move away from the requested port because another process was already listening there.
If you want to restrict it to local-only access, start it explicitly on loopback:
npx fatmux --host 127.0.0.1What You Need
- Node.js that satisfies the repo
engine-strictsetting npm- Optional:
claudeandcodexCLIs if you want agent chat integration
Check the agent CLIs if you plan to use them:
claude --version
codex --versionAccessing fatmux Over Tailscale
If you want remote access, you can either use the default 0.0.0.0 bind or expose the local port through Tailscale.
Option 1: tailscale serve
npx fatmux
tailscale serve https / http://127.0.0.1:4173Option 2: Direct Tailnet Access
Use Tailscale SSH, port forwarding, or another trusted tailnet path to reach the local port.
Repository Layout
app/web SvelteKit frontend
app/server Node HTTP/WebSocket runtime
app/shared Shared TypeScript types and schemas
scripts Local dev and release scriptsDevelopment
Install
npm installRun Locally
npm run devnpm run dev starts the local workspace manager defined in scripts/dev.sh, with:
- shared type-checking in
app/shared - the server in
app/server - the web UI in
app/web
Build
npm run buildCheck
npm run checkTest
npm testEnd-to-End Tests
npm run test:e2eRelease Workflow
fatmux uses date-based CalVer with a hotfix suffix:
YYYY.M.D-NExamples:
2026.4.302026.4.30-12026.4.30-22026.5.1
Release numbering rules:
- The base version is the current date in local time
- If a version for today already exists, the suffix increments
- On a new day, numbering resets to the new date without a suffix
Release Command
The release flow is implemented as an npm script:
NPM_TOKEN=your_token npm run releaseThat script does the following:
- Runs
npm run release:version - Computes the next date-based version from the repo’s package manifests
- Runs
npm publish --tag latest
Authentication For Publishing
Publishing uses the npm token from the environment:
//registry.npmjs.org/:_authToken=${NPM_TOKEN}Set NPM_TOKEN in your shell before running the release command.
Notes On Publish Artifacts
- The root package is the published CLI package
- The workspaces are part of the repo and are not separately published by the default release command
fatmux.jsis the CLI entrypoint
Package Structure
package.jsondefines the CLI package, workspace orchestration, and release scriptsapp/server/package.jsoncontains the server workspaceapp/shared/package.jsoncontains shared types and schemasapp/web/package.jsoncontains the browser UI
Working On The Project
Common Local Commands
npm run dev
npm run check
npm test
npm run buildRelease Checklist
- Confirm
NPM_TOKENis set - Run
npm run release - Verify the published version
- Commit and push the manifest changes if you want the release bump recorded in git
Versioning Files
The release script updates these manifests:
Implementation Notes
- The app stores persistent state in SQLite under
~/.fatmux - The web UI is SvelteKit-based
- The server is a Node runtime with HTTP and WebSocket endpoints
- Agent support uses locally installed CLI tools rather than vendor API keys stored in fatmux
Troubleshooting
- If
npm publishrefuses the version, check whether the version has a prerelease suffix and whether the--tagflag is set - If agents are missing, verify
claudeandcodexare available onPATH - If the app does not start, confirm your Node version satisfies the root
engine-strictsetting
