> For the complete documentation index, see [llms.txt](https://sunbird.gitbook.io/sunbird-spark/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://sunbird.gitbook.io/sunbird-spark/learn/tech-overview/tech-stack.md).

# Tech Stack

#### **Frontend**

| Technology        | Version       | Purpose                                  |
| ----------------- | ------------- | ---------------------------------------- |
| React             | 19            | Web portal                               |
| Ionic / Capacitor | Latest stable | Mobile app (Android + iOS)               |
| Web Components    | V2            | Content players and editors (embeddable) |

#### **Backend**

| Technology     | Version | Purpose                                   |
| -------------- | ------- | ----------------------------------------- |
| Node.js        | 22 LTS  | BFF, middleware services                  |
| Play Framework | 3.0.5   | Core microservices (Scala)                |
| Apache Pekko   | 1.0.3   | Actor model for high-concurrency services |
| Scala          | 2.13.14 | Language for Play/Pekko services          |
| Java           | 11      | Language for Play/Pekko services          |

{% hint style="info" %}
**Akka → Pekko:** Spark migrates from Akka 2.5 to Apache Pekko 1.0.3. Pekko is a fully open-source fork of Akka with an identical API — no code changes are required in services that used Akka 2.5. This removes the Akka Business Source Licence dependency.
{% endhint %}

#### **Data stores**

| Technology       | Purpose                                                     | Notes                                                   |
| ---------------- | ----------------------------------------------------------- | ------------------------------------------------------- |
| YugabyteDB       | Primary transactional database                              | Replaces Cassandra + PostgreSQL. CQL + YSQL compatible. |
| Janus Graph      | Content graph — metadata and relationships                  | Replaces Neo4J                                          |
| OpenSearch       | Search indices — content discovery and facets               | Synced from Janus Graph via Flink                       |
| Kafka            | Event streaming — telemetry, publish pipeline, certificates | Upgraded to v4.x                                        |
| Redis (optional) | Caching — API responses, sessions, telemetry dedup          | Two instances: metadata and knowledge platform          |

#### **Analytics (Obsrv add-on)**

| Technology      | Purpose                                           |
| --------------- | ------------------------------------------------- |
| Apache Druid    | OLAP database for time-series telemetry analytics |
| Apache Spark    | Batch summariser jobs                             |
| Apache Superset | Custom dashboard and report visualisation         |

#### **DevOps and infrastructure**

| Technology     | Version       | Purpose                                | Notes                         |
| -------------- | ------------- | -------------------------------------- | ----------------------------- |
| Kubernetes     | Latest stable | Container orchestration — all services | Fully native in Spark         |
| Helm           | v3            | Kubernetes package management          |                               |
| OpenTofu       | Latest stable | Infrastructure as Code                 | Replaces Terraform            |
| Grafana Alloy  | Latest stable | Log aggregation and shipping           | Replaces Promtail             |
| Grafana        | Latest stable | Metrics dashboards                     |                               |
| Prometheus     | Latest stable | Metrics collection                     |                               |
| GitHub Actions | —             | CI/CD pipelines                        | OIDC-based, no static secrets |
| Docker         | Latest stable | Container images                       |                               |

#### **Identity and security**

| Technology              | Purpose                                    | Notes                                                                                       |
| ----------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------- |
| Keycloak                | Identity provider, SSO, OAuth 2.0          | Now backed by YugabyteDB; OIDC protocol means it can be replaced by any OIDC-compatible IdP |
| Kong                    | API gateway — rate limiting, auth, routing | Upgraded                                                                                    |
| OPA (Open Policy Agent) | Declarative RBAC policy enforcement        |                                                                                             |


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://sunbird.gitbook.io/sunbird-spark/learn/tech-overview/tech-stack.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
