Skip to content

appstrate/appstrate

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1,084 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Appstrate

CI License: Apache-2.0 Docker Image Contributor Covenant Discord

An open-source platform for running autonomous AI agents in sandboxed Docker containers. Each agent receives its full context (prompt, config, input, credentials) and runs to completion without human interaction — then returns structured results. Connect OAuth/API key services, click "Run" or schedule via cron, and let the AI handle the rest.

Appstrate

Concepts

Appstrate uses the AFPS (Agent Format Packaging Standard) packaging model. Everything is a package with a manifest, a version, and a scope.

                ┌───────────────────────────────┐
  Goal          │  Agent                        │  "What should the AI accomplish?"
                │  prompt.md + manifest.json    │  Runs autonomously in a container.
                ├───────────────────────────────┤
  Capability    │  Skill       (declarative)    │  Reusable instructions (SKILL.md).
                │  MCP server  (executable)     │  Packaged MCP Bundle exposing tools.
                ├───────────────────────────────┤
  Connection    │  Integration                  │  OAuth 2.0, API key, basic, mTLS,
                │                               │  or custom auth for external services.
                └───────────────────────────────┘
  • An agent is the primary unit. It declares a goal (prompt.md), its dependencies (skills, mcp-servers, integrations), and input/output/config schemas. Each run creates a fresh Docker container, injects the prompt and credentials via a sidecar proxy, and produces a structured result.
  • A skill adds knowledge — reusable instructions the agent follows during a run (SKILL.md + the Anthropic Agent Skills format).
  • An mcp-server adds runnable tools. A packaged MCP Bundle (MCPB-vocabulary server / tools / user_config) that runs as a subprocess and speaks JSON-RPC. The agent calls its tools through the sidecar. server.type ∈ { node, python, binary, uv } with an optional _meta["dev.appstrate/mcp-server"].runtime: "bun" override for Bun-native servers.
  • An integration adds authenticated access to an external service. Declares a source (local mcp-server, remote MCP endpoint, or HTTP API), one or more auths methods, and delivery for credential injection. Supports OAuth 2.0 (with RFC 8414 discovery + RFC 8707 resource indicators + PKCE), API key, basic auth, mTLS, and custom credential flows.

Agents are prompt-driven: the AI coding agent inside the container interprets the goal and writes its own execution code. Change the prompt, change the behavior — no node graphs, no pre-scripted steps.

Features

  • Autonomous AI agents — Each run executes in an isolated Docker container with a Pi Coding Agent
  • Flexible authentication — Connect external services with OAuth 2.0 (RFC 8414 discovery + RFC 8707 resource indicators + PKCE), API key, basic auth, mTLS, and custom credential flows
  • Sandboxed runs — Containers are created, run, and destroyed per run
  • Sidecar isolation — Credential injection via a sidecar proxy (agent never sees raw credentials)
  • Cron scheduling — Schedule agents with cron expressions, distributed lock prevents duplicates
  • Package import — Import agents, skills, MCP servers, and integrations from ZIP/AFPS files
  • Skills & MCP servers — Extend agent capabilities with SKILL.md instructions and packaged MCP Bundles (server.type ∈ node | python | binary | uv)
  • Realtime — SSE-based run monitoring with LISTEN/NOTIFY
  • Multi-tenant — Organization-based isolation with role-based access (owner/admin/member)
  • API keys — Programmatic access via ask_* prefixed API keys
  • OpenAPI documentation — 258 endpoints documented at /api/openapi.json + Swagger UI at /api/docs
  • Connection profiles — Share connection sets across agents
  • Proxy system — Org-level and agent-level outbound HTTP proxy support

Self-Hosting

Deploy Appstrate with a single command. The installer drops the appstrate CLI on PATH and runs install --yes, which picks a tier based on what's available on the host — Tier 3 (PostgreSQL + Redis + MinIO) when Docker is reachable, Tier 0 (embedded Bun-only install) otherwise.

curl -fsSL https://get.appstrate.dev | bash

The CLI installs into ~/.local/bin (no sudo) and adds it to your PATH. For a system-wide install, prefix with APPSTRATE_BIN_DIR=/usr/local/bin (sudo will be requested). To skip the shell profile modification, set APPSTRATE_NO_MODIFY_PATH=1.

