Create your page. Host it on your server.
Design visually. Publish on your domain. Keep control of your data.
Quick start · Dashboard · Documentation · Contributing · Security
OrbitPage is an open-source visual page builder for anyone who wants a public page on their own server. Create portfolios, service pages, venue menus, or event pages. Add images, video, links, contact details, maps, and calls to action. Edit the layout, colors, and typography with a live preview.
Your page adapts to phones and desktops, with SEO, QR codes, analytics, and newsletters built in. The self-hosted edition is free, MIT-licensed, and runs in one Docker container, keeping your content and data on your own server.
Prefer managed hosting? Explore orbitpage.com. This repository contains the self-hosted application.
Docker Hub namespace migration: the official image is now
paoloronco/orbitpage. The formerpaueron/orbitpagepath is a temporary compatibility feed and stops receiving updates on October 9, 2026. Existing volumes and data are unaffected; see Deployment.
- Why OrbitPage
- Docker
- Linux installer
- Proxmox VE
- Run from source
- Updates
- Data and backups
- Dashboard workspaces
- Configuration & Environment
- Documentation
- Security and contributing
- Self-hosted. Run one Docker container with SQLite and local storage on your server or homelab.
- Visual editing. Manage content, design, menus, subpages, and publishing from the dashboard.
- Flexible content. Add images, video, links, contact details, events, maps, and venue menus.
- Sharing and discovery. Generate QR codes, set search and social metadata, and track visits with consent-aware analytics.
Docker is the recommended deployment method.
Docker Run and Compose publish port 8080 on all host interfaces. Replace device_ip with the Docker host's LAN address.
| Registry | Image |
|---|---|
| Docker Hub | paoloronco/orbitpage |
| GitHub Container Registry | ghcr.io/paoloronco/orbitpage |
docker pull paoloronco/orbitpage:latest
docker run -d \
--name orbitpage \
--restart unless-stopped \
-p 8080:8080 \
-v orbitpage-data:/app/data \
--security-opt no-new-privileges:true \
paoloronco/orbitpage:latestOpen the dashboard and choose a password for the admin.
The public page is at http://device_ip:8080.
Change the port or data mount in the command if needed. See the Docker deployment guide for options.
docker pull ghcr.io/paoloronco/orbitpage:latest
docker run -d \
--name orbitpage \
--restart unless-stopped \
-p 8080:8080 \
-v orbitpage-data:/app/data \
--security-opt no-new-privileges:true \
ghcr.io/paoloronco/orbitpage:latestOpen the dashboard and choose a password for the admin.
The public page is at http://device_ip:8080.
Change the port or data mount in the command if needed. See the Docker deployment guide for options.
Clone the repository and start the included configuration:
git clone https://github.com/paoloronco/OrbitPage.git
cd OrbitPage
docker compose up -dOpen the dashboard and choose a password for the admin.
The public page is at http://device_ip:8080.
Edit docker-compose.yml to change the image, port, environment, or storage path.
Use a Debian 12/13 or Ubuntu 22.04/24.04/26.04 server, VM, or LXC on amd64 or arm64. Run the Proxmox installer below on a Proxmox host.
sudo apt-get update
sudo apt-get install -y git
git clone https://github.com/paoloronco/OrbitPage.git
cd OrbitPage
sudo ./install.shOpen http://SERVER_IP:8080/dashboard/profile and choose a password for the admin.
The public page is at http://SERVER_IP:8080.
Replace SERVER_IP with the server's LAN address. For local-only access, see LAN and loopback.
The installer creates a dedicated unprivileged Debian 12 LXC and installs OrbitPage inside it.
Use an x86-64 Proxmox VE 8+ host with patched lxc-pve: at least 6.0.0-2 on PVE 8, or 6.0.5-2 on PVE 9+. Run as root:
apt-get update
apt-get install -y git
git clone https://github.com/paoloronco/OrbitPage.git
cd OrbitPage
./install-pve.shOpen http://GUEST_IP:8080/dashboard/profile and choose a password for the admin.
The public page is at http://GUEST_IP:8080.
Use the LXC's LAN address shown by the installer for GUEST_IP. For local-only access, see LAN and loopback.
git clone https://github.com/paoloronco/OrbitPage.git
cd OrbitPage/app
npm ci
npm run install:server
cp .env.example .env
chmod 600 .env
printf '\nJWT_SECRET=%s\n' "$(node -p "require('crypto').randomBytes(32).toString('hex')")" >> .env
npm run build
cd server
node --env-file=../.env server.jsOpen the dashboard and choose a password for the admin.
The public page is at http://device_ip:8080.
Edit app/.env if needed; set HOST=0.0.0.0 for LAN access.
Open Dashboard → Edition → Instance details and click Check for updates. When a release is available, click Install update… as an administrator. The dialog installs it through the host update service or shows terminal instructions if the service is unavailable.
Linux and Proxmox
For installer-managed deployments using latest:
sudo orbitpage updateFrom the Proxmox host:
pct exec CTID -- orbitpage updateDocker Compose
docker compose pull
docker compose up -dDocker Run
Pull the new image and recreate the container with the same volume, ports, and environment:
docker pull paoloronco/orbitpage:latest
docker stop orbitpage
docker rm orbitpage
docker run -d \
--name orbitpage \
--restart unless-stopped \
-p 8080:8080 \
-v orbitpage-data:/app/data \
--security-opt no-new-privileges:true \
paoloronco/orbitpage:latestAfter every update, verify on the Docker host or inside the Proxmox guest:
curl -fsS http://127.0.0.1:8080/healthAlso verify dashboard login, the public page, and uploaded media.
For backups and rollback procedures, see Maintenance.
The data directory contains:
orbitpage.db
uploads/
.jwt-secret (Docker-generated installations)
.instance-env.json (dashboard environment overrides, when saved)
Back up the whole data directory before upgrades or restores: /app/data in Docker, or your source installation's DATA_DIR. Keep any host-managed secrets backed up separately and private.
The dashboard exports selected application data as JSON, with an optional Include images (ZIP) archive. Newsletter records, SMTP credentials, and provider secrets require an infrastructure backup. Follow the backup and restore guide for a consistent copy of the database and uploads.
| Workspace | Purpose | URL path |
|---|---|---|
| Page | Profile, image, social links, browser metadata, and footer | /dashboard/editor/page |
| Content | Main-page blocks, ordering, visibility, and scheduling | /dashboard/editor/content |
| Menu | Venue menu settings, sections, products, and design | /dashboard/editor/menu/content |
| Shop | Digital products, services, orders and owner Stripe payments; setup guide | /dashboard/editor/shop/products |
| Pages | Additional public pages and their blocks | /dashboard/editor/pages |
| AI Assistant | Propose profile, content, and theme changes to review and confirm | /dashboard/ai |
| Theme | Colors, typography, cards, background, and live preview | /dashboard/theme/page |
| Publish | Static and scheduled QR links, sitemap, and discovery text files | /dashboard/publish/QR |
| Backup | JSON or image ZIP export, selective restore, and unused-media cleanup | /dashboard/backup |
| Analytics | Visit and content reports, plus optional GA4 | /dashboard/analytics |
| Privacy | Consent banner, legal policies, and external CMP settings | /dashboard/privacy |
| Newsletter | SMTP settings, subscribers, campaigns, scheduling, and reports | /dashboard/newsletter/overview |
| Team | Users, roles, permissions, and personal API tokens | /dashboard/team |
| Account | Account details, public page controls, password, TOTP, and admin audit log | /dashboard/account/general |
| Edition | Instance details, updates, environment settings, self-hosted features, and server responsibilities | /dashboard/plan |
Dashboard URLs include the interface language, for example /it-IT/dashboard/account/general. The paths above omit that prefix for readability. Navigation shows only the tools your role can access.
See the dashboard guide for tab URLs and editing instructions.
Common runtime settings:
| Variable | Default | Purpose |
|---|---|---|
DATA_DIR |
app/server from source; /app/data in Docker |
Database, uploads, and saved instance settings |
JWT_SECRET |
Generated and saved in Docker; required from source | Stable session and encryption secret; explicit values must be at least 32 characters |
NODE_ENV |
Unset from source; production in Docker |
Use production for deployed source installations |
PORT |
3001 from source; 8080 in Docker |
HTTP port |
HOST |
127.0.0.1 from source; 0.0.0.0 in Docker |
Listener address |
PUBLIC_SITE_URL |
Request origin | Public URL for metadata, QR codes, sitemap, and newsletter links |
PUBLIC_SITE_NAME |
OrbitPage |
Site name in generated metadata |
SEO_INDEXING |
true |
Set to false for staging or private instances |
UPLOAD_STORAGE_QUOTA_MB |
1024 |
Total upload quota in MB |
VIDEO_UPLOAD_LIMIT_MB |
100 |
Per-file video limit in MB |
ORBITPAGE_BACKUP_MEDIA_LIMIT_MB |
128 |
Total decoded media limit per backup export or restore in MB |
MEDIA_CLEANUP_ENABLED |
true outside tests and demo mode |
Automatic unused-upload cleanup |
MEDIA_CLEANUP_GRACE_HOURS |
24 |
Minimum age of an unused upload before cleanup |
TZ |
UTC |
Fallback timezone for scheduled content |
OPENAI_API_KEY |
Unset | Optional AI key; a key saved in AI Assistant takes precedence |
ORBITPAGE_SECRET_ENCRYPTION_KEY |
JWT_SECRET |
Optional separate stable secret of at least 32 characters for the saved AI key |
NEWSLETTER_SECRET_KEY |
JWT_SECRET |
Optional separate stable secret of at least 32 characters for SMTP encryption and newsletter links |
ORBITPAGE_TRUST_PROXY |
Disabled | Trusted proxy IPs or CIDRs; see the configuration reference before enabling |
BASE_PATH |
Empty | Mount path when serving under a subdirectory |
Administrators can change instance settings under Edition → Instance details → Environment variables.
Newsletters require SMTP configuration. See the newsletter guide for setup and the Configuration reference for all variables, defaults, and examples.
Start from the documentation index.
| Task | Guide |
|---|---|
| Deploy, update, or use Proxmox | Deployment |
| Configure environment variables | Configuration |
| Navigate the editor | Dashboard guide |
| Manage users, passwords and two-factor authentication | Account and team |
| Share or print a QR code | Publishing and QR |
| Build content, menus, subpages, and themes | Content and design |
| Export, restore, clean media, or evaluate demo mode | Backups, media, and demo mode |
| Configure AI safely | AI assistant |
| Configure analytics and consent | Analytics and privacy |
| Configure SMTP and send newsletters | Newsletters |
| Configure search and discovery | SEO and indexing |
| Troubleshoot | Troubleshooting |
To automate a self-hosted installation, see the API guide. For pages hosted on orbitpage.com, use the n8n community node.
Report suspected vulnerabilities privately through a GitHub Security Advisory or the contact in SECURITY.md. Do not open a public issue for an unpatched vulnerability.
Issues and focused pull requests are welcome. Read CONTRIBUTING.md for setup, checks, compatibility expectations, and the contribution workflow. Participation follows the Code of Conduct.
OrbitPage's open-source edition is available under the MIT License.

