Stack
Shared modules for Next and Node apps: referrals, email, payments and CrawlProof in one import.
PROFULLSTACK, INC. · OPEN SOURCE · MIT
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.
Counted from npm and GitHub on 2026-10-06.
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.
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.
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.
MIT licensed, on npm, self hostable. Bare metal or Railway, Turso or Postgres. No vendor holds the keys.
Every one is on npm under MIT. Pick the pieces you need; they do not require each other.
The app layer: shared modules, accounts, data, terminals and media.
Shared modules for Next and Node apps: referrals, email, payments and CrawlProof in one import.
btop-grade terminal dashboards for TypeScript from a one-import API. Dark by default.
Organizations, teams, members, roles and invites for Postgres. Bring your own users table.
Let a host site's signed-in users into an app over OAuth 2.1 with PKCE. No second signup.
A drop-in @libsql/client that talks to Postgres, plus the tools to move a Turso database over.
One web player for MP4, HLS, MPEG-TS and audio, with one control bar.
Contact-form spam stopped with a signed proof-of-render token. No captcha.
One way to add a feed to a directory, shared by every site that takes one.
One updater daemon for every listing site: jobs, refresh queues and resumable pipelines, polite and SSRF-safe fetching, SQLite or Postgres state.
Tools an agent can drive: MCP servers, data bridges and documents it can read.
A generic, modular server for the Model Context Protocol. Add a module, get a tool.
Browse collections, manage sources and feeds, and search datasets from a terminal or an agent.
Turn any video, audio file or book into a chaptered Markdown bundle you can hand to an LLM.
@profullstack/media2mdRead, write, merge and de-duplicate OpenProfile.md documents for people and agents.
An agent-friendly job board you self host. It posts its own jobs and never scrapes anyone else's.
Call the web through residential proxies, with each provider behind one interface.
Get paid by people and by machines: crypto checkout, x402 and pricing instead of 429s.
Non-custodial crypto payments: BTC, ETH, SOL, USDC and more, with x402 verify and settle.
Sell crawl access to AI training crawlers by the day over x402. Next and Hono adapters.
Pay x402 402s from JavaScript with a local key: a fetch, a CLI, and axios and got adapters.
An app-wide rate limit whose answer to going over is a price, not a 429.
Ed25519-signed Power Keys: one key that unlocks every Profullstack service.
A referral program SDK: 60% to the affiliate, 20% off for the new customer.
Release everywhere, watch everything, and keep the fleet up without a pager.
One codebase to every store, registry, CDN and channel. Build, promote, scale, iterate.
An all-in-one security daemon: monitor, detect, scan and protect servers in real time.
What the fleet costs and what it returns, in a live terminal dashboard over your traffic.
Notice when Postgres or Redis stops answering, and exit so the platform restarts you.
Quantum-resistant encryption: ML-KEM-1024 plus ChaCha20-Poly1305, wire compatible with qrypt.chat.
Mass email over the Resend batch API, with SMTP fallback.
@profullstack/emailerThe 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.
$ 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.
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.
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.
Every combo inherits these. A combo below only lists where it differs or adds.
Different stacks for different reasons. Each one names live products built on it.
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.
| Concern | Choice | Notes |
|---|---|---|
| Framework | Next 16, React 19 | App Router. proxy.ts, not middleware.ts. Server components by default. |
| API | Hono inside Next | Mounted under /api. Versioned routes live at /api/v1/... and OAuth callbacks at /api/v1/<provider>/<function>/<endpoint>. |
| Database | Turso (libSQL) via @libsql/client | Forward-only SQL migrations in packages/db, or Drizzle with dialect turso. Migrations must be safe to run twice concurrently. |
| UI | Tailwind 4 + shadcn/ui | Scoped behind a ui.css without preflight when adding to an existing site. Plain CSS modules on marketing sites. |
| Realtime | Server-Sent Events | WebSockets only for chat, terminals and multiplayer. |
| Background work | A worker process in the same container | Supervised by the entrypoint; the container exits non-zero when either process dies. BullMQ on Redis only when the queue is the product. |
| Storage | Railway volume or Cloudflare R2 | R2 buckets private, served through signed or proxied routes. |
| Layout | apps/web, packages/db, services/worker | Root-only vitest config, tsconfig.base.json with strict flags. Copy nightcell7 or reeleel rather than inventing a layout. |
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.
| Concern | Choice | Notes |
|---|---|---|
| Framework | Next 16, React 19 | Same conventions as web-app. |
| Database | Supabase Postgres, or self-hosted Postgres on Railway | Supabase 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. |
| Auth | Magic link + passkeys on the app's own users table | Supabase Auth exists in older apps; the local users.id is always the primary key. |
| Queues | BullMQ on Redis | Custom job ids must not contain a colon. |
| Migrations | supabase/migrations or plain SQL | Applied in CI or on boot, never by hand in the dashboard. |
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.
| Concern | Choice | Notes |
|---|---|---|
| Framework | Hono 4 | Web-standard Request/Response. Same app runs on Bun and Node; the router is the only Hono-specific code. |
| Runtime | Bun or Node, pinned | Bun 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. |
| Database | Turso (libSQL) | Embedded replica or remote. FTS5 for search, with the raw query escaped; libSQL cannot bind undefined. |
| Rate limiting | @profullstack/throttle | Credentialed callers get 600/min, anonymous 100/min, over the limit is a 402 with an offer. |
| Agent surface | MCP bridge in the CLI package | One query vocabulary across page, API, CLI and MCP. |
| Deploy | Railway, Dockerfile or Nixpacks | railway.json with healthcheckPath. Pin pnpm 10 on Nixpacks; corepack cannot launch pnpm 11. |
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.
| Concern | Choice | Notes |
|---|---|---|
| Runtime | Node 20+ (Bun optional) | Node is required: CLIs run in GitHub Actions and on customer machines. Bun is fine for development. |
| Arguments | commander | Subcommands map one to one onto MCP tools. |
| TUI | @profullstack/hqtui | btop-grade dashboards, one import. A mouse must work: one click unfolds, hover highlights. |
| Config | ~/.<tool>.json + @profullstack/synconfig | Allowlisted snapshot synced with the tool's cloud. |
| Install | npm i -g @profullstack/<tool> and curl | sh | The installer does the whole job. Never document a manual follow-up step. |
| Testing | node --test or vitest | bun test on Bun repos; mock.module is process-wide there. |
| Release | GitHub release workflow publishes to npm | Bump before testing. A brand-new scoped package 404s for minutes after publish. |
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.
| Concern | Choice | Notes |
|---|---|---|
| Shell | Electron | Tauri was tried and retired. |
| Inside | Hono or Next, same as the web surface | The renderer is the web app; the main process hosts the API locally. |
| CLI | Bundled via extraResources | The 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 modules | N-API only | Electron's ABI differs from system Node. @libsql/* passes; anything with V8 symbols does not. |
| Distribution | GitHub releases + curl installer | Headless machines get a CLI-only tarball. Homebrew, apt, rpm, scoop and nix repos exist for pairux. |
| Auto-update | From GitHub releases | Set the tool's NO_AUTO_UPDATE env when testing a dev binary. |
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.
| Concern | Choice | Notes |
|---|---|---|
| Renderer | Babylon.js | WebGPU where the browser has it, WebGL2 fallback. The fallback is a supported path, not a degraded one. |
| Physics | Havok via @babylonjs/havok | Only where real collision response is needed; most props are static. |
| Rules | A pure game-core package | No Babylon, no DOM, no Electron imports. This is the rule that makes a client and a server able to agree. |
| UI | Preact, outside the frame loop | The component layer never owns a per-frame transform. HUD readouts are text-node writes behind a change check, not a render pass. |
| Multiplayer | Server-authoritative over WSS | The client sends input intent. The server owns movement validation, damage, death, respawn and score. Shared messages live in their own protocol package. |
| Build | Vite + vite-plugin-pwa | Set registerType and actually wire the update prompt; prompt with no handler means returning players never get a new build. |
| API and data | Hono, Drizzle, Postgres | Same as api-service. Never cache /api, matchmaking or tickets in the service worker. |
| Desktop | Electron | The desktop combo applies unchanged; the renderer is the same web build. |
| Art | Generated by committed Blender scripts | No asset without provenance. One Blender metre is one game metre, GLB with glTF-compatible PBR, COL_ colliders and SOCKET_ attachment points. |
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.
| Concern | Choice | Notes |
|---|---|---|
| Framework | Expo (React Native) | React 19. Shares types and the API client with apps/web. |
| Layout | apps/mobile in the product monorepo | Standalone *-mobile repos are the old pattern and are dormant. |
| Backend | The product's own api-service or web-app | No separate mobile backend. |
| Store release | sh1pt | One codebase to every store, registry and channel. |
Code that two or more products need becomes a @profullstack/* package. Runtime-neutral core, subpath exports, one npm package per concern, released from GitHub.
| Concern | Choice | Notes |
|---|---|---|
| Shape | ESM, 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. |
| Core | Web-standard APIs | fetch, Request, Response, URL, crypto.subtle, ReadableStream. Runtime-specific code behind an adapter. A /core entry must never import a node: module. |
| Build | tsup or plain tsc | Node type-stripping needs .ts specifiers; pair with rewriteRelativeImportExtensions so dist still emits .js. |
| Tests | vitest | Contract tests where the package defines a protocol (x402, submit-feed, OpenProfile). |
| Release | Bump, merge, gh release | A release workflow publishes. Ship pkg@latest in docs, never update -g. pnpm 11 refuses packages younger than a day unless excluded from minimumReleaseAge. |
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.
The conventions an agent has to follow on any Profullstack repo, whichever combo it is on.
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.
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.
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.
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.
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.
The link proves the address and the address is the account. Passwords are optional and only for devices that cannot do either.
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.
PRs are merged, not parked. Release after merge. Then announce through myna, with rel=canonical on every syndicated copy.
Add the custom domain before writing any URL down. Never publish a *.up.railway.app address.
Web and worker both migrate on boot. Ledger writes are insert-or-ignore and every migration is safe to apply concurrently.
/sitemap.xml is an index; entities are chunked by month of creation so past files never change.
/api/v1/<provider>/<function>/<endpoint>, using whatever API prefix the project already has.
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.
Short sentences, no em dashes, no rule-of-three flourishes. This applies to posts, READMEs and announcements.
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.
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.
Things an agent might reach for by habit. Do not.
Every Profullstack product is built on this stack. The full list, with install commands, lives in the docs.
One senior engineer, a fleet of agents, and every change through review, tests and CI.
We build new products on it and move teams off per-project backends.