Stack | Profullstack

PROFULLSTACK, INC. · OPEN SOURCE · MIT

The open source stack for the agentic era

Packages, CLIs, terminal UIs and MCP servers that work naturally for engineers and reliably for the agents they direct. Pulled out of 170 live products, and still running them.

246Packages on npm
31k+Weekly downloads
165k+All-time downloads
230Public repos
170Products running on it

Counted from npm and GitHub on 2026-10-06.

01

Every surface

A library, a CLI, a TUI and an MCP server where it makes sense. Humans get a terminal, agents get a tool, and both call the same code.

02

Agent native

Written for the agentic era. The whole stack is one curl away as Markdown or JSON, so an agent can read the rules before it writes a line.

03

Proven in production

Nothing here is a demo. Each package was pulled out of a live product after a second product needed it, and the fleet still runs on it.

04

Open and portable

MIT licensed, on npm, self hostable. Bare metal or Railway, Turso or Postgres. No vendor holds the keys.

The libraries

Every one is on npm under MIT. Pick the pieces you need; they do not require each other.

Build

The app layer: shared modules, accounts, data, terminals and media.

Stack

Shared modules for Next and Node apps: referrals, email, payments and CrawlProof in one import.

Lib

HQ TUI

btop-grade terminal dashboards for TypeScript from a one-import API. Dark by default.

LibTUI

Orgs

Organizations, teams, members, roles and invites for Postgres. Bring your own users table.

LibCLI

Bridges

Let a host site's signed-in users into an app over OAuth 2.1 with PKCE. No second signup.

Lib

libSQL PG

A drop-in @libsql/client that talks to Postgres, plus the tools to move a Turso database over.

LibCLI

Player

One web player for MP4, HLS, MPEG-TS and audio, with one control bar.

Lib

Form Guard

Contact-form spam stopped with a signed proof-of-render token. No captcha.

Lib

Submit Feed

One way to add a feed to a directory, shared by every site that takes one.

Lib

Scraper Daemon

One updater daemon for every listing site: jobs, refresh queues and resumable pipelines, polite and SSRF-safe fetching, SQLite or Postgres state.

LibCLI

Agents

Tools an agent can drive: MCP servers, data bridges and documents it can read.

MCP Server

A generic, modular server for the Model Context Protocol. Add a module, get a tool.

MCP

NicheDB

Browse collections, manage sources and feeds, and search datasets from a terminal or an agent.

CLIMCP

media2md

Turn any video, audio file or book into a chaptered Markdown bundle you can hand to an LLM.

CLIMCP

OpenProfile

Read, write, merge and de-duplicate OpenProfile.md documents for people and agents.

Lib

Agentic Jobs

An agent-friendly job board you self host. It posts its own jobs and never scrapes anyone else's.

App

Proxy

Call the web through residential proxies, with each provider behind one interface.

LibCLIMCPTUI

Money

Get paid by people and by machines: crypto checkout, x402 and pricing instead of 429s.

CoinPay

Non-custodial crypto payments: BTC, ETH, SOL, USDC and more, with x402 verify and settle.

LibCLITUI

x402 Gateway

Sell crawl access to AI training crawlers by the day over x402. Next and Hono adapters.

Lib

x402 Client

Pay x402 402s from JavaScript with a local key: a fetch, a CLI, and axios and got adapters.

LibCLI

Throttle

An app-wide rate limit whose answer to going over is a price, not a 429.

Lib

Keys

Ed25519-signed Power Keys: one key that unlocks every Profullstack service.

Lib

Referrals

A referral program SDK: 60% to the affiliate, 20% off for the new customer.

Lib

Ship + operate

Release everywhere, watch everything, and keep the fleet up without a pager.

sh1pt

One codebase to every store, registry, CDN and channel. Build, promote, scale, iterate.

CLI

ThreatCrush

An all-in-one security daemon: monitor, detect, scan and protect servers in real time.

CLITUI

CrawlProof

What the fleet costs and what it returns, in a live terminal dashboard over your traffic.

CLITUI

Watchdog

Notice when Postgres or Redis stops answering, and exit so the platform restarts you.

Lib

Encrypt

Quantum-resistant encryption: ML-KEM-1024 plus ChaCha20-Poly1305, wire compatible with qrypt.chat.

LibCLIMCP

Emailer

Mass email over the Resend batch API, with SMTP fallback.

Lib

Start with a prompt