Once the tier is chosen, the CLI generates cryptographic secrets, writes .env + docker-compose.yml (Tiers 1/2/3) or clones the source + spawns bun run dev (Tier 0), waits for the healthcheck, and opens http://localhost:3000.

Customize the non-interactive install by forwarding flags through bash:

curl -fsSL https://get.appstrate.dev | bash -s -- --tier 1 --dir ~/apps/appstrate --port 4000

--tier, --dir, and --port override the smart defaults. Equivalent env vars: APPSTRATE_YES=1, APPSTRATE_PORT, APPSTRATE_BIN_DIR.

Want the interactive prompts? Drop the binary without auto-launching, then run install yourself:

curl -fsSL https://get.appstrate.dev | APPSTRATE_NO_LAUNCH=1 bash
appstrate install  # interactive tier + directory prompts

See apps/cli/README.md for the full CLI reference, and examples/self-hosting/ for manual Docker Compose setup.

Control from coding agents

The appstrate CLI is a first-class control plane for AI coding agents — Claude Code, Cursor, Codex, Gemini CLI, etc. Agents never see a raw bearer: the CLI injects Authorization: Bearer … + X-Org-Id from the OS keyring on every call, and the OpenAPI schema is explorable at human scale so the agent can discover the 258 endpoints on demand instead of flooding its context with the full spec.

# 1. Authenticate once — RFC 8628 device flow, tokens land in the OS keyring
appstrate login --instance https://app.example.com

# 2. Discover the API — filter, search, render as JSON for the agent to ingest
appstrate openapi list --tag runs --json
appstrate openapi show createRun --json      # fully dereferenced operation

# 3. Call the API — curl-compatible, bearer stays in the keyring
appstrate api POST /api/agents/:id/run -d @input.json

# 4. Scope to an org (auto-pinned on login when possible)
appstrate org switch acme                     # X-Org-Id sent on every subsequent call

Full recipe and flag reference: apps/cli/AGENTS.md. See apps/cli/README.md for the complete CLI documentation, including the full curlappstrate api mapping and profile management for multi-instance setups.

Quick Start (Development)

Prerequisites: Bun (v1.3+). Docker is optional.

git clone https://github.com/appstrate/appstrate.git
cd appstrate
bun install
cp .env.example .env
bun run dev       # → http://localhost:3000

No Docker, no PostgreSQL, no Redis — just Bun. Appstrate uses progressive infrastructure: it starts with an embedded database (PGlite) and local storage, then scales up to PostgreSQL, Redis, and S3 as you need them.

After signup, the onboarding flow guides you to create your first organization. See Contributing for the full development guide.

Progressive Infrastructure

Appstrate adapts to your infrastructure. Start minimal and add services as you grow — each tier works both as a development setup and a deployment target for small to medium workloads.

Tier Name Prerequisites Database Storage Queue Execution RAM (idle) RAM per run
0 Embedded Bun PGlite (embedded) Filesystem In-memory Bun subprocess ~300 MB +50-100 MB
1 Lightweight Bun + Docker PostgreSQL Filesystem In-memory Bun subprocess ~600 MB +50-100 MB
2 Persistent Bun + Docker PostgreSQL + Redis Filesystem BullMQ Bun subprocess ~700 MB +50-100 MB
3 Full Bun + Docker PostgreSQL + Redis + S3 S3 BullMQ Docker containers ~1.5 GB +200-300 MB

Tiers 0-2 run agents as Bun subprocesses — each concurrent run adds ~50-100 MB. On constrained hardware, limit parallel runs accordingly.

Tier 0 is ideal for personal use, small devices (Raspberry Pi 4+, NAS), or getting started with zero dependencies. Tiers 1-2 suit small teams and constrained servers. Tier 3 is for production with full container isolation.

Raspberry Pi: Bun supports ARM64 natively. A Raspberry Pi 4 (4 GB) handles Tiers 0-1 with 2-3 concurrent runs. A Pi 5 (8 GB) can run Tier 2 comfortably or Tier 3 with sequential runs.

Tier 0 is the default — bun run dev works immediately after install. To scale up:

# Tier 1: add PostgreSQL (persistent data, multi-user)
bun run docker:dev:minimal    # starts PostgreSQL
# → uncomment DATABASE_URL in .env

# Tier 2: add Redis (persistent scheduling, multi-instance)
bun run docker:dev:standard   # starts PostgreSQL + Redis
# → uncomment DATABASE_URL + REDIS_URL in .env

