Skip to content

Projects

A project is a deployed application on PandaStack. Every project maps to one build-and-serve pipeline and gets a public URL. You create a project by connecting a Git repository (or uploading static files), PandaStack builds it, and it goes live at https://{name}.pandastack.app — or at a custom domain you attach.

PandaStack keys each project on a slug column with one of three deploy types. The type decides how the project is built, where it is served from, and what it costs.

TypeHow it servesRuns a pod?CostBest for
staticPublished to the global CDNNoFreeSPAs, static site generators, plain HTML/CSS/JS
containerKubernetes pod fronted by the gatewayYesFree (scale-to-zero) or paid (always-warm)APIs, servers, SSR apps, anything with a backend
autoClassified at create time, then persists as static or containerDepends on classificationDepends”Just connect a repo and pick nothing”

auto is not a lasting type: it is a create-time convenience. After PandaStack classifies your repo, the project persists as either static or container. See Auto-detect deploys for the classification rules.

  • Static — you have a pure client-side app (Create React App, Vue CLI, a Vite SPA, Gatsby without SSR, Astro without an SSR adapter) or you upload pre-built files. There is no server process; the build output is published to the CDN and served with no pod. This is the cheapest option and it is free on every plan. See Static sites.
  • Container — you have a server: an Express/Fastify/NestJS API, a Next.js/Nuxt/SvelteKit SSR app, or anything that listens on a port. It runs as a pod on Kubernetes and is reached through the gateway. See Container apps.
  • Auto — you would rather not decide. PandaStack inspects the repository, ships a pure static SPA to the CDN when it can prove that is safe, and otherwise falls back to a container so the first deploy always works. See Auto-detect deploys.

A project name is the public subdomain. The default URL is:

https://{name}.pandastack.app

Because the name is a public subdomain, it is globally unique across all organizations — not just unique within your org. If another organization already owns a project called blog, you cannot create one with the same name; PandaStack rejects the clash at create time.

The name must be a valid RFC 1123 DNS label:

  • lowercase alphanumeric characters and hyphens only
  • must start and end with an alphanumeric character
  • at most 63 characters

The Deploy to PandaStack button works around the global-uniqueness constraint by appending a random 8-character suffix to the name, so two people clicking the same badge never collide.

Every deploy follows the same path:

  1. Create — you connect a repo (or upload files) and pick a type (or auto). PandaStack writes the Project and Deployment rows plus a transactional outbox row in one database transaction (topic deploy.requested).
  2. Queue — an outbox relay publishes the request to Google Pub/Sub. The deployment status is queued.
  3. Build — the worker picks up the message. For container and Git-static builds it runs a source scan (to reject malware/abuse kits), then builds. Static builds run in a microVM; container builds use Railpack or a Dockerfile. Status is running.
  4. Deploy — static output is published to the CDN; a container image is rolled out as a pod and a gateway service is created. The routing manifest is built and stored.
  5. Live — the project serves traffic at its URL. Status is succeeded (or failed if the build or rollout failed).
StatusMeaning
queuedDeploy request accepted, waiting for the worker
runningBuilding and/or rolling out
succeededLive and serving traffic
failedBuild or rollout failed — check the build logs

Custom domains, routing, and analytics at a glance

Section titled “Custom domains, routing, and analytics at a glance”

Every project shares the same gateway feature set. Some features are free; some require a paid plan.

FeatureWhat it doesFree?Details
Default URL{name}.pandastack.app on every projectFree
Custom domainsPoint your own domain at the project (Cloudflare SSL-for-SaaS)Paid (402 for free orgs)Domains
Redirects & rewritesURL rules applied at the gatewayFree (MEMBER+ to set)Routing
Response headersGlobal header rules on all pathsFree (MEMBER+ to set)Routing
AnalyticsAudience data (visitors, referrers, devices) captured at the gatewayPaid feature + per-project toggleAnalytics
MetricsPerformance (requests, latency, errors, bandwidth)See metrics docsMetrics
Autoscaling / scale-to-zeroHPA (paid) vs KEDA scale-to-zero (free)MixedScaling

Free organizations can run up to 5 container apps and 5 static sites. Paid plans (pro, premium, enterprise) allow unlimited projects of both types. Creating a project past the free limit returns a 402 quota_exceeded error. See Plans & limits.