Contributing to OmniRoute (ไธญๆ (็ฎไฝ))
May 13, 2026 ยท View on GitHub
๐ Languages: ๐บ๐ธ English ยท ๐ธ๐ฆ ar ยท ๐ง๐ฌ bg ยท ๐ง๐ฉ bn ยท ๐จ๐ฟ cs ยท ๐ฉ๐ฐ da ยท ๐ฉ๐ช de ยท ๐ช๐ธ es ยท ๐ฎ๐ท fa ยท ๐ซ๐ฎ fi ยท ๐ซ๐ท fr ยท ๐ฎ๐ณ gu ยท ๐ฎ๐ฑ he ยท ๐ฎ๐ณ hi ยท ๐ญ๐บ hu ยท ๐ฎ๐ฉ id ยท ๐ฎ๐น it ยท ๐ฏ๐ต ja ยท ๐ฐ๐ท ko ยท ๐ฎ๐ณ mr ยท ๐ฒ๐พ ms ยท ๐ณ๐ฑ nl ยท ๐ณ๐ด no ยท ๐ต๐ญ phi ยท ๐ต๐ฑ pl ยท ๐ต๐น pt ยท ๐ง๐ท pt-BR ยท ๐ท๐ด ro ยท ๐ท๐บ ru ยท ๐ธ๐ฐ sk ยท ๐ธ๐ช sv ยท ๐ฐ๐ช sw ยท ๐ฎ๐ณ ta ยท ๐ฎ๐ณ te ยท ๐น๐ญ th ยท ๐น๐ท tr ยท ๐บ๐ฆ uk-UA ยท ๐ต๐ฐ ur ยท ๐ป๐ณ vi ยท ๐จ๐ณ zh-CN
Thank you for your interest in contributing! This guide covers everything you need to get started.
Development Setup
Prerequisites
- Node.js >= 18 < 24 (recommended: 22 LTS)
- npm 10+
- Git
Clone & Install
git clone https://github.com/diegosouzapw/OmniRoute.git
cd OmniRoute
npm install
Environment Variables
# Create your .env from the template
cp .env.example .env
# Generate required secrets
echo "JWT_SECRET=$(openssl rand -base64 48)" >> .env
echo "API_KEY_SECRET=$(openssl rand -hex 32)" >> .env
Key variables for development:
| Variable | Development Default | Description |
|---|---|---|
PORT | 20128 | Server port |
NEXT_PUBLIC_BASE_URL | http://localhost:20128 | Base URL for frontend |
JWT_SECRET | (generate above) | JWT signing secret |
INITIAL_PASSWORD | CHANGEME | First login password |
APP_LOG_LEVEL | info | Log verbosity level |
Dashboard Settings
The dashboard provides UI toggles for features that can also be configured via environment variables:
| Setting Location | Toggle | Description |
|---|---|---|
| Settings โ Advanced | Debug Mode | Enable debug request logs (UI) |
| Settings โ General | Sidebar Visibility | Show/hide sidebar sections |
These settings are stored in the database and persist across restarts, overriding env var defaults when set.
Running Locally
# Development mode (hot reload)
npm run dev
# Production build
npm run build
npm run start
# Common port configuration
PORT=20128 NEXT_PUBLIC_BASE_URL=http://localhost:20128 npm run dev
Default URLs:
- Dashboard:
http://localhost:20128/dashboard - API:
http://localhost:20128/v1
Git Workflow
โ ๏ธ NEVER commit directly to
main. Always use feature branches.
git checkout -b feat/your-feature-name
# ... make changes ...
git commit -m "feat: describe your change"
git push -u origin feat/your-feature-name
# Open a Pull Request on GitHub
Branch Naming
| Prefix | Purpose |
|---|---|
feat/ | New features |
fix/ | Bug fixes |
refactor/ | Code restructuring |
docs/ | Documentation changes |
test/ | Test additions/fixes |
chore/ | Tooling, CI, dependencies |
Commit Messages
Follow Conventional Commits:
feat: add circuit breaker for provider calls
fix: resolve JWT secret validation edge case
docs: update SECURITY.md with PII protection
test: add observability unit tests
refactor(db): consolidate rate limit tables
Scopes: db, sse, oauth, dashboard, api, cli, docker, ci, mcp, a2a, memory, skills.
Running Tests
# All tests (unit + vitest + ecosystem + e2e)
npm run test:all
# Single test file (Node.js native test runner โ most tests use this)
node --import tsx/esm --test tests/unit/your-file.test.ts
# Vitest (MCP server, autoCombo, cache)
npm run test:vitest
# E2E tests (requires Playwright)
npm run test:e2e
# Protocol clients E2E (MCP transports, A2A)
npm run test:protocols:e2e
# Ecosystem compatibility tests
npm run test:ecosystem
# Coverage (60% min statements/lines/functions/branches)
npm run test:coverage
npm run coverage:report
# Lint + format check
npm run lint
npm run check
Coverage notes:
npm run test:coveragemeasures source coverage for the main unit test suite, excludestests/**, and includesopen-sse/**- Pull requests must keep the overall coverage gate at 60% or higher for statements, lines, functions, and branches
- If a PR changes production code in
src/,open-sse/,electron/, orbin/, it must add or update automated tests in the same PR npm run coverage:reportprints the detailed file-by-file report from the latest coverage runnpm run test:coverage:legacypreserves the older metric for historical comparison- See
docs/ops/COVERAGE_PLAN.mdfor the phased coverage improvement roadmap
Pull Request Requirements
Before opening or merging a PR:
- Run
npm run test:unit - Run
npm run test:coverage - Ensure the coverage gate stays at 60%+ for all metrics
- Include the changed or added test files in the PR description when production code changed
- Check the SonarQube result on the PR when the project secrets are configured in CI
Current test status: 122 unit test files covering:
- Provider translators and format conversion
- Rate limiting, circuit breaker, and resilience
- Semantic cache, idempotency, progress tracking
- Database operations and schema (21 DB modules)
- OAuth flows and authentication
- API endpoint validation (Zod v4)
- MCP server tools and scope enforcement
- Memory and Skills systems
Code Style
- ESLint โ Run
npm run lintbefore committing - Prettier โ Auto-formatted via
lint-stagedon commit (2 spaces, semicolons, double quotes, 100 char width, es5 trailing commas) - TypeScript โ All
src/code uses.ts/.tsx;open-sse/uses.ts/.js; document with TSDoc (@param,@returns,@throws) - No
eval()โ ESLint enforcesno-eval,no-implied-eval,no-new-func - Zod validation โ Use Zod v4 schemas for all API input validation
- Naming: Files = camelCase/kebab-case, components = PascalCase, constants = UPPER_SNAKE
Project Structure
src/ # TypeScript (.ts / .tsx)
โโโ app/ # Next.js 16 App Router
โ โโโ (dashboard)/ # Dashboard pages (23 sections)
โ โโโ api/ # API routes (51 directories)
โ โโโ login/ # Auth pages (.tsx)
โโโ domain/ # Policy engine (policyEngine, comboResolver, costRules, etc.)
โโโ lib/ # Core business logic (.ts)
โ โโโ a2a/ # Agent-to-Agent v0.3 protocol server
โ โโโ acp/ # Agent Communication Protocol registry
โ โโโ compliance/ # Compliance policy engine
โ โโโ db/ # SQLite database layer (21 modules + 16 migrations)
โ โโโ memory/ # Persistent conversational memory
โ โโโ oauth/ # OAuth providers, services, and utilities
โ โโโ skills/ # Extensible skill framework
โ โโโ usage/ # Usage tracking and cost calculation
โ โโโ localDb.ts # Re-export layer only โ never add logic here
โโโ middleware/ # Request middleware (promptInjectionGuard)
โโโ mitm/ # MITM proxy (cert, DNS, target routing)
โโโ shared/
โ โโโ components/ # React components (.tsx)
โ โโโ constants/ # Provider definitions (60+), MCP scopes, routing strategies
โ โโโ utils/ # Circuit breaker, sanitizer, auth helpers
โ โโโ validation/ # Zod v4 schemas
โโโ sse/ # SSE proxy pipeline
open-sse/ # @omniroute/open-sse workspace
โโโ executors/ # 14 provider-specific request executors
โโโ handlers/ # 11 request handlers (chat, responses, embeddings, images, etc.)
โโโ mcp-server/ # MCP server (25 tools, 3 transports, 10 scopes)
โโโ services/ # 36+ services (combo, autoCombo, rateLimitManager, etc.)
โโโ translator/ # Format translators (OpenAI โ Claude โ Gemini โ Responses โ Ollama)
โโโ transformer/ # Responses API transformer
โโโ utils/ # 22 utility modules (stream, TLS, proxy, logging)
electron/ # Electron desktop app (cross-platform)
tests/
โโโ unit/ # Node.js test runner (122 test files)
โโโ integration/ # Integration tests
โโโ e2e/ # Playwright tests
โโโ security/ # Security tests
โโโ translator/ # Translator-specific tests
โโโ load/ # Load tests
docs/ # Documentation
โโโ ARCHITECTURE.md # System architecture
โโโ API_REFERENCE.md # All endpoints
โโโ USER_GUIDE.md # Provider setup, CLI integration
โโโ TROUBLESHOOTING.md # Common issues
โโโ MCP-SERVER.md # MCP server (25 tools)
โโโ A2A-SERVER.md # A2A agent protocol
โโโ AUTO-COMBO.md # Auto-combo engine
โโโ CLI-TOOLS.md # CLI tools integration
โโโ COVERAGE_PLAN.md # Test coverage improvement plan
โโโ openapi.yaml # OpenAPI specification
โโโ adr/ # Architecture Decision Records
Adding a New Provider
Step 1: Register Provider Constants
Add to src/shared/constants/providers.ts โ Zod-validated at module load.
Step 2: Add Executor (if custom logic needed)
Create executor in open-sse/executors/your-provider.ts extending the base executor.
Step 3: Add Translator (if non-OpenAI format)
Create request/response translators in open-sse/translator/.
Step 4: Add OAuth Config (if OAuth-based)
Add OAuth credentials in src/lib/oauth/constants/oauth.ts and service in src/lib/oauth/services/.
Step 5: Register Models
Add model definitions in open-sse/config/providerRegistry.ts.
Step 6: Add Tests
Write unit tests in tests/unit/ covering at minimum:
- Provider registration
- Request/response translation
- Error handling
Pull Request Checklist
- Tests pass (
npm test) - Linting passes (
npm run lint) - Build succeeds (
npm run build) - TypeScript types added for new public functions and interfaces
- No hardcoded secrets or fallback values
- All inputs validated with Zod schemas
- CHANGELOG updated (if user-facing change)
- Documentation updated (if applicable)
Releasing
Releases are managed via the /generate-release workflow. When a new GitHub Release is created, the package is automatically published to npm via GitHub Actions.
Getting Help
- Architecture: See
docs/architecture/ARCHITECTURE.md - API Reference: See
docs/reference/API_REFERENCE.md - Issues: github.com/diegosouzapw/OmniRoute/issues
- ADRs: See
docs/adr/for architectural decision records