No description
  • TypeScript 92.2%
  • C++ 5.6%
  • Python 2.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Meta Vens c0d30e8081 Test fixtures: the Rust owner's Idunn runtime records, and one fake Idunn RUDP endpoint
tests/fixtures/idunn-runtime holds expected.cc, activation.cc, the activation seed,
the presence identity credential and the machine-id it is bound to, copied from
CultLib 217a9480 (Rust-written; test keys only). fake-idunn-rudp.ts is the accept
server idunn-rudp-health.test.ts built inline, now keeping a session per remote and
every delivered frame, so a boot test can receive several pulses.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-23 17:48:02 +02:00
.voidbot/state Seed Heimdall social interpretation biases 2026-05-24 20:39:24 +01:00
assets Add Heimdall profile avatar 2026-05-20 18:52:21 +01:00
deployment/idunn Declare Joystick in the Idunn recipe and document the locked refresh 2026-10-19 11:15:42 +02:00
docs Docs: map managed credential custody, the callback mint and the open follow-ups 2026-10-19 15:49:34 +02:00
notes State: live d51fa6b proven by a human Twitch sign-in; Joystick consent remains 2026-10-19 18:03:17 +02:00
plugins/gamecult.heimdall.access Resume browser sign-in by attempt id, not the completion code 2026-09-23 20:50:28 +02:00
schemas Add Joystick as a confidential, rotating managed-connection provider 2026-10-19 11:13:40 +02:00
src Presence: the publisher sequence is in-process, the state root keeps no owner-only file, an Idunn generation never self-enrolls 2026-10-23 14:25:11 +02:00
state State: live d51fa6b proven by a human Twitch sign-in; Joystick consent remains 2026-10-19 18:03:17 +02:00
tests Test fixtures: the Rust owner's Idunn runtime records, and one fake Idunn RUDP endpoint 2026-10-23 17:48:02 +02:00
tools Rename repo to Heimdall 2026-04-26 11:41:27 +01:00
vendor Bump vendored CultLib for the bounded fragment reassembly map 2026-09-10 11:50:49 +02:00
.env.example Docs: secrets are _FILE names; drop the unread Spotiverse secret 2026-09-30 14:40:21 +02:00
.gitignore Ignore local secret files 2026-04-29 12:23:45 +01:00
.gitmodules Vendor CultLib as a gitlink so Heimdall's source can be sealed 2026-09-06 00:42:45 +02:00
AGENTS.md Name the Linux deploy target for the auth authority 2026-09-08 12:23:44 +02:00
CLAUDE.md Drop the Codex framing from the doctrine import 2026-09-06 00:39:45 +02:00
LICENSE Add MIT license 2026-09-05 21:54:09 +02:00
package.json Heimdall: fastify 5.8.5 to 5.12.7, find-my-way 9.5.0 to 9.10.0 (clears 5 High advisories) 2026-10-22 21:00:47 +02:00
pnpm-lock.yaml Heimdall: fastify 5.8.5 to 5.12.7, find-my-way 9.5.0 to 9.10.0 (clears 5 High advisories) 2026-10-22 21:00:47 +02:00
README.md README: front door with value, problem, entry points, live versus planned 2026-10-22 20:03:50 +02:00
tsconfig.json Resume Heimdall auth from browser return witness 2026-08-22 11:42:28 +02:00
vitest.config.ts Limit Vitest to source test tree 2026-04-26 12:25:53 +01:00

Heimdall

Heimdall is the shared auth authority taking shape for GameCult-hosted experiments.

The point is painfully simple:

  • stop rebuilding Discord/Patreon login glue in every app
  • keep provider OAuth, linked identities, grants, entitlements, and session issuance in one place
  • let app runtimes verify signed claims locally so "shared auth" does not become "everything phones home for every request"
  • keep app-domain data separate so "shared auth" does not become "shared swamp"

