Releases
-
active pipelines
Open Bugs
-
blocking releases
Bot Status
-
—
Test Runs (7d)
-
—
Integrations
-
services connected
Tickets by Platform
Integration Health
Release Phases
Release Pipeline
| Tag | Platform | Phase | Bugs |
|---|
Activity Feed
Waiting for activity...
Release Management
| Tag | Platform | Phase | Bugs | Status | Target | Actual | Features | Actions |
|---|
OpenClaw Bot
Quick Actions
Command
Bot Log
Test Results
| ID | Runner | Platform | Status | Pass/Fail | Duration | When |
|---|
ClickUp Tickets
Tickets by Platform
Status Breakdown
| Platform | Title | Status | Priority | Assignees | Updated | Link |
|---|
Integrations
Core Services
Testing & Monitoring
Mobile Build Sources
System Architecture
System Diagram

Platform Overview
graph TB
subgraph CLIENT["Dashboard and Clients"]
UI["Web Dashboard\nHTML + Canvas Charts"]
WS["WebSocket Client\nReal-time Updates"]
UPLD["Upload Portal\nTokenized Sideload"]
end
subgraph SERVER["Express Server"]
API["API Routes\n9 Route Modules"]
AUTH["Auth Middleware\nSession / bcrypt / Tokens"]
RL["Rate Limiter\n120 req/min"]
WSS["WebSocket Server"]
EVENTS["Event Bus\nPub/Sub Broadcasts"]
end
subgraph BOTENG["OpenClaw Bot Engine"]
ENGINE["Chat Engine\nOpenAI GPT Tool Calling"]
SCHED["Job Scheduler\nQueue + Cron + Triggers"]
TOOLS["Tool Executor"]
DECISIONS["Decision Engine\nTriage, Routing, Paging"]
end
subgraph INTEG["External Integrations"]
CU["ClickUp\nTicket Management"]
GH["GitHub\nPRs, Deploys, CI"]
SLACK["Slack / Discord\nNotifications"]
DD["DataDog\nMonitoring"]
TR["TestRail\nTest Case Tracking"]
GD["Google Drive\nReport Storage"]
OAI["OpenAI API\nGPT Chat + Tools"]
PD["PagerDuty\nCritical Paging"]
BS["BrowserStack\nDevice Cloud"]
PC["Play Console\nAndroid Builds"]
ASC["App Store Connect\niOS / tvOS Builds"]
MBI["Mobile Builds\nUnified Ingest"]
SLD["Sideload Dropzone\nAppleTV / FireTV"]
end
subgraph RUNR["QA Test Runners"]
PW["Playwright\nWeb + Cucumber"]
APPR["Appium\niOS / Android / TV\nBrowserStack"]
K6R["k6\nLoad + API Tests"]
VISREG["Visual Regression\nPlaywright Screenshots"]
end
subgraph DATALAYER["Data Layer"]
PG["PostgreSQL 16\n13 Migrations"]
PM2R["PM2\nProcess Manager"]
end
UI -->|"HTTP + Session"| API
UI -->|"Real-time"| WS
UPLD -->|"Tokenized POST"| API
WS --- WSS
API --> AUTH
AUTH --> RL
API --> ENGINE
API --> CU
ENGINE --> TOOLS
SCHED --> ENGINE
TOOLS --> CU
TOOLS --> GH
TOOLS --> PW
TOOLS --> APPR
DECISIONS --> PD
MBI --> PC
MBI --> ASC
MBI --> SLD
EVENTS --> WSS
ENGINE --> EVENTS
SCHED --> PG
SCHED --> MBI
PW --> PG
APPR --> PG
APPR --> BS
API --> PG
AUTH --> PG
classDef client fill:#1a1a2e,stroke:#e91e8c,stroke-width:2px,color:#e8e8f0
classDef server fill:#15151e,stroke:#448aff,stroke-width:2px,color:#e8e8f0
classDef bot fill:#15151e,stroke:#e91e8c,stroke-width:2px,color:#e8e8f0
classDef integration fill:#15151e,stroke:#00e676,stroke-width:2px,color:#e8e8f0
classDef runner fill:#15151e,stroke:#b388ff,stroke-width:2px,color:#e8e8f0
classDef data fill:#15151e,stroke:#ffd740,stroke-width:2px,color:#e8e8f0
class UI,WS,UPLD client
class API,AUTH,RL,WSS,EVENTS server
class ENGINE,SCHED,TOOLS,DECISIONS bot
class CU,GH,SLACK,DD,TR,GD,OAI,PD,BS,PC,ASC,MBI,SLD integration
class PW,APPR,K6R,VISREG runner
class PG,PM2R data
API Route Map
graph LR
subgraph ROUTES["Express API Routes"]
direction TB
R1["auth\nLogin, Logout, Users, Tokens"]
R2["releases\nCRUD + Phase + Lifecycle"]
R3["bot\nStart, Stop, Actions"]
R4["integrations\nConfig + Test Connection"]
R5["clickup\nMulti-List Tasks + Sync"]
R6["test-runs\nResults + Triage + Suggestions"]
R7["webhooks\nGitHub, ClickUp Events"]
R8["sideload\nTokenized Build Upload"]
R9["system\nHealth + Uptime"]
end
classDef route fill:#15151e,stroke:#448aff,stroke-width:1px,color:#e8e8f0
class R1,R2,R3,R4,R5,R6,R7,R8,R9 route
Bot Tool Calling Flow
sequenceDiagram
participant U as User
participant API as Bot API
participant E as OpenAI Engine
participant T as Tool Executor
participant I as Integrations
participant DB as PostgreSQL
U->>API: POST action
API->>E: processMessage
loop Tool Calling max 10
E->>E: Chat Completion
E->>T: Execute tools
T->>I: Integration action
I-->>T: Results
T-->>E: Tool outputs
end
E->>DB: Log results
E-->>API: Reply
API-->>U: JSON response
Scheduler Architecture
graph TB
subgraph SCHEDULER["Three-Tier Execution"]
direction TB
Q["Job Queue\nPolls bot_jobs every 5s"]
C["Cron Tasks\nClickUp sync: 15m\nDataDog check: 10m"]
W["Webhook Triggers\nGitHub PR, ClickUp events"]
end
Q --> ENG2["Bot Engine\nprocessMessage"]
C --> ENG2
W --> ENG2
ENG2 --> DB2["PostgreSQL\nbot_jobs table"]
ENG2 --> EVT["Event Bus\nWebSocket broadcast"]
classDef sched fill:#15151e,stroke:#e91e8c,stroke-width:2px,color:#e8e8f0
classDef engine fill:#15151e,stroke:#ffd740,stroke-width:2px,color:#e8e8f0
classDef store fill:#15151e,stroke:#00e676,stroke-width:2px,color:#e8e8f0
class Q,C,W sched
class ENG2 engine
class DB2,EVT store
Database Schema
erDiagram
users ||--o{ sessions : has
users ||--o{ upload_tokens : issues
releases ||--o{ test_runs : tracks
releases ||--o{ mobile_builds : receives
releases ||--o{ release_approvals : gates
test_runs ||--o{ test_failures : contains
test_failures ||--o{ bug_suggestions : proposes
bot_jobs }o--|| releases : belongs-to
upload_audit }o--|| upload_tokens : logs
users {
int id PK
varchar email
varchar name
varchar role
timestamp created_at
}
releases {
int id PK
varchar tag
varchar app
varchar phase
int bugs
varchar status
jsonb features
date deployed_at
}
test_runs {
int id PK
varchar runner
varchar platform
varchar status
int passed
int failed
}
test_failures {
int id PK
int test_run_id FK
varchar severity
varchar kanban_status
varchar pagerduty_dedup_key
int suggestion_id FK
}
bug_suggestions {
int id PK
int failure_id FK
varchar status
text title
text body
}
integrations {
varchar service PK
varchar status
jsonb config
}
bot_jobs {
int id PK
varchar job_type
varchar status
jsonb input
jsonb output
}
browserstack_apps {
int id PK
varchar platform
varchar app_url
varchar version
}
mobile_builds {
int id PK
int release_id FK
varchar source
varchar version
jsonb metadata
}
release_approvals {
int id PK
int release_id FK
varchar stakeholder
varchar decision
}
upload_tokens {
uuid token PK
int user_id FK
varchar scope
timestamp expires_at
}
upload_audit {
int id PK
uuid token FK
varchar filename
bigint size_bytes
varchar ip
}
Test Runner Dispatch
graph LR
subgraph PLATFORMS["Platform to Runner Mapping"]
direction TB
WEB["Web"] --> PWR["Playwright + Cucumber"]
WEB --> VISREGR["Visual Regression"]
IOS["iOS"] --> APPR2["Appium + BrowserStack"]
AND["Android"] --> APPR2
TVP["TV"] --> APPR2
APIP["API"] --> K6R2["k6 Load Tests"]
end
PWR --> DBR[("test_runs")]
VISREGR --> DBR
APPR2 --> DBR
K6R2 --> DBR
classDef platform fill:#15151e,stroke:#e91e8c,stroke-width:2px,color:#e8e8f0
classDef runner fill:#15151e,stroke:#b388ff,stroke-width:2px,color:#e8e8f0
classDef db fill:#15151e,stroke:#ffd740,stroke-width:2px,color:#e8e8f0
class WEB,IOS,AND,TVP,APIP platform
class PWR,VISREGR,APPR2,K6R2 runner
class DBR db
Integration Data Flow
graph TB
subgraph INBOUND["Inbound Events"]
GHW["GitHub Webhook"]
CUW["ClickUp Webhook"]
PCW["Play Console\nPoll / Callback"]
ASCW["App Store Connect\nPoll"]
SLDW["Sideload Upload\nTokenized"]
end
subgraph CORE["Core Platform"]
WHR["Webhook Router"]
BOT["OpenClaw Bot"]
REL["Release Manager"]
MB["Mobile Builds\nIngest"]
end
subgraph OUTBOUND["Outbound Actions"]
CUA["ClickUp API
Tasks + Priority Map"]
GHA["GitHub API
PR Status, Deploys"]
SLA["Slack / Discord
Notifications"]
DDA["DataDog API
Alert Queries"]
TRA["TestRail API
Result Sync"]
GDA["Google Drive
Report Upload"]
PDA["PagerDuty
Critical Paging"]
BSA["BrowserStack
App Upload + Sessions"]
end
GHW --> WHR
CUW --> WHR
PCW --> MB
ASCW --> MB
SLDW --> MB
WHR --> BOT
MB --> REL
BOT --> REL
BOT --> CUA
BOT --> GHA
BOT --> SLA
BOT --> DDA
BOT --> TRA
BOT --> GDA
BOT --> PDA
BOT --> BSA
classDef inbound fill:#15151e,stroke:#ffd740,stroke-width:2px,color:#e8e8f0
classDef core fill:#15151e,stroke:#e91e8c,stroke-width:2px,color:#e8e8f0
classDef outbound fill:#15151e,stroke:#00e676,stroke-width:2px,color:#e8e8f0
class GHW,CUW,PCW,ASCW,SLDW inbound
class WHR,BOT,REL,MB core
class CUA,GHA,SLA,DDA,TRA,GDA,PDA,BSA outbound
Technical Documentation
Stack
RuntimeNode.js 22 + TypeScript 6
FrameworkExpress 5 + WebSocket (ws)
DatabasePostgreSQL 16 (13 migrations)
AI EngineOpenAI GPT via ChatGPT OAuth
ProcessPM2 (fork mode)
HostingContabo VPS, Ubuntu 24.04
SSLCloudflare (server runs HTTP)
AuthSession-based, bcrypt hashing, 24h TTL
API Endpoints
| Route | Methods | Purpose |
|---|---|---|
| /api/auth | POST, GET | Login, logout, session check, user CRUD |
| /api/releases | GET, POST, PUT, DELETE | Release pipeline management |
| /api/bot | GET, POST | Bot status, start/stop, send actions |
| /api/integrations | GET, PUT, POST | Service config, connection testing |
| /api/clickup | GET, POST | Multi-list task fetch, bug count sync |
| /api/test-runs | GET, POST | Test execution results and stats |
| /api/webhooks | POST | Inbound events from GitHub, ClickUp, Play Console, App Store Connect |
| /api/sideload | GET, POST | Tokenized build uploads from Fatima (AppleTV/FireTV) |
| /api/system | GET | Health check, uptime, memory |
Bot Engine
The OpenClaw bot uses OpenAI's tool-calling API to orchestrate release operations. It processes natural language commands and executes integration actions through a structured tool loop (max 10 iterations per request).
Job Queue: Polls
bot_jobs every 5 seconds using FOR UPDATE SKIP LOCKED for concurrency safety.Cron: ClickUp sync every 15 minutes, DataDog alert check every 10 minutes.
Triggers: GitHub PRs auto-queue QA test runs. ClickUp status changes trigger release bug syncs. Deploy events push Slack notifications. Play Console / App Store Connect builds ingest into mobile_builds and attach to releases.
Bug Suggestion Review: Test failures flagged with severity and kanban_status are converted into bug_suggestions, routed through a human review step, then pushed to ClickUp with severity→priority mapping (critical→1, high→2, medium→3, low→4).
Stakeholder Approval: Releases entering Stage or Production require recorded approvals in release_approvals (owner, QA lead, product) before the phase transition commits.
PagerDuty Paging: Critical severity failures in Stage / Production phases trigger a PagerDuty incident via dedup_key (one page per failure fingerprint), bypassing standard Slack notification.
Test Runners
| Runner | Platform | Technology | Output |
|---|---|---|---|
| Playwright | Web | Playwright + Cucumber | JSON report, screenshots |
| Appium | iOS, Android, TV | Appium + WebdriverIO on BrowserStack | Session results |
| k6 | API | k6 load testing | Threshold checks |
| Visual | Visual | Playwright toHaveScreenshot | Local diff images |
Integrations
| Service | Direction | Use Case |
|---|---|---|
| ClickUp | Inbound + Outbound | Ticket management, bug tracking, release sync across 5 QA lists |
| GitHub | Inbound + Outbound | PR status, deploy triggers, CI workflows, multi-repo support |
| Slack / Discord | Outbound | Notifications for deploys, test failures, alerts |
| DataDog | Inbound | Production monitoring, alert queries, incident detection |
| TestRail | Outbound | Test case sync, result reporting |
| Google Drive | Outbound | Release report storage, document uploads |
| OpenAI | Outbound | Bot engine via ChatGPT OAuth consumer account |
| PagerDuty | Outbound | Critical paging for late-phase severity=critical test failures |
| BrowserStack | Outbound | Device cloud for Appium sessions + mobile app uploads |
| Play Console | Inbound | Android / AndroidTV build ingestion across 5 package IDs |
| App Store Connect | Inbound | iOS / tvOS TestFlight build polling across 4 bundle IDs |
| Mobile Builds | Internal | Unified build registry aggregating Play Console, ASC, Sideload |
| Sideload Dropzone | Inbound | Tokenized AppleTV / FireTV uploads from Fatima |
Database Tables
| Table | Migration | Purpose |
|---|---|---|
| releases | 001 | Release tags, platform, phase, bug counts |
| bot_log | 001 | Audit trail of all bot actions |
| bot_state | 001 | Singleton bot status and last run |
| integrations | 001 | Service configs as JSONB |
| users | 002 | Team members with bcrypt passwords |
| sessions | 002 | Auth sessions with 24h TTL |
| test_runs | 003 | Execution results per runner/platform |
| test_failures | 003 | Individual failure details + screenshots |
| webhooks | 004 | Inbound event log |
| bot_jobs | 005 | Job queue with status tracking |
| validation_results | 007 | Search validation outputs |
| browserstack_apps | 008 | Uploaded BrowserStack app_url handles per platform |
| mobile_builds | 009 | Unified build registry (Play Console, ASC, Sideload) |
| release_approvals | 010 | Stakeholder sign-offs for Stage / Prod transitions |
| releases.features, deployed_at | 010 | Release feature list (jsonb) + deployment date |
| upload_tokens | 011 | One-time tokens issued to sideload uploaders |
| upload_audit | 011 | Audit trail of every tokenized upload |
| bug_suggestions | 012 | Queued AI bug proposals pending human review |
| test_failures.severity, kanban_status, suggestion_id | 012 | Triage columns + FK to bug_suggestions |
| test_failures.pagerduty_dedup_key | 013 | Idempotency key for PagerDuty incidents |
File Structure
qa-ecco-app/ ├── public/ │ ├── index.html # Dashboard UI (HTML + inline JS) │ └── upload.html # Tokenized sideload upload portal ├── src/ │ ├── index.ts # Express server, routes, WebSocket │ ├── db.ts # PostgreSQL pool + migration runner │ ├── auth.ts # Session auth, bcrypt, middleware, upload tokens │ ├── events.ts # Pub/sub event bus → WebSocket │ ├── routes/ │ │ ├── auth.ts # Login, logout, user CRUD │ │ ├── releases.ts # Release pipeline, features, approvals │ │ ├── bot.ts # Bot control + action dispatch │ │ ├── integrations.ts # Service config + test connection │ │ ├── clickup.ts # Multi-list tasks + sync │ │ ├── test-runs.ts # Test results, triage, bug suggestions │ │ ├── webhooks.ts # Inbound GitHub / ClickUp / Play / ASC │ │ ├── sideload.ts # Tokenized build uploads (AppleTV / FireTV) │ │ └── system.ts # Health, uptime, memory │ ├── bot/ │ │ ├── engine.ts # OpenAI chat loop + tool calling │ │ ├── openai.ts # OpenAI client wrapper │ │ ├── tools.ts # Tool definitions + executors │ │ ├── decisions.ts # Triage + PagerDuty routing │ │ └── scheduler.ts # Job queue + cron + triggers │ ├── integrations/ │ │ ├── base.ts # Abstract integration class │ │ ├── clickup.ts # ClickUp API client │ │ ├── clickup-sync.ts # Release ↔ ClickUp sync + severity map │ │ ├── github.ts # GitHub PRs, deploys, CI │ │ ├── slack.ts # Slack / Discord notifications │ │ ├── datadog.ts # Monitoring + alerts │ │ ├── testrail.ts # Test case management │ │ ├── gdrive.ts # Google Drive uploads │ │ ├── pagerduty.ts # Critical paging via Events v2 API │ │ ├── browserstack.ts # BrowserStack app upload + sessions │ │ ├── play-console.ts # Android / AndroidTV build polling │ │ ├── app-store-connect.ts # iOS / tvOS TestFlight polling │ │ ├── mobile-builds.ts # Unified build registry ingest │ │ ├── sideload-dropzone.ts # Fatima tokenized upload handler │ │ ├── notifications.ts # Rules-based notification engine │ │ └── search-validator.ts │ ├── runners/ │ │ ├── base.ts # Abstract test runner │ │ ├── index.ts # Runner registry + dispatcher │ │ ├── playwright.ts # Web (Cucumber + JSON) │ │ ├── appium.ts # iOS / Android / TV (BrowserStack) │ │ ├── k6.ts # Load / API testing │ │ └── visual.ts # Visual regression (Playwright screenshots) │ └── migrations/ │ ├── 001_initial.sql # Core tables │ ├── 002_auth.sql # Users + sessions │ ├── 003_test_runs.sql # Test results + failures │ ├── 004_webhooks.sql # Webhook events │ ├── 005_bot_jobs.sql # Job queue │ ├── 006_rename_jira_ticket.sql │ ├── 007_validation_results.sql │ ├── 008_browserstack_apps.sql # BrowserStack app_url cache │ ├── 009_mobile_build_integrations.sql # mobile_builds registry │ ├── 010_release_lifecycle.sql # features, deployed_at, approvals │ ├── 011_upload_audit.sql # Tokens + audit for sideload │ ├── 012_bug_suggestions.sql # Human-review bug queue │ └── 013_pagerduty.sql # dedup_key for critical incidents ├── scripts/ │ ├── verify-asc.ts # App Store Connect credential check │ ├── create-uploader.ts # Issue sideload upload tokens │ └── run-ios-smoke.ts # Local iOS smoke harness └── tests/ # Unit + integration + e2e scaffolding