Documentation
Getting Started with SnapDeploy
From a GitHub repository to a live HTTPS URL in about five minutes — no Dockerfile, no YAML, no servers. This page walks through the first deploy, explains what you are looking at afterwards, and points to what to do next.
Before you start
- Code on GitHub — public or private. SnapDeploy builds from the repository; there is no CLI upload step (a pre-built Docker image from Docker Hub or a private registry also works, see Docker hosting).
- An app that listens on a port. Node.js (Express, Next.js, Vite, Create React App, TanStack Start), Python (Django, Flask, FastAPI), Go, Java (Spring Boot), PHP, Ruby and static sites are detected automatically; anything else runs from your own Dockerfile. The port is detected too (Dockerfile
EXPOSE, framework default, then 3000) — you can always set it explicitly. - Nothing to pay. The free tier is 4 containers, 10 deploys a day (5 per rolling 12 hours) and 100 hours a month, no credit card. Free apps sleep after ~15 minutes idle and wake on the next request in about a minute.
Step 1 — Create an account
Go to snapdeploy.dev/register. The fastest path is Sign up with GitHub: one tap creates the account and connects your repositories, so the deploy wizard is ready immediately. Email + password works too; you can connect GitHub later from the dashboard.
Already have an account with the same email as your GitHub identity? GitHub sign-in asks for your password once and links the two — you keep one account.
Step 2 — Connect GitHub (if you signed up by email)
Dashboard → Deploy → Connect GitHub. SnapDeploy asks for the standard repo, read:user and user:email scopes so it can list and clone your repositories and install a deploy webhook. Organisation repositories appear once the organisation has approved the SnapDeploy app. Details: GitHub integration.
Step 3 — Deploy your first repository
- Pick the repo and branch. Deploy → choose the repository; the default branch is preselected. Set a root directory only if the app lives in a subfolder of a monorepo.
- Check the detected stack. The wizard shows the framework, runtime version (from
engines,.nvmrcor the lockfile) and port it found. If it says "no entry point", add anindex.js/server.jsor astartscript — or a Dockerfile. - Fill in the environment variables it asks for. The wizard scans the code for variables it reads and marks the required and secret ones — for a Supabase app that is
VITE_SUPABASE_URLand the publishable key, for Django theSECRET_KEY. Public build variables (VITE_*,NEXT_PUBLIC_*) are compiled into the bundle, so they must be set now; runtime secrets can be added or changed later. - Choose a name and size, deploy. The name becomes your URL,
name.containers.snapdeploy.app. Small (512 MB) is free; Medium (2 GB) and Large (4 GB) need Always-On. Click Deploy and watch the build log stream — typically two to six minutes end to end.
Step 4 — What you are looking at
When the status turns RUNNING, the URL is live with HTTPS. The container page gives you, in one place:
- Deployments — every build with its commit, duration, steps, and on failure the error code, a readable message and the last lines of the build log. It also says who triggered it: you, a GitHub push, or an AI assistant.
- Logs — runtime logs streamed live, plus the last lines kept with each deployment.
- Environment — runtime variables are applied with a rolling restart; build-time ones trigger a rebuild.
- Domains, add-ons, size, Always-On — custom domain with free SSL, managed Postgres/MySQL/MariaDB/MongoDB/Redis/RabbitMQ, resize, or keep the app awake 24/7.
From now on every push to the branch redeploys automatically through the webhook SnapDeploy installed. Pushes count toward the daily deploy limit, and a failed build still counts — read the log before retrying.
Deploy from your AI assistant instead
Prefer chat? Open API Keys, create a deploy-scoped token and paste the generated one-liner into Claude Code, Cursor, Windsurf, Codex CLI or Gemini CLI. "Deploy this repo to SnapDeploy" runs the same detection and env-var scan and replies with the URL. Tokens can never delete anything and never see secret values. Guides: Claude Code, Cursor, MCP reference. The iOS app does the same from your phone.
If the first deploy fails
| Message | Fix |
|---|---|
MISSING_ENTRY_POINT | Add index.js / server.js / app.js at the root directory, a start script, or a Dockerfile |
| Missing required environment variables | Set the ones the scan listed, deploy again |
| Health check never passed | The app did not answer on the detected port — check the port and the container log tail |
| Repository not listed | Organisation repos need the org to approve the app; re-run Connect GitHub |
| Blank page on a Vite/Lovable app | A VITE_* variable was set after the build — set it and redeploy |
More in troubleshooting and the FAQ.