Front Door

  • Value: one shared auth authority: provider OAuth (Discord, Patreon, GitHub, Twitch, YouTube, Spotify), linked identities, grants, entitlements and session issuance, with Ed25519-signed claims that app backends verify locally.
  • Problem: every GameCult app was rebuilding Discord/Patreon login glue. Heimdall centralizes identity authority and keeps app-domain data in the apps.
  • Entry points:
    • src/index.ts and src/app.ts: the Fastify service. src/signing.ts and src/claims.ts issue JWTs and serve /.well-known/jwks.json; src/oauth.ts and src/providers.ts own provider flows.
    • src/verifier.ts: the local verifier helper an app backend imports to validate Heimdall JWTs without phoning home.
    • src/odin-publication.ts and plugins/gamecult.heimdall.access: the redacted Odin/Eve provider advertisement and the gamecult.heimdall.access plugin (docs/eve-access-plugin.md).
    • docs/architecture.md, docs/service-contract.md, docs/verse-service-contract.md, docs/app-profiles/: the contracts.
    • pnpm install, pnpm dev, pnpm test (see Dev Commands).
  • Live: a stateful first slice: signing and JWKS, OAuth state for six providers, in-memory and Postgres stores, a real Discord callback path for the Repixelizer flow, sealed provider tokens, the loopback CultNet operation boundary, Idunn health publication, and the deployed Ghostlight Eve host consuming the discovered boundary.
  • Planned: the two-account and eight-account Ghostlight human canaries, refresh and revocation flows, admin surfaces, and broader inspection projections beyond the redacted access boundary.

Current Shape

This repo now has a stateful first slice instead of a decorative skeleton.

Landed right now:

  • a TypeScript/Fastify service scaffold under src/
  • Ed25519 JWT signing plus /.well-known/jwks.json
  • file-backed signing-key loading/bootstrap so restart does not vaporize the service identity when you configure a real key path
  • signed OAuth start-state scaffolding for Discord, Patreon, GitHub, Twitch, YouTube, and Spotify
  • durable auth/control-plane storage with in-memory and Postgres backends
  • account, linked-identity, session, persistent OAuth attempt, grant, entitlement snapshot, and audit persistence
  • a real Discord OAuth callback path for the first Repixelizer access flow
  • direct backend callback handoff for same-host or Yggdrasil-reachable app backends
  • AES-256-GCM sealing for managed provider tokens at rest
  • a one-time browser completion exchange kept as fallback for opener postMessage handoff
  • app profile surfaces for Repixelizer, StreamPixels, and Spotiverse
  • signed claim issuance for app-local verification experiments
  • a local verifier helper in src/verifier.ts so app backends can validate Heimdall JWTs without phoning home on every guarded request
  • a read-only Odin/Eve provider advertisement export that names redacted CultCache witness document shapes and paths without touching live secrets
  • a daemon-owned CultCache boundary witness at GC_ACCESS_CULTCACHE_PATH containing the Heimdall provider advertisement, command boundary, transport profile, and Idunn daemon-health summary
  • optional Idunn daemon-health publication over cultnet.transport.rudp.v0 when GC_ACCESS_IDUNN_RUDP_HEALTH is configured
  • the gamecult.heimdall.access Eve plugin with executable describe, validate, and project operations plus a browser reference adapter
  • a loopback-only CultNet operation boundary on port 4101 for authenticated heimdall.auth.begin and heimdall.auth.complete; app payloads and completion claims are AES-256-GCM wrapped and HMAC-bound to expiry, nonce, operation, runtime, and idempotency identity
  • redacted provider, command-boundary, plugin, and transport records published through Odin under unique typed catalog keys; secret-bearing auth state never enters the catalog
  • the deployed Ghostlight Eve host consumes that discovered boundary and keeps routine app-session verification local

Remaining work:

  • the two-account and eight-account Ghostlight human canaries
  • refresh/revocation flows and admin surfaces
  • broader admin and inspection projections beyond the redacted access boundary

Canonical docs:

  • docs/architecture.md
  • docs/implementation-plan.md
  • docs/service-contract.md
  • docs/verse-service-contract.md
  • docs/app-profiles/repixelizer.md
  • docs/app-profiles/streampixels.md
  • docs/app-profiles/spotiverse.md
  • state/map.yaml
  • notes/fresh-workspace-handoff.md

Dev Commands

pnpm install
pnpm dev
pnpm test
pnpm build
pnpm export:provider-advertisement

Working Loop

  1. Rehydrate from canonical state.
  2. Keep identity authority central and app-domain data local.
  3. Prefer a Yggdrasil-hosted shared service over duplicated per-app provider stacks.
  4. Let app backends verify signed claims locally instead of begging Heimdall on every guarded route.
  5. Commit finished passes before the notes start breeding.