@blueforge-studio/app-logs
SDK for app-logs, the BlueForge opt-in event lane: a batching producer client for LogEventV1 events and a reader client for events/summary queries. Zero runtime dependencies.
Package Info
Versions
| Version | Published |
|---|---|
| 0.1.0 | 2026-10-25 |
Per-version supply chain
| Version | Sig | SBOM | Att |
|---|---|---|---|
| 0.1.0 |
Click a version to view its details.
Supply chain
Provenance
- Published by
- web:5
- When
- 2026-10-25T21:36:34Z
- sha256 (registry-computed)
- 20687bf4bee657c306b98819cb9808cf60ae914e40fbf1a7e7559a90db18c91d
Observed by the registry at publish.
Claimed by the build
The publisher claimed nothing about its build.
Attachments
- Signature
- none
- SBOM
- none
Dependencies
README
@blueforge-studio/app-logs
Producer + reader SDK for app-logs, the BlueForge opt-in event lane
(design: docs/superpowers/specs/2026-10-23-app-logging-design.md in
forge-control). Zero runtime dependencies.
import { createLogProducer, createLogReader } from '@blueforge-studio/app-logs'
// Env (operator-provisioned, mirrors APP_DEVDB_*):
// FORGE_LOGS_URL full ingest URL
// FORGE_LOGS_PROJECT project UUID
// FORGE_LOGS_SECRET producer secret (ingest); reader secret (read-back)
const logs = createLogProducer({
ingestUrl: process.env.FORGE_LOGS_URL!,
secret: process.env.FORGE_LOGS_SECRET!,
project: process.env.FORGE_LOGS_PROJECT!,
enabled: () => consentStore.has('analytics') && flags.mediaLog !== 'off',
})
logs.emit({
kind: 'audio.play',
session_ref: liveHandle.session_ref,
visitor_ref: liveHandle.visitor_ref,
props: { hop: 'clip_served', path: '/clips/a.mp3', lang: 'da' }, // origin-relative paths!
})
await logs.flush() // explicit flush = one deterministic receipt (CI/relay pattern)
logs.drop() // consent revoke: discard the unsent buffer
Receipt: {accepted, deduped, quota_dropped} — the three always sum to the
batch size. Batches: ≤500 events, ≤256 KB. Retries: network + 502/503/504
only (never 4xx), secret redacted from every error.
Read-back (verify what you shipped):
const reader = createLogReader({ baseUrl: FORGE_LOGS_URL, readerSecret: READER })
const page = await reader.events({ project, session_ref, kind: 'audio.play' })
An event you cannot read back is not verified. Producer secrets cannot read.