Aurora Continuum — Architecture
Overview
Aurora Continuum is a multi-framework test result aggregation platform. It collects test results from CI/CD pipelines and testing tools, normalises them into a unified data model, and provides dashboards, trend analysis, DORA metrics tracking, and compliance reporting.
System Architecture
┌──────────────────────────────────────────────────────────────────┐
│ Aurora Continuum │
├──────────────────────────┬───────────────────────────────────────┤
│ Frontend (Vue 3 + Vite) │ Backend (Node.js + Express) │
│ Port 82 (Docker/nginx) │ Port 3002 │
│ │ │
│ Vue Router │ REST API │
│ Pinia state management │ JWT authentication │
│ Tailwind CSS │ Mongoose ODM │
│ Chart.js / vue-chartjs │ MongoDB │
└──────────────────────────┴───────────────────────────────────────┘
↑ CI/CD pipelines, webhooks, direct API imports
Data Flow
CI/CD Pipeline Aurora Continuum
───────────── ────────────────
Playwright run ──POST──► /api/imports/results
Cypress run ──POST──► /api/imports/results
JUnit run ──POST──► /api/imports/results
Selenium run ──POST──► /api/imports/results
GitHub webhook ──POST──► /api/deployments/webhook/github
GitLab webhook ──POST──► /api/deployments/webhook/gitlab
Jenkins webhook ──POST──► /api/deployments/webhook/jenkins
Manual import ──POST──► /api/dora/incidents
Incident register ──POST──► /api/dora/incidents
Aurora Continuum is the aggregator. Individual Aurora instances (or any CI/CD tool) are the source.
Backend Structure
backend/
├── server.js # Express app, routes registration
├── models/
│ ├── TestResults.js # Core test result document
│ ├── Deployment.js # DORA deployment records
│ ├── Incident.js # DORA incident records
│ ├── Team.js # Teams with repo configuration
│ ├── User.js # Users with role-based access
│ ├── Project.js # Projects/programmes
│ ├── License.js # License management
│ └── ...
├── routes/
│ ├── auth.js # Login, token refresh
│ ├── imports.js # Test result import endpoint
│ ├── tests.js # Test query endpoints
│ ├── deployments.js # Deployment registration + webhooks
│ ├── dora.js # DORA metrics aggregation
│ ├── reports.js # Report data aggregation
│ ├── teams.js # Team management
│ ├── users.js # User management
│ ├── synthetics.js # Synthetic monitoring
│ └── ...
├── controllers/
│ ├── testController.js # Test result queries + aggregations
│ ├── doraController.js # DORA metric calculations
│ └── ...
├── services/
│ ├── importService.js # Format detection and routing
│ ├── syntheticMonitoring.js # Scheduled synthetic runner
│ └── parsers/
│ ├── playwrightParser.js
│ ├── cypressParser.js
│ └── junitParser.js
└── middleware/
├── auth.js # JWT verification, role guards
└── license.js # License tier enforcement
Frontend Structure
frontend/src/
├── views/
│ ├── TeamView.vue # Team dashboard
│ ├── ManagerView.vue # Manager dashboard
│ ├── ExecutiveView.vue # Executive dashboard
│ ├── FunctionalTestsView.vue
│ ├── ApiTestsView.vue
│ ├── SyntheticsView.vue
│ ├── DoraView.vue
│ ├── ReportsView.vue # PDF report wizard
│ ├── DashboardView.vue
│ ├── SettingsView.vue
│ └── LoginView.vue
├── components/
│ ├── TestTracker/
│ │ ├── TeamView.vue # Performance health, flaky tests, timeline
│ │ ├── ManagerView.vue # Quality overview + DORA
│ │ ├── ExecutiveView.vue # Strategic KPIs + DORA
│ │ ├── DoraMetrics.vue # Shared DORA component
│ │ ├── FunctionalTestsView.vue
│ │ └── APITestsView.vue
│ ├── Settings/
│ │ ├── TeamManagment.vue # Teams + repo configuration
│ │ ├── APIKeysSettings.vue
│ │ ├── LicenseSettings.vue
│ │ └── ...
│ ├── Synthetics/
│ │ ├── TransactionCard.vue
│ │ ├── TrendsChart.vue
│ │ └── ...
│ └── InfoTooltip.vue # Contextual help tooltips
├── stores/
│ ├── userStore.js # Auth state
│ ├── themeStore.js # Dark/light mode
│ └── filtersStore.js # Global period/team/framework filters
├── router/
│ └── index.js # Route definitions + role guards
└── style.css # Aurora design system (CSS custom properties)
Data Model — TestResult
The core document stored for every test execution:
{
testCaseId: String, // unique identifier for the test case
testName: String, // human-readable test name
testType: String, // 'functional' | 'performance' | 'api'
suite: String, // describe block / file grouping
status: String, // 'passed' | 'failed' | 'skipped' | 'flaky'
duration: Number, // execution time in ms
errorMessage: String,
stackTrace: String,
browser: String,
environment: String, // 'staging' | 'production' | ...
scriptLocation: String, // source file path
retries: Number,
commitSha: String, // git commit hash
branch: String,
commitTimestamp: Date,
deployment: ObjectId, // ref → Deployment
perfMetrics: {
fcp: Number, // First Contentful Paint (ms)
lcp: Number, // Largest Contentful Paint (ms)
tti: Number, // Time to Interactive (ms)
inp: Number, // Interaction to Next Paint (ms)
tbt: Number, // Total Blocking Time (ms)
ttfb: Number, // Time to First Byte (ms)
cls: Number, // Cumulative Layout Shift (0–1)
load: Number, // Full page load (ms)
memory: Number, // JS heap used (MB)
longTasksCount: Number,
longTasksMax: Number
},
metadata: {
tool: String, // 'playwright' | 'cypress' | 'junit' | 'selenium'
version: String,
team: String, // CONTINUUM_TEAM env var value
product: String // CONTINUUM_PRODUCT env var value
},
team: ObjectId, // ref → Team
executedBy: ObjectId, // ref → User
executedAt: Date,
createdAt: Date
}
All perfMetrics fields are optional. A document that doesn't include them simply has no perfMetrics subdocument, which has zero storage overhead.
Import Pipeline
POST /api/imports/results
│
▼
importService.js
detectFormat(content)
│
┌────┴────┬──────────┬──────────┐
▼ ▼ ▼ ▼
playwright cypress junit generic
Parser Parser Parser JSON
│ │ │ │
└────┬────┘ │ │
▼ ▼ │
normalised result array │
│ │ │
└───────┬────────┘ │
▼ │
TestResult.insertMany ◄─────┘
The parser strips all raw reporter output — only the fields defined in the TestResult schema are persisted. This keeps storage 80–95% smaller than platforms that store raw reporter JSON.
Authentication & Roles
| Role | Access |
|---|---|
admin / system_admin | All views, all teams, settings, license |
manager | Manager View, Executive View, DORA, Reports, Tests, Settings (non-admin) |
user | Team View only, filtered to own team |
JWT tokens are stored in localStorage. Route guards in Vue Router and middleware in Express enforce role requirements.
License Tiers
| Tier | Teams | Projects | Imports/month | Features |
|---|---|---|---|---|
| Free | 3 | 5 | 5K | Core dashboards |
| Starter | 10 | 25 | 50K | + Webhooks |
| Professional | 50 | 100 | 500K | + SSO |
| Enterprise | Unlimited | Unlimited | Unlimited | All features |
License key format: CONTINUUM-<TIER>-<6_CHARS> (e.g. CONTINUUM-PRO-ABC123)
Validated against aurora.selectred.com on startup and daily at 03:00 UTC.
Running Locally
Docker (recommended)
docker compose up -d
The database is seeded automatically on first startup. Default login: admin@continuum.aurora / admin123
Frontend: http://localhost:82
Backend API: http://localhost:3002
Development
# Backend
cd backend && npm run dev # port 3002
# Frontend
cd frontend && npm run dev # port 5173
Environment variables
# Backend (.env)
MONGODB_URI=mongodb://localhost:27017/aurora-continuum
JWT_SECRET=your-secret-key
PORT=3002