RootCX
Pricing
Customers
Blog
Docs

By audience

Builders
Ship AI-coded apps to production
Agencies
Deliver professional, code-first client projects

Build

AI Agents
Agents that do the work
Internal Apps
Build by describing
Integrations
Connect your tools
Claude Code
Build from your terminal

Run

App Library
Pre-built, ready to extend
Infrastructure
Database, hosting, logs

Govern

Security
SSO, RBAC, audit, vault
RootCX/RootCX
Introduction
What is RootCX?Getting StartedHow it Works
Build
ApplicationAI AgentIntegrationDeploying
Platform
CoreAuthenticationRBACData APISecret VaultJob QueueScheduled Jobs (Crons)Audit LogReal-time LogsChannels
Developers
React SDKBackend & RPCManifest ReferenceREST APICLIClaude CodeSelf-Hosting
DocsPlatformReal-time Logs

Real-time Logs

The Core captures stdout and stderr from backend processes and broadcasts them via an in-memory SSE channel. Ephemeral: logs are not persisted to disk.

Log Levels

Level Source
stdout console.log() from the backend process.
stderr console.error() from the backend process.
system Core lifecycle events (start, stop, restart, crash).

Using Studio

The Console panel shows live logs from all running backends. Logs stream in real time with color-coded levels. Use the Command Palette to clear the console.

Using Code

SSE Endpoint

GET /api/v1/apps/{appId}/logs
Authorization: Bearer <token>

Streams text/event-stream with JSON payloads:

{ "level": "stdout", "message": "RPC call received" }
{ "level": "stderr", "message": "Failed to connect" }
{ "level": "system", "message": "Worker restarted" }

Logging from Your Backend

// Standard output → broadcasts as [stdout]
console.log("Processing:", method);

// Standard error → broadcasts as [stderr]
console.error("Connection failed");

// Structured IPC log with custom level
process.stdout.write(JSON.stringify({
  type: "log", level: "info", message: "Event occurred"
}) + "\n");

Client Example

const res = await fetch(`/api/v1/apps/myapp/logs`, {
  headers: { Authorization: `Bearer ${token}` },
});

const reader = res.body!.getReader();
const decoder = new TextDecoder();
while (true) {
  const { done, value } = await reader.read();
  if (done) break;
  console.log(decoder.decode(value));
}
PreviousAudit LogNextChannels

On this page

Log Levels
Using Studio
Using Code