# ox > ox is a deployment platform: you connect a GitHub repo and ox deploys it to your own Ubuntu LTS server (a VPS) with systemd and Caddy, no Docker. The user signs in to ox Cloud, the hosted control plane; their server runs only a small agent and Caddy. ox Cloud (deploywithox.com) is not Open-Xchange's OX App Suite or OX Security, which are unrelated products. How ox works: ox reads the repo's files, and `ox.toml` when there is one, and shows a plan: the start command, the build, the services the app needs (PostgreSQL, Redis and others) and its variables. A deploy builds a new release on the server and runs it as a systemd service behind Caddy, which gets the HTTPS certificate. The release gets traffic only after its health check passes, so a failed deploy leaves the previous release serving. Every push to the deployed branch deploys again, and the app's databases are backed up every day. Happy path for a new app: 1. Sign in with GitHub at https://console.oss-node2.sorv.dev/login. 2. Add a server: run the command the dashboard shows on a fresh Ubuntu LTS server. 3. Add the repository as a project on that server. 4. Review the plan ox detected (start, services, variables) and answer what it still needs. 5. Deploy, and follow the run's log. Config: `ox.toml` at the repo root is optional, and so is every key in it; ox detects what is left out from the repo's files. The ox.toml skill below is the full authoring contract. CLI (macOS or Linux): ``` curl -fsSL https://console.oss-node2.sorv.dev/install.sh | sh ox login # approve a code in the browser ox check # offline: the plan, problems and missing variables ox deploy --wait # deploy and stream the log ox logs --follow # the app's logs ox help # every command ``` Every client command takes `--json` and exits non-zero on failure. Rules for agents: - Run `ox check` in the repo before deploying, and fix what it reports. - Never put secrets in `ox.toml`. They live in the dashboard or in `ox vars set KEY`, which asks for the value. - Do not invent keys: unknown keys are errors. - Ask the user before deploying, deleting, or rolling back. Every docs link below is the page's Markdown twin; drop `.md` for the HTML page. The whole docs, guides and story in one Markdown file: https://console.oss-node2.sorv.dev/llms-full.txt ## Start here - [ox docs](https://console.oss-node2.sorv.dev/docs.md): Deploy a GitHub repo to your own Ubuntu server with ox, on systemd and Caddy, no Docker. Start with the quickstart, a framework guide or the ox.toml keys. - [Quickstart](https://console.oss-node2.sorv.dev/docs/quickstart.md): Deploy a GitHub repo to a fresh Ubuntu VPS in five steps: sign in, add the server with one command, add the repo, review the plan, and deploy it live. - [Examples](https://console.oss-node2.sorv.dev/docs/examples.md): Example repos on GitHub that ox deploys: Django, Rails, Laravel, Next.js, FastAPI, Phoenix, Go and Rust, each with an ox.toml when it needs one. - [Stacks](https://console.oss-node2.sorv.dev/docs/guides.md): Deploy guides for every stack ox runs: React, Next.js, Django, Rails, Laravel, Spring Boot and more, each with its plan and proof, filterable by language. - [Config reference](https://console.oss-node2.sorv.dev/docs/config.md): The ox.toml reference: every key with its default, what ox detects from your repo, services, variables, and working examples for Next.js, Python, Go, SPAs. - [CLI](https://console.oss-node2.sorv.dev/docs/cli.md): The ox command line: install it, sign in, and every command for projects, deploys, logs, variables, backups and servers, with --json and its exit codes. - [Security](https://console.oss-node2.sorv.dev/docs/security.md): How ox secures your VPS: SSH keys only, a firewall, fail2ban, each app as its own sandboxed user, signed updates, and an audit you can run any time. - [ox.toml skill](https://console.oss-node2.sorv.dev/ox-skill.md): The ox.toml authoring contract as one Markdown file to load as context. ## Guides: JavaScript and TypeScript - [Deploy Next.js](https://console.oss-node2.sorv.dev/docs/guides/nextjs.md): Tested on a real server. next start, a health check, PostgreSQL, Prisma migrations and the image cache, in one ox.toml. - [Deploy a Node API](https://console.oss-node2.sorv.dev/docs/guides/node.md): Tested on a real server. start script, lockfile install, migrations, PostgreSQL and Redis, from one short ox.toml. - [Angular SSR](https://console.oss-node2.sorv.dev/docs/guides/angular-ssr.md): Tested on a real server. ox builds it, runs the server.mjs Angular writes under systemd, and Caddy adds HTTPS. - [Astro SSR](https://console.oss-node2.sorv.dev/docs/guides/astro-ssr.md): Tested on a real server. ox builds it, runs dist/server/entry.mjs under systemd, with Caddy and HTTPS in front. - [SvelteKit](https://console.oss-node2.sorv.dev/docs/guides/sveltekit.md): Tested on a real server. ox reads svelte.config.js, builds it, runs node build under systemd, and Caddy adds HTTPS. - [Nuxt](https://console.oss-node2.sorv.dev/docs/guides/nuxt.md): Tested on a real server. ox runs nuxt build, starts .output/server/index.mjs under systemd, and Caddy adds HTTPS. - [React Router](https://console.oss-node2.sorv.dev/docs/guides/react-router.md): Tested on a real server. ox builds it, runs npm start under systemd, and Caddy adds HTTPS. - [SolidStart](https://console.oss-node2.sorv.dev/docs/guides/solidstart.md): Tested on a real server. ox reads the Node version from package.json, runs the build, starts it under systemd and adds HTTPS with Caddy. - [Qwik City](https://console.oss-node2.sorv.dev/docs/guides/qwik.md): Tested on a real server. ox finds the adapter, builds it, runs npm run serve under systemd, and Caddy serves HTTPS. - [NestJS](https://console.oss-node2.sorv.dev/docs/guides/nestjs.md): Tested on a real server. ox installs from package-lock.json, runs nest build and start:prod under systemd, and sets up PostgreSQL for the app. - [Fastify](https://console.oss-node2.sorv.dev/docs/guides/fastify.md): Tested on a real server. ox finds server.js, runs node server.js under systemd behind Caddy, and adds PostgreSQL with DATABASE_URL set. - [Hono on Bun](https://console.oss-node2.sorv.dev/docs/guides/hono-bun.md): Tested on a real server. ox installs Bun, runs bun install from bun.lock, and starts src/index.ts under systemd behind Caddy. - [BullMQ worker](https://console.oss-node2.sorv.dev/docs/guides/bullmq-worker.md): Tested on a real server. ox adds Redis with REDIS_URL set, runs your server, and the [workers] line runs worker.js beside it. ## Guides: Python - [Deploy Django](https://console.oss-node2.sorv.dev/docs/guides/django.md): Tested on a real server. gunicorn, PostgreSQL, migrations, static files served by Caddy, uploads kept across deploys, in one ox.toml. - [Deploy FastAPI](https://console.oss-node2.sorv.dev/docs/guides/fastapi.md): Tested on a real server. ox detects the uvicorn start command, installs from uv.lock, runs Alembic migrations, and adds PostgreSQL from one ox.toml. - [Flask](https://console.oss-node2.sorv.dev/docs/guides/flask.md): Tested on a real server. ox installs with uv from requirements.txt, runs gunicorn app:app under systemd behind Caddy, and adds PostgreSQL. ## Guides: Ruby - [Deploy Rails](https://console.oss-node2.sorv.dev/docs/guides/rails.md): Tested on a real server. precompiled Ruby, gems, assets, db:prepare and Solid Cache, Queue and Cable on PostgreSQL. ## Guides: Java and .NET - [Spring Boot (Maven)](https://console.oss-node2.sorv.dev/docs/guides/spring-boot.md): Tested on a real server. ox builds the jar with mvnw, installs Java 21, runs it under systemd and adds PostgreSQL for it. - [Spring Boot (Gradle)](https://console.oss-node2.sorv.dev/docs/guides/spring-boot-gradle.md): Tested on a real server. ox runs gradlew bootJar, reads the Java version from build.gradle.kts, and runs the jar. - [Quarkus](https://console.oss-node2.sorv.dev/docs/guides/quarkus.md): Tested on a real server. ox builds it with mvnw, runs quarkus-run.jar under systemd, checks /q/health and adds PostgreSQL for it. - [ASP.NET Core](https://console.oss-node2.sorv.dev/docs/guides/aspnet-core.md): Tested on a real server. ox installs the .NET 10 SDK, runs dotnet publish, starts the DLL under systemd, and adds PostgreSQL. ## Guides: PHP - [Deploy Laravel](https://console.oss-node2.sorv.dev/docs/guides/laravel.md): Tested on a real server. PHP from apt, Composer, a Vite build, PostgreSQL, a queue worker and the scheduler every minute, from one ox.toml. - [Symfony](https://console.oss-node2.sorv.dev/docs/guides/symfony.md): Tested on a real server. ox runs composer install for prod, Doctrine migrations and FrankenPHP under systemd, and asks for APP_SECRET first. - [Plain PHP](https://console.oss-node2.sorv.dev/docs/guides/php.md): Tested on a real server. ox finds index.php, installs FrankenPHP, and serves the site under systemd behind Caddy with HTTPS, no ox.toml. ## Guides: Go and Rust - [Rust](https://console.oss-node2.sorv.dev/docs/guides/rust.md): Tested on a real server. ox installs stable Rust, runs cargo build --release --locked, and starts the binary. ## Guides: Elixir and Deno - [Deno Fresh](https://console.oss-node2.sorv.dev/docs/guides/deno-fresh.md): Tested on a real server. ox installs Deno 2, runs deno install and deno task build, then deno serve under systemd with Caddy for HTTPS. - [Phoenix](https://console.oss-node2.sorv.dev/docs/guides/phoenix.md): Tested on a real server. ox builds a mix release with its assets, runs Release.migrate, starts it under systemd, and adds PostgreSQL. ## Guides: Static sites - [Deploy a static site](https://console.oss-node2.sorv.dev/docs/guides/static-site.md): Tested on a real server. Deploy a Vite single-page app, an Astro site or plain HTML to your own VPS. Caddy serves the files over HTTPS, no app process, with a tiny ox.toml or none. - [React with Vite](https://console.oss-node2.sorv.dev/docs/guides/react-vite.md): Tested on a real server. ox runs the build from your lockfile and Caddy serves dist over HTTPS, no ox.toml. - [Create React App](https://console.oss-node2.sorv.dev/docs/guides/create-react-app.md): Tested on a real server. ox runs react-scripts build and Caddy serves the build folder over HTTPS. No Docker, no ox.toml. - [Vue CLI](https://console.oss-node2.sorv.dev/docs/guides/vue.md): Tested on a real server. ox installs from yarn.lock, runs your build, and Caddy serves dist over HTTPS. The plan comes from the repo alone. - [Angular](https://console.oss-node2.sorv.dev/docs/guides/angular.md): Tested on a real server. ox reads the output folder from angular.json, runs ng build, and Caddy serves it, with no Docker. - [Next.js static export](https://console.oss-node2.sorv.dev/docs/guides/nextjs-static-export.md): Tested on a real server. 'export' to your own VPS: ox runs next build and Caddy serves the out folder over HTTPS, with no Node process running. - [Gatsby](https://console.oss-node2.sorv.dev/docs/guides/gatsby.md): Tested on a real server. ox reads gatsby-config.js, runs gatsby build from package.json, and Caddy serves the public folder over HTTPS. - [Docusaurus](https://console.oss-node2.sorv.dev/docs/guides/docusaurus.md): Tested on a real server. ox runs the build from package.json and Caddy serves the build folder over HTTPS, no ox.toml. - [Astro](https://console.oss-node2.sorv.dev/docs/guides/astro.md): Tested on a real server. ox reads astro.config.mjs, runs astro build, and Caddy serves dist over HTTPS with no app process running. - [SvelteKit static](https://console.oss-node2.sorv.dev/docs/guides/sveltekit-static.md): Tested on a real server. ox reads the pages folder from svelte.config and Caddy serves it over HTTPS, no Docker. - [React Router SPA](https://console.oss-node2.sorv.dev/docs/guides/react-router-spa.md): Tested on a real server. false to your own VPS: ox reads react-router.config.ts, builds it, and Caddy serves build/client over HTTPS, no Node. ## Operate - [Operate](https://console.oss-node2.sorv.dev/docs/operate.md): Run your app after its first deploy: read logs, roll back a release, back up and restore data, set variables, add domains with HTTPS, staging and previews. - [Logs](https://console.oss-node2.sorv.dev/docs/operate/logs.md): View your app's logs live in the dashboard or with ox logs: filter by severity and process, search with a regex, pick a time range, and download them. - [Roll back](https://console.oss-node2.sorv.dev/docs/operate/rollback.md): Roll back a deployment to a kept release without a rebuild. The live release serves until the old one passes its health check. What happens to your data. - [Backups and restore](https://console.oss-node2.sorv.dev/docs/operate/backups.md): ox backs up your app's databases every day with nothing to turn on. Back up now, keep copies in your S3 bucket, download a backup, and restore it safely. - [Backups and leaving](https://console.oss-node2.sorv.dev/docs/operate/leaving.md): Where your backups live, what is not backed up, how much data you can lose, what pauses when ox is down, and how to leave ox with your data. - [Variables](https://console.oss-node2.sorv.dev/docs/operate/variables.md): Set environment variables and secrets in the dashboard or with ox vars, reference one in another, see the keys ox provides and hides, restore old ones. - [Staging and previews](https://console.oss-node2.sorv.dev/docs/operate/previews.md): Turn on a preview deployment per branch and a staging copy, each with its own database, on your own server. Limits, passwords and promote to production. - [Domains and HTTPS](https://console.oss-node2.sorv.dev/docs/operate/domains.md): Add a custom domain to your app: create the A record, add the name in ox, and Caddy gets and renews the HTTPS certificate. What each domain status means. ## Services - [Services](https://console.oss-node2.sorv.dev/docs/operate/services.md): See every service your app uses on one card: status, size, backups and its connection URL, then browse Postgres, Redis, NATS or ClickHouse data, read-only. - [PostgreSQL](https://console.oss-node2.sorv.dev/docs/operate/services#postgres): Built-in type: a database on the shared cluster or a private one, with tables, read-only SQL and activity. - [MySQL (MariaDB)](https://console.oss-node2.sorv.dev/docs/operate/services#mysql): Built-in type served by MariaDB, private only, with a table browser and activity. - [SQLite](https://console.oss-node2.sorv.dev/docs/operate/services#sqlite): A file the app keeps in [storage] keep: ox lists its tables and backs it up with SQLite's own backup. - [Valkey](https://console.oss-node2.sorv.dev/docs/operate/services#valkey): Custom service from apt valkey-server: the Redis key browser reads it. - [Redis](https://console.oss-node2.sorv.dev/docs/operate/services#redis): Built-in type: an index on the shared instance or a private one, with a key browser and a command console. - [MongoDB](https://console.oss-node2.sorv.dev/docs/operate/services#mongodb): No server package for Ubuntu 26.04 yet, so ox cannot run it; use PostgreSQL's jsonb meanwhile. - [MariaDB](https://console.oss-node2.sorv.dev/docs/operate/services#mariadb): The mysql type runs MariaDB: same table browser. - [OpenSearch](https://console.oss-node2.sorv.dev/docs/operate/services#opensearch): The Elasticsearch explorer reads it; there is no install path on Ubuntu 26.04 yet. - [Elasticsearch](https://console.oss-node2.sorv.dev/docs/operate/services#elasticsearch): Index list and a read-only search; the vendor apt repo is its only install path, which ox does not add. - [Memcached](https://console.oss-node2.sorv.dev/docs/operate/services#memcached): Custom service from apt memcached: hit rate, items and connections. It has no auth, so it stays on 127.0.0.1. - [RabbitMQ](https://console.oss-node2.sorv.dev/docs/operate/services#rabbitmq): Custom service from apt rabbitmq-server: the card and the connection details; its management UI has no safe path yet. - [Prometheus](https://console.oss-node2.sorv.dev/docs/operate/services#prometheus): Custom service: scrape targets, series names and a read-only PromQL box. It has no auth, so it stays on 127.0.0.1. - [Grafana](https://console.oss-node2.sorv.dev/docs/operate/services#grafana): Only in the vendor apt repo, which ox does not add; point a domain at it yourself once that changes. - [InfluxDB](https://console.oss-node2.sorv.dev/docs/operate/services#influxdb): Ubuntu ships 1.6, which is old: the card only. VictoriaMetrics is the better pick. - [Neo4j](https://console.oss-node2.sorv.dev/docs/operate/services#neo4j): Built-in type: label counts, a node browser and read-only Cypher. - [ClickHouse](https://console.oss-node2.sorv.dev/docs/operate/services#clickhouse): Custom service: table list with rows and size, and read-only SQL with readonly=1 on every request. - [Cassandra](https://console.oss-node2.sorv.dev/docs/operate/services#cassandra): Multi-node by design and heavy on memory: ox does not claim it. - [Meilisearch](https://console.oss-node2.sorv.dev/docs/operate/services#meilisearch): Custom service: index list with document counts and a search box, with the generated master key. - [Qdrant](https://console.oss-node2.sorv.dev/docs/operate/services#qdrant): Built-in type: collections, point counts and sample points. - [pgvector](https://console.oss-node2.sorv.dev/docs/operate/services#pgvector): Wired into the postgres type: vectors show in the Postgres browser. - [Typesense](https://console.oss-node2.sorv.dev/docs/operate/services#typesense): Collections and a search box; its .deb is not on apt or GitHub, so there is no install path yet. - [Chroma](https://console.oss-node2.sorv.dev/docs/operate/services#chroma): Custom service: collections with counts and a peek. It has no auth by default, so it stays on 127.0.0.1. - [Kafka](https://console.oss-node2.sorv.dev/docs/operate/services#kafka): A JVM tarball only: ox does not claim it. NATS JetStream or Redis streams fit one server. - [MinIO](https://console.oss-node2.sorv.dev/docs/operate/services#minio): No Linux binaries since 2025-10; SeaweedFS is the S3 store ox runs. - [SeaweedFS](https://console.oss-node2.sorv.dev/docs/operate/services#seaweedfs): Custom service from its GitHub release: the card and the S3 connection details. - [NATS](https://console.oss-node2.sorv.dev/docs/operate/services#nats): Custom service from apt nats-server: JetStream streams with messages, bytes and consumers, read over its own protocol. - [PostGIS](https://console.oss-node2.sorv.dev/docs/operate/services#postgis): Ubuntu ships it for PostgreSQL 18; ox does not create the extension yet. - [TimescaleDB](https://console.oss-node2.sorv.dev/docs/operate/services#timescaledb): Needs a preload that touches every project on a shared cluster, so private mode only, and not wired yet. - [PgBouncer](https://console.oss-node2.sorv.dev/docs/operate/services#pgbouncer): Custom service from apt: the card and the connection details. - [Mailpit](https://console.oss-node2.sorv.dev/docs/operate/services#mailpit): Custom service: the card. Captured mail can hold secrets, so its UI stays on 127.0.0.1. - [Keycloak](https://console.oss-node2.sorv.dev/docs/operate/services#keycloak): A Java zip that wants about 1 GB: ox does not claim it. Zitadel or Ory Kratos fit. - [Loki](https://console.oss-node2.sorv.dev/docs/operate/services#loki): Custom service: the card and the push URL. ox's own log explorer already reads the journal. - [VictoriaMetrics](https://console.oss-node2.sorv.dev/docs/operate/services#victoriametrics): Custom service: series names and read-only PromQL through its Prometheus API. - [Weaviate](https://console.oss-node2.sorv.dev/docs/operate/services#weaviate): Custom service from its GitHub release: the card and the connection details. - [Mosquitto](https://console.oss-node2.sorv.dev/docs/operate/services#mosquitto): Custom service from apt: the card. Set allow_anonymous false and a password file. - [Celery](https://console.oss-node2.sorv.dev/docs/operate/services#celery): A worker, not a service: its page lists workers and their tasks over the Redis broker. - [DuckDB](https://console.oss-node2.sorv.dev/docs/operate/services#duckdb): A file the app keeps: [storage] keep backs it up; ox has no DuckDB browser yet. - [Temporal](https://console.oss-node2.sorv.dev/docs/operate/services#temporal): Custom service in dev-server mode: the card and the frontend address. - [Zitadel](https://console.oss-node2.sorv.dev/docs/operate/services#zitadel): Custom service on PostgreSQL: the card. Its console is reached through a domain you set. - [Ory Kratos](https://console.oss-node2.sorv.dev/docs/operate/services#kratos): Custom service: the card. Only its public API goes on a domain, never the admin API. - [OpenBao](https://console.oss-node2.sorv.dev/docs/operate/services#openbao): Custom service: the card. ox never stores its unseal keys. - [Centrifugo](https://console.oss-node2.sorv.dev/docs/operate/services#centrifugo): Custom service: the card; keep its admin UI off. - [ntfy](https://console.oss-node2.sorv.dev/docs/operate/services#ntfy): Custom service: the card. Start it with auth-default-access deny-all. - [PocketBase](https://console.oss-node2.sorv.dev/docs/operate/services#pocketbase): Custom service: the card. Its admin UI has no safe path yet. - [Gitea](https://console.oss-node2.sorv.dev/docs/operate/services#gitea): Custom service: the card, with registration off. - [Postfix](https://console.oss-node2.sorv.dev/docs/operate/services#postfix): Custom service: the card. Many providers block port 25, so an email API is usually simpler. - [Garage](https://console.oss-node2.sorv.dev/docs/operate/services#garage): Its binaries have no verified fetch path; SeaweedFS is the S3 store ox runs. - [Redpanda](https://console.oss-node2.sorv.dev/docs/operate/services#redpanda): Only its CLI is on GitHub: no install path. - [Supabase](https://console.oss-node2.sorv.dev/docs/operate/services#supabase): Docker Compose only: ox does not claim it. PostgreSQL plus an auth service covers it. - [SQL Server](https://console.oss-node2.sorv.dev/docs/operate/services#sqlserver): No package for Ubuntu 26.04 and it needs 2 GB: ox does not claim it. ## Troubleshooting - [Troubleshooting](https://console.oss-node2.sorv.dev/docs/troubleshooting.md): Fix a failed deploy: health check failed, build failed, domain not working, disk full, out of memory, server offline. The exact message, cause and fix. - [Health check failed](https://console.oss-node2.sorv.dev/docs/troubleshooting#health-check-failed): the app did not answer within 120s - [Build failed](https://console.oss-node2.sorv.dev/docs/troubleshooting#build-failed): exit status 1, or set these before deploying - [Domain not working](https://console.oss-node2.sorv.dev/docs/troubleshooting#domain-not-working): waiting for DNS, points elsewhere, no certificate - [another operation is already running](https://console.oss-node2.sorv.dev/docs/troubleshooting#busy): another operation is already running for shop; wait for it to finish, then retry - [interrupted by ox, not the app](https://console.oss-node2.sorv.dev/docs/troubleshooting#interrupted): deploy interrupted: interrupted by ox, not the app: the ox agent stopped mid-run (an ox update or a reboot); ox is deploying it again as run Qd8xT2LmA0c (ox logs shop --run Qd8xT2LmA0c --follow) - [Disk full](https://console.oss-node2.sorv.dev/docs/troubleshooting#disk-full): a deploy needs at least 2 GB - [Not enough memory](https://console.oss-node2.sorv.dev/docs/troubleshooting#out-of-memory): killed by the out-of-memory killer - [The app keeps crashing](https://console.oss-node2.sorv.dev/docs/troubleshooting#crash-loop): systemd restarted it 5 times - [Server offline](https://console.oss-node2.sorv.dev/docs/troubleshooting#server-offline): the server has not connected yet - [Install refused](https://console.oss-node2.sorv.dev/docs/troubleshooting#install-refused): this server can't take ox yet - [repository access removed](https://console.oss-node2.sorv.dev/docs/troubleshooting#github-access): GitHub gives ox no access - [not signed in; run ox login](https://console.oss-node2.sorv.dev/docs/troubleshooting#cli-sign-in): not signed in; run ox login ## Blog - [Guides to deploying on your own server](https://console.oss-node2.sorv.dev/blog): Step-by-step guides to deploying Django on a VPS, zero-downtime releases with systemd and Caddy, moving off Heroku, and more. - [Why I Stopped Paying for Vercel on My Side Projects](https://console.oss-node2.sorv.dev/blog/stopped-paying-for-vercel-side-projects): Vercel is great, but the bill grows with each project. How I run my side projects on one VPS I own with ox, what it costs, and what I gave up. - [Self-Hosted Deploy Tools Felt Too Busy, So I Built ox](https://console.oss-node2.sorv.dev/blog/why-i-built-ox-simple-self-hosted-deploys): I could pay a lot to keep deploys simple, or pay less and fight a busy screen. I wanted neither, so I built a calm deploy tool for my own server. - [Deploy FastAPI to Your Own VPS with One Config File](https://console.oss-node2.sorv.dev/blog/deploy-fastapi-to-your-own-vps): Put a FastAPI app with uvicorn, Postgres and Alembic on your own Ubuntu server, with HTTPS and no Docker, using one small ox.toml file you can copy. - [Deploy Django Without Docker: Gunicorn, systemd and Caddy](https://console.oss-node2.sorv.dev/blog/deploy-django-to-a-vps-without-docker): Deploy Django without Docker on your Ubuntu VPS: gunicorn under systemd, Caddy for HTTPS and PostgreSQL. Every step by hand, then the same deploy with ox. - [A Heroku alternative on your own VPS, without Docker](https://console.oss-node2.sorv.dev/blog/heroku-alternative-on-your-own-server): A Heroku alternative for 2026: move your app to a VPS you own. What maps to what, real costs, five migration steps, and what ox does not do. - [Zero-downtime deploys without Docker: systemd and Caddy](https://console.oss-node2.sorv.dev/blog/zero-downtime-deploys-systemd-caddy): Zero-downtime deployment on a VPS without Docker: blue-green with two systemd units, a health check and a Caddy upstream file. A copyable script inside. - [Agentic Loops and Swarms Are the New Moat for Dev Tools](https://console.oss-node2.sorv.dev/blog/agentic-loops-swarm-is-the-new-moat): What agentic loops are and why they beat prompting: a swarm of research, review and production agents that removed dead code with zero broken features. - [Case Study: Raising a Vue App's Lighthouse Score to 93](https://console.oss-node2.sorv.dev/blog/case-study-how-i-improved-frontend-page-speed): A Vue and Vite case study: how route splitting, lazy components, deferred analytics and leaner fonts raised a Lighthouse performance score from 60 to 93. - [Deploy Django and Vue.js on a VPS: Nginx, Gunicorn, Celery](https://console.oss-node2.sorv.dev/blog/deployment-guide-for-django-vuejs-project-on-vps): Deploy a Django and Vue.js app on a VPS: Nginx serves the Vue build, Gunicorn runs Django, Celery and Redis under systemd, with HTTPS from Certbot. - [Fail2Ban for Django: Stop Brute-Force Logins on Your VPS](https://console.oss-node2.sorv.dev/blog/fail2ban-magic-keeping-your-django-castle-safe): Use Fail2Ban to stop brute-force logins on Django: ban IPs from Nginx logs, catch failed Django admin logins with a signal, and test every filter safely. - [Deploy Django with Uvicorn and Nginx: A Beginner's Guide](https://console.oss-node2.sorv.dev/blog/comprehensive-django-deployment-guide-for-beginners): A beginner's guide to deploying Django with Uvicorn and Nginx on an Ubuntu VPS: SSH keys, Supervisor, a firewall and free HTTPS with Certbot, step by step. ## About - [Why I built ox](https://console.oss-node2.sorv.dev/story): Saurav Sharma on why he built ox: simple deploys to a server you own, with a calm dashboard and nothing extra. - [Features: push to deploy on your own server](https://console.oss-node2.sorv.dev/features): Zero-downtime deploys, staging and branch previews, daily backups, rollback and a CLI your AI can drive. All on a VPS you own. - [Privacy policy](https://console.oss-node2.sorv.dev/privacy): ox privacy policy: what ox Cloud stores, why, and your rights - [Terms of service](https://console.oss-node2.sorv.dev/terms): ox terms of service ## Optional - [llms-full.txt](https://console.oss-node2.sorv.dev/llms-full.txt): Every docs page, stack guide and the story as one Markdown file, with the blog's post summaries. - [sitemap.xml](https://console.oss-node2.sorv.dev/sitemap.xml): Every public page and post. - [robots.txt](https://console.oss-node2.sorv.dev/robots.txt): The crawling policy: public pages are open to every crawler.