Skip to main content
Pxxl compiles and runs your code using a standardised three-phase build pipeline: install dependencies, build the production artefact, then start the server process. The platform auto-detects your stack from lock files and populates these commands for you, but you can override any of them from the deploy form or a pxxl.toml file in your repository root. Use the reference below to find the correct values for your language and framework.

Technical Stack Command Matrix

Tech StackPackage ManagerInstall CommandBuild CommandStart Command
Static HTMLNoneNoneNonepython3 -m http.server ${PORT:-8080} --bind 0.0.0.0
Vite / Reactnpm / pnpm / bunnpm installnpm run buildnpm run preview -- --host 0.0.0.0 --port ${PORT:-4173}
Next.jsnpm / pnpm / bunnpm installnpm run buildnpm start
Express APInpm / pnpm / bunnpm installnpm run build (if TS)node dist/index.js
FastAPIpip / poetrypip install -r requirements.txtNoneuvicorn main:app --host 0.0.0.0 --port ${PORT:-8000}
Djangopip / poetrypip install -r requirements.txtpython manage.py collectstaticgunicorn config.wsgi:application --bind 0.0.0.0:${PORT:-8000}
Go APIGo Modulesgo mod downloadgo build -o app ../app
LaravelComposercomposer install --no-devphp artisan config:cachephp artisan serve --host 0.0.0.0 --port ${PORT:-8000}
Ruby / RailsBundlerbundle installbundle exec rails assets:precompilebundle exec rails server -b 0.0.0.0 -p ${PORT:-3000}
Spring BootMaven / Gradle./mvnw dependency:go-offline./mvnw package -DskipTestsjava -jar target/*.jar

Node.js Configurations

Pxxl supports all major Node.js package managers. It detects your manager automatically from the lock file present in your repository (package-lock.json → npm, pnpm-lock.yaml → pnpm, yarn.lock → yarn, bun.lockb → bun) and runs the corresponding binary.
npm install
npm run build
npm run start

Next.js

For Next.js applications, use the standard build command and make sure your start script binds to all interfaces so the Pxxl proxy can reach the container:
package.json
{
  "scripts": {
    "build": "next build",
    "start": "next start -H 0.0.0.0 -p ${PORT:-3000}"
  }
}
If your Next.js app uses the Standalone output mode (output: 'standalone' in next.config.js), change your start command to node .next/standalone/server.js instead of npm start.

Vite, React, Vue, Svelte, and Astro

To serve a client-side SPA, use Vite’s built-in preview server configured for host routing. If you need full server-side fallback routing, pair it with a small Express server that catches all routes and returns index.html.
# Vite preview server
npm run preview -- --host 0.0.0.0 --port ${PORT:-4173}

Python Configurations

FastAPI and Flask

FastAPI requires an ASGI server (Uvicorn). Flask requires a WSGI server (Gunicorn). Both must bind to 0.0.0.0 so the Pxxl proxy can forward traffic to the container.
pip install -r requirements.txt
uvicorn main:app --host 0.0.0.0 --port ${PORT:-8000}

Django

Run database migrations as part of your build or release phase. Never hard-code database credentials — use environment variables and let Pxxl inject them at runtime.
pip install -r requirements.txt
python manage.py migrate --noinput
python manage.py collectstatic --noinput
gunicorn project_name.wsgi:application --bind 0.0.0.0:${PORT:-8000}
Replace project_name with your actual Django WSGI module path, for example core.wsgi:application or config.wsgi:application.

Go Configurations

Go builds produce a single statically-linked binary, making containers lightweight and fast to start.
go mod download
go build -o server ./cmd/api
./server
Your Go server must read the PORT environment variable and bind to 0.0.0.0:
main.go
port := os.Getenv("PORT")
if port == "" {
    port = "8080"
}
log.Fatal(http.ListenAndServe("0.0.0.0:"+port, router))
Pxxl injects PORT automatically at runtime. If your code hard-codes a port number, the container will start on the wrong port and fail the health check.

PHP and Laravel Configurations

For production Laravel deployments, optimise Composer’s autoloader and cache the framework’s config, route, and view files to eliminate file-system lookups on every request.
# Install (production only — no dev dependencies)
composer install --no-dev --optimize-autoloader

# Build (cache framework lookups)
php artisan config:cache
php artisan route:cache
php artisan view:cache

# Start
php artisan serve --host 0.0.0.0 --port ${PORT:-8000}

Monorepo and Multi-Service Configurations

Base Directory Scoping

When you deploy from a monorepo, set the Base Directory in your project settings to scope the build context to the subdirectory that contains your application. Pxxl treats that directory as the repository root during install and build.
Project in MonorepoBase Directory Value
apps/web-client/apps/web-client
services/user-api/services/user-api
packages/admin/packages/admin

Multi-Service Pattern

If your repository contains multiple processes — for example a web server and a background worker — create two separate Pxxl projects pointing at the same repository but using different start commands:
ServiceStart CommandPort Exposed?
Web ServiceYour HTTP server entry point, e.g. npm run startYes — receives public traffic
Worker ServiceYour queue consumer entry point, e.g. celery -A app worker or npm run workerNo — runs as a background process
This keeps concerns separated and lets you scale or redeploy each service independently.