@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

Latest Version0.1.0
Licensenone
Keywords-
Repository-
Author-
Homepage-
Bugs-

Versions

VersionPublished
0.1.02026-10-25

Per-version supply chain

VersionSigSBOMAtt
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

Loading dependency graph...

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.