ONCALL CLI
Debug your
_
Work with
oncall
across your stack.
Debug from your terminal, no dashboards. Ask a question, and OnCall inspects live logs, services, and code (if allowed) to get you to root cause.
NPM
npm install -g oncall-cli
COPY
Or read the

0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
Auth Service
[auth] verify_token: OK
[auth] uid:8821 scope:write
[auth] refreshing_session
[auth] token_generated
Postgres DB
LOG: statement: SELECT *
LOG: duration: 49.2ms
LOG: duration: 5001ms (SLOW)
LOG: connection_reset
Stripe Worker
[worker] polling queue...
[worker] job#491: PENDING
[worker] job#491: DONE
Frontend Build
wait - compiling...
event - compiled client
info - generating pages
✓ Ready in 120ms
API Gateway
GET /auth 200 OK
GET /products 200 OK
POST /checkout 500 ERR
POST /checkout 500 ERR
GET /health 200 OK
AI Chat // ONCALL
Input: What's bugging you today
Inventory Service
[inv] processing order #9921
[inv] check_stock(sku="991")
[inv] db: acquiring connection...
[inv] warn: pool empty (5/5 busy)
[inv] warn: waiting 5000ms...
[inv] ERROR: GetConnectionTimeout
[inv] FATAL: PoolExhaustedException
[inv] panic at db_client.go:42
[inv] processing order #9921
[inv] check_stock(sku="991")
[inv] db: acquiring connection...
[inv] warn: pool empty (5/5 busy)
[inv] warn: waiting 5000ms...
[inv] ERROR: GetConnectionTimeout
[inv] FATAL: PoolExhaustedException
[inv] panic at db_client.go:42
K8s Infrastructure
pod/api-gateway Running
pod/inv-service Running
warn: probe_failed (tcp)
restarting pod...
Redis Cache
"GET" "product:991"
"SET" "session:8821"
"GET" "cart:active"
"GET" "feature:flags"
Stripe Worker
[worker] polling queue...
[worker] job#491: PENDING
[worker] job#491: DONE
Postgres DB
LOG: statement: SELECT *
LOG: duration: 49.2ms
LOG: duration: 5001ms (SLOW)
LOG: connection_reset
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
Auth Service
[auth] verify_token: OK
[auth] uid:8821 scope:write
[auth] refreshing_session
[auth] token_generated
API Gateway
GET /auth 200 OK
GET /products 200 OK
POST /checkout 500 ERR
POST /checkout 500 ERR
GET /health 200 OK
GET /auth 200 OK
GET /products 200 OK
POST /checkout 500 ERR
POST /checkout 500 ERR
GET /health 200 OK
Stripe Worker
[worker] polling queue...
[worker] job#491: PENDING
[worker] job#491: DONE
Frontend Build
wait - compiling...
event - compiled client
info - generating pages
✓ Ready in 120ms
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
AI Chat // ONCALL
Input: What's bugging you today
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
K8s Infrastructure
pod/api-gateway Running
pod/inv-service Running
warn: probe_failed (tcp)
restarting pod...
Redis Cache
"GET" "product:991"
"SET" "session:8821"
"GET" "cart:active"
"GET" "feature:flags"
Inventory Service
[inv] processing order #9921
[inv] check_stock(sku="991")
[inv] db: acquiring connection...
[inv] warn: pool empty (5/5 busy)
[inv] warn: waiting 5000ms...
[inv] ERROR: GetConnectionTimeout
[inv] FATAL: PoolExhaustedException
[inv] panic at db_client.go:42
[inv] processing order #9921
[inv] check_stock(sku="991")
[inv] db: acquiring connection...
[inv] warn: pool empty (5/5 busy)
[inv] warn: waiting 5000ms...
[inv] ERROR: GetConnectionTimeout
[inv] FATAL: PoolExhaustedException
[inv] panic at db_client.go:42
Postgres DB
LOG: statement: SELECT *
LOG: duration: 49.2ms
LOG: duration: 5001ms (SLOW)
LOG: connection_reset
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
Integrates with
UPCOMING EVENT
OnCall Lab: AI-Driven Systems Investigation
03 Jan
5 PM (GMT +5:30)
Online
23+ attending
HOW IT WORKS
Run → Ask → Review.
→ OnCall keeps the workflow you already use, then adds investigation and evidence alongside your logs.
Logs stream
LIVE
LIVE
Ask questions while it’s still running.
$ oncall npm run dev
✓ Starting development server…
→ Ready on http://localhost:3000
Step 1
Run
Start your service — just prefix the command
with
oncall
Step 2
Ask
Ask in plain English—no queries, no copying logs.“Where did this error originate?”
Step 3
Review
OnCall does the hunting. You make the call: evidence + root cause + fix, right next to your logs.
Logs stream
LIVE
LIVE
Ask questions while it’s still running.
$ oncall npm run dev
✓ Starting development server…
→ Ready on http://localhost:3000
Step 1
Run
Start your service — just prefix the command
with
oncall
Step 2
Ask
Ask in plain English—no queries, no copying logs.“Where did this error originate?”
Step 3
Review
OnCall does the hunting. You make the call: evidence + root cause + fix, right next to your logs.
AI DEBUGGER
Turn your Logs into Answers.
→ Most debugging time is spent (1) figuring out where to look and (2) gathering enough context to be sure. OnCall does both for you.
No grepping. No tab-switching. No “which service is it?”
Root-cause
A clear explanation of why the failure happened—stated in a way you can verify immediately
Evidence + context
The exact log lines with timestamps and service tags, plus the surrounding context needed to trust the conclusion.
Fix steps
Short, concrete steps to resolve the issue and confirm the chain clears.
What you get in seconds
Hypothesis:
payment-service is missing STRIPE_API_KEY in this environment
Evidence:
[payment-service 14:03:12] ERROR StripeAuth: STRIPE_API_KEY missing
[api-service 14:03:11] POST /checkout 500 (stripe.ts:42)
Code location (allowed):
payment-service/stripe.ts:42
Next checks:
- confirm env var / secret mount
- restart payment-service and retry checkout
Which service logged the real cause?
Where did this originate?
Why did this fail?
What happened right before it broke?
What you get in seconds
Hypothesis:
payment-service is missing STRIPE_API_KEY in this environment
Evidence:
[payment-service 14:03:12] ERROR StripeAuth: STRIPE_API_KEY missing
[api-service 14:03:11] POST /checkout 500 (stripe.ts:42)
Code location (allowed):
payment-service/stripe.ts:42
Next checks:
- confirm env var / secret mount
- restart payment-service and retry checkout
Which service logged the real cause?
Where did this originate?
Why did this fail?
What happened right before it broke?
TERMINAL TRUST
No new workflow. Just a better terminal.
→ Most debugging tools assume debugging is code comprehension.
But bugs show up at runtime,in logs, timing, and side effects across services. That’s why OnCall lives in the terminal: it wraps the running command, streams logs live, and investigates in-place.
Run anything
No browser tabs. No dashboards. No context switching.
Designed for Incidents
Live logs, not static files
Immediate answers, not handcrafted queries
Follow-ups without resetting context
Ask what just happened — while it’s still happening.
Multi-service
Your system, understood as one app.
→ In real systems, bugs don’t respect service boundaries. Cluster mode lets OnCall route the investigation across services and connect the evidence.
Cluster in one command
$ oncall cluster ✓ Cluster running (project: checkout)
Ask from any service.
Debug the whole system.
ROUTING
web → api → payment
Frontend 500 — where is the real cause?
ONCALL
→ Routing: web → api → payment
web
GET /checkout 500
api
GET /checkout 500
payment
StripeError: No API key
Conclusion:
Root cause originates in payment-service (not the frontend 500)
Active AI
Don’t explain the bug. Let it investigate.
→ OnCall reads logs when errors appear, searches code when stack traces point somewhere, and pulls more context only when needed. You’re the reviewer — not the orchestrator.
Investigation behavior
Reads logs when errors appear
Follows stack traces to code paths
Pulls extra context only when needed
What changes for you
Less log spelunking
Fewer “where do I look?” loops
More confident fixes, faster
WHY CHOOSE ONCALL
Debugging is a race against uncertainty
→ OnCall reduces uncertainty by connecting runtime signals, code, and reasoning into a single investigation surface—so engineers find the truth faster, not just fixes sooner.
SIGNAL → HYPOTHESIS
5x
faster time to first insight
EVIDENCE FIRST
Clarity early changes everything
OnCall surfaces correlated runtime signals and code paths early in the investigation, so engineers form defensible hypotheses instead of guessing their way forward.
SIGNAL → HYPOTHESIS
5x
faster time to first insight
EVIDENCE FIRST
Clarity early changes everything
OnCall surfaces correlated runtime signals and code paths early in the investigation, so engineers form defensible hypotheses instead of guessing their way forward.
SOLVE, DON'T REACT
60%
Mean Time To Resolution
MTTR
Investigate with evidence, not urgency
By connecting logs, services, and execution context, OnCall reduces the time spent stitching data together—cutting resolution time without rushing decisions.
SOLVE, DON'T REACT
60%
Mean Time To Resolution
MTTR
Investigate with evidence, not urgency
By connecting logs, services, and execution context, OnCall reduces the time spent stitching data together—cutting resolution time without rushing decisions.
ONE THREAD
−70%
Context switches
FOCUS
Momentum matters
OnCall keeps logs, code, and reasoning in one surface—so engineers maintain mental flow instead of jumping between tools mid-incident.
ONE THREAD
−70%
Context switches
FOCUS
Momentum matters
OnCall keeps logs, code, and reasoning in one surface—so engineers maintain mental flow instead of jumping between tools mid-incident.
LOGS · CODE · RUNTIME
01
surface Instead of 6 tools
Unified
A single place to reason
OnCall unifies logs, runtime signals, code context, and AI reasoning into one investigation flow—without forcing engineers to reassemble context manually.
LOGS · CODE · RUNTIME
01
surface Instead of 6 tools
Unified
A single place to reason
OnCall unifies logs, runtime signals, code context, and AI reasoning into one investigation flow—without forcing engineers to reassemble context manually.
Safe by design
0
Log scraping or repo indexing
Read-only
Observe without intrusion
OnCall investigates live systems using standard local tools—no background scraping, no indexing, and no persistent access to your repositories or logs.
Safe by design
0
Log scraping or repo indexing
Read-only
Observe without intrusion
OnCall investigates live systems using standard local tools—no background scraping, no indexing, and no persistent access to your repositories or logs.
Confidence > speed
2×
Higher confidence in root cause
RCA
Fix it once. Fix it right.
OnCall helps engineers validate hypotheses against live runtime evidence—reducing guesswork and increasing confidence that the root cause is truly resolved.
Confidence > speed
2×
Higher confidence in root cause
RCA
Fix it once. Fix it right.
OnCall helps engineers validate hypotheses against live runtime evidence—reducing guesswork and increasing confidence that the root cause is truly resolved.
Safety & control
Your code stays where it belongs.
→ All inspections run locally. You decide which services expose logs, which expose code, and when production is log-only.
Permissioned by service
services:
web:
logs_available: true
code_available: true
api:
logs_available: true
code_available: true
payment:
logs_available: true
code_available: false # log-only
production:
mode: log-only
No silent uploads. No surprises.
Operational defaults
Log-only in production when needed
Explicit allowlists for code access
Answers show evidence + next checks
ONCALL CLI
Debug your
_
Work with
oncall
across your stack.
Debug from your terminal, no dashboards. Ask a question, and OnCall inspects live logs, services, and code (if allowed) to get you to root cause.
npm install -g oncall-cli
NPM
COPY
Or read the

