Thanks for your interest in contributing to Outray! This guide will help you get started.
outray/
├── apps/
│ ├── cli/ # CLI client for creating tunnels
│ ├── cron/ # Background jobs (tunnel snapshots)
│ ├── internal-check/ # Domain verification for Caddy on-demand TLS
│ ├── landing/ # Marketing website (Astro)
│ ├── tunnel/ # Tunnel server (HTTP, TCP, UDP proxying)
│ └── web/ # Dashboard & API (React + TanStack Router)
├── shared/ # Shared utilities and types
└── deploy/ # Deployment scripts and configs
- Node.js 20+
- npm
- Redis (for tunnel state)
- PostgreSQL (for user data)
- Tiger Data / TimescaleDB (for analytics)
-
Clone the repository
git clone https://github.com/akinloluwami/outray.git cd outray -
Install dependencies
npm install
-
Set up environment variables
Copy
.env.exampleto.envin each app directory and fill in the values:cp apps/web/.env.example apps/web/.env cp apps/tunnel/.env.example apps/tunnel/.env cp apps/cron/.env.example apps/cron/.env cp apps/internal-check/.env.example apps/internal-check/.env
-
Run database migrations
cd apps/web npx drizzle-kit push -
Set up Tiger Data (TimescaleDB) tables
Run the schema file against your TimescaleDB instance:
psql "$TIMESCALE_URL" -f deploy/setup_tigerdata.sql -
Start development servers
# Terminal 1: Web dashboard cd apps/web && npm run dev # Terminal 2: Tunnel server cd apps/tunnel && npm run dev # Terminal 3: CLI (for testing) cd apps/cli && npm run dev
- React with TanStack Router
- Drizzle ORM for database
- Better Auth for authentication
- Handles HTTP, TCP, and UDP tunneling
- WebSocket-based protocol for client communication
- Redis for tunnel state management
- TypeScript CLI for creating tunnels
- Supports HTTP, TCP, and UDP protocols
- Use TypeScript
- Follow existing code patterns
- Run
npm run lintbefore committing
- Fork the repository
- Create a feature branch (
git checkout -b feature/my-feature) - Make your changes
- Test your changes locally
- Commit with a descriptive message
- Push and open a PR. Add a detailed description of your changes and attach a screenshot if you made UI changes.