# Tier 3: full production stack
bun run docker:dev            # starts PostgreSQL + Redis + MinIO
# → uncomment DATABASE_URL + REDIS_URL + S3_BUCKET in .env
Full setup with Docker (Tier 3)
bun install
bun run setup     # copies .env, starts all Docker services, runs migrations, builds frontend
bun run dev       # → http://localhost:3000

Project Structure

appstrate/
├── apps/
│   ├── api/src/              # Hono API server (:3000)
│   │   ├── routes/           # Route handlers (one file per domain)
│   │   ├── modules/          # Built-in modules (oidc, webhooks) — owned schemas + routes
│   │   ├── services/         # Business logic, Docker, adapters, scheduler
│   │   ├── openapi/          # OpenAPI 3.1 spec (258 endpoints)
│   │   └── middleware/       # Auth, rate-limit, guards (requireAdmin, requireAgent)
│   │
│   ├── cli/                  # @appstrate/cli — channel-aware install + self-update + doctor
│   │
│   └── web/src/              # React 19 SPA (Vite + React Query v5 + Zustand)
│       ├── pages/            # Route pages (React Router v7)
│       ├── hooks/            # React Query + SSE realtime hooks
│       ├── components/       # UI components (modals, forms, editors)
│       └── stores/           # Zustand stores (auth, org, app, sidebar, theme)
│
├── packages/
│   ├── core/                 # @appstrate/core — shared validation, storage, utilities
│   ├── ui/                   # @appstrate/ui — React components (schema-form, widgets)
│   ├── afps-runtime/         # @appstrate/afps-runtime — portable AFPS bundle runner + signing + conformance
│   ├── mcp-transport/        # @appstrate/mcp-transport — MCP SDK adapter (sidecar tools surface)
│   ├── db/                   # @appstrate/db — Drizzle ORM + Better Auth
│   ├── emails/               # @appstrate/emails — email template registry + cloud override
│   ├── env/                  # @appstrate/env — Zod env validation
│   ├── shared-types/         # @appstrate/shared-types — Drizzle InferSelectModel re-exports
│   └── connect/              # @appstrate/connect — OAuth2/PKCE, API key, credential encryption (v1 envelope + multi-key keyring)
│
├── system-packages/           # System package ZIPs (skills, mcp-servers, integrations, agents — loaded at boot)
│
├── runtime-pi/               # Docker image: Pi Coding Agent SDK
│   ├── entrypoint.ts         # SDK session → HMAC-signed CloudEvents to platform sink
│   └── sidecar/server.ts     # Credential-isolating MCP server — first-party tools (run_history, recall_memory) + per-integration {ns}__api_call (+ optional {ns}__api_upload)
│
└── scripts/verify-openapi.ts # OpenAPI validation (coverage + structure + lint + Zod ↔ spec + Code ⊆ Spec)

API Overview

The API is organized into 30+ route domains with 258 documented endpoints:

Domain Description
Auth Better Auth email/password + cookie sessions
Agents Agent CRUD, config, skills/mcp-servers/integrations binding, versions, bundle export
Runs Run agents, list runs, logs, cancel, remote run minting + HMAC event ingestion + sink TTL extension
Realtime SSE streams for run monitoring (with Last-Event-ID resume)
Schedules Cron-based agent scheduling
Connections OAuth 2.0 / API key / basic / mTLS / custom service connections
Connection Profiles Shared connection sets across agents
Integrations Integration package configuration (OAuth 2.0 + discovery, API key, basic, mTLS, custom; source.kind = local | remote | api)
Model Provider Keys Org-level LLM model provider API key management (OpenAI, Anthropic, etc.) — distinct from AFPS integrations
Proxies Org-level and agent-level HTTP proxy config
API Keys Programmatic access tokens (ask_*)
Packages Org packages CRUD, import (incl. .afps-bundle multi-package), publish, dist-tags, version pinning
Library Consolidated package list with per-app install state
Notifications Run notification management
Organizations Org CRUD, members, invitations
Profile User profile management
Invitations Magic link invitation acceptance
Welcome Post-invite profile setup
Internal Container-to-host routes (credentials, run history)
Meta OpenAPI spec + Swagger UI
Models Org-level LLM model configuration and testing
Health Health check
Applications Primary workspace boundary — scopes agents, runs, schedules, webhooks, connections, packages, end-users
App Profiles Application-scoped connection profile management
End-Users External end-user management for headless API (cursor pagination via startingAfter/endingBefore)
Webhooks Run event webhooks with HMAC signing (Standard Webhooks)
Credential Proxy Server-side credential injection for external runners (5 verbs: GET/POST/PUT/PATCH/DELETE)
LLM Proxy Server-side LLM model injection — OpenAI + Anthropic protocol families
OAuth Clients OIDC module — instance/end-user OAuth 2.1 client management
CLI Sessions OIDC module — admin oversight of CLI sessions per org (cli-sessions RBAC resource)