The whole stack, its combos and its house rules are published as text for agents. Point Claude Code, Codex or any agent at it and it builds the way we do.

Blueprint updated 2026-10-19

$ curl -fsSL https://profullstack.com/install.sh | sh
# the Profullstack skill, into every agent on the box

$ curl -s https://profullstack.com/stack.md

> Build me a waitlist app on the
  Profullstack stack. Read
  https://profullstack.com/stack.md
  first and follow the house rules.

The blueprint

Profullstack runs about 170 active repos on a small number of deliberate combinations. Pick the combo that matches the job, inherit the shared defaults, follow the house rules, and reuse the published packages before writing anything new.

Pick a combo

There is no single stack. Match the job to a combo, then apply the shared defaults and the house rules.

A new product with a web UI

web-app Next 16 on Turso with a Hono API inside the app. This is the default for anything new.

A change to an existing SaaS on Supabase or Postgres

web-app-postgres Stay on the database it has. Do not migrate an app to Turso as a side effect of a feature.

A real-time 3D game, in the browser and on the desktop

games Babylon on a pure rules core, server-authoritative multiplayer, and art generated by committed scripts rather than modelled by hand.

An API, crawler, poller or data service with little or no UI

api-service Hono on Turso, Bun or Node, one Railway service with a health check.

A command-line or terminal tool, or an agent-facing bridge

cli-tui Node, TypeScript, commander, hqtui for dashboards, MCP where an agent should drive it, published to npm.

A desktop app

desktop Electron with the CLI bundled inside it, so one install gives both surfaces.

A mobile app

mobile Expo inside the product monorepo, sharing the API and packages.

Code two or more products need

