A Stacks app's dashboard cannot read logs from loghq, because the only credential a machine can hold is an ingest key and ingest keys grant no read access.
Why now
The Stacks dashboard (buddy dev --dashboard) already has the seam for this. config.dashboard.providers.<domain>.driver accepts local or hq, resolution lives in storage/framework/core/defaults/app/Actions/Dashboard/dashboard-provider.ts, and a remote provider is wrapped so an unreachable backend renders an empty section with a reason instead of taking the page down.
Selecting hq today renders empty, with this reason, which is written into the framework as a constant:
No data. The hosted provider has no read API yet, so this section cannot be filled from it.
So the dashboard side is finished and waiting. This issue is the missing half.
The actual blocker, verified rather than assumed
It is not that there are no read endpoints. There are. The blocker is that every one of them authenticates a person.
app/Support/request-auth.ts:18 resolves a Bearer token through Auth.getUserFromToken(token), and routes/logs.ts:138 gates GET /api/projects/{projectId}/logs on the user it returns. A Bearer token therefore works, but the only issuable one belongs to a human: it carries that person's full scope, it dies when they leave, and putting it in an app's config is the wrong shape for a server-to-server read.
Meanwhile app/Models/Project.ts:29 has ingest_key, which is the credential an app already holds, and it is write-only by design.
So the gap is one missing credential type, not a missing API.
What would unblock it
A read-scoped project key, issued from project settings beside the ingest key:
- scoped to one project, independent of any user account
- read-only, and never accepted on
POST /logs - presented as
Authorization: Bearer <key> - revocable, and listed with a last-used timestamp
The endpoints it must reach, which already exist and need only to accept the new credential:
GET /api/projects/{projectId}/logswith the existing filtersGET /api/logs/{logId}
The shape the dashboard needs back
The Logs section renders declared types, so this is a contract rather than a preference. In storage/framework/core/defaults/app/Actions/Dashboard/Infrastructure/:
log-provider.tsdeclaresDashboardLogQuery(page, perPage, search, type, source, project, range),DashboardLogPagination(page, perPage, total, totalPages) andDashboardLogOptionslog-dashboard.tsdeclaresDashboardLogRecordandDashboardLogSummary, which three stx components import directly
Serving those field names as-is means the driver on the Stacks side is a fetch and a cast rather than a translation layer. Anything close but differently named costs a mapping that then has to be kept in step.
Not in scope
Writes. The seam is read-only and no provider writes.
Where this is tracked
Raised by Chris: HQ apps should be usable from the Stacks dashboard for HQ.training and other Stacks apps. The framework-side driver is tracked in stacksjs/stacks, blocked on this.