Quickstart: deploy from a git push
This is the simplest way to get an app running on Tabbify. You write a few small files, push them to GitHub, and Tabbify submits a remote deployment. The platform clones the selected commit, builds an OCI image on its own machines, and runs it as a CPU-only Firecracker microVM on one selected target.
You do not need Docker on your laptop, a server, or any registry login.
What you need:
- A GitHub account (free — github.com/signup).
- A Tabbify API token. This comes with your Tabbify account. Keep it handy — you'll paste it into GitHub once, in step 3.
The whole thing takes about five minutes. There's a working copy of everything below at github.com/tabbify-io/quickstart — you can fork that instead of typing the files out.
Step 1 — Create the four files
Make a new folder on your computer and put these four files in it. Copy them
exactly; you can change the words inside index.html to anything you like.
index.html — the page your app serves:
<!doctype html>
<html>
<body style="font-family: system-ui; text-align: center; margin-top: 4rem">
<h1>Hello from Tabbify</h1>
<p>Deployed straight from a git push.</p>
</body>
</html>
Dockerfile — how your app is packaged. (You don't run this yourself —
Tabbify does. The ENTRYPOINT line must use this exact bracket form.)
FROM busybox:1.36
COPY index.html /www/index.html
EXPOSE 8080
ENTRYPOINT ["busybox", "httpd", "-f", "-v", "-p", "8080", "-h", "/www"]
This listens on 8080, which is the default Tabbify probes — so nothing extra
to set. If your app listens on a different port, add port = <n> under
[runtime] (below), otherwise the readiness check hits the wrong port and the
app crash-loops.
tabbify.toml — what to build and how to run it. This quickstart omits a
target so Tabbify selects the current default, and it omits an ID so the deploy
client assigns the application address. Nothing else to fill in:
[app]
name = "quickstart"
[build]
kind = "docker" # build the Dockerfile into an image
[runtime]
lifecycle = "on_request" # start on the first visit, sleep when idle
idle_timeout_sec = 300
memory_mb = 256
vcpus = 1
[routes]
dynamic_prefixes = ["/"] # send every web address to your app
.github/workflows/deploy.yml — the part that deploys on every push. Copy
it as-is:
name: Deploy to Tabbify
on:
push:
branches: [main]
jobs:
deploy:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v4
- uses: tabbify-io/deploy@v1
with:
token: ${{ secrets.TABBIFY_TOKEN }}
That last file lives in a folder called .github/workflows/ — create those two
folders, with the leading dot, and put deploy.yml inside.
Step 2 — Put it on GitHub
-
Go to github.com/new and create a repository. Give it any name (for example,
my-first-tabbify-app). Leave everything else at its default and click Create repository. -
GitHub shows you a page of commands. The simplest path: on your computer, in your app folder, run the commands GitHub lists under "…or push an existing repository from the command line." They look like this:
git init git add . git commit -m "my first app" git branch -M main git remote add origin https://github.com/YOUR-NAME/my-first-tabbify-app.git git push -u origin main
Don't worry if that first push kicks off a deploy that fails — you haven't added your token yet. That's step 3, and then you'll push once more.
Step 3 — Mint your deploy token and add it to GitHub
First, mint a deploy token in the Tabbify console. A deploy token is scoped to one of your tenant networks and is what lets the CLI submit work within that boundary.
- Open Deploy tokens (the Deploy tokens tab in the console sidebar).
- You need a network to deploy into. If you don't have one yet, open Networks, create one, then come back.
- On your network, click Manage tokens, then Mint deploy token.
- The token appears once in a Deploy token field — click Copy. It is shown only once, so copy it now. Its expiry is shown in the console, and you can Revoke it from the same list.
Now store it on GitHub. Your token is a password, so it goes into GitHub's encrypted Secrets, never into your code. Here's exactly where to click:
- Open your repository on GitHub.
- Click Settings (top-right of the repo menu bar).
- In the left sidebar, click Secrets and variables, then Actions.
- Click the green New repository secret button.
- For Name, type exactly:
TABBIFY_TOKEN - For Secret, paste the deploy token you just copied.
- Click Add secret.
That's it — the workflow you copied in step 1 reads this secret automatically.
Step 4 — Push and watch it deploy
Make any small change (edit a word in index.html), then push:
git add .
git commit -m "deploy"
git push
Now open the Actions tab at the top of your repository on GitHub. You'll see a run called "Deploy to Tabbify". Click it to watch the steps. The Deploy step prints a deploy ID, status URL, and app address like:
app URL: https://app.tabbify.io/app/2f8c1a9e-…/
Deployment is asynchronous. A successful workflow submission does not by itself
mean the workload is serving. Follow the printed status URL or the console until
the deployment reports running; Tabbify activates the candidate only after its
configured health gate passes. Status may include a bounded tail of recent local
application output when startup fails.
Then open the app link in your browser. The address stays associated with the same application UUID across later deployments.
Want a fixed, memorable id instead of the generated one? Add
id = "…"under[app]intabbify.toml(any UUID — runuuidgen). Optional; skip it and Tabbify picks one for you.
The first visit includes boot time. With
lifecycle = "on_request"your app sleeps when nobody's using it and wakes on the next visit. The very first request after a deploy (or after a long idle) takes a moment while the VM boots. Later requests avoid that boot step while the workload remains active.
Step 5 — Ship a new version
There's nothing new to learn. Edit your files, commit, and push:
git add .
git commit -m "new version"
git push
Tabbify builds the new version and applies the configured health gate before activation. The application URL remains the same, but the current service does not guarantee an interruption-free release. Design clients to retry safe requests and plan a recovery path for failed releases.
What just happened
When you pushed, GitHub Actions ran one step — the tabbify-io/deploy action —
which handed your repo's address and commit to Tabbify. Tabbify then:
- Cloned your repo (using a short-lived, repo-scoped GitHub token — no GitHub App to install, nothing extra to authorize).
- Built your
Dockerfileinto an image on its own build machine. - Ran that image as a Firecracker microVM and gave it an address on the private mesh.
- Routed
app.tabbify.io/app/<your-id>/to it.
Your laptop never built or pushed anything — it only did a git push.
Where to go next
- tabbify.toml — every supported field of the app manifest, including environment variables and one selected target.
- Runtime — how an OCI image runs in a Firecracker microVM.
- The deploy pipeline — what happens between
git pushand a running app, in depth. - CLI reference — deploy from your own terminal with
tcliinstead of GitHub Actions.