Self-hosted, Self-Improving, Federated Everything App — dev management, agent orchestration, persistent mind, digital twin, second brain, and creative pipeline from a single dashboard over Tailscale to port the user into the OS
37
stars
16,962
commits
JavaScript
primary language
Sep 11, 2026
updated
Your self-hosted operating system for dev machines. Manage apps, orchestrate AI agents, build your digital twin, capture knowledge, and track your health — all from a single dashboard accessible anywhere via Tailscale.
Think Umbrel, but for your active git repos, AI workflows, and personal knowledge. Access everything from your phone, tablet, or any device on your Tailscale network.
Highly opinionated & personal. PortOS is built for one specific use case: a single developer running it on their own machine, behind Tailscale, with their own AI providers and workflows. It makes strong assumptions about how you work and will keep making them. Pull requests are welcome — but the project will always prioritize the author's needs first, and merges may introduce breaking changes without warning. If something stops working after an update, ask your coding agent of choice to read the changelog and upgrade your local data:
"Read .changelog/vX.Y.Z.md and fix any migration issues in my PortOS data/ directory."

Most developers juggle a dozen tools — PM2 terminals, JIRA boards, AI chat windows, note apps, health trackers. PortOS unifies them into a single local-first dashboard that runs on your dev machine and travels with you over Tailscale.
PortOS is designed to run on flat-rate AI subscriptions rather than metered API credit billing — though API-key options exist for every provider slot. Autonomous agents that work around the clock are terrifying on a per-token bill and liberating on a flat monthly plan: you can let the Chief of Staff burn all night without watching a meter.
The owner builds this app Rick Rubin style — producing and directing AI coding agents rather than typing the code by hand: taste, direction, and judgment applied to output generated by the machines. PortOS is his personal digital twin and brain-management tool — a port of a meatspace existence into an OS (hence the name). The stack that develops and runs it:
These tools develop PortOS, and PortOS in turn uses them to manage projects, itself, and the digital twin.
| Chief of Staff | AI Agents | AI Providers |
|---|---|---|
![]() | ![]() | ![]() |
| App Wizard | PM2 Processes | Chief of Staff Tasks |
|---|---|---|
![]() | ![]() | ![]() |
| Login | Historical OpenWorld |
|---|---|
![]() | ![]() |
Bring your entire portfolio of projects under one roof.
package.json, vite.config, and ecosystem.config (App Wizard docs).gitmodules) that tracks each git submodule against its remote and updates it, optionally committing the pointer bump on the repo's default branchAn autonomous AI agent orchestrator that manages your development workflow. Submit a task, and CoS dispatches the right AI agent to handle it — then learns from the result. (Full docs)
cli) and an interactive terminal (tui) provider variant (Agent Runner docs).planning/ directories in managed apps and tracks phase state and concerns per projectA full creative studio for taking an idea from blank page to finished media. Each surface feeds the next — prose drafted in Writers Room becomes a series in the Pipeline, the Pipeline pulls characters and locations from a Universe Builder canon, the canon generates reference images through Media Gen, and finished work goes out through Sharing.
gpt-image modemlx_video on macOS, diffusers on Windows. Modes: text-to-video, image-to-video, first/last-frame, extend, audio-to-videoauto-merge or inbox mode, and outgoing PortOS records (universes, series, characters, media) propagate to friends running their own PortOS instance. Live subscription indicators surface when the sender is actively editingAn identity scaffolding system for building a quantified AI representation of yourself. Your digital twin informs every agent prompt, ensuring AI interactions align with your values and style. (Full docs | Identity System docs)
Privacy Center — the PII half of identity, and the one area deliberately walled off from every sync and federation path (ADR):
A thought capture and knowledge management system — your offline-first external memory. (Full docs)
Unified inbox for everything that talks back at you — email, chat, agent-generated drafts, and external operator chats.
chat.db sync (requires Full Disk Access) with contact resolution, blocklist, and spam triage; feeds Tribe and the Activity TimelineA unified calendar surface that pulls from Google Calendar (and other sources) and lays them out across multiple horizons.
Personal long-form knowledge base — separate from Brain (capture surface) and Notes (drafts) — for curated, evergreen reference material.
A gamified daily cognitive self-test in ~5 minutes, composed from 6 scored domains. (Full docs)
Everything you need to manage your dev environment without leaving the browser.
/devtools/quota-burn) (Quota Burn docs)yt-dlp into the media libraryPush-to-talk and hands-free voice assistant with barge-in. TTS and LLM run locally; STT can be fully offline with whisper.cpp, while the default browser Web Speech API may forward audio to a vendor cloud service.
Space to speak; release to sendEnable under Settings → Voice; PortOS provisions required voice components as needed on first enable — whisper-cpp via Homebrew (when STT is whisper), Piper + phonemize libs pulled from rhasspy/piper GitHub Releases (when TTS is Piper), and selected Whisper/Piper models downloaded into ~/.portos/voice/. Full setup in Voice Mode docs.
Track your biological self alongside your digital one.
ui_navigate)⌘K/api/* and /data/*, and run npm run setup:cert for a trusted Tailscale/Let's Encrypt certificate.nvmrc use; Vite 8 requires ≥20.19). npm run setup, npm start and npm run dev check this first and stop immediately on an older Node — a bare npm install only warns, so use the commands below.npm install -g npm@latest) for dependency authoring. Older npm installs dependencies correctly, but its lockfile writer omits the libc fields npm 12 records, so a direct npm install can rewrite client/package-lock.json and server/package-lock.json — and the next Dependabot PR puts those fields back. PortOS-managed setup, update, and dependency-repair installs preserve the committed lockfiles with --no-save; do not commit metadata-only churn from an older npm. Every workspace declares engines.npm, so npm warns on any install path; npm run setup/start/dev also print what to do about it. These are warnings, never failures. No Node release bundles npm 12 yet (Node 24.10 ships 11.6.1), so this is a deliberate global upgrade — and worth checking npm -v matches, since an old global npm earlier on PATH shadows the one Node ships.git clone --recurse-submodules https://github.com/atomantic/PortOS.git
cd PortOS
npm run setup
npm start
npm run setup (aliased as npm run install:all) initializes bundled submodules; installs the root, client, server, and Autofixer dependencies; runs the trusted native rebuilds; prepares runtime data; provisions PostgreSQL, local LLM tooling, and the headless browser; safely attempts a trusted Tailscale certificate; and prints an ordered setup walkthrough. npm start builds the client and starts the managed processes with PM2. Before HTTPS is ready, access PortOS locally at http://localhost:5555.
For a guided setup that also checks optional local media and command-line tooling, run ./setup.sh instead. It prompts before starting PortOS; choose that option or run npm start afterward, not both.
For HTTPS (recommended — required for the in-browser microphone away from loopback), setup tells you when Tailscale, MagicDNS, or the tailnet's HTTPS Certificates toggle is still missing and automatically fetches the trusted certificate once those prerequisites are ready:
npm run setup:cert # Tailscale + Let's Encrypt (trusted)
npm run setup:guide # show the next setup action + correct URL
npm run setup:cert -- --self-signed # fallback if you don't have Tailscale
npm run pm2:restart
After that, https://<machine>.<tailnet>.ts.net:5555 is the user-facing URL on every device. The same :5555 is used for both HTTP and HTTPS — only the scheme changes. When HTTPS is enabled a loopback-only HTTP mirror also spawns at http://localhost:5553 so local curl/scripts skip cert warnings (override with PORTOS_HTTP_PORT).
A fresh install with no Tailscale stays on HTTP, so
http://localhost:5555works out of the box.npm startwill only auto-provision a cert when Tailscale'stailscale certsucceeds — it won't silently flip you to a self-signed HTTPS that breaks the URL above. Pass--self-signedif you want HTTPS without Tailscale (browser warning included).
The same walkthrough is always available in Settings → Setup. It verifies one runnable AI provider as well as secure remote access, and links directly to every action PortOS cannot perform at the account level. The Dashboard and Instances page surface the same network state; Unix and Windows update scripts retry certificate provisioning and print the guide after every update. See the complete setup guide.
PM2 keeps PortOS running in the background. To configure startup after a reboot, run npm run pm2:startup from the repository root and follow the platform-specific instructions it prints, then run npm run pm2:save to save the process list. npm start already saves the process list, but does not install the startup service.
npm run setup # Install all dependencies (alias: npm run install:all)
npm run dev # Starts PostgreSQL, launches full PM2 ecosystem, and tails logs
npm run dev executes scripts/dev-start.js to initialize PostgreSQL, stop existing PM2 processes, and launch the complete PM2 process ecosystem defined in ecosystem.config.cjs (portos-server, portos-cos, portos-ui, portos-autofixer, portos-autofixer-ui, portos-browser) while tailing logs. The React frontend runs with Vite hot-reload on :5554 and the API on :5555.
:5554 is the Vite server. In dev it is the active hot-reload frontend; in production (npm start / PM2) the React build is served from :5555 directly, although the PM2 ecosystem still starts Vite on :5554.
PortOS binds to 0.0.0.0 so you can access it from any device on your Tailscale network:
Security Note: PortOS is designed for private Tailscale networks. Do not expose ports 5553-5561 to the public internet. An optional instance password (Settings → Security) gates
/api/*and/data/*if you want a second layer, but it is off by default — the tailnet is the trust boundary. See the Security Model in AGENTS.md and the Setup Guide for network and authentication details.
| Layer | Technologies |
|---|---|
| Frontend | React 19, Vite 8, Tailwind CSS 4, Three.js, xterm.js |
| Backend | Express 5, Socket.IO, PM2, Zod validation |
| Data | PostgreSQL + pgvector (primary datastore — mandatory), JSON files for binary assets and synced/ephemeral state (storage contract) |
| AI | Claude Code, Codex, Antigravity, Grok Build, Kimi Code, Cursor Agent, OpenCode, Ollama, LM Studio (via the in-tree AI toolkit, server/lib/aiToolkit/) |
PortOS/
├── client/ # React + Vite frontend (Vite on :5554; built client served on :5555)
├── server/ # Express API (always serves on :5555)
├── autofixer/ # Standalone crash-detection/repair worker
├── data/ # Runtime data (apps, providers, history, brain, pipeline, …)
├── data.reference/ # Seed files copied on first install and by migrations
├── docs/ # Documentation, ADRs, design plans, and screenshots
├── lib/slashdo/ # Slashdo submodule (provides /do:* slash commands)
├── scripts/ # Setup, migration, and maintenance scripts
├── .changelog/ # Per-release changelogs generated from commits by the release workflow
└── ecosystem.config.cjs # PM2 configuration + canonical PORTS map
Run these from the repository root after setup. They use the PM2 bundled with PortOS, so a global pm2 command is not required.
npm start # Build the client and start PortOS
npm run pm2:status # View status
npm run pm2:logs -- portos-server --lines 100 # View server logs
npm run pm2:restart # Restart the PortOS ecosystem
npm run pm2:stop # Stop the PortOS ecosystem
npm run pm2:save # Save the process list for startup
data/apps.json)Each registered app includes:
data/providers.json)Configure AI providers for the runner and Chief of Staff:
Full catalog (including design plans, ADRs, and research notes): docs/README.md
METRICS.md Convention — How a managed app declares the metrics agents should judge it byPull requests are welcome. This is a personal project, so:
.changelog/vX.Y.Z.md for what changed."Read .changelog/vX.Y.Z.md and fix any migration issues in my PortOS data/ directory." Most data issues are trivially auto-fixable this way.MIT
16,474 commits
321 commits
57 commits
35 commits
JavaScript
98.4%
Python
1.0%
Self-hosted, Self-Improving, Federated Everything App — dev management, agent orchestration, persistent mind, digital twin, second brain, and creative pipeline from a single dashboard over Tailscale to port the user into the OS
37
stars
16,962
commits
JavaScript
primary language
Sep 11, 2026
updated
Your self-hosted operating system for dev machines. Manage apps, orchestrate AI agents, build your digital twin, capture knowledge, and track your health — all from a single dashboard accessible anywhere via Tailscale.
Think Umbrel, but for your active git repos, AI workflows, and personal knowledge. Access everything from your phone, tablet, or any device on your Tailscale network.
Highly opinionated & personal. PortOS is built for one specific use case: a single developer running it on their own machine, behind Tailscale, with their own AI providers and workflows. It makes strong assumptions about how you work and will keep making them. Pull requests are welcome — but the project will always prioritize the author's needs first, and merges may introduce breaking changes without warning. If something stops working after an update, ask your coding agent of choice to read the changelog and upgrade your local data:
"Read .changelog/vX.Y.Z.md and fix any migration issues in my PortOS data/ directory."

Most developers juggle a dozen tools — PM2 terminals, JIRA boards, AI chat windows, note apps, health trackers. PortOS unifies them into a single local-first dashboard that runs on your dev machine and travels with you over Tailscale.
PortOS is designed to run on flat-rate AI subscriptions rather than metered API credit billing — though API-key options exist for every provider slot. Autonomous agents that work around the clock are terrifying on a per-token bill and liberating on a flat monthly plan: you can let the Chief of Staff burn all night without watching a meter.
The owner builds this app Rick Rubin style — producing and directing AI coding agents rather than typing the code by hand: taste, direction, and judgment applied to output generated by the machines. PortOS is his personal digital twin and brain-management tool — a port of a meatspace existence into an OS (hence the name). The stack that develops and runs it:
These tools develop PortOS, and PortOS in turn uses them to manage projects, itself, and the digital twin.
| Chief of Staff | AI Agents | AI Providers |
|---|---|---|
![]() | ![]() | ![]() |
| App Wizard | PM2 Processes | Chief of Staff Tasks |
|---|---|---|
![]() | ![]() | ![]() |
| Login | Historical OpenWorld |
|---|---|
![]() | ![]() |
Bring your entire portfolio of projects under one roof.
package.json, vite.config, and ecosystem.config (App Wizard docs).gitmodules) that tracks each git submodule against its remote and updates it, optionally committing the pointer bump on the repo's default branchAn autonomous AI agent orchestrator that manages your development workflow. Submit a task, and CoS dispatches the right AI agent to handle it — then learns from the result. (Full docs)
cli) and an interactive terminal (tui) provider variant (Agent Runner docs).planning/ directories in managed apps and tracks phase state and concerns per projectA full creative studio for taking an idea from blank page to finished media. Each surface feeds the next — prose drafted in Writers Room becomes a series in the Pipeline, the Pipeline pulls characters and locations from a Universe Builder canon, the canon generates reference images through Media Gen, and finished work goes out through Sharing.
gpt-image modemlx_video on macOS, diffusers on Windows. Modes: text-to-video, image-to-video, first/last-frame, extend, audio-to-videoauto-merge or inbox mode, and outgoing PortOS records (universes, series, characters, media) propagate to friends running their own PortOS instance. Live subscription indicators surface when the sender is actively editingAn identity scaffolding system for building a quantified AI representation of yourself. Your digital twin informs every agent prompt, ensuring AI interactions align with your values and style. (Full docs | Identity System docs)
Privacy Center — the PII half of identity, and the one area deliberately walled off from every sync and federation path (ADR):
A thought capture and knowledge management system — your offline-first external memory. (Full docs)
Unified inbox for everything that talks back at you — email, chat, agent-generated drafts, and external operator chats.
chat.db sync (requires Full Disk Access) with contact resolution, blocklist, and spam triage; feeds Tribe and the Activity TimelineA unified calendar surface that pulls from Google Calendar (and other sources) and lays them out across multiple horizons.
Personal long-form knowledge base — separate from Brain (capture surface) and Notes (drafts) — for curated, evergreen reference material.
A gamified daily cognitive self-test in ~5 minutes, composed from 6 scored domains. (Full docs)
Everything you need to manage your dev environment without leaving the browser.
/devtools/quota-burn) (Quota Burn docs)yt-dlp into the media libraryPush-to-talk and hands-free voice assistant with barge-in. TTS and LLM run locally; STT can be fully offline with whisper.cpp, while the default browser Web Speech API may forward audio to a vendor cloud service.
Space to speak; release to sendEnable under Settings → Voice; PortOS provisions required voice components as needed on first enable — whisper-cpp via Homebrew (when STT is whisper), Piper + phonemize libs pulled from rhasspy/piper GitHub Releases (when TTS is Piper), and selected Whisper/Piper models downloaded into ~/.portos/voice/. Full setup in Voice Mode docs.
Track your biological self alongside your digital one.
ui_navigate)⌘K/api/* and /data/*, and run npm run setup:cert for a trusted Tailscale/Let's Encrypt certificate.nvmrc use; Vite 8 requires ≥20.19). npm run setup, npm start and npm run dev check this first and stop immediately on an older Node — a bare npm install only warns, so use the commands below.npm install -g npm@latest) for dependency authoring. Older npm installs dependencies correctly, but its lockfile writer omits the libc fields npm 12 records, so a direct npm install can rewrite client/package-lock.json and server/package-lock.json — and the next Dependabot PR puts those fields back. PortOS-managed setup, update, and dependency-repair installs preserve the committed lockfiles with --no-save; do not commit metadata-only churn from an older npm. Every workspace declares engines.npm, so npm warns on any install path; npm run setup/start/dev also print what to do about it. These are warnings, never failures. No Node release bundles npm 12 yet (Node 24.10 ships 11.6.1), so this is a deliberate global upgrade — and worth checking npm -v matches, since an old global npm earlier on PATH shadows the one Node ships.git clone --recurse-submodules https://github.com/atomantic/PortOS.git
cd PortOS
npm run setup
npm start
npm run setup (aliased as npm run install:all) initializes bundled submodules; installs the root, client, server, and Autofixer dependencies; runs the trusted native rebuilds; prepares runtime data; provisions PostgreSQL, local LLM tooling, and the headless browser; safely attempts a trusted Tailscale certificate; and prints an ordered setup walkthrough. npm start builds the client and starts the managed processes with PM2. Before HTTPS is ready, access PortOS locally at http://localhost:5555.
For a guided setup that also checks optional local media and command-line tooling, run ./setup.sh instead. It prompts before starting PortOS; choose that option or run npm start afterward, not both.
For HTTPS (recommended — required for the in-browser microphone away from loopback), setup tells you when Tailscale, MagicDNS, or the tailnet's HTTPS Certificates toggle is still missing and automatically fetches the trusted certificate once those prerequisites are ready:
npm run setup:cert # Tailscale + Let's Encrypt (trusted)
npm run setup:guide # show the next setup action + correct URL
npm run setup:cert -- --self-signed # fallback if you don't have Tailscale
npm run pm2:restart
After that, https://<machine>.<tailnet>.ts.net:5555 is the user-facing URL on every device. The same :5555 is used for both HTTP and HTTPS — only the scheme changes. When HTTPS is enabled a loopback-only HTTP mirror also spawns at http://localhost:5553 so local curl/scripts skip cert warnings (override with PORTOS_HTTP_PORT).
A fresh install with no Tailscale stays on HTTP, so
http://localhost:5555works out of the box.npm startwill only auto-provision a cert when Tailscale'stailscale certsucceeds — it won't silently flip you to a self-signed HTTPS that breaks the URL above. Pass--self-signedif you want HTTPS without Tailscale (browser warning included).
The same walkthrough is always available in Settings → Setup. It verifies one runnable AI provider as well as secure remote access, and links directly to every action PortOS cannot perform at the account level. The Dashboard and Instances page surface the same network state; Unix and Windows update scripts retry certificate provisioning and print the guide after every update. See the complete setup guide.
PM2 keeps PortOS running in the background. To configure startup after a reboot, run npm run pm2:startup from the repository root and follow the platform-specific instructions it prints, then run npm run pm2:save to save the process list. npm start already saves the process list, but does not install the startup service.
npm run setup # Install all dependencies (alias: npm run install:all)
npm run dev # Starts PostgreSQL, launches full PM2 ecosystem, and tails logs
npm run dev executes scripts/dev-start.js to initialize PostgreSQL, stop existing PM2 processes, and launch the complete PM2 process ecosystem defined in ecosystem.config.cjs (portos-server, portos-cos, portos-ui, portos-autofixer, portos-autofixer-ui, portos-browser) while tailing logs. The React frontend runs with Vite hot-reload on :5554 and the API on :5555.
:5554 is the Vite server. In dev it is the active hot-reload frontend; in production (npm start / PM2) the React build is served from :5555 directly, although the PM2 ecosystem still starts Vite on :5554.
PortOS binds to 0.0.0.0 so you can access it from any device on your Tailscale network:
Security Note: PortOS is designed for private Tailscale networks. Do not expose ports 5553-5561 to the public internet. An optional instance password (Settings → Security) gates
/api/*and/data/*if you want a second layer, but it is off by default — the tailnet is the trust boundary. See the Security Model in AGENTS.md and the Setup Guide for network and authentication details.
| Layer | Technologies |
|---|---|
| Frontend | React 19, Vite 8, Tailwind CSS 4, Three.js, xterm.js |
| Backend | Express 5, Socket.IO, PM2, Zod validation |
| Data | PostgreSQL + pgvector (primary datastore — mandatory), JSON files for binary assets and synced/ephemeral state (storage contract) |
| AI | Claude Code, Codex, Antigravity, Grok Build, Kimi Code, Cursor Agent, OpenCode, Ollama, LM Studio (via the in-tree AI toolkit, server/lib/aiToolkit/) |
PortOS/
├── client/ # React + Vite frontend (Vite on :5554; built client served on :5555)
├── server/ # Express API (always serves on :5555)
├── autofixer/ # Standalone crash-detection/repair worker
├── data/ # Runtime data (apps, providers, history, brain, pipeline, …)
├── data.reference/ # Seed files copied on first install and by migrations
├── docs/ # Documentation, ADRs, design plans, and screenshots
├── lib/slashdo/ # Slashdo submodule (provides /do:* slash commands)
├── scripts/ # Setup, migration, and maintenance scripts
├── .changelog/ # Per-release changelogs generated from commits by the release workflow
└── ecosystem.config.cjs # PM2 configuration + canonical PORTS map
Run these from the repository root after setup. They use the PM2 bundled with PortOS, so a global pm2 command is not required.
npm start # Build the client and start PortOS
npm run pm2:status # View status
npm run pm2:logs -- portos-server --lines 100 # View server logs
npm run pm2:restart # Restart the PortOS ecosystem
npm run pm2:stop # Stop the PortOS ecosystem
npm run pm2:save # Save the process list for startup
data/apps.json)Each registered app includes:
data/providers.json)Configure AI providers for the runner and Chief of Staff:
Full catalog (including design plans, ADRs, and research notes): docs/README.md
METRICS.md Convention — How a managed app declares the metrics agents should judge it byPull requests are welcome. This is a personal project, so:
.changelog/vX.Y.Z.md for what changed."Read .changelog/vX.Y.Z.md and fix any migration issues in my PortOS data/ directory." Most data issues are trivially auto-fixable this way.MIT
16,474 commits
321 commits
57 commits
35 commits
JavaScript
98.4%
Python
1.0%