Self-hosted 360° virtual tour software

Build 360° virtual tours on your own server.

Tourbine is an open source web app for building and publishing interactive 360° tours. Add panoramas, video and info points, arrange the rooms, then publish. No SaaS account, no cloud services, no data leaving your machine.

What Tourbine does

360° panorama viewer

Rotate, zoom, fullscreen, auto-rotate, and switch rooms from a filmstrip. Built on Pannellum.

Six room media types

Each room can hold a 360° image, still image, local video, YouTube, Vimeo, or an iframe embed URL.

Room-to-room hotspots

Link rooms with a pitch/yaw position and a label. Visitors click the hotspot to move to the next room.

External link hotspots

Point a hotspot at any URL to send visitors out of the tour.

Info points

Attach a title and text to a spot in a 360° or still image. Visitors see it as a tooltip.

Click-to-pick placement

Set the initial view and hotspot positions by clicking the panorama in the room editor instead of typing pitch and yaw.

Image privacy editor

Blur or mosaic parts of an image on a canvas brush before upload.

Embeddable tours

Every tour has an iframe-friendly /embed view and a copyable embed snippet.

Tour import and export

Export a tour as a ZIP and import it on another instance. Legacy JSON exports are supported too.

Visitor analytics

All-time, 24-hour and 7-day view counts, plus per-tour totals.

Multi-user dashboard

Three roles: system_admin, admin and user. Create users, change roles and reset passwords.

Read-only JSON API

GET /api/tours and GET /api/tours/:slug for headless use.

Cloudflare Tunnel setup

Store the tunnel name, UUID, credentials path and hostname in the dashboard and preview the generated cloudflared config.

Hardened authentication

bcrypt password hashes, session cookies, CSRF tokens on every write, and rate-limited login.

Docker deployment

A Dockerfile and Compose file with named volumes for the database and uploads.

Password recovery CLI

node reset-password.js sets a new password straight in the SQLite database, even when the server is stopped.

Stack at a glance

RuntimeNode.js + Express
TemplatesEJS
DatabaseSQLite
ViewerPannellum
Default port3000
LicenseGPL-3.0

No separate database server. Tours live in a single SQLite file and uploads stay in a local folder, so a backup is a copy of two paths. Media files are capped at 100 MB each.

Install Tourbine

Tourbine runs as one Node.js process on port 3000. It supports Cloudflare Tunnel for public access without port-forwarding.

Requirement: Node.js LTS and npm. The SQLite driver is a native addon, so installing from source needs build tools (python3, make, g++); the Docker image installs them for you.
  1. Clone the repository
    git clone https://github.com/efenow/tourbine.git
  2. Enter the project directory
    cd tourbine
  3. Install dependencies
    npm install
  4. Start the server
    npm start

Open http://localhost:3000. On first run, /dashboard redirects to /dashboard/setup. Create the system admin account there: username at least 3 characters, password at least 8 characters.

Development (auto-restart on file change)

npm run dev

Run the test suite

npm test

Environment variables: PORT (default 3000), DB_PATH (default data/tourbine.db), and NODE_ENV=production to turn on secure session cookies.

Open by design

Tourbine is GPL-3.0 software. Run it on your own hardware, read the source, and change it to fit your workflow. There is no hosted tier and no telemetry.

Get the source