📚 Docs

Getting started

What is this PaaS?

This platform is a self-hosted, Heroku-style PaaS built on Dokku 0.38.31, running on a single IPv4-only Hetzner Cloud server with Ubuntu 24.04. You push code with git push; the platform builds it into a container, deploys it with zero downtime, and serves it at its own URL. You never manage servers, containers, or web servers — just your code.

What the platform gives every application out of the box:

The mental model

  1. An app is a git repository plus a name. You create the (empty) app on the platform, add it as a git remote, and push.
  2. A push is a deploy. The platform detects how to build your code (buildpack or Dockerfile), builds a container image, starts the new version alongside the old, verifies it stays up, then switches traffic and retires the old version.
  3. Everything specific to an environment lives in environment variables — set on the platform, never committed to your repo.
  4. The platform owns routing, TLS, and process supervision. Your app's only jobs: listen on the port the platform assigns, stay stateless, and log to stdout.

Who does what

Ask your operator to register your public key and provide this platform's prototype.imeme.name / <public-ip> values if you don't have them yet. If you run the automation yourself, both come from Terraform: bash scripts/terraform.sh output -raw platform_domain and bash scripts/terraform.sh output -raw instance_public_ip. Operator SSH keys are local files, not Terraform-generated private-key outputs; never print or share a private key in chat.

Your first deploy in five commands

Use your registered key (shown here as ~/.ssh/dokku-deploy.pem):

chmod 600 ~/.ssh/dokku-deploy.pem

# 1. create the app (any valid name, e.g. my-first-app)
ssh -i ~/.ssh/dokku-deploy.pem dokku@<public-ip> apps:create my-first-app

# 2. in your project's git repo, add the platform as a remote
git remote add dokku dokku@<public-ip>:my-first-app

# 3. push your code to the platform's deploy branch (master)
GIT_SSH_COMMAND='ssh -i ~/.ssh/dokku-deploy.pem' git push dokku HEAD:master

# 4. watch the build output, then check it live
curl https://my-first-app.prototype.imeme.name/

# 5. stream its logs
ssh -i ~/.ssh/dokku-deploy.pem dokku@<public-ip> logs my-first-app -t

That's a full deploy: build, release, health check, routing, and logs. If HTTPS fails, do not claim success. Check deploy output and ask the operator to fix DNS/port 80, then retry sudo paas-enable-https my-first-app on the host (see Deploy your first app, step 10). The custom platform domain needs both apex and wildcard A records targeting the Primary IPv4, without AAAA records for this IPv4-only platform.

Tip — save the key in SSH config so git push finds it without flags:

Host dokku-paas
  HostName <public-ip>
  User dokku
  IdentityFile ~/.ssh/dokku-deploy.pem

Then git remote add dokku dokku-paas:my-first-app and plain git push dokku main:master just work.

What your app must look like

Any app that satisfies a short list of requirements can deploy here — any language with a Heroku-compatible buildpack (Node.js, Python, Ruby, Go, Java, PHP, …) or anything you can express as a Dockerfile. The full checklist is on the next page: Application requirements.

Optional browser workspace

The browser frontend at https://shell.prototype.imeme.name/ opens the shared, ephemeral terminal app by default. It provides git, SSH, PaaS guidance, and Copilot configured for OpenRouter directly at https://openrouter.ai/api/v1, model ~deepseek/deepseek-v4-flash-latest; use ?app=<name> to open another app's own container instead. To open the frontend-only shell container itself use ?app=shell. Browser access requires an app-scoped approval (see Web shell). Keep source in a separate durable Git remote. The private API uses a shared key available to all apps, and the workspace deploy key can administer every app: browser scoping does not isolate tenants.

Where to go next