0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
Auth Service
[auth] verify_token: OK
[auth] uid:8821 scope:write
[auth] refreshing_session
[auth] token_generated
Postgres DB
LOG: statement: SELECT *
LOG: duration: 49.2ms
LOG: duration: 5001ms (SLOW)
LOG: connection_reset
Stripe Worker
[worker] polling queue...
[worker] job#491: PENDING
[worker] job#491: DONE
Frontend Build
wait - compiling...
event - compiled client
info - generating pages
✓ Ready in 120ms
API Gateway
GET /auth 200 OK
GET /products 200 OK
POST /checkout 500 ERR
POST /checkout 500 ERR
GET /health 200 OK
AI Chat // ONCALL
Input: What's bugging you today
Inventory Service
[inv] processing order #9921
[inv] check_stock(sku="991")
[inv] db: acquiring connection...
[inv] warn: pool empty (5/5 busy)
[inv] warn: waiting 5000ms...
[inv] ERROR: GetConnectionTimeout
[inv] FATAL: PoolExhaustedException
[inv] panic at db_client.go:42
[inv] processing order #9921
[inv] check_stock(sku="991")
[inv] db: acquiring connection...
[inv] warn: pool empty (5/5 busy)
[inv] warn: waiting 5000ms...
[inv] ERROR: GetConnectionTimeout
[inv] FATAL: PoolExhaustedException
[inv] panic at db_client.go:42
K8s Infrastructure
pod/api-gateway Running
pod/inv-service Running
warn: probe_failed (tcp)
restarting pod...
Redis Cache
"GET" "product:991"
"SET" "session:8821"
"GET" "cart:active"
"GET" "feature:flags"
Stripe Worker
[worker] polling queue...
[worker] job#491: PENDING
[worker] job#491: DONE
Postgres DB
LOG: statement: SELECT *
LOG: duration: 49.2ms
LOG: duration: 5001ms (SLOW)
LOG: connection_reset
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
Auth Service
[auth] verify_token: OK
[auth] uid:8821 scope:write
[auth] refreshing_session
[auth] token_generated
API Gateway
GET /auth 200 OK
GET /products 200 OK
POST /checkout 500 ERR
POST /checkout 500 ERR
GET /health 200 OK
GET /auth 200 OK
GET /products 200 OK
POST /checkout 500 ERR
POST /checkout 500 ERR
GET /health 200 OK
Stripe Worker
[worker] polling queue...
[worker] job#491: PENDING
[worker] job#491: DONE
Frontend Build
wait - compiling...
event - compiled client
info - generating pages
✓ Ready in 120ms
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
AI Chat // ONCALL
Input: What's bugging you today
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
K8s Infrastructure
pod/api-gateway Running
pod/inv-service Running
warn: probe_failed (tcp)
restarting pod...
Redis Cache
"GET" "product:991"
"SET" "session:8821"
"GET" "cart:active"
"GET" "feature:flags"
Inventory Service
[inv] processing order #9921
[inv] check_stock(sku="991")
[inv] db: acquiring connection...
[inv] warn: pool empty (5/5 busy)
[inv] warn: waiting 5000ms...
[inv] ERROR: GetConnectionTimeout
[inv] FATAL: PoolExhaustedException
[inv] panic at db_client.go:42
[inv] processing order #9921
[inv] check_stock(sku="991")
[inv] db: acquiring connection...
[inv] warn: pool empty (5/5 busy)
[inv] warn: waiting 5000ms...
[inv] ERROR: GetConnectionTimeout
[inv] FATAL: PoolExhaustedException
[inv] panic at db_client.go:42
Postgres DB
LOG: statement: SELECT *
LOG: duration: 49.2ms
LOG: duration: 5001ms (SLOW)
LOG: connection_reset
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
0x0041: alloc_mem OK
0x0042: init_thread
0x0043: ctx_switch
0x0044: [DEBUG] ack
0x0045: [DEBUG] syn
0x0046: pipe_broken
Integrates with
UPCOMING EVENT
OnCall Lab: AI-Driven Systems Investigation
03 Jan
5 PM (GMT +5:30)
Online
23+ attending
HOW IT WORKS
Run → Ask → Review.
→ OnCall keeps the workflow you already use, then adds investigation and evidence alongside your logs.
Logs stream
LIVE
LIVE
Ask questions while it’s still running.
$ oncall npm run dev
✓ Starting development server…
→ Ready on http://localhost:3000
Step 1
Run
Start your service — just prefix the command
with
oncall
Step 2
Ask
Ask “why did this fail?” while the system is running.
Step 3
Review
OnCall does the hunting. You make the call: evidence + root cause + fix, right next to your logs.
AI DEBUGGER
Turn your Logs into Answers.
→ Most debugging time is spent (1) figuring out where to look and (2) gathering enough context to be sure. OnCall does both for you.
No grepping. No tab-switching. No “which service is it?”
Root-cause
A clear explanation of why the failure happened—stated in a way you can verify immediately
Evidence + context
The exact log lines with timestamps and service tags, plus the surrounding context needed to trust the conclusion.
Fix steps
Short, concrete steps to resolve the issue and confirm the chain clears.
What you get in seconds
Hypothesis:
payment-service is missing STRIPE_API_KEY in this environment
Evidence:
[payment-service 14:03:12] ERROR StripeAuth: STRIPE_API_KEY missing
[api-service 14:03:11] POST /checkout 500 (stripe.ts:42)
Code location (allowed):
payment-service/stripe.ts:42
Next checks:
- confirm env var / secret mount
- restart payment-service and retry checkout
Which service logged the real cause?
Where did this originate?
Why did this fail?
What happened right before it broke?
TERMINAL TRUST
No new workflow. Just a better terminal.
→ Most debugging tools assume debugging is code comprehension.
But bugs show up at runtime,in logs, timing, and side effects across services. That’s why OnCall lives in the terminal: it wraps the running command, streams logs live, and investigates in-place.
Run anything
No browser tabs. No dashboards. No context switching.
Designed for Incidents
Live logs, not static files
Immediate answers, not handcrafted queries
Follow-ups without resetting context
Ask what just happened — while it’s still happening.
Multi-service
Your system, understood as one app.
→ In real systems, bugs don’t respect service boundaries. Cluster mode lets OnCall route the investigation across services and connect the evidence.
Cluster in one command
$ oncall cluster ✓ Cluster running (project: checkout)
Ask from any service.
Debug the whole system.
ROUTING
web → api → payment
Frontend 500 — where is the real cause?
ONCALL
→ Routing: web → api → payment
web
GET /checkout 500
api
GET /checkout 500
payment
StripeError: No API key
Conclusion:
Root cause originates in payment-service (not the frontend 500)
Active AI
Don’t explain the bug. Let it investigate.
→ OnCall reads logs when errors appear, searches code when stack traces point somewhere, and pulls more context only when needed. You’re the reviewer — not the orchestrator.
Investigation behavior
Reads logs when errors appear
Follows stack traces to code paths
Pulls extra context only when needed
What changes for you
Less log spelunking
Fewer “where do I look?” loops
More confident fixes, faster
WHY CHOOSE ONCALL
Debugging is a race against uncertainty
→ OnCall reduces uncertainty by connecting runtime signals, code, and reasoning into a single investigation surface—so engineers find the truth faster, not just fixes sooner.
SIGNAL → HYPOTHESIS
5x
faster time to first insight
EVIDENCE FIRST
Clarity early changes everything
OnCall surfaces correlated runtime signals and code paths early in the investigation, so engineers form defensible hypotheses instead of guessing their way forward.
SOLVE, DON'T REACT
60%
Mean Time To Resolution
MTTR
Investigate with evidence, not urgency
By connecting logs, services, and execution context, OnCall reduces the time spent stitching data together—cutting resolution time without rushing decisions.
ONE THREAD
−70%
Context switches
FOCUS
Momentum matters
OnCall keeps logs, code, and reasoning in one surface—so engineers maintain mental flow instead of jumping between tools mid-incident.
LOGS · CODE · RUNTIME
01
surface Instead of 6 tools
Unified
A single place to reason
OnCall unifies logs, runtime signals, code context, and AI reasoning into one investigation flow—without forcing engineers to reassemble context manually.
Safe by design
0
Log scraping or repo indexing
Read-only
Observe without intrusion
OnCall investigates live systems using standard local tools—no background scraping, no indexing, and no persistent access to your repositories or logs.
Confidence > speed
2×
Higher confidence in root cause
RCA
Fix it once. Fix it right.
OnCall helps engineers validate hypotheses against live runtime evidence—reducing guesswork and increasing confidence that the root cause is truly resolved.
Safety & control
Your code stays where it belongs.
→ All inspections run locally. You decide which services expose logs, which expose code, and when production is log-only.
Permissioned by service
services:
web:
logs_available: true
code_available: true
api:
logs_available: true
code_available: true
payment:
logs_available: true
code_available: false # log-only
production:
mode: log-only
No silent uploads. No surprises.
Operational defaults
Log-only in production when needed
Explicit allowlists for code access
Answers show evidence + next checks
Ready to install?
Turn your logs into answers
Turn your logs into answers
Install OnCall, run your next command, and ask one question. Then try cluster mode when the bug crosses services.
OnCall
Built for developers who need to debug in real time.
ONCALL
optimized
realtime
solved
terminal-native
auto-detect
no-context-switch
zero-config
ONCALL






