{"id":32838678,"url":"https://github.com/openqoe/openqoe-dev","last_synced_at":"2026-01-20T08:05:31.083Z","repository":{"id":322627892,"uuid":"1089345206","full_name":"openqoe/openqoe-dev","owner":"openqoe","description":"Open-source video Quality of Experience (QoE) monitoring platform. JavaScript SDK for 5 players,   Cloudflare Worker ingestion, and production-ready Grafana dashboards. Monitor VST, rebuffering, errors, and engagement metrics at scale.","archived":false,"fork":false,"pushed_at":"2026-01-15T06:47:53.000Z","size":747,"stargazers_count":7,"open_issues_count":2,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-01-15T13:02:07.033Z","etag":null,"topics":["cloudflare-workers","dash","grafana","grafana-dashboard","grafana-prometheus","hls","html5player","mimir","observability","opensource","opensource-projects","prometheus","qoe-monitoring","shaka-player","video-analytics","video-metrics","video-player","video-streaming","videojs"],"latest_commit_sha":null,"homepage":"https://openqoe.dev","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/openqoe.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"docs/contributing.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-04T08:08:28.000Z","updated_at":"2026-01-06T13:57:13.000Z","dependencies_parsed_at":"2025-12-05T05:06:48.198Z","dependency_job_id":null,"html_url":"https://github.com/openqoe/openqoe-dev","commit_stats":null,"previous_names":["openqoe/openqoe-dev"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/openqoe/openqoe-dev","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openqoe%2Fopenqoe-dev","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openqoe%2Fopenqoe-dev/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openqoe%2Fopenqoe-dev/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openqoe%2Fopenqoe-dev/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/openqoe","download_url":"https://codeload.github.com/openqoe/openqoe-dev/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/openqoe%2Fopenqoe-dev/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28598875,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-20T02:08:49.799Z","status":"ssl_error","status_checked_at":"2026-01-20T02:08:44.148Z","response_time":117,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cloudflare-workers","dash","grafana","grafana-dashboard","grafana-prometheus","hls","html5player","mimir","observability","opensource","opensource-projects","prometheus","qoe-monitoring","shaka-player","video-analytics","video-metrics","video-player","video-streaming","videojs"],"created_at":"2025-11-08T00:00:36.262Z","updated_at":"2026-01-20T08:05:31.076Z","avatar_url":"https://github.com/openqoe.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# OpenQoE\n\n**Open-Source Video Quality of Experience (QoE) Monitoring Platform**\n\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE)\n[![Production Ready](https://img.shields.io/badge/Status-Dash.js%20Ready-brightgreen.svg)](docs/production-ready.md)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.0+-blue.svg)](https://www.typescriptlang.org/)\n[![Go](https://img.shields.io/badge/Go-1.25+-00ADD8.svg)](https://go.dev/)\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](docs/contributing.md)\n\n\u003e **Production-grade video quality monitoring for web video players with comprehensive business and technical metrics, accurate percentile calculations, real-time alerting, and distributed tracing.**\n\n\u003e **Guarantee of p90 request latency of \u003c=30ms for event insgestion under any load**\n\n---\n\n## 📋 Table of Contents\n\n- [Overview](#overview)\n- [Features](#features)\n- [Architecture](#architecture)\n- [Quick Start](#quick-start)\n- [Documentation](#documentation)\n- [Deployment Options](#deployment-options)\n- [Metrics \u0026 Dashboards](#metrics--dashboards)\n- [Contributing](#contributing)\n- [License](#license)\n- [Support](#support)\n\n---\n\n## 🎯 Overview\n\nOpenQoE is a complete, production-ready observability platform for video streaming that helps you:\n\n- **Monitor Quality**: Track video startup time, rebuffering, errors, and playback quality\n- **Understand Engagement**: Measure watch time, completion rates, and viewer behavior\n- **Optimize Performance**: Identify bottlenecks with P50/P95/P99 percentile analysis\n- **Alert Proactively**: Get notified when quality degrades or business metrics drop\n- **Scale Globally**: Deploy on Cloudflare's edge network or self-host\n\n### What's Included\n\n| Component               | Description                                  | Status                           |\n| ----------------------- | -------------------------------------------- | -------------------------------- |\n| **JavaScript SDK**      | 5 player adapters capturing 24+ event types  | ✅ Dash.js Ready / 🏗️ Others WIP |\n| **Go Worker**           | High-performance OTLP ingestion \u0026 processing | ✅ Production Ready              |\n| **Grafana Alloy**       | Edge telemetry collector \u0026 processor         | ✅ Production Ready              |\n| **Grafana Dashboards**  | 4 comprehensive dashboards (58 panels total) | ✅ Production Ready              |\n| **Recording Rules**     | 25 pre-aggregated metrics for performance    | ✅ Production Ready              |\n| **Alert Rules**         | 18 production-ready alerts                   | ✅ Production Ready              |\n| **Distributed Tracing** | End-to-end tracing with Grafana Tempo        | ✅ Production Ready              |\n| **Docker Stack**        | Self-hosted Mimir + Loki + Tempo + Alloy     | ✅ Production Ready              |\n\n---\n\n## ✨ Features\n\n### SDK Capabilities\n\n- ✅ **Multi-Player Support**: HTML5, Video.js, HLS.js, Dash.js, Shaka Player\n- ✅ **Dash.js Production Ready**: Robust integration for MPEG-DASH\n- 🏗️ **WIP Adapters**: Other players are in active development\n- ✅ **Comprehensive Events**: 24+ event types with full context capture\n- ✅ **Privacy-First**: SHA-256 hashing, configurable PII controls\n- ✅ **Lightweight**: ~10KB gzipped per adapter\n- ✅ **TypeScript**: Full type definitions included\n\n### Go Worker Features\n\n- ✅ **OTLP Ingestion**: Native support for OpenTelemetry protocol\n- ✅ **High Concurrency**: Built with Go for scalable event processing\n- ✅ **Cardinality Governance**: Automatic high-cardinality dimension management\n- ✅ **Dual Destinations**: Self-hosted or Grafana Cloud\n- ✅ **Health Monitoring**: Integrated health and stats endpoints\n\n### Observability Stack\n\n- ✅ **Full OTLP Pipeline**: Alloy -\u003e Mimir/Loki/Tempo\n- ✅ **Distributed Tracing**: End-to-end visibility with Tempo\n- ✅ **4 Production Dashboards**: VOD, Live, Quality, Impact Explorer\n- ✅ **18 Alert Rules**: Critical quality and performance alerts\n- ✅ **Self-Hosted**: Complete Docker Compose stack (Mimir, Loki, Tempo, Alloy, Grafana)\n\n---\n\n## 🏗️ Architecture\n\n```mermaid\ngraph TD\n    subgraph \"Your Application\"\n        SDK[OpenQoE SDK]\n        P1[\"Dash.js,HLS.js, HTML5 - Ready\"]\n        P2[\"Others - WIP\"]\n        P1 -.-\u003e SDK\n        P2 -.-\u003e SDK\n    end\n\n    SDK -- \"HTTPS POST /v2/events\" --\u003e Worker[Go Worker]\n\n    subgraph \"Observability Pipeline\"\n        Worker -- \"OTLP\" --\u003e Alloy[Grafana Alloy]\n        Alloy -- \"Metrics\" --\u003e Mimir[Grafana Mimir]\n        Alloy -- \"Logs\" --\u003e Loki[Grafana Loki]\n        Alloy -- \"Traces\" --\u003e Tempo[Grafana Tempo]\n    end\n\n    subgraph \"Visualization\"\n        Mimir --- Grafana[Grafana]\n        Loki --- Grafana\n        Tempo --- Grafana\n    end\n```\n\n**Flow**:\n\n1. SDK captures events from video players (Dash.js production ready)\n2. Events batched and sent to Go Worker (`/v2/events`)\n3. Worker validates and forwards via OTLP to Grafana Alloy\n4. Alloy routes data to Mimir (metrics), Loki (logs), and Tempo (traces)\n5. Grafana visualizes with pre-built dashboards and unified observability\n\n---\n\n### 1. Clone Repository\n\n```bash\ngit clone https://github.com/openqoe/openqoe-dev.git\ncd openqoe-dev\n```\n\n### 2. Start Observability Stack\n\n```bash\n# Start Mimir, Loki, Tempo, Alloy, and Grafana\ndocker compose up -d\n\n# Verify all services are healthy\ndocker compose ps\n```\n\n### 3. Start Go Worker\n\n```bash\ncd worker\n\n# Install dependencies \u0026 build\ngo mod download\ngo build -o openqoe-worker\n\n# Configure environment (OTEL_URL=http://localhost:4317)\ncp .env.example .env\n\n# Run the worker\n./openqoe-worker\n# Worker available at http://localhost:8788\n```\n\n### 4. Integrate SDK (Dash.js Example)\n\n```html\n\u003cscript type=\"module\"\u003e\n  import { OpenQoE } from \"./sdk/dist/index.js\";\n\n  const qoe = new OpenQoE({\n    orgId: \"my-org\",\n    playerId: \"my-website\",\n    endpointUrl: \"http://localhost:8788/v2/events\",\n  });\n\n  const player = dashjs.MediaPlayer().create();\n  player.initialize(videoElement, url, true);\n\n  qoe.attachPlayer(\"dashjs\", player, {\n    videoId: \"video-123\",\n    videoTitle: \"Production Stream\",\n  });\n\u003c/script\u003e\n```\n\n### 5. View Dashboards \u0026 Traces\n\n1. Open Grafana: [localhost:3000](http://localhost:3000) (admin/admin)\n2. Navigate to **Dashboards** → **OpenQoE** folder\n3. Explore **VOD Monitoring** or **Impact Explorer**\n4. Use the **Explore** tab to view distributed traces in Tempo\n\n**OpenQoE v2 is ready!** 🚀\n\n---\n\n## 📚 Documentation\n\n### Getting Started\n\n| Document                                     | Description                                          |\n| -------------------------------------------- | ---------------------------------------------------- |\n| [Deployment Guide](docs/deployment-guide.md) | Go Worker and Alloy Setup and deployment             |\n| [API Reference](docs/api-reference.md)       | V2 Event Schemas and OTLP details                    |\n| [SDK Integration](docs/sdk-integration.md)   | Dash.js, HLS.js, HTML5 focus (other players WIP)     |\n| [Architecture](docs/architecture.md)         | Distributed observability pipeline                   |\n| [Production Ready](docs/production-ready.md) | Production readiness report (Dash.js, HLS.js, HTML5) |\n\n3. Open **VOD Monitoring** dashboard\n4. Play a video and watch metrics appear in real-time!\n\n**That's it!** Your video QoE monitoring is now live. 🎉\n\n### Architecture \u0026 Design\n\n| Document                                            | Description                              |\n| --------------------------------------------------- | ---------------------------------------- |\n| [Architecture Overview](docs/architecture.md)       | System architecture and component design |\n| [Technical Specification](docs/technical-spec.md)   | Detailed technical specifications        |\n| [Data Model](docs/data-model.md)                    | Event schemas and data structures        |\n| [Production Ready Status](docs/production-ready.md) | Complete production readiness report     |\n\n### Observability\n\n| Document                                                                      | Description                                       |\n| ----------------------------------------------------------------------------- | ------------------------------------------------- |\n| [Observability README](docs/observability/README.md)                          | Stack overview, metrics, queries, troubleshooting |\n| [Dashboard Documentation](docs/observability/dashboards.md)                   | Dashboard specifications and panel details        |\n| [Recording Rules](observability/prometheus/rules/openqoe-recording-rules.yml) | 25 pre-aggregated metrics                         |\n| [Alert Rules](observability/prometheus/rules/openqoe-alert-rules.yml)         | 18 production alerts                              |\n\n### Component READMEs\n\n| Component | README                                   |\n| --------- | ---------------------------------------- |\n| SDK       | [sdk/README.md](sdk/README.md)           |\n| Worker    | [worker/README.md](worker/README.md)     |\n| Examples  | [examples/README.md](examples/README.md) |\n\n---\n\n## 🌍 Deployment Options\n\n### Option 1: Self-Hosted (Docker)\n\n**Best for**: On-premise deployments, full control, data sovereignty\n\n```bash\n# Start complete stack\ndocker compose up -d\n\n# Configure worker for localhost\ncd worker \u0026\u0026 npm run dev\n```\n\n**Includes**: Mimir (metrics), Loki (logs), Grafana (dashboards)\n\n**Docs**: [Self-Hosted Deployment](docs/deployment-guide.md#option-1-self-hosted-docker-stack)\n\n---\n\n### Option 2: Grafana Cloud\n\n**Best for**: Managed service, zero infrastructure, global scale\n\n```bash\n# Configure worker in .env\nDESTINATION_TYPE=GrafanaCloud\nGRAFANA_CLOUD_INSTANCE_ID=123456\nGRAFANA_CLOUD_API_KEY=your-api-key\n\n# Run worker\n./openqoe-worker\n```\n\n**Docs**: [Grafana Cloud Deployment](docs/deployment-guide.md#option-3-grafana-cloud)\n\n---\n\n### Option 3: Hybrid (Self-Hosted + Managed Worker)\n\n**Best for**: Distributed ingestion with on-premise storage\n\nCombine regional Go workers for global ingestion with a central self-hosted observability stack.\n\n**Docs**: [Hybrid Deployment](docs/deployment-guide.md#network-connectivity-for-self-hosted-deployments)\n\n---\n\n## 📊 Metrics \u0026 Dashboards\n\n### Dashboard Overview\n\n| Dashboard              | Panels | Purpose               | Key Metrics                               |\n| ---------------------- | ------ | --------------------- | ----------------------------------------- |\n| **VOD Monitoring**     | 21     | Real-time VOD quality | VST, rebuffering, completion, quartiles   |\n| **Live Streaming**     | 11     | Live event monitoring | Concurrent viewers, join time, geographic |\n| **Quality \u0026 Delivery** | 12     | Technical deep-dive   | Seek latency, dropped frames, ABR         |\n| **Impact Explorer**    | 14     | Business analysis     | Watch time, engagement, revenue           |\n\n### Key Metrics Captured\n\n**Business Metrics**:\n\n- Total views, completion rate, watch time\n- Revenue impact calculations\n- Engagement by quartile (25/50/75/100%)\n- Content performance comparison\n\n**Technical Metrics**:\n\n- Video Startup Time (P50/P95/P99 via histograms)\n- Rebuffer rate, duration, and frequency\n- Seek latency and performance\n- Error rates by type and family\n- Bitrate distribution and ABR behavior\n- Dropped frames and rendering quality\n- Resolution distribution (360p-8K)\n- Buffer health\n\n**Live Streaming**:\n\n- Concurrent viewers (real-time)\n- Join time (P95)\n- Geographic distribution\n- Viewer drop detection\n\n### Histogram Metrics\n\nOpenQoE uses **true histograms** (not gauges) for accurate percentile calculations:\n\n```promql\n# Accurate P95 Video Startup Time\nhistogram_quantile(0.95,\n  sum(rate(openqoe_video_startup_seconds_bucket[5m])) by (le)\n)\n\n# Using pre-aggregated recording rule (10-50x faster)\nopenqoe:video_startup_seconds:p95\n```\n\n**Histogram buckets configured**:\n\n- **VST**: [0.5, 1, 2, 3, 5, 10, 15, 30] seconds\n- **Rebuffer Duration**: [0.5, 1, 2, 3, 5, 10, 30] seconds\n- **Seek Latency**: [0.1, 0.25, 0.5, 1, 2, 5] seconds\n\n---\n\n## 🎨 Supported Players\n\n| Player           | Adapter          | Status                  |\n| ---------------- | ---------------- | ----------------------- |\n| **Dash.js**      | `DashJsAdapter`  | ✅ **Production Ready** |\n| **HTML5**        | `HTML5Adapter`   | 🏗️ Work In Progress     |\n| **Video.js**     | `VideoJsAdapter` | 🏗️ Work In Progress     |\n| **HLS.js**       | `HlsJsAdapter`   | 🏗️ Work In Progress     |\n| **Shaka Player** | `ShakaAdapter`   | 🏗️ Work In Progress     |\n\n\\*HTML5 doesn't support `quality_change` events (no native ABR)\n\n### Events Tracked (24+ Total)\n\n| Event            | Description           | Business Value               |\n| ---------------- | --------------------- | ---------------------------- |\n| `playerready`    | Player initialized    | Time to interactive          |\n| `viewstart`      | Video load started    | View funnel entry            |\n| `playing`        | Playback started      | **Video Startup Time (VST)** |\n| `pause`          | User paused           | Engagement analysis          |\n| `seek`           | User scrubbed         | Navigation behavior          |\n| `stall_start`    | Buffering started     | **Rebuffering detection**    |\n| `stall_end`      | Buffering ended       | **Rebuffer duration**        |\n| `ended`          | Video completed       | **Completion rate**          |\n| `error`          | Playback error        | **Error tracking**           |\n| `quartile`       | 25/50/75/100% reached | **Drop-off analysis**        |\n| `heartbeat`      | Periodic update (10s) | **Watch time tracking**      |\n| `quality_change` | ABR switch            | Bitrate adaptation           |\n\n---\n\n## 🛠️ Development\n\n### Project Structure\n\n```\nopenqoe/\n├── build\n│   ├── build.ninja\n│   ├── CMakeCache.txt\n│   ├── CMakeFiles\n│   │   ├── 3.28.3\n│   │   │   ├── CMakeCXXCompiler.cmake\n│   │   │   ├── CMakeDetermineCompilerABI_CXX.bin\n│   │   │   ├── CMakeSystem.cmake\n│   │   │   └── CompilerIdCXX\n│   │   │       ├── a.out\n│   │   │       ├── CMakeCXXCompilerId.cpp\n│   │   │       └── tmp\n│   │   ├── cmake.check_cache\n│   │   ├── CMakeConfigureLog.yaml\n│   │   ├── OpenQoEWorker.dir\n│   │   │   └── src\n│   │   ├── pkgRedirects\n│   │   ├── rules.ninja\n│   │   └── TargetDirectories.txt\n│   ├── cmake_install.cmake\n│   ├── compile_commands.json\n│   └── OpenQoEWorker\n├── compose.yaml\n├── docs\n│   ├── api-reference.md\n│   ├── architecture.md\n│   ├── contributing.md\n│   ├── data-model.md\n│   ├── deployment-checklist.md\n│   ├── deployment-guide.md\n│   ├── observability\n│   │   ├── dashboards.md\n│   │   └── README.md\n│   ├── production-ready.md\n│   ├── sdk-integration.md\n│   └── technical-spec.md\n├── examples\n│   ├── dashjs-demo\n│   │   └── index.html\n│   ├── DEMO_TEMPLATE.md\n│   ├── hlsjs-demo\n│   │   └── index.html\n│   ├── html5-demo\n│   │   └── index.html\n│   ├── README.md\n│   ├── shaka-demo\n│   │   └── index.html\n│   └── videojs-demo\n│       └── index.html\n├── LICENSE\n├── observability\n│   ├── alloy\n│   │   └── config.alloy\n│   ├── dashboards\n│   │   ├── impact-explorer.json\n│   │   ├── live-streaming.json\n│   │   ├── quality-delivery.json\n│   │   └── vod-monitoring.json\n│   ├── grafana\n│   │   └── provisioning\n│   │       ├── dashboards\n│   │       │   └── dashboards.yml\n│   │       └── datasources\n│   │           └── datasources.yml\n│   ├── GRAFANA_DASHBOARDS.md\n│   ├── loki\n│   │   └── loki-config.yaml\n│   ├── mimir\n│   │   ├── mimir-config.yml\n│   │   └── runtime.yml\n│   ├── prometheus\n│   │   ├── prometheus.yml\n│   │   └── rules\n│   │       ├── load-rules.sh\n│   │       ├── openqoe-alert-rules.yml\n│   │       └── openqoe-recording-rules.yml\n│   ├── README.md\n│   └── tempo\n│       └── tempo-config.yaml\n├── openqoe-dev.code-workspace\n├── README.md\n├── sdk\n│   ├── jest.config.js\n│   ├── package.json\n│   ├── package-lock.json\n│   ├── README.md\n│   ├── rollup.config.js\n│   ├── src\n│   │   ├── adapters\n│   │   │   ├── DashJsAdapter.ts\n│   │   │   ├── HlsJsAdapter.ts\n│   │   │   ├── HTML5Adapter.ts\n│   │   │   ├── ShakaAdapter.ts\n│   │   │   └── VideoJsAdapter.ts\n│   │   ├── core\n│   │   │   ├── BatchManager.ts\n│   │   │   ├── EventCollector.ts\n│   │   │   ├── QueueManager.ts\n│   │   │   ├── RetryManager.ts\n│   │   │   ├── SessionManager.ts\n│   │   │   └── Transport.ts\n│   │   ├── index.ts\n│   │   ├── OpenQoE.ts\n│   │   ├── types.ts\n│   │   └── utils\n│   │       ├── device.ts\n│   │       ├── logger.ts\n│   │       └── privacy.ts\n│   ├── tests\n│   │   ├── core\n│   │   │   ├── BatchManager.test.ts\n│   │   │   └── SessionManager.test.ts\n│   │   └── utils\n│   │       └── privacy.test.ts\n│   └── tsconfig.json\n├── sonar-project.properties\n├── test\n│   ├── dashjs-test\n│   │   └── index.html\n│   ├── hlsjs-test\n│   │   └── index.html\n│   ├── html5-test\n│   │   └── index.html\n│   ├── shaka-test\n│   │   └── index.html\n│   └── videojs-test\n│       └── index.html\n└── worker\n    ├── compute\n    │   ├── events.go\n    │   ├── helpers.go\n    │   ├── metrics.go\n    │   ├── system_metrics.go\n    │   └── types.go\n    ├── config\n    │   ├── auth.go\n    │   ├── cardinality.go\n    │   ├── config.go\n    │   ├── destination.go\n    │   ├── env.go\n    │   └── redis.go\n    ├── data_structure\n    │   ├── pair.go\n    │   └── set.go\n    ├── Dockerfile\n    ├── go.mod\n    ├── go.sum\n    ├── main.go\n    ├── middlewares\n    │   ├── auth.go\n    │   └── headers.go\n    ├── otelservice\n    │   ├── setup.go\n    │   ├── tracer.go\n    │   └── types.go\n    ├── pool\n    │   └── worker.go\n    ├── README.md\n    └── requesthandlers\n        ├── controller.go\n        ├── markdevice.go\n        ├── requestvalidation.go\n        └── types.go\n```\n\n### Build SDK\n\n```bash\ncd sdk\nnpm install\nnpm run build\nnpm test\n```\n\n### Run Worker Locally\n\n```bash\ncd worker\ngo build .\n./worker\n# Available at http://localhost:8788\n```\n\n### Run Examples\n\n```bash\n# while in root level\nnpm install -g http-server\nhttp-server\n# Open http://localhost:8080\n```\n\n---\n\n## 🤝 Contributing\n\nWe welcome contributions! Whether it's:\n\n- 🐛 Bug reports\n- ✨ Feature requests\n- 📝 Documentation improvements\n- 🔧 Code contributions\n\nPlease read our [Contributing Guide](docs/contributing.md) for guidelines.\n\n### Quick Contribution Steps\n\n1. Fork the repository\n2. Create a feature branch (`git checkout -b feature/amazing-feature`)\n3. Make your changes\n4. Commit with clear messages (`git commit -m 'Add amazing feature'`)\n5. Push to your branch (`git push origin feature/amazing-feature`)\n6. Open a Pull Request\n\n---\n\n## 📄 License\n\nThis project is licensed under the **Apache License 2.0** - see the [LICENSE](LICENSE) file for details.\n\n```\nCopyright 2026-27 OpenQoE Contributors\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n```\n\n---\n\n## 💬 Support\n\n### Community Support\n\n- 🌐 **Website**: [https://openqoe.dev](https://openqoe.dev)\n- 📖 **Documentation**: Start with [docs/deployment-guide.md](docs/deployment-guide.md)\n- 🐛 **Bug Reports**: [GitHub Issues](https://github.com/openqoe/openqoe-dev/issues)\n- 💡 **Feature Requests**: [GitHub Discussions](https://github.com/openqoe/openqoe-dev/discussions)\n- 💬 **Questions**: [GitHub Discussions Q\u0026A](https://github.com/openqoe/openqoe-dev/discussions/categories/q-a)\n\n### Getting Help\n\n1. Check the [documentation](#documentation)\n2. Search [existing issues](https://github.com/openqoe/openqoe-dev/issues)\n3. Check [troubleshooting guide](docs/observability/README.md#troubleshooting)\n4. Ask in [Discussions](https://github.com/openqoe/openqoe-dev/discussions)\n\n---\n\n## 🌟 Acknowledgments\n\nOpenQoE is built with:\n\n- **TypeScript** - Type safe development\n- **Go** - Low Latency highly concurrent native application with strict type safety\n- **Grafana Alloy** - Open Telemetry collector for Observability Signals\n- **Grafana Mimir** - Prometheus-compatible metrics storage\n- **Grafana Loki** - Log aggregation\n- **Grafana Tempo** - Trace Correleation\n- **Grafana** - Visualization platform\n- **Docker** - Containerization\n\nInspired by commercial QoE monitoring solutions for continuous improvement and industry best practices.\n\n---\n\n## 📈 Project Status\n\n**Current Version**: 2.0.0\n**Status**: ✅ **Dash.js, HLS.js, HTML5 Ready** / 🏗️ **Core v2 In Beta**\n**Last Updated**: January 2026\n\nSee [docs/production-ready.md](docs/production-ready.md) for complete production readiness report.\n\n### What's Production Ready\n\n- ✅ SDK for all 5 major web players\n- ✅ Low Latency\n- ✅ 4 comprehensive Grafana dashboards (58 panels)\n- ✅ 25 recording rules for performance\n- ✅ 18 production-ready alerts\n- ✅ Self-hosted Docker stack\n- ✅ Grafana Cloud support\n- ✅ Complete documentation\n\n### Roadmap\n\n**Phase 2** (Optional):\n\n- Worker Health Dashboard (pipeline monitoring)\n- Advanced cardinality analytics\n- Custom metric extensions\n- Load testing framework\n\n---\n\n## 🙏 Star Us!\n\nIf you find OpenQoE useful, please consider giving us a star ⭐ on GitHub. It helps others discover the project!\n\n[![Star on GitHub](https://img.shields.io/github/stars/openqoe/openqoe-dev?style=social)](https://github.com/openqoe/openqoe-dev)\n\n---\n\n**Made with ❤️ by the OpenQoE Community**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenqoe%2Fopenqoe-dev","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fopenqoe%2Fopenqoe-dev","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fopenqoe%2Fopenqoe-dev/lists"}