Tim Berners-Lee's Charlie Works describes a vision for trustworthy, user-centric AI assistants that leverage personal data stored in Solid Pods. Rather than giving generic responses, "Charlie" accesses an individual's structured data (with consent) to provide highly personalized answers.
Key insight: "the pod full of semantic web data is extremely powerful in driving the LLM."
How it maps to JSS
JSS already has most of the building blocks:
Solid Pods with LDP containers and JSON-LD resources
WAC auth for fine-grained access control
/db/ route backed by MongoDB for structured data storage
IdP with credentials endpoint for token-based auth
Pay-as-you-go token model — agent interactions can be metered
Proposed implementation
/agent/ endpoint — accepts a natural language query + consent scope
Pod data retrieval — agent reads user's pod data (fitness, finances, preferences, etc.) based on granted permissions
LLM context injection — pod data is serialized as JSON-LD context and sent to an LLM (e.g. Claude API)
Response — personalized answer returned to the user
Consent flow — user explicitly grants/revokes data access per query or per session
Token metering — each agent query costs tokens, fits the pay-as-you-go model
Data flow
User query + consent → /agent/ endpoint
→ Read pod data (WAC-scoped)
→ Build JSON-LD context
→ Send to LLM API
→ Return personalized response
This is the original Charlie proposal — superseded in shape (not in spirit) by #490, which lands the substrate first.
#490 lands the foundation: `jss start --mcp` exposes the pod as an MCP tool surface. Any MCP-compatible client (Claude Desktop, Cursor, `solid-apps/charlie`) can drive it. Bot identity is a `did:nostr:` WAC subject; ACL controls access exactly like for human users. No server-held API keys, no vendor coupling.
This issue stays open as the hosted-Charlie follow-on: a JSS-internal `/agent/` endpoint that owns the LLM call and applies the pay-as-you-go token metering described above. That's a useful convenience layer on top of MCP for users who don't want to run their own LLM client — but it's strictly additive to the MCP primitive in #490.
Proposed order: #490 first (substrate + reference `solid-apps/charlie` UI), then this one (hosted convenience + metering).
Documentation: docs/features/charlie.md on the docs site — TBL's 2017 vision, the working 2026 stack (npx jspod + any MCP client + open-weights model), and session transcripts showing an agent reading WAC as a consent model rather than a barrier. Plus the "How Charlie works" wiring section in the MCP feature doc.
On the hosted-Charlie follow-on (the /agent/ endpoint + token metering my earlier comment reserved this issue for): dropping it. The shipped pattern's framing supersedes the idea — "no vendor in the loop, no commercial API key required" is the point. A JSS-internal endpoint that owns the LLM call would reintroduce exactly the coupling the pattern exists to avoid. The agent runtime is the right home for inference; the pod's job is identity, consent, and storage. If demand for a hosted convenience layer materializes, it can be a fresh, narrowly-scoped issue — this one's vision is delivered.
Activity
melvincarvalho commented on May 18, 2026
This is the original Charlie proposal — superseded in shape (not in spirit) by #490, which lands the substrate first.
#490 lands the foundation: `jss start --mcp` exposes the pod as an MCP tool surface. Any MCP-compatible client (Claude Desktop, Cursor, `solid-apps/charlie`) can drive it. Bot identity is a `did:nostr:` WAC subject; ACL controls access exactly like for human users. No server-held API keys, no vendor coupling.
This issue stays open as the hosted-Charlie follow-on: a JSS-internal `/agent/` endpoint that owns the LLM call and applies the pay-as-you-go token metering described above. That's a useful convenience layer on top of MCP for users who don't want to run their own LLM client — but it's strictly additive to the MCP primitive in #490.
Proposed order: #490 first (substrate + reference `solid-apps/charlie` UI), then this one (hosted convenience + metering).
melvincarvalho commented on Jun 10, 2026
Closing (2026-06-10): Charlie ships as the MCP pattern
The vision this issue proposed is running today, and documented:
On the hosted-Charlie follow-on (the /agent/ endpoint + token metering my earlier comment reserved this issue for): dropping it. The shipped pattern's framing supersedes the idea — "no vendor in the loop, no commercial API key required" is the point. A JSS-internal endpoint that owns the LLM call would reintroduce exactly the coupling the pattern exists to avoid. The agent runtime is the right home for inference; the pod's job is identity, consent, and storage. If demand for a hosted convenience layer materializes, it can be a fresh, narrowly-scoped issue — this one's vision is delivered.