library A runtime-neutral @profullstack/* package with subpath exports, released from GitHub.

Something that must be a single fast binary

systems Rust (tokio, axum, clap), or Go when the upstream ecosystem is Go.

Shared defaults

Every combo inherits these. A combo below only lists where it differs or adds.

Combos

Different stacks for different reasons. Each one names live products built on it.

Web app

web-app

The default for a new product. Next 16 renders the UI, a Hono app mounted inside it serves the API, Turso holds the data, and one Railway service runs web and worker together.

Use it when

  • You are starting a product that has a UI and a database.
  • The data fits SQLite semantics: one writer, modest joins, no Postgres extensions.
  • You want one service, one deploy, one domain.

Notes

  • Next inlines process.env.NAME at build time, so read runtime secrets through a non-literal key.
  • A 200 on /api/health proves nothing about the worker. Check the logs for its up line after a deploy.

Built on it

ConcernChoiceNotes
FrameworkNext 16, React 19App Router. proxy.ts, not middleware.ts. Server components by default.
APIHono inside NextMounted under /api. Versioned routes live at /api/v1/... and OAuth callbacks at /api/v1/<provider>/<function>/<endpoint>.
DatabaseTurso (libSQL) via @libsql/clientForward-only SQL migrations in packages/db, or Drizzle with dialect turso. Migrations must be safe to run twice concurrently.
UITailwind 4 + shadcn/uiScoped behind a ui.css without preflight when adding to an existing site. Plain CSS modules on marketing sites.
RealtimeServer-Sent EventsWebSockets only for chat, terminals and multiplayer.
Background workA worker process in the same containerSupervised by the entrypoint; the container exits non-zero when either process dies. BullMQ on Redis only when the queue is the product.
StorageRailway volume or Cloudflare R2R2 buckets private, served through signed or proxied routes.
Layoutapps/web, packages/db, services/workerRoot-only vitest config, tsconfig.base.json with strict flags. Copy nightcell7 or reeleel rather than inventing a layout.

Web app on Postgres

web-app-postgres

The previous generation of the same shape, and still the largest by count. Next 16 on Supabase, or on a self-hosted Postgres in the same Railway project. Kept where the data needs Postgres or the app already lives there.

Use it when

  • The app is already on Supabase or Postgres. Stay there.
  • You need row-level security, pgvector, heavy relational joins, or a queue on Redis next to the database.
  • Several services share one database and the write volume is real.

Notes

  • Do not move an app to Turso as part of a feature. Classify it first: easy Turso, needs Postgres, or consolidate.
  • coinpayportal is public with 19 forks. Never put real data in a fixture there.

Built on it

ConcernChoiceNotes
FrameworkNext 16, React 19Same conventions as web-app.
DatabaseSupabase Postgres, or self-hosted Postgres on RailwaySupabase client via @profullstack/stack/supabase. New Postgres apps self-host on Railway (w3bs.org is the reference). Index every foreign key you will cascade through.
AuthMagic link + passkeys on the app's own users tableSupabase Auth exists in older apps; the local users.id is always the primary key.
QueuesBullMQ on RedisCustom job ids must not contain a colon.
Migrationssupabase/migrations or plain SQLApplied in CI or on boot, never by hand in the dashboard.

API service

api-service

Hono on Turso with no framework in front of it. For pollers, crawlers, data APIs, MCP servers and anything whose UI is a few server-rendered pages or none at all. Bun or Node, chosen per repo and pinned.

Use it when

  • The product is an API, a feed, a dataset or a daemon.
  • The UI is small enough to render from Hono (JSX or templates) or lives in a separate app.
  • You want the smallest possible service: one process, one SQLite file or one Turso database.

Notes

  • Bun-only gotchas: Bun.serve idleTimeout kills long streams, and Bun's SQL client stringifies arrays. Keep those behind small adapters.

Built on it

ConcernChoiceNotes
FrameworkHono 4Web-standard Request/Response. Same app runs on Bun and Node; the router is the only Hono-specific code.
RuntimeBun or Node, pinnedBun for stream-heavy or IO-heavy services (genrewatch, tipoffwatch, niche-db, r4ck). Node + pnpm when the service shares code with a Next app or a CLI.
DatabaseTurso (libSQL)Embedded replica or remote. FTS5 for search, with the raw query escaped; libSQL cannot bind undefined.
Rate limiting@profullstack/throttleCredentialed callers get 600/min, anonymous 100/min, over the limit is a 402 with an offer.
Agent surfaceMCP bridge in the CLI packageOne query vocabulary across page, API, CLI and MCP.
DeployRailway, Dockerfile or Nixpacksrailway.json with healthcheckPath. Pin pnpm 10 on Nixpacks; corepack cannot launch pnpm 11.

CLI and TUI

cli-tui

Terminal tools for people and agents. Node and TypeScript, commander for arguments, hqtui for anything with a screen, an MCP bridge so an agent can drive the same commands, published to npm under @profullstack.

Use it when

  • The user is a developer, an operator or an agent.
  • The tool wraps a site or API we run (nichedb, rssamplifier, coinpay, r4ck, readm3).
  • You need a dashboard in a terminal rather than a browser.

Built on it

ConcernChoiceNotes
RuntimeNode 20+ (Bun optional)Node is required: CLIs run in GitHub Actions and on customer machines. Bun is fine for development.
ArgumentscommanderSubcommands map one to one onto MCP tools.
TUI@profullstack/hqtuibtop-grade dashboards, one import. A mouse must work: one click unfolds, hover highlights.
Config~/.<tool>.json + @profullstack/synconfigAllowlisted snapshot synced with the tool's cloud.
Installnpm i -g @profullstack/<tool> and curl | shThe installer does the whole job. Never document a manual follow-up step.
Testingnode --test or vitestbun test on Bun repos; mock.module is process-wide there.
ReleaseGitHub release workflow publishes to npmBump before testing. A brand-new scoped package 404s for minutes after publish.

Desktop

desktop

Electron, with the product's CLI bundled inside the app. A desktop install gives the CLI too, with no system Node, and the two surfaces cannot disagree because they are the same build.

Use it when

  • The product needs a tray, a window, the filesystem or OS input.
  • A CLI already exists and the desktop app is a second surface for it.

Built on it

ConcernChoiceNotes
ShellElectronTauri was tried and retired.
InsideHono or Next, same as the web surfaceThe renderer is the web app; the main process hosts the API locally.
CLIBundled via extraResourcesThe installer writes a shim: ELECTRON_RUN_AS_NODE=1 exec app resources/cli/dist/bin.js. Build the bundle with pnpm deploy --prod --legacy.
Native modulesN-API onlyElectron's ABI differs from system Node. @libsql/* passes; anything with V8 symbols does not.
DistributionGitHub releases + curl installerHeadless machines get a CLI-only tarball. Homebrew, apt, rpm, scoop and nix repos exist for pairux.
Auto-updateFrom GitHub releasesSet the tool's NO_AUTO_UPDATE env when testing a dev binary.

Games

games

Babylon in the browser, with every gameplay rule in a package that cannot import a renderer. The same rules run in the client, in the authoritative match server and in tests, so a rule exists exactly once.

Use it when

  • The product is a real-time 3D scene the player acts inside, not a page they read.
  • It has to run in a browser first, with the desktop build as a second surface rather than the only one.

Notes

  • Distant point lights and glows are camera-facing sprites held at a fixed screen size, never scaled geometry. A 25 mm firefly is sub-pixel past 30 m and no amount of scaling the mesh fixes that.
  • Budget the shell download. Models ship geometry, UVs and a named material slot; the engine binds the real textures by that name so one atlas is not shipped ten times.

Built on it

ConcernChoiceNotes
RendererBabylon.jsWebGPU where the browser has it, WebGL2 fallback. The fallback is a supported path, not a degraded one.
PhysicsHavok via @babylonjs/havokOnly where real collision response is needed; most props are static.
RulesA pure game-core packageNo Babylon, no DOM, no Electron imports. This is the rule that makes a client and a server able to agree.
UIPreact, outside the frame loopThe component layer never owns a per-frame transform. HUD readouts are text-node writes behind a change check, not a render pass.
MultiplayerServer-authoritative over WSSThe client sends input intent. The server owns movement validation, damage, death, respawn and score. Shared messages live in their own protocol package.
BuildVite + vite-plugin-pwaSet registerType and actually wire the update prompt; prompt with no handler means returning players never get a new build.
API and dataHono, Drizzle, PostgresSame as api-service. Never cache /api, matchmaking or tickets in the service worker.
DesktopElectronThe desktop combo applies unchanged; the renderer is the same web build.
ArtGenerated by committed Blender scriptsNo asset without provenance. One Blender metre is one game metre, GLB with glTF-compatible PBR, COL_ colliders and SOCKET_ attachment points.

Mobile

mobile

Expo and React Native, as apps/mobile inside the product monorepo. It shares the API client and packages with the web app rather than living in its own repo.

Use it when

  • The product needs to be in the app stores or on a phone home screen with native capabilities.
  • A PWA is not enough (push, background, camera, payments in-app).

Notes

  • Start with the PWA. Most products never need this combo.

Built on it

ConcernChoiceNotes
FrameworkExpo (React Native)React 19. Shares types and the API client with apps/web.
Layoutapps/mobile in the product monorepoStandalone *-mobile repos are the old pattern and are dormant.
BackendThe product's own api-service or web-appNo separate mobile backend.
Store releasesh1ptOne codebase to every store, registry and channel.

Library

library

Code that two or more products need becomes a @profullstack/* package. Runtime-neutral core, subpath exports, one npm package per concern, released from GitHub.

Use it when

  • You are about to copy a module from one repo into another.
  • A site needs a component another site already ships (player, leaderboard, feed submission, contact-form guard).

Built on it

ConcernChoiceNotes
ShapeESM, TypeScript, subpath exports`@profullstack/stack/referrals`, `/email`, `/supabase`, `/feedback`, `/coinpay`, `/crawlproof` is the pattern. Peer-depend on next, react and clients rather than bundling them.
CoreWeb-standard APIsfetch, Request, Response, URL, crypto.subtle, ReadableStream. Runtime-specific code behind an adapter. A /core entry must never import a node: module.
Buildtsup or plain tscNode type-stripping needs .ts specifiers; pair with rewriteRelativeImportExtensions so dist still emits .js.
TestsvitestContract tests where the package defines a protocol (x402, submit-feed, OpenProfile).
ReleaseBump, merge, gh releaseA release workflow publishes. Ship pkg@latest in docs, never update -g. pnpm 11 refuses packages younger than a day unless excluded from minimumReleaseAge.

Systems

systems

Rust when the product is a single static binary that has to be fast (benchmarks, transports, agents on servers). Go when the upstream ecosystem is Go. Python only for security tooling that lives in that world.

Use it when

  • A JavaScript runtime would be the bottleneck or the dependency you cannot ship.
  • The upstream you build on is in that language (LiveKit for agentbbs, nmap and Kali tooling).

Built on it

House rules

The conventions an agent has to follow on any Profullstack repo, whichever combo it is on.

Ship it, never stop at in progress

An agent does not end its turn on "still running, I will report when it lands". Work handed to a subagent, CI or a deploy is driven to merged, released and verified live in the same turn, then reported once with the result. Stop early only for a real blocker a person must clear: a login, or a decision that is theirs.

Every site takes payment from launch

Launching a site includes taking crypto: npx @profullstack/coinpay-onboard site <name> --webhook <public url> makes its CoinPay business, copies the payout wallets in, sets the webhook and writes the COINPAY_* keys into the site vault. Idempotent; every step must print a check before the launch is announced.

Launch on a Moshpit name

New products launch on a Moshpit name (pit.moshcode.sh), not a new ICANN domain, served from our own box with a registry-signed certificate and listed on the Moshpit ring. Announcements give the <name>.pit.world address for browsers without Moshpit DNS.

Reuse the house package first

Before adding a dependency or writing a component, grep the repo for @profullstack/ and check npm. The package usually exists and is often already installed.

Secrets live in the vault

Set production secrets on the Railway service and record them in the logicsrc team vault. Never write one into a .env in the repo, and never ask a person to.

Auth is magic link plus passkeys

The link proves the address and the address is the account. Passwords are optional and only for devices that cannot do either.

Installers do the whole job

If a feature needs a component, the installer or update command installs it. No documented manual follow-up step. DNS routing is the one thing that stays explicit.

Push to the default branch deploys

PRs are merged, not parked. Release after merge. Then announce through myna, with rel=canonical on every syndicated copy.

Our domains only

Add the custom domain before writing any URL down. Never publish a *.up.railway.app address.

Migrations run twice

Web and worker both migrate on boot. Ledger writes are insert-or-ignore and every migration is safe to apply concurrently.

Large catalogues use a sitemap index

/sitemap.xml is an index; entities are chunked by month of creation so past files never change.

OAuth callbacks are namespaced

/api/v1/<provider>/<function>/<endpoint>, using whatever API prefix the project already has.

Every product is a customer of another

Wire products together when the integration is load-bearing: x402 settles through CoinPay, blogs open CrawlProof ads, myna distributes every ship, NicheDB sells the data.

Copy has no LLM tells

Short sentences, no em dashes, no rule-of-three flourishes. This applies to posts, READMEs and announcements.

A wedged process restarts without a person

Every container gets a HEALTHCHECK that hits its own /healthz, so a blocked event loop shows as unhealthy. watchdog-autoheal restarts what Docker marks unhealthy, three times an hour at most, then emails. In-process, watchDependencies exits when the shared DB or Redis client stops answering.

Agents get a first-class surface

A site ships its data as Markdown or JSON at a stable URL, a CLI ships an MCP bridge, and training crawlers pay through x402 rather than being blocked.

Not in the stack

Things an agent might reach for by habit. Do not.

  • Hetzner: Ruled out permanently. Railway hosts the fleet; a netcup box and DigitalOcean droplets cover what needs a VM.
  • Vercel, Fly.io, Cloudflare Workers: Not deploy targets. One repo has a fly.toml and none have a wrangler config. Railway is the host.
  • Supabase for a new app: Turso is the default. Supabase and Postgres stay where they already are.
  • .env files as the source of secrets: The vault and the platform env are the authority. A file is a stale copy.
  • Password-first auth, next-auth: Magic link plus passkeys. @profullstack/auth-system is password-only and is the exception, not the pattern.
  • SvelteKit, Primate + SurrealDB, Express for new work: Earlier generations still in maintenance. Do not start anything new on them.
  • Tauri: Retired in favour of Electron with the bundled CLI.
  • mocha, jest, Prisma: vitest and plain SQL or Drizzle.
  • Oxc, Oxlint, Oxfmt, Rolldown as a default: On the roadmap since June and present in six repos. Use the repo's existing lint and format setup until parity is proven.
  • Hand-rolled players, rate limiters, contact-form guards, feed forms: Each of these is a published package already.
  • video.js, plyr, a bare hls.js or mpegts.js: @profullstack/player wraps hls.js and mpegts.js already. video.js 10 ships no player at all: it throws VJS8_LEGACY_* on v8 code.
  • *.up.railway.app URLs: Our domains only.

Runs in production

Every Profullstack product is built on this stack. The full list, with install commands, lives in the docs.

Browse every product

Maintainers

One senior engineer, a fleet of agents, and every change through review, tests and CI.

Anthony Ettinger

Founder, Profullstack, Inc.

riotcoder

The agent persona that writes most of the code.

Want this stack on your product?

We build new products on it and move teams off per-project backends.