In observability, complexity is the enemy. Our previous architecture asked a React app to hit multiple APIs through Nginx/Kong for JWT verification, while a standalone auth service issued JWKS/OAuth tokens. We'd been wrestling with this stack for a while—slow initial renders, state management sprawl, and the constant churn of keeping dependencies current across a deep node_modules tree.
React2Shell forced the conversation we'd been putting off. The vulnerability itself was bad enough, but the follow-up CVEs and the broader pattern they revealed made us take a harder look at what we were signing up for. React is a mature framework carrying years of accumulated complexity and technical debt. That's not a criticism—it's the natural arc of any widely-adopted JS project. But for a team shipping observability tooling, betting on a stack where the next critical CVE feels like a matter of "when" rather than "if" wasn't a trade-off we wanted to keep making.
The platform takes a different shape:
- Phoenix + LiveView serves as the experience layer
- SRQL (Rust) powers query translation and execution
- CloudNativePG with TimescaleDB + Apache AGE provides a single unified data store
- core-elx orchestrates ingestion, identity reconciliation (DIRE), and control-plane workflows