ββββββ ββββββ βββββ βββββββ ββββββββ
ββ ββ ββ ββ ββ ββ ββ
ββ βββ ββββββ βββββββ βββββ ββ
ββ ββ ββ ββ ββ ββ ββ ββ
ββββββ ββ ββ ββ ββ ββ ββ
If it works with Docker Compose, Graft can ship it in minutes
Got a working docker-compose.yml? You're 3 commands away from production.
# This works locally
docker compose up -d
# This works in production (same exact commands)
graft up -dSame commands. Same workflow. Different server. If your app runs locally with Docker Compose, Graft can deploy it in under 5 minutes.
No agents running on your server. No web UIs eating RAM. No control panels you never asked for. Just SSH, your existing compose file, and automatic infrastructure setup.
Graft is completely agentless. The only thing it leaves on your server is a tiny webhook for CI/CD (1.7MB RAM idle, ~10-15MB during deployments). Everything else runs from your machine.
You've already done the hard work. Your app runs perfectly locally with Docker Compose.
Now you just need it live. But somehow "just deploy it" turns into:
- Dokploy/Coolify/CapRover β Install a 500MB+ web UI on your server, click through dashboards
- Managed platforms β Rewrite configs for their format, watch costs scale with success
- Manual SSH deployment β Spend hours configuring Traefik, Let's Encrypt, networking, security...
Graft takes your working compose file and ships it. That's it.
graft init # Point at your server (once)
graft sync # Deploy everything
graft logs -f # Verify it's runningFrom working locally to live with SSL in under 5 minutes. Your server's resources stay focused on your app, not management tools.
Graft runs from your machine, not your server. The only footprint on your server:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % PIDS
0deea9bcd77e webhook-graft-hook-1 0.00% 1.73MiB / 916.8MiB 0.19% 3
1.7MB of RAM at idle. ~10-15MB during deployments. That's the webhook for CI/CD triggers. Everything else is your actual application.
Compare to server management UIs that consume 500MB-1GB+ just sitting there with a web interface you barely use.
Every command you know works on production:
graft ps # What's running?
graft logs backend -f # Follow logs in real-time
graft exec backend cat config.yml # Read files
graft restart frontend # Bounce a service
graft pull && graft up -d # Deploy updatesNo new syntax. No proprietary config files. If you know Docker Compose, you know Graft.
Point Graft at a clean Ubuntu/Debian server and it:
- Installs Docker automatically
- Configures Traefik reverse proxy
- Sets up SSL certificates via Let's Encrypt
- Creates isolated Docker networks
- Handles all the boring infrastructure work
All done over SSH. Nothing installed server-side except what you actually need.
Just ship it: Direct sync mode
graft sync # Rsync code β server builds β doneProper CI/CD: GitHub Actions + GHCR
graft init # Choose git-images mode
graft sync # Auto-generates workflow, sets up webhooks, doneGraft writes production-ready GitHub Actions workflows with zero configuration. The webhook receiver on your server? That tiny 1.7MB container above.
Managing 10 clients across 5 servers?
graft -p client1 logs api # Project 1
graft -p client2 restart backend # Project 2
graft -p client3 ps # Project 3Graft remembers which project lives where. You don't juggle SSH configs or server IPs.
Bonus: graft dns map updates Cloudflare DNS automatically. Perfect for rotating between cloud free tiers.
graft rollback # See deployment history, choose which to restoreEvery deployment is versioned. Broke production? Roll back in 10 seconds.
Already have a working docker-compose.yml? You're ready.
# Install (Linux/macOS)
brew tap skssmd/tap && brew install graft
# Initialize (point at your server)
graft init
# Deploy (that's it)
graft sync
# Manage like localhost
graft ps # Status check
graft logs backend -f # Live logs
graft map # Update DNS
graft rollback # Undo deploymentProduction-ready in under 5 minutes. SSL, reverse proxy, and CI/CD all configured automatically.
Linux/macOS (Homebrew)
brew tap skssmd/tap
brew install graftDebian/Ubuntu
echo "deb [trusted=yes] https://apt.fury.io/skssmd/ /" | sudo tee /etc/apt/sources.list.d/graft.list
sudo apt update && sudo apt install graftFedora/RHEL/Amazon Linux
echo "[graft]
name=Graft Repository
baseurl=https://yum.fury.io/skssmd/
enabled=1
gpgcheck=0" | sudo tee /etc/yum.repos.d/graft.repo
sudo yum install graftArch Linux (AUR)
yay -S graft-binWindows
powershell -ExecutionPolicy ByPass -Command "iwr -useb https://raw.githubusercontent.com/skssmd/Graft/main/bin/install.ps1 | iex"Or via WinGet:
winget install graftFrom source
git clone https://github.com/skssmd/Graft
cd Graft
go build -o graft cmd/graft/main.goRequires Go 1.24+
Graft is for small teams that don't need multi-server scalability but want simple, reliable deployment without bloat.
| You are... | Graft helps you... |
|---|---|
| π Solo developer | Ship projects without platform bills or resource-hogging UIs |
| π₯ Small team (2-10 people) | Simple production setup everyone can use via CLI |
| π’ Agency/Freelancer | Manage 20+ client projects without server bloat |
| βοΈ VPS optimizer | Maximize server resources for apps, not management tools |
| π§ͺ Rapid prototyper | VPS to live SSL URL in under 5 minutes |
- You need multi-region, multi-server orchestration (that's Kubernetes territory)
- You prefer clicking through web UIs over terminal commands
- You're already running enterprise-scale infrastructure
| What | Server footprint | How you interact | Best for |
|---|---|---|---|
| Graft | ~2MB idle, ~15MB deploying | CLI from your machine | Developers who know Docker Compose |
| Dokploy/Coolify | 500MB-1GB+ (UI + agent) | Web interface on server | Teams that want UI-based management |
| CapRover | 300MB+ (UI + agent) | Web interface on server | Single-server apps with UI preference |
| Railway/Render | Nothing (fully managed) | Web dashboard | Teams with budget, want zero ops |
| Manual setup | Just your apps | SSH directly | Masochists with free time |
The Graft difference: Server resources go to your applications, not to management software you barely use.
Full docs: graftdocs.vercel.app
Common commands:
# Deployment
graft init # One-time setup
graft sync # Deploy/update
graft mode # Change deployment mode
# Management
graft ps # Container status
graft logs service -f # Live logs
graft restart service # Restart
graft exec service command # Run commands
# Multi-project
graft -p project1 logs api # Project-specific
graft -p project2 restart # Switch contexts
# DNS & Servers
graft dns map # Update Cloudflare DNS
graft registry ls # List servers
graft -sh # Direct SSH access
# Rollback
graft rollback # Restore previous deployment
graft rollback config # Configure retention- Slack/Discord deployment notifications
- Graft-Hook configurations
Graft is open source and contributions are welcome.
Before submitting features: Open an issue to discuss. Graft intentionally stays simple and lightweightβwe evaluate new features against "does this solve a common problem without adding bloat?"
Bug reports, documentation improvements, and bug fixes are always appreciated.
Apache 2.0 License - see LICENSE file.
- Issues: Bug reports and feature requests
- Discussions: Questions and community chat
- Star the repo if you find it useful π
Built by developers tired of installing 500MB web UIs just to deploy a Docker Compose app.
If you know Docker Compose and have a server with SSH, you can use Graft. That's the whole requirement. Your server's CPU and RAM stay focused on your actual applications, not on management software.