Agent runtime — MCP-only

Agents inside the sandboxed container interact with the platform exclusively through MCP (Model Context Protocol). The sidecar exposes /mcp as a Streamable HTTP server; the agent never sees raw credentials, the platform API URL, or HTTP routes. First-party tools cover platform capabilities; per-integration tools cover outbound service access:

  • run_history({ limit?, fields? }) — past-run metadata via per-run signed token.
  • recall_memory({ query?, limit? }) — search the agent's archive memories written via the note(content) built-in runtime tool.
  • Per spawned integration the sidecar exposes {ns}__api_call({ method, target, headers?, body?, responseMode? }) — credentials injected server-side; URLs validated against the integration's auths.{key}.authorized_uris. Optional {ns}__api_upload when the integration declares source.api.upload_protocols.
  • Integrations backed by an MCP server (source.kind = local or remote) additionally surface their own tools under the same {ns}__{tool} prefix.

The agent's primary completions are served by the sidecar's /llm/* HTTP passthrough route the Pi SDK calls natively; sub-agent flows are handled by spawning a separate run via the platform API. The legacy HTTP /proxy and /run-history routes have been retired — runners 1.x are not compatible with the current platform. See packages/mcp-transport/README.md and runtime-pi/sidecar/README.md.

API Documentation

  • Interactive docs: GET /api/docs — Swagger UI, try endpoints in your browser
  • OpenAPI spec: GET /api/openapi.json — Raw OpenAPI 3.1 specification
  • Validation: bun run verify:openapi — Structural + lint checks (0 errors/warnings required)

Architecture

Browser (React SPA)              Platform (Bun + Hono :3000)
    |                                |
    |-- Login/Signup --------------->|-- Better Auth (cookie session)
    |-- POST /api/agents/:id/run ->|
    |                                |-- Validate → Create run → Fire-and-forget
    |<-- SSE (realtime) ------------|-- LISTEN/NOTIFY → SSE stream
    |                                |
    |   Docker network (isolated):   |
    |   ┌─────────────────────┐      |
    |   │  Sidecar Container  │      │-- Credential injection proxy
    |   │  Agent Container    │      │-- Pi SDK → JSON lines stdout
    |   └─────────────────────┘      |
  • Sidecar pool: Pre-warmed containers for fast startup
  • Parallel setup: Sidecar + agent creation run concurrently
  • Credential isolation: Agent calls sidecar proxy; never sees raw credentials
  • Output validation: Native LLM schema enforcement + AJV post-validation against output schema

Environment Variables

All variables are listed in .env.example with dev-ready defaults. The authoritative validation source is packages/env/src/index.ts (Zod schema).

Variable Required Default Description
DATABASE_URL No PostgreSQL connection. Absent = PGlite (embedded)
BETTER_AUTH_SECRET Yes Session signing secret
BETTER_AUTH_ACTIVE_KID No k1 Active key id for cookies/HMACs WE sign (rotation support)
BETTER_AUTH_SECRETS No {} JSON map { kid: secret } — verifier accepts every kid present (rotation window)
UPLOAD_SIGNING_SECRET Yes HMAC secret for FS upload-sink tokens (rotates independently of BETTER_AUTH_SECRET)
CONNECTION_ENCRYPTION_KEY Yes 32 bytes base64 — primary key for v1 credential envelope
CONNECTION_ENCRYPTION_KEY_ID No k1 Active kid embedded in newly-encrypted credential blobs (must match /^[A-Za-z0-9_-]{1,32}$/)
CONNECTION_ENCRYPTION_KEYS No {} JSON map { kid: base64-32B-key } — retired keys held for decrypt-only during rotation window
REDIS_URL No Redis connection. Absent = in-memory adapters (single-instance)
S3_BUCKET No S3 bucket. Absent = filesystem storage (FS_STORAGE_PATH)
S3_REGION No S3 region. Required when S3_BUCKET is set
S3_ENDPOINT No Custom S3 endpoint (for MinIO/R2)
S3_PUBLIC_ENDPOINT No Browser-facing S3 endpoint for presigned URLs (falls back to S3_ENDPOINT)
FS_STORAGE_PATH No ./data/storage Filesystem storage path (used when S3_BUCKET is absent)
PGLITE_DATA_DIR No ./data/pglite PGlite data directory (used when DATABASE_URL is absent)
RUN_TOKEN_SECRET No Run token signing secret
APP_URL No http://localhost:3000 Public URL for OAuth callbacks
TRUSTED_ORIGINS No http://localhost:3000,http://localhost:5173 CORS origins (comma-separated)
TRUST_PROXY No false false (XFF ignored) | true (1 hop) | N trusted proxy hops — critical for per-IP rate limiters
PORT No 3000 Server port
NODE_ENV No development development | production | test — gates production-only invariants (e.g. APP_URL https)
API_BODY_LIMIT_BYTES No 10485760 Global request body cap (Hono bodyLimit middleware)
MODULES No oidc,webhooks Comma-separated module specifiers loaded at boot
DOCKER_SOCKET No /var/run/docker.sock Docker socket path
PLATFORM_API_URL No How sidecar reaches host (fallback: Docker bridge auto-detection / host.docker.internal:{PORT})
SYSTEM_PROVIDER_KEYS No [] JSON array of system provider keys with nested models
SYSTEM_PROXIES No [] JSON array of system proxy definitions
PROXY_URL No Outbound HTTP proxy for sidecar containers
LOG_LEVEL No info debug | info | warn | error
RUN_ADAPTER No process Execution backend: docker or process
SIDECAR_MAX_REQUEST_BODY_BYTES No 10485760 (10 MB) Sidecar inbound POST size cap (hard ceiling 100 MB; loud-fail at boot if invalid)
SIDECAR_MAX_MCP_ENVELOPE_BYTES No 16777216 (16 MB) MCP envelope cap, sized for base64 inflation
PI_IMAGE No appstrate-pi:latest Docker image for the Pi agent runtime (slim — 313 MB)
SIDECAR_IMAGE No appstrate-sidecar:latest Docker image for the sidecar proxy
COOKIE_DOMAIN No Cookie domain for cross-subdomain auth
GOOGLE_CLIENT_ID No Google OAuth client ID (enables Google sign-in)
GOOGLE_CLIENT_SECRET No Google OAuth client secret
GITHUB_CLIENT_ID No GitHub OAuth App client ID (enables GitHub sign-in)
GITHUB_CLIENT_SECRET No GitHub OAuth App client secret
SMTP_HOST No SMTP server host (enables email verification)
SMTP_PORT No 587 SMTP server port
SMTP_USER No SMTP authentication username
SMTP_PASS No SMTP authentication password
SMTP_FROM No Sender email address for verification emails
LEGAL_TERMS_URL No Footer link to terms (optional)
LEGAL_PRIVACY_URL No Footer link to privacy policy (optional)
AUTH_DISABLE_SIGNUP No false Closed mode — block account creation (3 exceptions: pending invite, platform admin, bootstrap owner)
AUTH_DISABLE_ORG_CREATION No false Restrict POST /api/orgs to platform admins; org-less users see "waiting for invitation"
AUTH_PLATFORM_ADMIN_EMAILS No "" Comma-separated email allowlist of platform-level admins (bypasses signup/org disable)
AUTH_ALLOWED_SIGNUP_DOMAINS No "" Comma-separated email domain allowlist (case-insensitive)
AUTH_BOOTSTRAP_OWNER_EMAIL No "" Auto-create root org with this user as owner on first signup (idempotent)
AUTH_BOOTSTRAP_ORG_NAME No Default Display name of the bootstrap org
AFPS_TRUST_ROOT No [] JSON array of trusted publishers for .afps-bundle Ed25519 signature verification
AFPS_SIGNATURE_POLICY No off off | warn | required — bundle signature enforcement at load
OIDC_INSTANCE_CLIENTS No [] JSON array of instance-level OAuth clients (admin dashboards, satellite apps) — reconciled at boot
PLATFORM_RUN_LIMITS No {} JSON caps applied to EVERY run (timeout ceiling, per-org rate, max concurrent)
INLINE_RUN_LIMITS No {} JSON caps for POST /api/runs/inline (manifest size, prompt size, skill/tool counts, retention)
LLM_PROXY_LIMITS No {} JSON caps for /api/llm-proxy/* (per-call rate, max request bytes)
CREDENTIAL_PROXY_LIMITS No {} JSON caps for /api/credential-proxy/proxy (per-call rate, request/response body, cookie-jar TTL)
REMOTE_RUN_SINK_DEFAULT_TTL_SECONDS No 7200 Default sink TTL when caller doesn't request one
REMOTE_RUN_SINK_MAX_TTL_SECONDS No 86400 Hard ceiling on caller-requested sink TTL
REMOTE_RUN_REPLAY_WINDOW_SECONDS No 600 Redis dedup window for webhook-id replay detection
REMOTE_RUN_BUFFER_FLUSH_MS No 5000 Out-of-order event buffer flush window (terminal events flush immediately)
RUN_HEARTBEAT_INTERVAL_SECONDS No 15 Runner-side heartbeat cadence
RUN_STALL_THRESHOLD_SECONDS No 60 Watchdog stall threshold (rule of thumb: ≥ 3 × heartbeat interval) — backstop for hard runner crashes
RUN_WATCHDOG_INTERVAL_SECONDS No 15 Watchdog sweep interval

Development

bun run setup            # One-command dev bootstrap (first time only)
bun run dev              # Start API + web (turbo, hot-reload)
bun run check            # TypeScript + ESLint + Prettier + OpenAPI validation
bun test                 # All tests (~1000) — requires Docker
bun run db:generate      # Generate Drizzle migrations from schema changes
bun run db:migrate       # Apply migrations
bun run build            # Build everything (turbo)
bun run build-runtime    # Build agent Docker image (only if you modify runtime-pi/)
bun run build-sidecar    # Build sidecar Docker image (only if you modify runtime-pi/sidecar/)

Testing

bun test                          # All tests (~1000), all packages — requires Docker
bun test apps/api/test/unit/      # API unit tests only (fast, no DB)
bun test apps/api/test/           # API unit + integration
bun test runtime-pi/              # Runtime + sidecar tests

Test infrastructure (PostgreSQL, Redis, MinIO, DinD) is started automatically by the preload script on first run. Framework: bun:test. See CLAUDE.md Testing section for conventions and patterns.

Tech Stack

  • Runtime: Bun
  • API: Hono (SSE, middleware, routing)
  • Database: PostgreSQL 16 + Drizzle ORM
  • Auth: Better Auth (cookie sessions) + API keys (ask_*)
  • Frontend: React 19 + Vite + React Router v7 + React Query v5 + Zustand
  • Styling: Tailwind CSS 4 (@tailwindcss/vite plugin + tailwind-merge, dark theme via @theme inline)
  • i18n: i18next (fr default, en)
  • Docker: fetch() + unix socket (not dockerode)
  • Scheduling: BullMQ (Redis-backed distributed cron) + cron-parser
  • Validation: AJV (config/input/output), Zod (env), @appstrate/core (manifests)
  • Build: Turborepo + Bun workspaces
  • Code quality: ESLint + Prettier + OpenAPI lint (@redocly/openapi-core)

FAQ

Can I self-host Appstrate? Yes. Run curl -fsSL https://get.appstrate.dev | bash to install with automatic secret generation and Docker Compose setup. See Self-Hosting and examples/self-hosting/ for configuration.

What LLM providers are supported? Any provider compatible with the Pi Coding Agent SDK. Configure via SYSTEM_PROVIDER_KEYS or the org-level model settings UI.

How is this different from workflow automation tools? Appstrate runs autonomous AI agents in isolated containers, not predefined step-by-step workflows. Each agent is prompt-driven — the agent decides how to process data.

Is this production-ready? The platform is actively used in production. See SECURITY.md for the threat model and defense layers, and CHANGELOG.md for release history.

Community

Support

Contributing

See CONTRIBUTING.md for development setup, conventions, and pull request process.

License

Apache License 2.0

About

[⚡️] The open‑source managed agent runtime platform.

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Packages

 
 
 

Contributors