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
2026-05-24 20:39:24 +01: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
docs Refresh Repixelizer app claims through Heimdall 2026-05-20 13:43:53 +01:00
notes Refresh Repixelizer app claims through Heimdall 2026-05-20 13:43:53 +01:00
src Refresh Repixelizer app claims through Heimdall 2026-05-20 13:43:53 +01:00
state Record Heimdall refresh deployment 2026-05-20 18:56:58 +01:00
tests Refresh Repixelizer app claims through Heimdall 2026-05-20 13:43:53 +01:00
tools Rename repo to Heimdall 2026-04-26 11:41:27 +01:00
.env.example Accept caller-owned entitlement policy 2026-04-29 13:22:01 +01:00
.gitignore Ignore local secret files 2026-04-29 12:23:45 +01:00
AGENTS.md Clarify push after major passes 2026-04-26 15:43:03 +01:00
package.json Land first stateful Discord auth slice 2026-04-26 12:50:07 +01:00
pnpm-lock.yaml Land first stateful Discord auth slice 2026-04-26 12:50:07 +01:00
README.md Prefer direct backend auth handoff 2026-04-26 17:00:57 +01:00
tsconfig.json Land Heimdall service skeleton 2026-04-26 12:25:11 +01: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"

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, and YouTube
  • durable auth/control-plane storage with in-memory and Postgres backends
  • account, linked-identity, session, 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 and StreamPixels
  • 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

Still not landed:

  • end-to-end app integrations in consumer repos
  • refresh/revocation flows and admin surfaces

Canonical docs:

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

Dev Commands

pnpm install
pnpm dev
pnpm test
pnpm build

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.