All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Trivy vulnerability scanning for Docker images (
api,app,processing) in CI; scans run on Dockerfile changes and weekly against publishedghcr.ioimages, with SARIF reports uploaded to GitHub Code Scanning and the workflow failing onCRITICALfindings. Closes #372. - Dependabot configuration in
.github/dependabot.ymlcovering all fivepackage.jsonlocations (root,api,app,xstreamroll-sdk,xstreamroll-processing), with grouped updates (@nestjs/*,@opentelemetry/*, React/Next,@radix-ui/*), weekly schedules, and auto-merge for patch and security updates via.github/workflows/dependabot-auto-merge.yml. Closes #368. .trivyignorefile at the repo root documenting the suppression format and serving as the canonical place for triaged false-positive findings.@xstreamroll/contract-testsworkspace package (tests/contracts) with a custom consumer/provider contract test suite covering thestreamsandauthendpoints:api/src/contract-provider.spec.tsverifies the API satisfies each contract,xstreamroll-sdk/__tests__/contract.consumer.test.tsverifies the SDK sends/parses what each contract describes. CI fails if either suite fails (#399).@xstreamroll/typesworkspace package (packages/types) as the single source of truth for domain types (User,Stream,StreamEvent, pagination, and API error shapes) shared byapi,app, andxstreamroll-sdk(#376).- Kubernetes deployment manifests for API, App, Processing Worker, and PostgreSQL (
#217). - Health check endpoints (
/api/health,/livez,/healthz) to support container orchestrator probes. SECURITY.mdpolicy covering supported versions, SLAs, and private vulnerability reporting.- Comprehensive
CONTRIBUTING.mdguide covering monorepo setup, conventional commits, and PR expectations. - PostgreSQL-backed
TagsDbRepositoryandStreamsDbRepositoryfor secure, parameterized data access. - User registration page (
/auth/register) in the Next.js frontend with Zod schema validation. - Stream visibility (
#393): additivevisibility: "public" | "private"field onStream, with"private"as the safe default. Newvisibilityquery filter onGET /streams, opt-invisibilityon create/update payloads, and migration2026080101_add_streams_visibility.up.sqlto backfill existing rows. - Stream event replay API (
#396): newGET /streams/:id/eventsendpoint returning paginated historical events for a stream, backed by a newStreamEventsrefactored into the existing repository pattern so swapping the in-memory store for a Postgres-backed one is a drop-in. - SDK streaming pagination helper (
#390):paginateAll()async iterator onStreamingClientwalks every page of a paginated list endpoint without forcing callers to re-implement cursor logic. ComputeshasMorefromtotal / page / limitso the on-wirePaginatedResponse<T>type stays unchanged. - Browser-compatible SDK build (
#387): the SDK now ships a dual CJS + ESM build (dist/anddist-esm/), with amodule,browser, andexportsfield onxstreamroll-sdk/package.json. Bundler entry points (Vite,Webpack,Rollup,esbuild) pick the ESM bundle automatically. - Pre-commit and pre-push hooks (
#385):huskyandlint-stagedare wired (npm run prepareinstalls the hooks) so staged TS/JS files geteslint --max-warnings=0+prettier --write; pre-push runs the package-widetsc --noEmitsuite in parallel for the api, sdk, and processing workspaces. - Mutation testing scaffold (
#389): astryker.config.jsonfor the SDK plus annpm run test:mutationscript that runs Stryker against the SDK retry / HttpClient / webhook signature surfaces. Opt-in (not in default CI) so existing CI workflows stay green until the team is ready to expand coverage. - ADR-0008 evaluating a message-queue replacement (
#404): documents the candidate architectures, recommendation (Redis Streams), and phased migration path with explicit exit criteria. - PostgresLockManager coverage expansion (
#401): added four edge-case tests inxstreamroll-processing/__tests__/leader-election.test.tsso the SQL-contract branches the existing in-memory suite could not exercise are now covered: (1)renewreturns false when the same row has been taken over by a differentworker_id; (2)releaseis a no-op for a stream that was never claimed; (3)releaseAllbinds the currentworker_id(not a wildcard); (4)acquirereturns null when the DB hands back a row owned by a foreign worker.
- Breaking (api):
StreamandUserid/userIdfields are now serialized as strings in JSON responses instead of numbers, resolving theStream.id: number(API) vs.Stream.id: string(SDK) contract mismatch. Internal storage (PostgresSERIALcolumns) and request-side route params are unaffected — the change is at the response boundary only. - Breaking (xstreamroll-sdk):
User,Stream,CreateStreamDto,UpdateStreamDto,StreamEvent,StreamEventRecord, and the pagination/error types are now re-exported from@xstreamroll/typesinstead of being defined locally, and no longer include fields the API never actually implemented (User.role,User.displayName,Stream.visibility).CreateUserDtonow matches the realPOST /auth/registercontract (usernameinstead ofdisplayName) — previously anyregister()call would fail server-side validation. app's server-side stream cache (lib/cache/streams.ts) now uses the sharedStream/PaginatedResponsetypes instead of a locally-definedStreamSummary/StreamListResultwhose field names (items) had drifted from the real API response shape (data).StreamOwnershipServicein API backend now safely queries the PostgreSQL database via parameterized queries instead of relying on demo environment variables.- Prepared
AdminStatsServicefor database integration to aggregate platform-wide stats. - Breaking (xstreamroll-sdk):
StreamingClientnow uses the fetch-basedHttpClient(with sharedwithRetry) instead of axios. Theaxiosdependency has been removed from@stellar/streaming-sdk. Callers that relied on axios-specific error shapes (AxiosError,error.isAxiosError, axios interceptors on the client instance) must switch toApiError/HttpRequestError. The publicStreamingClientmethod surface is unchanged. - ADR-0003 (
docs/adr/0003-polling-based-processing.md) is enriched with an explicit recovery model, signals to revisit the decision, and a forward link to ADR-0008 (#391). - ESLint configuration now enforces consistent import ordering via
eslint-plugin-import'simport/orderrule (groups: builtin / external / internal / parent / sibling / index) — autofix withnpm run lint:fix. Thelintscript no longer fails on warnings so a gradual rollout is safe across the existing codebase (#403).
- UI
ConfirmDialogcomponent now properly handles async states and prevents dialog dismissal while action promises are pending. xstreamroll-sdkREADME replaces the obsoleteaxioswording with the currentfetch-based HTTP transport, removes the "track issue #34" placeholder for the upcoming WebSocket support, and corrects two stale status URLs (#395).
- Scheduled re-scan of published
ghcr.io/<owner>/xstreamroll-{api,app,processing}:latestimages so newly disclosed CVEs are surfaced outside of release windows. (#372)