TR

tyler-r-kendrick/opensesame

Developer tools
0 stars Quality 64 Trend 20MIT

An all-in-one authorization fabric for the agentic era.

Overview

Agents get scoped, revocable authority to act — never the secrets behind it. People keep their own credentials on their own devices. Websites get "Sign in with OpenSesame" without running a backend. Pre-release / early stage. APIs and behavior may change. An agent that needs to call GitHub, a database or a payment API normally gets handed a token, and from then on it has that token. OpenSesame inverts that. The agent holds a — a handle that names a connection but contains nothing secret — and states an . The Host authorizes the intent against policy and grants, performs the call itself, and returns a signed . There is no getSecret() anywhere in the agent-facing API, so there is nothing for a prompt injection to exfiltrate (ADR 0005). - The Identity API answers who; the Host API answers what they may do and does it. They are never merged behind one backend (ADR 0017).

README

OpenSesame

An authorization fabric for the agentic era. Agents get scoped, revocable authority to act — never the secrets behind it. People keep their own credentials on their own devices. Websites get “Sign in with OpenSesame” without running a backend.

Live app · Documentation · Getting started · Architecture · Decisions · Security

Status: Pre-release / early stage. APIs and behavior may change.


The idea in one paragraph

An agent that needs to call GitHub, a database or a payment API normally gets handed a token, and from then on it has that token. OpenSesame inverts that. The agent holds a ConnectionRef — a handle that names a connection but contains nothing secret — and states an intent. The Host authorizes the intent against policy and grants, performs the call itself, and returns a signed receipt. There is no getSecret() anywhere in the agent-facing API, so there is nothing for a prompt injection to exfiltrate (ADR 0005).

What it does

For OpenSesame provides
Agents ConnectionRef + intent → authorize → invoke → receipt. Task-scoped grants that can only narrow, JIT access with approval, MCP servers and WebMCP tools, CLI credential helpers for git, Docker, AWS and kubectl.
Operators An authority console: connectors, grants, approvals, device login, certificates (private CA, ACME), rotation, security alerting, audit receipts.
People An end-to-end-encrypted vault that lives on the device (passkey or PIN unlock; a password wrap from an older vault still opens), a git-native sealed store with pass parity, and bridges to KeePass, Bitwarden, pass/gopass and browserpass so existing tools keep working.
Websites OIDC sign-in for static sites with no backend: an origin-derived public client, PKCE, pairwise subjects.

How it fits together

flowchart LR
  subgraph Clients
    PWA["Pages PWA(static, works offline)"]
    CLI["CLIsopensesame · opensesame-id"]
    MCP["MCP / WebMCP"]
    EXT["Browser extension"]
    AG["Agents"]
  end
  subgraph Identity["Identity plane · TypeScript"]
    IDAPI["Identity API :8788OIDC issuer, principals,passkeys, claims"]
  end
  subgraph Host["Host / authority plane · Rust"]
    HOST["Host API :8787authorize → invoke → receipt"]
    D["Daemon :18790local session capabilities"]
  end
  UP[("Upstream servicesGitHub, clouds, databases")]
  PWA -. optional .-> IDAPI
  PWA -. optional .-> HOST
  CLI --> HOST
  CLI --> IDAPI
  MCP --> HOST
  EXT --> HOST
  AG -- "ConnectionRef + intent" --> HOST
  D --> HOST
  HOST -- "performs the call" --> UP
  • Two APIs, deliberately separate. The Identity API answers who; the Host API answers what they may do and does it. They are never merged behind one backend (ADR 0017).
  • The static app is complete on its own. The Pages PWA opens, signs in and keeps a vault with no Host, no Identity API and no server at all; each backend it can use is optional, per feature (ADR 0090).
  • One client core. The PWA and the client CLI share packages/app-core and the vault-format kernel packages/vault-core; app-core’s sandbox host is proven in a bare V8 isolate, the runtime Android’s JavaScriptSandbox offers (ADR 0133).

The full picture is in docs/architecture.

Quick start

Prerequisites: Node 22+, pnpm 9 (via Corepack), and Rust 1.88 for the Host plane. Details and troubleshooting: getting started.

corepack enable
pnpm install
pnpm setup:hooks                             # lint + secret-scan hooks

# The app, no backend needed — open http://localhost:5180
pnpm --filter @opensesame/pages dev:web

# The app with a local Host, Identity API and mock IdP behind it
# (runs the Host with `cargo run --offline`: run `cargo +1.88.0 fetch` once first)
pnpm --filter @opensesame/pages dev

Or start the backends one at a time:

# Identity plane (Identity API on :8788, mock upstream IdP on :9090)
pnpm --filter @opensesame/mock-upstream-idp dev &
OPENSESAME_ALLOW_DEV_DEFAULTS=1 pnpm --filter @opensesame/control-plane start

# Host plane (Host API on :8787, daemon on :18790), one terminal each. The
# scripts generate the development secrets the binaries refuse to start without.
pnpm dev:host
pnpm dev:daemon
pnpm dev:cli -- login --flow device --no-browser

Repository layout

Path What lives there
apps/ Deployable products: the native opensesame binary (apps/cli; the Host API, daemon and worker are its roles), the Pages PWA, the browser extensions and the Android app.
crates/ Rust libraries: the Host / authority plane, plus the Wasm client core.
packages/ TypeScript libraries and services: domain model, client core, SDKs, protocols, the Identity API, the client CLI and the MCP servers.
examples/ Runnable integrations: relying parties, agents, a headless device-login client.
marketplace/ Vault item-type definitions — the built-in set and the installable catalogue.
spec/ Language-neutral contracts: WIT worlds, the Host OpenAPI, the OpenFGA model, connector manifests.
tests/ Cross-cutting suites: fuzzing, red team, visual contract, mTLS interop, shared fixtures.
tools/ Development tooling: lint plugins, quality baselines, mutation configs, the mock IdP.
scripts/ Task scripts behind pnpm commands: gates, audits, release checks.
ops/ Compose stacks, ingress and NATS references, repo governance, scheduled routines.
skills/ Agent skills for using and developing OpenSesame.
docs/ Everything else worth reading.

Everyday commands

pnpm typecheck        # every TypeScript workspace
pnpm test             # every TypeScript test suite
cargo +1.88.0 test --workspace --all-targets
pnpm lint             # Biome on files changed from origin/main
pnpm quality          # file-size, complexity and package-coupling ratchets
pnpm verify           # the full local gate: all of the above, Clippy, anti-slop, battle test

What each gate enforces and why: contributing.

AI usage disclosure

Coding agents are used under human review. See CONTRIBUTING.md.

Contributing

Read CONTRIBUTING.md, then AGENTS.md — it is the canonical rulebook for humans and coding agents alike, and its design rules gate merges. Consequential decisions get an ADR. See CODE_OF_CONDUCT.md, GOVERNANCE.md, and SECURITY.md.

Security

Report vulnerabilities privately; see SECURITY.md. The threat models, trust boundaries and the running audit log are in docs/security.

License

MIT — see LICENSE and NOTICE. What we build on instead of reinventing, and under which licenses: docs/reference/reuse.md.

View this README on GitHub

Recommended Tools

Try a different keyword or remove a filter.

Install

npx skillfish add tyler-r-kendrick/opensesame