A visualizer and social layer for Open Session License artifacts — the append-only llm-turn-history.jsonl session logs that open-session repos ship alongside their code.
Every project built in collaboration with an LLM under the Open Session License carries a complete, verbatim, append-only history of the human and machine turns that produced it. OpenSession makes those histories legible, social, and comparable:
- Realtime session feed. Watch a live-updating feed of changes to
llm-turn-history.jsonlfiles across the GitHub repos you've starred. See how projects are actually being built — turn by turn, human and model — as it happens. - Session visualization. Render open-session-jsonl archives as readable, replayable conversations: speakers, timestamps, tool-activity summaries, identity attestations, and the
(ts, id)merge order recovered across parallel branches. - Discussion threads. Every session (and every turn) can anchor a chat thread where users discuss what happened, make suggestions, and critique prompting or model behavior.
- Cross-model evals. Run the same session prompts through different models and compare — the license's "epistemic self-defense" goal made concrete. See evals attached to sessions in the feed.
- Linked identity: GitHub ⇄ X. Users connect their GitHub account and link their X (Twitter) identity. Once linked:
- GitHub contributions are shown as the X users who made them.
- Any user can DM any other linked user on X — powered by xChatHub (an in-page Chrome extension that drives X's own DM client, including E2E-encrypted XChat threads).
| Piece | Role |
|---|---|
OPEN-SESSION-LICENSE.md |
The license and the open-session-jsonl wire format this app visualizes (pulled from InfiniteMirror) |
xChatHub/ |
X DM layer — keyboard-first DM client + WebMCP tools + localhost MCP bridge; the transport for user-to-user messaging |
llm-turn-history.jsonl |
This repo's own session history — OpenSession is itself built under the Open Session License |
The web app lives in app/ — Vite + React + TypeScript (views are kept presentational so they can be reused in a future React Native mobile app):
git clone --recurse-submodules https://github.com/oceanseth/OpenSession
cd OpenSession/app
npm install
npm run dev # local dev server
npm test # vitest (open-session-jsonl parser tests)
npm run build # production build → dist/main is tested locally only. Pushing to the production branch deploys to
https://opensession.groupnetwork.com via GitHub Actions
(.github/workflows/deploy.yml): OIDC-assumed IAM role →
build → S3 (opensession.groupnetwork.com) → CloudFront (E1ECGJB4KUGGL5) invalidation.
DNS is a Route53 alias on the groupnetwork.com zone.
Sign-in uses a GitHub OAuth App (web flow). The SPA redirects to GitHub, and the
opensession-auth Lambda (behind API Gateway r1q8b3li40, endpoint
https://r1q8b3li40.execute-api.us-east-1.amazonaws.com/token) exchanges the callback code
for a token — the client secret never reaches the browser. The client ID is injected at build
time via VITE_OAUTH_CLIENT_ID (repo Actions variable OAUTH_CLIENT_ID); when unset, the
sign-in button is hidden and the personal-access-token flow still works.
To (re)configure credentials:
# after creating the OAuth App at github.com/settings/applications/new
# (callback URL: https://opensession.groupnetwork.com/)
aws lambda update-function-configuration --function-name opensession-auth --region us-east-1 \
--environment "Variables={GH_CLIENT_ID=<id>,GH_CLIENT_SECRET=<secret>}"
gh variable set OAUTH_CLIENT_ID -b <id> -R oceanseth/OpenSessionFor local dev, the simplest path is the PAT flow (leave VITE_OAUTH_CLIENT_ID unset). Full
OAuth locally needs a second OAuth App with callback http://localhost:5173/ — its id goes in
app/.env.local, and the Lambda's env must temporarily hold that app's id/secret, since it
can only serve one OAuth App at a time.
Discovery is backed by a hosted registry (server/index.mjs — the opensession-api Lambda on
API Gateway r1q8b3li40 under /api, DynamoDB opensession-repos / opensession-follows /
opensession-authcache, SQS opensession-verify) so users never probe thousands of starred
repos against GitHub themselves:
- Canonical key is the GitHub numeric repo id. The registry caches which repos implement
the Open Session License; checks are server-side (a
HEADon the raw history file) and demand-driven — repos are (re)verified only when users surface them, at most once daily per repo (no global sweeps). POST /api/repos/match— client sends its starred repos ([{id, full_name}]); server returns the known implementers and queues unknown/stale ones for verification.POST /api/repos/submit— follow any repo byowner/nameor URL; resolved with the caller's token, verified inline, auto-followed.GET/PUT/DELETE /api/follows…— the user's curated follow list (following is opt-in per repo, not forced for every starred match). Auth is the user's GitHub token, resolved to their GitHub user id server-side (cached ~1h).
The client scans stars in 1,000-repo windows (newest first, "scan more" for deeper history) and live-polls only followed repos for new turns.
The live follow feed, starred-repo discovery via the shared registry, GitHub OAuth sign-in, and the session visualizer are working. Next up: X identity linking via xChatHub attestation, discussion threads, and the evals pipeline.
Code is MIT (see LICENSE, forthcoming). Session-transparency conditions per the Open Session License apply: the history file is append-only, propagates to forks, and is never loaded as machine context.
