LWS Server
A Linked Web Storage (LWS) server implementing the W3C LWS Protocol, written as plain Jakarta servlets and bootstrapped (for now) by Spring Boot on an embedded Eclipse Jetty container.
It is a personal storage server: clients create, read, update and delete RDF and binary resources organised into containers, authenticate with any of the LWS credential suites, and the owner (or fine-grained access rules) decide who may do what.
What it implements
- LWS Core — the resource/containment model and CRUD operations.
- LWS Vocabulary — the
https://www.w3.org/ns/lws#terms. - Authentication — all four LWS suites: OpenID Connect, SAML 2.0, Self-signed Controlled Identifier, and Self-signed did:key — plus proof-of-possession via DPoP.
- Notifications — webhook subscriptions with RFC 9421 HTTP Message Signatures.
- Search & Type Index —
TypeIndexServiceandTypeSearchService, authorization-filtered per client. - Access Requests & Grants — ODRL-based, enforced and revocable.
- Web Access Control — multi-user authorization as an alternative to single owner/public-read.
Standards
| Area | Standard |
|---|---|
| Resource & containment model | LWS Core, LDP / Solid conventions |
| RDF metadata + linkset | RDF 1.1, RFC 9264 Linksets |
| Patch formats | RFC 7386 Merge Patch, RFC 6902 JSON Patch, SPARQL 1.1 Update |
| Conditional / range requests | RFC 9110, RFC 7233 |
| Errors | RFC 9457 problem+json |
| Integrity | RFC 9530 Digest Fields |
| Auth | OpenID Connect, SAML 2.0, RFC 9449 DPoP |
| Notifications | RFC 9421 HTTP Message Signatures, Activity Streams 2.0 |
| Preferences | RFC 7240 Prefer |
| TLS provisioning | ACME (RFC 8555) via acme4j |
Start here
- Getting Started — build, run, make your first request, mint the first owner.
- Architecture — how the server is wired and where data lives.
- Configuration — every
lws.*setting. - HTTP API — methods, headers, content negotiation, discovery, integrity.
- Security — the consolidated security model and its limits.
Tracking an evolving spec. The LWS core operations are implemented from the normative
Operations/source in the spec repository, which is ahead of the rendered Editor’s Draft. Where the draft is silent, the implementation follows the LDP / Solid conventions it derives from (trailing-slash containers,Link: rel="type"interaction models, content negotiation, conditional requests). Because the source is in flux, some details may change.