PULSE
Sprintsail v1SDK + sail CLI shipped — Apache 2.0 — install with npm i @sprintsail/sdk
///
9 PrimitivesFunction · Worker · CronJob · WebApp · API · Database · Bucket · Queue · Secret
///
Two Targetsaws — your account, your bill — sprintsail-runtime — managed K8s, no lock-in
///
sail migrateaws → sprintsail-runtime end-to-end — infra · secrets · data — verified live
///
Open SourceKnative · CloudNativePG · MinIO · RabbitMQ · sealed-secrets · Contour · cert-manager
///
Sprintsail v1SDK + sail CLI shipped — Apache 2.0 — install with npm i @sprintsail/sdk
///
9 PrimitivesFunction · Worker · CronJob · WebApp · API · Database · Bucket · Queue · Secret
///
Two Targetsaws — your account, your bill — sprintsail-runtime — managed K8s, no lock-in
///
sail migrateaws → sprintsail-runtime end-to-end — infra · secrets · data — verified live
///
Open SourceKnative · CloudNativePG · MinIO · RabbitMQ · sealed-secrets · Contour · cert-manager
///
Now Shipping — SDK v1 + sail CLI + Sprintsail Runtime alpha

Ship apps. To any runtime.
Lock in nothing.

Sprintsail is an opinionated TypeScript IaC SDK. Declare your app — Function, Database, Bucket… — then sail deploy to AWS. When you're ready, sail migrate to a managed Kubernetes runtime you own — infrastructure, secrets, and data. Same handler code. Apache 2.0.

~/orders · sail migrate aws → sprintsail-runtime verified live
Plan
Provision
Data
Cutover
Live
$sail migrate --from aws --to sprintsail-runtime --yes
[k8s/database] created Cluster sail-orders/orders
[k8s/secret] created SealedSecret (encrypted at rest)
[k8s/migrate] database copied AWS RDS → CNPG/app
✓ secret value copied Secrets Manager → SealedSecret
→ orders-web.runtime.example.com
database ordersRDS → CloudNativePG · 4 rowsmigrated
secret api-keySecrets Manager → SealedSecretmigrated
webapp webECS Express → Deployment + Ingressrolling
project: orders · source: aws:us-east-1 destination: sprintsail-runtime:prod
9
Primitives
2
Targets · AWS + Runtime
1
CLI · sail
0
Vendor lock-in
// How it works

Declare. Bind. Deploy. Migrate.

Five steps from npm install to a workload running on the runtime you choose. Same handler code, every step.

📦
Install the SDK

Add @sprintsail/sdk + @sprintsail/cli to your project. Node 20+. Apache 2.0. Nothing to license.

npm install @sprintsail/sdk @sprintsail/cli
🧱
Declare primitives

infra.ts describes your app — Function, WebApp, Database, Secret, … Nine primitives, one mental model.

new WebApp(app, …)
🔗
Bind & build

Bind resources to compute primitives. Your handler imports db from infra.ts and calls db.query(...). The runtime adapter wires it up.

bindings: { db, apiKey }
🚀
Deploy

One command provisions Lambda + ECS + RDS + S3 + … on AWS, or Knative + CNPG + MinIO + … on the Sprintsail Runtime. Idempotent.

sail deploy --yes
Migrate without rewriting

When you're ready to leave your cloud, sail migrate moves the infra, secrets, and data to the new target. Handler code doesn't change.

sail migrate --from aws --to sprintsail-runtime
Open-source under the hood →
AWS Lambda ECS Express (Fargate) API Gateway v2 EventBridge Scheduler RDS · S3 · SQS · Secrets Manager Knative Serving CloudNativePG MinIO RabbitMQ Cluster Operator sealed-secrets Contour cert-manager AWS Lambda ECS Express (Fargate) API Gateway v2 EventBridge Scheduler RDS · S3 · SQS · Secrets Manager Knative Serving CloudNativePG MinIO RabbitMQ Cluster Operator sealed-secrets Contour cert-manager
// Nine primitives. Two targets.

