⚠️ Early preview. Not ready for serious use. Read the fine print
Built for AI-assisted Rust development

Ship Rust to your VPS in seconds

The zero-abstraction deploy pipeline. Scaffold, develop, and ship production Rust web apps with three commands. No cloud vendors. No containers on your machine. Just your code on your server.

Get Started See how it works
$ cargo install perc
zsh

Three commands from idea to production

No YAML. No Dockerfiles. No CI config. Describe what you want to an LLM and perc handles the rest.

1

Scaffold

perc new myapp

Initialises an Axum project with routing, config, and deploy structure. Ready for an AI coding agent and human to start pairing on features immediately.

2

Develop

perc dev

Starts Postgres, S3 storage, and Restate as containers. Watches your source, auto-restarts on change. Everything your app needs, zero setup.

3

Deploy

perc deploy push

Cross-compiles to a static Linux binary, builds a minimal OCI image in pure Rust, and ships it over SSH. Automatic HTTPS. No registry, no runtime.

Everything you need, nothing you don't

Opinionated where it matters. Each feature is one command away.

Pure Rust OCI images

No Docker daemon on your dev machine. Perc builds minimal container images entirely in Rust and pipes them directly to the server over SSH.

Automatic HTTPS

Set a domain, Caddy provisions a Let's Encrypt certificate. Multiple apps on one VPS get routed by domain. Zero TLS configuration.

Durable execution

Add [restate] to your config and get Restate server deployed alongside your app. Durable workflows, sagas, and virtual objects out of the box.

Managed Postgres

One command provisions PostgreSQL, creates a database and user, injects DATABASE_URL, and auto-tunes for available RAM. Per-app isolation on shared instances.

S3-compatible storage

Declare a bucket in config, get a local RustFS instance for development. Same S3 API in dev and production. Console included for debugging.

Tailscale-secured

After bootstrap, SSH is restricted to your Tailscale network. Public-facing ports are 80 and 443 only. Your deploy surface is zero-trust by default.

What happens when you push

No build servers. No registries. No orchestrators. A single SSH connection and your binary is running.

  • Cross-compile

    Builds a static x86_64-unknown-linux-musl binary via cargo-zigbuild. No target machine toolchain needed.

  • Build image

    Creates a minimal OCI image in pure Rust. Just your binary, nothing else. No runtime dependency.

  • Ship over SSH

    Pipes the image directly to podman load on the target. No registry, no intermediate storage, no credentials.

  • Deploy as Quadlet

    Generates a systemd unit via Podman Quadlet. Auto-restarts, logs via journald, lifecycle managed by the OS.

  • Verify

    Health-checks the app on the target before reporting success. If it doesn't respond, you know immediately.

your machine
cargo zigbuild --target x86_64-unknown-linux-musl
perc::oci::build_image(binary, includes)
ssh target podman load
target VPS
quadlet systemd podman
caddy reverse_proxy :allocated_port
https://your-domain.com

One file. Everything declared.

Your entire stack is defined in perc.toml. Databases, storage, secrets, domains — all derived from one source of truth.

perc.toml
[app]
name = "myapp"
include = ["prompts", "static"]
 
[env]
S3_REGION = "us-east-1"
S3_BUCKET = "uploads"
 
[database]
 
[storage]
bucket = "uploads"
 
[restate]
worker = "myapp-worker"
 
[targets.production]
host = "vps-01.tail.ts.net"
domain = "myapp.dev"
what you get from this
# local dev (perc dev)
PostgreSQL 18 container
RustFS with "uploads" bucket
Restate server + worker
File watcher + auto-restart
All env vars injected
 
# production (perc deploy push)
Static musl binary
PostgreSQL provisioned + tuned
Restate deployed + registered
HTTPS via Let's Encrypt
prompts/ and static/ bundled

Do your due diligence

Lots of people are building tools with AI coding agents right now. That means there's a lot of vibe-coded nonsense out there.

This is a very early stage project

Perc is in active development and has rough edges. APIs will change, features will break, and there are gaps in what's implemented. Don't rely on it for anything serious right now.

Any tool you find on GitHub, including this one, deserves scrutiny before you trust it with your infrastructure. Read the source. Check the commit history.

I appreciate your interest and value any feedback. But bookmark this, give it a few months, and come back to see how it's developed. If it's still here and more mature, maybe then it's worth a real look.

Your code. Your server.
No platform in between.

Install perc and deploy your first Rust app in under five minutes.