You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Technical architecture for VisionClaw's Solid/LDP integration using JSON Solid Server (JSS) as a sidecar container
category
explanation
tags
architecture
solid
ldp
sidecar
jss
pods
updated-date
2026-04-09
Solid Sidecar Architecture
Technical Architecture for Decentralized Data Storage
ADR-11 update: The "Neo4j (Graph DB)" component shown throughout this design is now
the embedded Oxigraph RDF triple store running in-process inside the Rust backend —
there is no separate graph-database container, Bolt URI, or DB password. The sync tool
names below (neo4j-to-solid / solid-to-neo4j) are historical; the live equivalents
export from / import to the embedded Oxigraph store. RDF export to Solid is now a
direct serialization (Oxigraph is already RDF-native).
UPDATED 2026-06-12: The Solid surface shipped embedded, not as a JSS
Node.js sidecar: the Rust backend serves /api/solid/* and /pods/* itself
via the solid-pod-rs crate (configure_solid_routes in src/main.rs;
nginx proxies /solid/ and /pods/ to the backend). The current compose
defines no jss container. Diagrams below showing a separate
"JSS Sidecar (:3030)" are design-era intent — read "JSS" as the embedded
solid-pod-rs LDP layer. References to "Binary V2" predate the V3 52 B/node
wire (docs/binary-protocol.md).
Version: 1.0
Date: 2025-12-29
Target: VisionClaw with Solid/LDP Integration
Status: Architecture Design (graph store updated per ADR-11)
Executive Summary
This document defines the technical architecture for VisionClaw's Solid integration, enabling decentralized data ownership through Linked Data Platform (LDP) compliance. The system uses JSON Solid Server (JSS) as a sidecar container, providing:
Decentralized Storage - User-owned Solid pods for graph data
LDP Compliance - Standard Linked Data Platform operations
sequenceDiagram
participant C as Client
participant B as Backend
participant J as JSS
participant N as Oxigraph (embedded)
Note over C,N: Read Operation (Solid-first)
C->>J: GET /pods/user/graph/node-1.ttl
J->>J: Check authorization
J-->>C: 200 OK (Turtle RDF)
Note over C,N: Write Operation (Backend-first)
C->>B: POST /api/nodes
B->>N: CREATE (n:Node {...})
N-->>B: Node created
B->>J: PUT /pods/user/graph/node-{id}.ttl
J-->>B: 201 Created
J->>C: WebSocket: notification (create)
B-->>C: 201 Created
Loading
2.3 WebSocket Notification Flow
sequenceDiagram
participant C1 as Client 1
participant C2 as Client 2
participant J as JSS
participant B as Backend
C1->>J: WebSocket: subscribe /pods/user/graph/
J-->>C1: subscribed
C2->>J: WebSocket: subscribe /pods/user/graph/
J-->>C2: subscribed
B->>J: PATCH /pods/user/graph/node-1.ttl
J->>J: Update resource
J->>C1: notification (update, node-1.ttl)
J->>C2: notification (update, node-1.ttl)
sequenceDiagram
participant C as Client
participant B as Backend
participant J as JSS
participant R as Nostr Relay
C->>C: Generate NIP-98 event (kind 27235)
C->>C: Sign with Nostr private key
C->>B: POST /api/auth/nostr
Note over C,B: Authorization: Nostr base64(event)
B->>B: Decode event from header
B->>B: Verify Schnorr signature
B->>B: Validate timestamp (60s window)
B->>B: Check URL and method tags
opt Reputation Check
B->>R: GET pubkey metadata
R-->>B: NIP-01 profile
end
B->>B: Generate JWT session token
B->>J: Create/verify pod access
B-->>C: 200 OK + JWT + Pod WebID
Note over C,J: Subsequent requests use JWT
C->>J: GET /pods/{user}/graph/
Note over C,J: Authorization: Bearer {jwt}
J-->>C: 200 OK + RDF data
flowchart TD
A[Detect Conflict] --> B{Compare Timestamps}
B -->|Graph store newer| C[Graph store wins]
B -->|Solid newer| D[Solid wins]
B -->|Same time| E{Compare checksums}
E -->|Different| F[Create merge node]
E -->|Same| G[No conflict]
C --> H[Update Solid]
D --> I[Update graph store]
F --> J[Manual resolution required]
networks:
visionclaw-internal:
internal: true # No external accessvisionclaw-public:
driver: bridgeservices:
jss:
networks:
- visionclaw-internal
- visionclaw-publicbackend:
networks:
- visionclaw-internal# The graph store is embedded in the backend process (Oxigraph) — no separate# graph-database service or network entry is required (ADR-11).
8. Monitoring and Observability
8.1 Health Endpoints
Endpoint
Purpose
GET /.well-known/solid
Solid discovery
GET /health
JSS health check
GET /metrics
Prometheus metrics
8.2 Key Metrics
solid_pods_total - Total pod count
solid_requests_total - Request count by method
solid_ws_connections - Active WebSocket connections