🚀 Open Source & Free

Run your scavenger hunt
like a pro

Oriento is a full-stack platform for organizing orienteering events and scavenger hunts. Real-time maps, QR checkpoints, live leaderboards — all in a sleek PWA your teams install in seconds.

View on GitHub Quick Start
PWA
Installable on iOS & Android
Real-time
WebSocket live updates
i18n
English & Greek built-in
Docker
One-command deploy

Everything you need to run
a competitive hunt

From event setup to finish-line celebration — Oriento handles the full lifecycle of your scavenger hunt.

🗺️
Interactive Team Maps
Teams navigate in real-time with a Leaflet-powered map showing checkpoints, GPS position and the return point. Multiple tile layers including satellite view.
📸
QR Checkpoint Scanning
Continuous camera scanning validates QR codes at each checkpoint. Admins can download and print all QRs at once from the dashboard.
🏆
Live Leaderboards
Scores update the moment a team scans a checkpoint via WebSockets. Share a public link with spectators — no login required.
📍
Real-time GPS Tracking
Admin map shows all team positions live. Route history per team, filterable activity feed, and GPS breadcrumb trails on the map.
⏱️
Event Timer
Set start and end times. Events auto-activate at the start time, scans are rejected after the end time, and a live countdown is shown to all teams.
🥇
Bonus Point System
Award extra points to the first team to scan each checkpoint and to the first team to complete the entire hunt. Fully configurable per event.
📱
Progressive Web App
Teams install Oriento directly to their home screen on iOS and Android. Works seamlessly in any mobile browser — no app store needed.
🌗
Dark Mode & i18n
Full dark mode support throughout the app. Built-in English and Greek localization with per-event language preference for teams.
👑
Admin Dashboard
Create events, manage teams, drag checkpoint markers on a map, view live activity feeds and checkpoint progression — all from one place.

Up and running in minutes

Oriento is designed to get out of the way so you can focus on running a great event.

1
Create your event
Set the name, timer, bonus rules and start/return points from the admin dashboard.
2
Place checkpoints
Drop pins on the map, set point values and first-scan bonuses. Download all QR codes as a batch.
3
Register teams
Create team accounts with usernames and passwords. Teams log into the PWA on their phones.
4
Go live
Activate the event. Teams navigate the map, scan QR codes at checkpoints and compete in real-time.
5
Follow along
Watch the live activity feed, GPS positions and leaderboard update in real-time from the admin dashboard.

Built on modern,
battle-tested tools

Every piece chosen for reliability, developer experience and performance.

⚡ Vue 3
🎨 Quasar Framework
🔷 TypeScript
🪺 NestJS
🐘 PostgreSQL
🔺 Prisma ORM
🗺️ Leaflet
🔌 Socket.IO
🐳 Docker
📦 Vite
🔐 JWT Auth
📱 PWA

One command to production

Pre-built Docker images are published to GHCR. Copy the compose file, fill in your secrets and you're live.

docker-compose.prod.yml
services:
  db:
    image: postgres:15-alpine
    restart: always
    env_file: ./db.env.prod
    volumes:
      - postgres_data_prod:/var/lib/postgresql/data

  backend:
    image: ghcr.io/athamour1/oriento/backend:latest
    restart: always
    depends_on: [db]
    ports: ["3000:3000"]
    env_file: ./backend/.env.prod

  frontend:
    image: ghcr.io/athamour1/oriento/frontend:latest
    restart: always
    ports: ["80:80"]
    environment:
      - VITE_API_URL=https://your-domain.com

volumes:
  postgres_data_prod:
db.env.prod
POSTGRES_USER=admin
POSTGRES_PASSWORD=CHANGE_ME
POSTGRES_DB=orienteering
backend/.env.prod
DATABASE_URL=postgresql://admin:CHANGE_ME@db:5432/orienteering
JWT_SECRET=CHANGE_ME_MIN_32_CHARS
ADMIN_USERNAME=admin
ADMIN_PASSWORD=CHANGE_ME
CORS_ORIGIN=https://your-domain.com
PORT=3000
Deploy
docker compose -f docker-compose.prod.yml pull
docker compose -f docker-compose.prod.yml up -d

Ready to run your hunt?

Oriento is completely open-source and free. Clone it, deploy it with Docker and run your first event today.