Everything your app needs.
Declared in TypeScript.

Each primitive is a stable contract — Database means "managed Postgres I can db.query(sql) against." Below: nine of those contracts, with the open-source resources they map to on each target.

λ
Function

Event-driven, scale-to-zero unit of compute. AWS Lambda. Knative Service on the runtime. Same handler code.

Worker

Queue consumer. AWS Lambda + SQS event-source mapping. In-process consume loop on the runtime — with dead-letter handling.

CronJob

Scheduled handler. EventBridge + Lambda on AWS. Native Kubernetes CronJob on the runtime. Linux cron, EventBridge cron, or rate() all accepted.

WebApp

Long-running HTTP server. ECS Express (Fargate) on AWS. Deployment + Service + Contour Ingress on the runtime. DB pools persist; no cold starts.

🌐
API

Request-driven HTTP. Lambda + API Gateway v2 on AWS. In-cluster gateway shim + Ingress on the runtime. Same event shape on both.

🗄
Database

Managed Postgres. RDS on AWS. CloudNativePG on the runtime. db.query(sql) works identically on both.

📦
Bucket

Object store. S3 on AWS. MinIO on the runtime. S3-compatible API on both — your code uses @aws-sdk/client-s3 against either.

📨
Queue

Durable message queue. SQS on AWS. RabbitMQ Cluster Operator on the runtime. queue.publish(msg) on both.

🔑
Secret

Encrypted credential. AWS Secrets Manager. sealed-secrets on the runtime (encrypted at rest). secret.value() on both.

// The contract

Primitives are the boundary.
Targets do the work.

Your code imports primitives from infra.ts and calls methods on them — db.query(), bucket.put(), secret.value(). The primitive contract is the stable boundary; everything below is the target's implementation detail.

This is exactly what makes sail migrate possible. Swap the target; the contract holds; the handler doesn't change.

Your handler — await db.query(sql)Your code
@sprintsail/sdk — primitives + bindingsStable contract
↓ Primitive boundary ↓
Runtime adapter — connects bindings to a real clientTarget-specific
Provider — provisions, destroys, migrates resourcesTarget-specific
AWS — Lambda, ECS, RDS, S3, SQS, Secrets Manageraws
Sprintsail Runtime — Knative, CNPG, MinIO, RabbitMQ, …sprintsail-runtime
// The sail CLI

Four commands.
One mental model.

Everything you do is one of these. Full reference in the docs.

01 — sail deploy

Provision + deploy. Idempotent.

Walks every primitive in infra.ts, provisions each (adopting existing where present), threads attributes to downstream bindings, then runs the deploy phase. Re-run anytime — it only rolls what changed.

# first time and every time
$ sail deploy --yes
[aws/database] creating orders-orders
[aws/webapp] docker push 107…ecr…/orders-web
✓ Deploy complete.
02 — sail migrate

Move between targets without rewriting.

Reads source state, provisions equivalents on the destination, copies stateful data — RDS rows to CloudNativePG via in-cluster pg_dump | psql, Secrets Manager values into sealed-secrets, S3 to MinIO. Generates a cutover script.

# the killer workflow
$ sail migrate \
--from aws:us-east-1 \
--to sprintsail-runtime:prod
✓ Migration complete.
03 — sail target

Inspect capabilities per target.

Each provider declares the primitives it supports and at what maturity (stable / alpha / planned). The output is the source of truth — it's what the docs' capability matrix mirrors.

# what works where
$ sail target capabilities aws
COMPUTE — Function, Worker, CronJob…
STORAGE — Database (RDS) · Bucket (S3)
SECRETS — Secret (Secrets Manager)
04 — sail destroy

Tear down — with safety guards.

Walks primitives in reverse and asks each provider to destroy. Non-empty buckets refuse to delete; databases schedule a 7-day recovery window on AWS; secrets are soft-deleted. State file removed on success.

# clean teardown
$ sail destroy --target aws:us-east-1 --yes
[aws/webapp] deletion scheduled
[aws/database] deletion scheduled
✓ Destroy complete.
// Languages & targets

