A modern, mobile-first web UI for OpenWRT-based travel routers (GL.iNet Beryl AX MT3000, Slate AXT1800).
Provides an intuitive dashboard, WiFi management with hotel captive portal support, VPN/service management, and system configuration. Built as a Go backend + React frontend monorepo that coexists with LuCI.
- Contributor and agent doc map: docs/README.md
- Stable architecture decisions: docs/architecture.md
- Active backlog: docs/requirements/tasks_open.md
SSH into your OpenWRT router and run:
wget -O- https://raw.githubusercontent.com/raydak-labs/travo/main/scripts/install.sh | shThis installs Travo on port 80, AdGuard Home on port 3000 (DNS on 5353 via dnsmasq forwarding), and moves LuCI to port 8080. See docs/deployment.md for all options and manual install instructions.
Default AdGuard credentials:
admin/password— change immediately via Settings → AdGuard Password in the Travo UI.
- UI / UX inspired by GL.iNet (review article)
┌─────────────────────────────────────────────┐
│ Browser (React SPA) │
│ TanStack Query/Router, Shadcn/UI, Zustand │
└──────────────────┬──────────────────────────┘
│ REST + WebSocket
┌──────────────────▼──────────────────────────┐
│ Go Backend (Fiber) │
│ ┌─────────┐ ┌──────────┐ ┌──────────────┐ │
│ │ Auth │ │ REST API │ │ WebSocket │ │
│ │ (session│ │ handlers │ │ (live stats) │ │
│ │ +JWT) │ │ │ │ │ │
│ └────┬────┘ └────┬─────┘ └──────┬───────┘ │
│ │ │ │ │
│ ┌────▼───────────▼───────────────▼───────┐ │
│ │ Service Layer │ │
│ │ UCI wrapper │ ubus client │ opkg mgr │ │
│ └────────────────────────────────────────┘ │
│ │ (mock mode: in-memory fakes) │
└───────┼─────────────────────────────────────┘
│ exec / socket
┌───────▼─────────────────────────────────────┐
│ OpenWRT System │
│ UCI configs │ ubus │ init.d │ iwinfo │
└─────────────────────────────────────────────┘
- Dashboard — Real-time system stats, connection status, quick actions
- WiFi Management — Scan, connect, mode switching (client/repeater/AP)
- Hotel Captive Portal — Automatic detection and one-click login
- VPN Management — WireGuard and Tailscale configuration
- Service Management — Install/manage AdGuard Home and other services
- System Settings — Network, DNS, firewall configuration
- Mobile-First — Responsive design optimized for phone access
- Dark/Light Theme — System preference detection with manual toggle
- LuCI Coexistence — Runs on port 80/443, LuCI relocated to 8080
# Clone the repository
git clone https://github.com/raydak-labs/travo.git
cd travo
# Install Node dependencies (also generates MSW mock worker for dev mode)
pnpm install
# Install Go dependencies
cd backend && go mod tidy && cd ..
# Run development servers
make devTroubleshooting: If the frontend shows a white page, the MSW service worker may be missing. Run
cd frontend && pnpm exec msw init public --saveto regenerate it.
| Command | Description |
|---|---|
make dev |
Run frontend + backend dev servers |
make build |
Build frontend and backend |
make test |
Run all tests (Go + shared + frontend) |
make lint |
Run ESLint + go vet |
make format |
Run Prettier + gofmt |
make clean |
Remove build artifacts |
make build-prod |
Cross-compile for OpenWRT (aarch64) |
make build-all |
Cross-compile for aarch64 and x86_64 |
make package |
Create release .tar.gz (install layout) |
make package-all |
Tarballs for aarch64 and x86_64 |
make deploy |
Deploy to router (needs ROUTER_IP) |
make docker-dev |
Start Docker dev environment |
docker compose upRuns frontend (Vite + HMR) and backend (Air hot reload) in containers. Same ports: frontend on :5173, backend on :3000.
# Cross-compile binary for aarch64
make build-prod
# Create install tarball (matches GitHub Releases)
make packageSee docs/deployment.md for full details.
# Deploy to router
make deploy ROUTER_IP=192.168.8.1This copies the dev build to the router over SSH (default: binary + UI; use DEPLOY_METHOD=release for a full tree like the release tarball). Production installs use scripts/install.sh instead. See docs/deployment.md.
travo/
├── frontend/ # React + TypeScript + Vite + TailwindCSS
│ ├── src/
│ │ ├── components/ # UI components
│ │ ├── pages/ # Page components
│ │ ├── lib/ # Utilities, API client
│ │ └── main.tsx # Entry point
│ ├── index.html
│ └── vite.config.ts
├── backend/ # Go + Fiber
│ ├── cmd/server/ # Main server entry
│ └── internal/ # Internal packages
├── shared/ # Shared TypeScript types
│ └── src/
├── scripts/ # Dev and build scripts
├── docs/plans/ # Project planning documents
├── Makefile
└── package.json # Workspace root
- GL.iNet Beryl AX (MT3000) — aarch64
- GL.iNet Slate AXT1800 — aarch64
- Any OpenWRT 23.05+ device (aarch64 or x86_64)
Pre-built install tarballs for aarch64 and x86_64 are available on GitHub Releases.
To create a new release, tag and push:
git tag v1.0.0
git push origin v1.0.0The CI/CD pipeline automatically builds all artifacts and publishes a GitHub Release.
See CONTRIBUTING.md for guidelines.
MIT — Copyright 2026 openwrt-travel-gui contributors

