App platform

Ship a container image or a Git repository and get a running application with a domain, TLS and logs. HTTP apps, background workers and scheduled jobs live side by side in one project.
Run any Docker image
Deploy an image from Docker Hub, GitHub Container Registry, your own registry or the Docker registry built into Granite. Private registries are supported — just add the credentials when you create the resource.
Or build from source
Connect a repository on GitHub, GitLab or Bitbucket and Granite builds the image for you. The build log is streamed to the dashboard, so you see exactly what happened and when.
Automatic deploys
Push to the tracked branch and the new version is built and rolled out. Running a prebuilt image instead? Granite watches the Docker tag and redeploys as soon as it is updated.
Secrets and environment variables
Secrets are stored encrypted, with a separate encryption key per application. Set variables for the whole application or for a single resource, and roll back to any previous version.
Web console and CLI
Open a shell in a running container from the browser, or use the CLI to run commands, tail logs and forward ports to your machine.
Cron jobs without a server
Schedule a command with standard cron syntax. The container starts on schedule and stops when the job is done, so you are not paying for an idle machine.

One application, three kinds of resources

An application is a scope that holds everything your product needs. Resources inside it share environment variables and reach each other over internal DNS.
Resource types
Use the same image with different commands to run the web app, the queue worker and the scheduled jobs.
web-app
Gets a public domain with TLS. Specify the HTTP port that accepts requests, add a custom domain when you are ready.
worker
For background tasks and internal services that must always run — queue consumers, private APIs reachable only over internal ports.
cron-job
Runs on a schedule and is not reachable over HTTP or TCP. Choose whether a new run may overlap with a previous one that is still going.
Replicas
Pick the CPU and RAM configuration and how many containers to run. Change it later and only the resource you edited is redeployed.
Build fast. Ship fast.
Automatically rebuild your application when you push to the Git repository.
user@granite:~$ git push
Writing objects: 100% (9/9), 3.41 KiB | 3.41 MiB/s, done.
Total 9 (delta 8), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (8/8), completed with 7 local objects.
To github.com:granite-demo/demo-app.git
4186778..8ff2685 main -> main
user@granite:~$
Clone image
Prepare build
Build and deploy
May 27, 2025, 10:35:29 PM ==> Starting build worker
May 27, 2025, 10:35:29 PM ==> Extracting source
May 27, 2025, 10:35:29 PM ==> Downloading metadata
May 27, 2025, 10:35:30 PM ==> Checking registry auth us.registry.novps.app
Laravel
Next.js
FastAPI
Flask
Symfony
Remix
Ruby on Rails
Spring
Django
Static Sites
Docker
Go
You use it — we support it.
Deploy your projects on Granite, regardless of your tech stack. Thanks to containerization, you can run any application with ease.

App platform questions

More questions? Email us at support@granite.so

Every plan includes monthly usage credits and unlimited workspace seats.
See pricing
Be first in line for updates
and special pricing
Get early access to new features and exclusive discounts delivered straight to your inbox