Background
There is no in-app developer dashboard that captures recent HTTP requests, EF Core queries, dispatched events, sent mails, background jobs, exceptions, etc. AuditLogs covers business actions, not framework-level traffic. Laravel Telescope is the canonical example.
Motivation
- Local debugging without tailing logs or attaching a debugger
- Catching N+1, slow queries, accidental email sends in dev
- Drop-in for support engineers reproducing bugs in staging
Design sketch
New module modules/Telescope (dev-only by default; gated via Telescope:Enabled setting and Telescope.View permission):
Watchers (each implemented as a focused interceptor / event handler):
HttpRequestsWatcher — middleware records URL, status, duration, controller, payload (sampled, redacted)
EfQueriesWatcher — DbCommandInterceptor records SQL, parameters (redacted), duration, stack trace
JobsWatcher — subscribes to BackgroundJobs lifecycle events
EventsWatcher — wraps IEventBus to record published events
MailWatcher — wraps Email module's sender
ExceptionsWatcher — IExceptionHandler records unhandled exceptions
LogsWatcher — Serilog sink
CacheWatcher — IDistributedCache decorator
Storage: dedicated SQLite file by default (telescope.db) with a 24-hour TTL purge job; opt-in to share the main DB.
UI: Inertia pages at /telescope listing each watcher's stream with detail-view drill-downs. Filter by tag (request-id, user-id, tenant-id).
Acceptance criteria
References
Background
There is no in-app developer dashboard that captures recent HTTP requests, EF Core queries, dispatched events, sent mails, background jobs, exceptions, etc.
AuditLogscovers business actions, not framework-level traffic. Laravel Telescope is the canonical example.Motivation
Design sketch
New module
modules/Telescope(dev-only by default; gated viaTelescope:Enabledsetting andTelescope.Viewpermission):Watchers (each implemented as a focused interceptor / event handler):
HttpRequestsWatcher— middleware records URL, status, duration, controller, payload (sampled, redacted)EfQueriesWatcher—DbCommandInterceptorrecords SQL, parameters (redacted), duration, stack traceJobsWatcher— subscribes toBackgroundJobslifecycle eventsEventsWatcher— wrapsIEventBusto record published eventsMailWatcher— wraps Email module's senderExceptionsWatcher—IExceptionHandlerrecords unhandled exceptionsLogsWatcher— Serilog sinkCacheWatcher—IDistributedCachedecoratorStorage: dedicated SQLite file by default (
telescope.db) with a 24-hour TTL purge job; opt-in to share the main DB.UI: Inertia pages at
/telescopelisting each watcher's stream with detail-view drill-downs. Filter by tag (request-id, user-id, tenant-id).Acceptance criteria
References