Loomplane / Clouds

Each service on the cloud that suits it.

Connect the accounts you already have. A Google Cloud service account key, a Vercel token, an AWS access key, a Render API key, a DigitalOcean token, an Azure service principal. Each is checked with its cloud before it's kept, and Loomplane tells you which permissions are missing.

Targets

Where things run, and where they're built.

ProviderServicesDatabases, caches, bucketsBuilds on
Google CloudCloud RunCloud SQL (PostgreSQL, MySQL), Memorystore, Cloud StorageCloud Build
AWSECS on FargateRDS (PostgreSQL, MySQL), ElastiCache, S3CodeBuild
VercelWeb apps, static sitesNoneVercel
RenderWeb services, workersRender Postgres, Key ValueRender
DigitalOceanApp PlatformManaged PostgreSQL, MySQL, ValkeyApp Platform
AzureContainer AppsAzure Database for PostgreSQL and MySQL, Azure Managed RedisACR Tasks
Your serversSSH with Docker, Kubernetes namespacesThe service catalog's enginesYour registry
Anything elseA provider pluginA provider pluginYour choice
Cloud targets

Pick a target by name, not by account ID.

Group accounts into a Cloud, give each target a name like frontend, and assign the Cloud to an environment. Your manifest refers to frontend, and production and staging each resolve it to their own account.

  • One connection per cloud per environment, shared by its services
  • With one ready account, Loomplane picks it for you
  • Account choices are saved on the server and used by the dashboard, CLI and API
loomctl · cloudszsh
services:  web:    source: node:apps/web    cloud_target: frontend$ loomctl clouds create mono --name Production$ loomctl cloud-targets create mono cloud_7d2 \    --name frontend --provider vercel --connection conn_41a$ loomctl clouds assign mono env_prod --cloud cloud_7d2 \    --revision 0 --wait --timeout 10m  assigned · web resolves to vercel/acme-prod
Adopt and move

Bring what already runs. Move it when you're ready.

Adopt an existing service by describing where it runs today. When the placement matches what already serves, the plan records it without redeploying anything. Later, replace the account or switch providers, and the plan shows exactly what moves.

  • Adoption that changes nothing when nothing needs to change
  • Follow and recover a sync if a provider call goes missing
  • Finish external routing or revert it, step by step
  • A Cloud switch never moves database contents behind your back
Move webvercel/acme-old to vercel/acme-prod
Stage on new accountbuild and deploy, no traffic
done
Check new addressGET / 200 in 84ms
done
Switch routingacme.dev to the new deployment
waiting
Retire old deploymentafter routing is confirmed
later
Servers, pools and plugins

Your own machines are a target too.

Connect an SSH server with Docker or a Kubernetes namespace, group servers into pools, and share them across projects. When you need a target Loomplane doesn't ship, write a provider plugin in Go, run it, and point Loomplane at it.

  • Storage inventory for every Docker volume and Kubernetes claim
  • Pause a target to stop new work landing on it
  • A provider protocol with its own test suite
servers / poolshealthy
Pool eu-shared3 servers
hetzner-fsn-1ssh · docker 27 · 6 services
ready
hetzner-fsn-2ssh · docker 27 · 4 services
ready
k8s-appskubernetes · namespace apps
paused
10 services · 2 ready · 1 paused
Get started

Deploy your monorepo to your own clouds this afternoon.

Open source and self-hosted. Your applications don't need Forge, or Go.

$docker pull ghcr.io/xraph/loomplane:latestServer
$brew install xraph/tap/loomctlCLI
Read the install guide