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

  1. 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.
  2. Check the detected stack. The wizard shows the framework, runtime version (from engines, .nvmrc or the lockfile) and port it found. If it says "no entry point", add an index.js/server.js or a start script — or a Dockerfile.
  3. 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_URL and the publishable key, for Django the SECRET_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.
  4. 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

MessageFix
MISSING_ENTRY_POINTAdd index.js / server.js / app.js at the root directory, a start script, or a Dockerfile
Missing required environment variablesSet the ones the scan listed, deploy again
Health check never passedThe app did not answer on the detected port — check the port and the container log tail
Repository not listedOrganisation repos need the org to approve the app; re-run Connect GitHub
Blank page on a Vite/Lovable appA VITE_* variable was set after the build — set it and redeploy

More in troubleshooting and the FAQ.

Next steps