The Problem

Puter solves personal-cloud fragmentation: users juggle Dropbox, Drive, and OneDrive for files, apps, and games that should live in one place. It is a self-hostable internet OS — a desktop-like web environment with its own filesystem, auth, and app platform — so data stays on infrastructure you control rather than a commercial cloud.

What This Does

Puter is a full-stack system: src/backend is the Express server (services for auth, filesystem, database), src/gui is the React desktop UI, and extensions/ holds pluggable capabilities like puterfs (filesystem provider) and metering. The repo is a portfolio of five self-contained projects (src, extensions, tools, mods, eslint), not one monolith — treat them separately.

How It Is Wired

Execution starts at src/backend/src/index.js (testlaunch reaches 354 functions) or via run in src/backend/src/codex/Sequence.js (371 functions). Everything routes through three hub modules: src/backend/src/util/context.js (148 importers), src/backend/src/services/BaseService.js (143), and src/backend/src/api/APIError.js (120). These are high-blast-radius: changing them ripples across ~15% of the codebase.

Traced paths show a run touches the filesystem via ins.unlink (run -> arun), and crypto via jwt.sign (start -> id2path -> create -> get_user_app_token) and crypto.randomBytes(24) (init -> init_). Across the repo, 23 functions read/write files, 8 make outbound network calls, 20 do crypto, 4 hit a database, 3 call a model for inference. The hottest functions are $ (147 call sites), create (128), and on (62); install -> registerService is the most-called edge (165). The GUI has a circular import cycle in src/gui/src/UI/UIWindow.js and siblings.

How To Use It

The README documents the commands verbatim:

git clone https://github.com/moses-y/puter
cd puter
npm install
npm start

Docker: docker run --rm -p 4100:4100 -v ... ghcr.io/heyputer/puter. Configuration lives in .env.example and docker-compose.yml. Requires Node.js 24+, 2GB RAM.

Real-World Use

Self-hosted personal cloud: deploy with Docker Compose, mount puter/config and puter/data volumes, access at puter.localhost:4100. The extensions/puterfs/PuterFSProvider.js handles filesystem operations; src/gui renders the desktop. The extension system is the main integration point for custom capabilities.

Code Health & Issues

Measured analysis (static, not opinion): 524 findings (146 high, 346 medium, 32 low). High: deep nesting ×31 (src/backend/src/util/context.js max depth 6), oversized files ×3 (src/backend/src/helpers.js at 1277 lines), hub modules ×11. 22 modules sit in circular imports (GUI files). Fixes: early returns, splitting oversized files, breaking cycles.

SDLC audit — 8 findings, 0 critical:

  • High — unpinned GitHub Actions tags (e.g., docker/login-action@v3) in .github/workflows; pin to commit SHA.
  • Medium — no least-privilege GITHUB_TOKEN; no Dependabot; npm install instead of npm ci in CI; node:24-alpine base image unpinned by digest; no dependency vuln scan; persist-credentials not disabled.
  • Low — no timeout-minutes on workflow jobs.

The Bottom Line

A solid fork of a mature project (43k-star upstream) with clean hygiene — tests, CI, license, lockfile, no committed secrets. The hub modules and oversized files are the main maintainability risks. Good fit for teams wanting a self-hosted cloud OS; the extension system is the real value.