OpenModel is a gateway-first local model runtime distributed as @wundercorp/openmodel, with a baseui.sh-powered dashboard, a separate marketing site, and a separately deployable cloud API.
https://doku.sh/#/i/a8cb5b73686a2bd50e-511db60796c841 Auto-Generated via https://doku.sh
It provides:
om pullfor Hugging Face GGUF files, direct artifact URLs, Ollama model references, and contributed gatewaysom runfor llama.cpp and Ollama runtimesom servewith OpenAI-compatible and Ollama-compatible local endpointsom capacityfor pricing and publishing provider GPU inventoryom providerfor worker enrollment, heartbeats, assignment processing, earnings, and payouts- A hyperscaler master control plane with reservations, metering, fee snapshots, disputes, and settlement states
- A dashboard GPU marketplace with worker health, earnings, payout setup, and public availability
- Explicit gateway package registration with a versioned SDK contract
- OIDC device login for the CLI through
auth.wundercorp.co - OIDC Authorization Code with PKCE for the website
- AWS Lambda and API Gateway deployment for the cloud layer
- AWS S3 and CloudFront deployment for the production website
- Optional Cloudflare Worker and Pages deployment
- Static website deployment through Docker or Kubernetes
- An
@wundercorp/baseui-powered dashboard, typed design tokens, Phosphor-backed icons, and a living component catalogue
apps/cli @wundercorp/openmodel npm package
apps/web openmodel.sh React website
apps/cloud optional Cloudflare Worker cloud API
apps/aws-api AWS Lambda cloud API
packages/gateway-sdk public gateway authoring contract
gateways/ first-party and example gateway packages
deploy/terraform/aws Route 53, CloudFront, S3, API Gateway, Lambda, DynamoDB
deploy/terraform/cloudflare optional Cloudflare infrastructure
deploy/ Docker and Kubernetes manifests
npm install --global @wundercorp/openmodel
om doctorom pull hf://TheBloke/TinyLlama-1.1B-Chat-v1.0-GGUF/tinyllama-1.1b-chat-v1.0.Q4_K_M.gguf --alias tinyllama
om run tinyllama "Write a four-line poem about local inference."Use an existing Ollama model:
om pull ollama://qwen2.5:3b
om run qwen2.5:3b "Explain gateway interoperability."Start the local API. A default model is optional, so the dashboard can connect before anything is installed:
om serve --port 11435
curl http://127.0.0.1:11435/v1/modelsThe local server supports:
GET /healthGET /v1/modelsGET /v1/model-catalogPOST /v1/models/installGET /v1/model-installs/:jobIdGET /v1/runtime-statusGET /v1/metricsPOST /v1/metrics/resetPOST /v1/chat/completionsGET /api/tagsPOST /api/generate
The web dashboard uses the catalog and install-job endpoints for a one-click starter-model download with local progress reporting. Its Metrics route remains usable without authentication for local request counts, estimated token usage, latency, throughput, runtime activity, per-model usage, and recent requests. Authenticated sessions also load the Wundership monthly allowance, provider/model pricing estimates, local-versus-cloud cost comparisons, usage and cost charts, and idempotent usage synchronization. Installation and metrics-reset requests remain restricted to configured browser origins.
OpenModel supports a master/worker marketplace: the cloud hyperscaler is the authenticated control-plane master, while provider-owned GPU machines are worker nodes that make outbound heartbeat and assignment-poll requests. Public listings never reveal worker credentials, private network details, or unallocated endpoints.
Fast provider setup:
om login
om provider enroll \
--name worker-1 \
--endpoint https://gpu-provider.example.com/v1
om provider agent --interval-seconds 30
om capacity expose \
--node-id <node-id> \
--price-hour 0.75 \
--allocation EXCLUSIVEThe agent detects NVIDIA hardware through nvidia-smi when available, stores a one-time node token with mode 0600, sends heartbeats, and pulls assignments. It deliberately does not execute arbitrary buyer commands automatically. Providers explicitly accept, start, meter, complete, or fail each reservation:
om provider assignments
om provider accept <reservation-id>
om provider start <reservation-id>
om provider usage <reservation-id> --sequence 1 --billable-seconds 300
om provider complete <reservation-id> --sequence 2 --billable-seconds 3600Completed usage creates an earning after the configured hold period. Payout destinations are processor-issued references that require hyperscaler verification:
om provider earnings
om provider payout-profile --method STRIPE_CONNECT --destination-reference acct_123
om provider payout --currency USDThe AWS implementation uses DynamoDB transactions to update listing capacity, physical-node reservations, reservation state, earnings, and payout claims. Assignment expiration releases abandoned capacity, multiple listings cannot overbook one node, usage is monotonic and capped, contract-sensitive listing fields are locked during active reservations, and payout destination changes reset verification.
The public API is available under both hostnames when both custom domains point to the same deployment:
https://api.openmodel.sh/v1/capacity/gpu
https://api.walton.bot/v1/capacity/gpu
Cloudflare KV remains suitable for public inventory and development. Transactional allocation and settlement fail closed by default because KV cannot guarantee protection against overbooking or double payout. Use AWS as the production hyperscaler master or add a strongly consistent Cloudflare coordinator.
See docs/gpu-capacity.md, docs/gpu-provider-marketplace.md, and docs/openapi-gpu-capacity.json.
The dashboard consumes the independently published @wundercorp/baseui package. The component library is no longer copied into this repository or linked as a workspace package.
Install dependencies normally from the repository root:
npm installThe web workspace imports the package stylesheet once in apps/web/src/main.tsx:
import "@wundercorp/baseui/styles.css";Shared dashboard primitives are exposed through apps/web/src/components/ui.tsx, which keeps product imports stable while resolving them to the external package. The dashboard uses baseui.sh buttons, cards, badges, code blocks, semantic icons, tokens, and the full Phosphor passthrough entry point. The marketing home page retains its existing visual language.
Run the web app and open /baseui to review the component catalogue in the OpenModel application:
npm run dev:webThe reusable library itself lives at:
https://github.com/wundercorp/baseui
See docs/baseui-integration.md, docs/baseui-design-language.md, and docs/baseui-validation.md for the integration boundary and dashboard-specific usage rules.
Gateways normalize external model catalogs and artifact sources into a stable descriptor. Runtimes are separate from gateways, so one gateway can feed multiple local runtimes and one runtime can execute models from multiple gateways.
Built-in gateway reference formats:
hf://owner/repository/path/to/model.gguf?revision=main
https://example.com/model.gguf
ollama://model:tag
Third-party gateway packages are explicit and opt-in:
om gateway add @acme/openmodel-gateway-modelhub
om gatewaysSee docs/gateway-authoring.md and gateways/example-gateway.
The CLI uses OAuth 2.0 Device Authorization Grant when supported by the configured issuer:
om login
om whoami
om logoutDefaults can be overridden with:
OPENMODEL_AUTH_ISSUER
OPENMODEL_AUTH_CLIENT_ID
OPENMODEL_AUTH_AUDIENCE
OPENMODEL_CLOUD_API_URL
Expired CLI access tokens are refreshed automatically when a refresh token is available. Protected API deployments must accept the CLI app client ID in AUTH_AUDIENCE in addition to the web app client ID.
The website uses Authorization Code with PKCE and stores access tokens in session storage rather than local storage.
npm install
npm run check
npm test
npm run buildSee LOCAL.md for complete CLI, website, cloud API, Docker Compose, authentication, gateway-plugin, and pre-deployment instructions.
Preview the next CLI patch version without changing files:
npm run version:bump -- patch --package cli --dry-runCreate, validate, commit, push, publish, and tag a CLI patch release:
./release.sh patch \
--package cli \
--commit \
--push \
--publish \
--tag \
--yesSDK increments automatically update the CLI dependency and give the CLI its own release bump. See RELEASING.md for prereleases, GitHub tag publication, and all available options.
The production domain is hosted in Route 53, so AWS is the default provider.
Create the protected configuration:
cp env.deploy.example .env.deploy
chmod 600 .env.deployValidate without deploying:
./deploy.sh --validate-onlyReview the Terraform plan:
./deploy.sh --plan-onlyDeploy the website and API without publishing npm packages:
./deploy.sh --yesDeploy and explicitly publish the npm packages:
./deploy.sh --publish-npm --yes
When package contents changed but the current version is already on npm, deployment automatically selects an unpublished patch version for the affected package.Initialize and push the source repository separately:
./git-init.sh
GIT_REMOTE_URL="git@github.com:wundercorp/openmodel.git" ./git-push.shOr compose Git with deployment:
./deploy.sh \
--git-init \
--git-push \
--git-remote-url git@github.com:wundercorp/openmodel.git \
--yesThe AWS deployment verifies and uses the existing Route 53 hosted zone and assigned name servers, private S3 storage, CloudFront, ACM, API Gateway, Lambda, DynamoDB, CloudWatch, and an encrypted remote Terraform state bucket. See DEPLOY.md and GIT.md.
The optional Cloudflare deployment remains available:
./deploy.sh --provider cloudflare --yesLocal composition remains available with:
docker compose -f deploy/docker/compose.yaml up --buildKubernetes manifests live in deploy/kubernetes. They contain no credentials and use a separately created Secret for environment-specific values.
OpenModel can only run formats supported by an installed runtime. The included llama.cpp adapter targets GGUF artifacts. The Ollama adapter targets models supported by the local Ollama installation. Other formats and remote providers belong in runtime or gateway plugins rather than hard-coded CLI branches.
Apache-2.0
OpenModel can collect token and cost usage from Claude Code, Codex, OpenRouter, BuilderStudio, and other cloud-backed agents through OTLP logs or normalized local usage events. Collection stays local until om telemetry sync is run. See Cloud Agent Session Telemetry.
om setup
om serve --port 11435
om setup claude-code --launch
om telemetry summary
om telemetry sync