TypeScript for infra.
Any language for handlers.

SDK is TypeScript. Handler runtimes today: Node.js, Python. More land as adapters ship.

🟩
Node.js
v20 · v22 LTS
🐍
Python
3.12 (handlers on AWS)
📜
@sprintsail/sdk
TypeScript · ESM
sail CLI
deploy · migrate · destroy
☁️
Target: AWS
Your account · stable
Target: Runtime
K8s · open-source · alpha
📐
Target: Azure
Planned
🅶
Target: GCP
Planned
// What you get

Real production primitives.
Not toys.

🔒

Secrets, encrypted at rest

On the Sprintsail Runtime, every Secret is a SealedSecret CR encrypted with the cluster's sealing key (RSA-OAEP + AES-GCM, strict-scoped). On AWS, Secrets Manager with a 7-day soft-delete window. Same secret.value() on both.

Both targets
🛡

HTTPS for ingress, automatic

Runtime WebApps and APIs get a per-host certificate from cert-manager when a sail-issuer ClusterIssuer is present. Plain HTTP fallback otherwise. AWS ECS Express terminates HTTPS by default.

Both targets
💀

Worker dead-letter handling

A Worker's handler that throws republishes the failing message to <queue>.dlq with x-sail-error / x-sail-failed-at headers — preserving poison messages instead of dropping them. No infinite redelivery loop.

Runtime
🛟

Cross-provider DB migration

The runtime provider auto-opens the source RDS security group to the destination cluster's egress IP, fetches RDS creds from Secrets Manager, and runs an in-cluster pg_dump | psql Job. No host pg_dump, no manual coordination.

aws → runtime
📦

Registry-aware image distribution

Set SAIL_IMAGE_REGISTRY=<ecr-or-other> and the SDK builds linux/amd64 images, pushes to your registry, and the cluster pulls from there. Or skip the env var and load directly into kind for local dev.

Runtime
🧯

Idempotent everything

Every primitive provision is adopt-on-exists. sail deploy can be re-run any time and only rolls what changed. sail migrate can be re-run if a step fails — the data copy is --clean --if-exists on the destination Postgres.

Both targets
// Pricing

SDK is free.
Runtime is managed.

The SDK and CLI are open source under Apache 2.0 — you'll always be able to run your app on AWS in your own account, no Sprintsail account required. Sprintsail Runtime is the managed K8s tier; pricing scales with the cluster.

SDK + CLI
Free · Apache 2.0

The whole IaC SDK, every primitive, both providers, the runtime adapters, the sail CLI. Forever free. No phone-home, no telemetry-by-default, no rugpull. Use it against your own AWS account today.

  • 9 primitives — Function, WebApp, API, CronJob, Worker, Database, Bucket, Queue, Secret
  • AWS provider (stable) — your account, your bill, your data
  • Sprintsail Runtime provider (alpha) — bring your own K8s
  • sail migrate end-to-end, including cross-provider DB
  • npm install · MIT-friendly license terms
  • Full source on GitHub
npm install @sprintsail/sdk
Managed
Sprintsail Runtime
Contact Sales

A managed Kubernetes runtime running the open-source operator stack — Knative, CloudNativePG, MinIO, RabbitMQ, sealed-secrets, Contour, cert-manager — so sail deploy --target sprintsail-runtime just works.

  • Fully managed K8s cluster — we run the operators
  • Pre-installed sail-issuer, Sprintsail Runtime image registry
  • Bring your own cluster, or use ours (single-region today)
  • Same primitives, same handler code as your AWS deploys
  • SLA, HA Postgres + RabbitMQ + MinIO on the Pro tier
  • SOC 2 / HIPAA paths on the Sovereign tier (planned)
Contact Sales
// Also from Orion

Built, run, and sold by the same team.

// Get started

Ready to set sail?
npm install @sprintsail/sdk

Install. Declare. Deploy. sail migrate when you're ready to leave.