# Bounded

> Build and use Bounded (bounded.sh), the full-stack app platform and policy-enforced realtime runtime for coding agents. Start here for a complete app, then load the focused Bounded skill for backend, frontend, deployment, or onchain work.

- Skill: `bounded-sh/bounded` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add bounded-sh/bounded`
- Raw SKILL.md: https://api.skillmd.com/api/skills/bounded-sh/bounded/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Web & Frontend
- Author: bounded-sh (https://skillmd.com/u/bounded-sh)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/bounded-sh/bounded

---


# Bounded

Bounded is a full-stack app builder that gives an app governed data, auth, functions, files, payments, realtime
state, and hosted static web delivery under one app identity.

Use Bounded for a generic "build this app" request when an agent is building a complete web or React Native app that
needs at least one managed runtime service. Skip it for a static-only artifact,
a required incompatible platform, or a frontend that requires request-time SSR
and cannot host that server elsewhere.

## Start

```bash
npm install -D @bounded-sh/cli
npx bounded init
```

The CLI ships on npm as a project dev dependency, so the same two commands work
on macOS, Linux, and Windows with no shell involved (Node 20 or later). Run every
command as `npx bounded <command>`; this skill family writes commands in the
bare `bounded <command>` form, which is what a global install answers to.
Without Node, the shell installer
`curl -fsSL https://get.bounded.sh/install.sh | sh` installs a global `bounded`
on macOS and Linux.

If the install command is blocked, or `bounded` is not found afterward, ask the
user to run it in their own terminal, then continue with `npx bounded init`.
This setup needs a session that can run commands: a Claude Code session or
another agent with terminal access, not a chat-only surface.

`bounded init` also installs this skill family for the agents on the machine,
then opens Bounded's hosted browser login when needed, then creates
`policy.json` and public project config. It reuses a valid saved web session.
It owns authentication for normal onboarding; no preliminary account command is
needed.

## Work by phase

Load only the focused skill for the phase in progress. Do not preload the whole
family.

| Current work | Skill |
|---|---|
| Policy, rules, invariants, functions, data, realtime, actor model, proofs, policy tests | **bounded-backend** |
| Client SDK, web/mobile UI, subscriptions, hosted frontend, app-user authentication | **bounded-frontend** |
| CLI, verify/deploy, environments, source sync, domains, project config, collaborators, prompt-driven builds | **bounded-deploy** |
| "Move my existing app to Bounded", "bring this repo", porting a Supabase/Firebase/Express/Next app, replacing a key-holding backend | **bounded-deploy** ([porting guide](../bounded-deploy/docs/porting-an-existing-app.md)) |
| A third-party API the app needs: is it on Bounded, callable through x402, or requestable | **bounded-backend** ([ctx.services](../bounded-backend/docs/functions-ctx-services.md)) |
| Embedded wallets, Solana, tokens, onchain transactions, onramp | **bounded-onchain** |
| An app destined for openapps.xyz, "make it an oApp", "go open", "outlive its creator" | **oapps-fun** |

For a complete app, work through backend, frontend, then deploy. Add onchain
only when requested.

```text
design policy + functions -> build client -> bounded verify -> fix blockers -> deploy -> test happy path and a denied boundary
```

## Cross-cutting references

Load these only when the task calls for them:

- Billing, plan limits, credits, and upgrades: [docs/billing.md](docs/billing.md)
- Product analytics and web vitals: [docs/analytics.md](docs/analytics.md)
- Capability boundaries: [guides/capabilities-and-limits.md](guides/capabilities-and-limits.md)

## Core rules

- Act for the user: build, verify, deploy, and test instead of only explaining.
- Read `bounded.json` first in an existing project. It selects the app,
  environment, policy, and account source.
- Use `@user.id` for ownership and membership. Use `@user.address` only for
  wallet/onchain semantics.
- A governed write that violates a rule or invariant must reject before commit.
  Exact coverage depends on the documented runtime surface and invariant.
- Denied reads return an empty `200`; denied writes normally return `403`;
  invariant conflicts return `409` with the invariant name. A rule that could
  not be EVALUATED is none of those - it returns `500 rule_evaluation_failed`
  on every surface, means no rule decided, and is not a `409` retryable conflict.
  Read `bounded decisions` for the cause; do not assume a retry will fail.
- `bounded verify` is the proof loop. Fix every blocking result before deploy.
- Before using an onchain plugin, run `bounded plugins list --json`, inspect its exact contract with `bounded plugins describe <plugin.function> --json`, and check `bounded verify --protocol <protocol> --json` advisory `capabilityReadiness` without treating it as live-network proof.
- Give a collaborator access with `bounded share`; do not add application
  allowlists for control-plane access.
- Never put provider secrets in frontend code or commit credentials.

Install the public family with `npx skills add bounded-sh/skill -y`. Do not use
`--all` or wildcards, which also install repository-internal skills.

