npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@dwk/solid-pod

v0.1.0-beta.2

Published

Edge-native Solid Pod: LDP verbs, content negotiation, N3 Patch, WAC, notifications. Ships the per-pod Durable Object.

Readme

@dwk/solid-pod

Edge-native Solid Pod: LDP verbs, content negotiation, N3 Patch, WAC, notifications. Ships the per-pod Durable Object.

Part of the @dwk IndieWeb + Solid cohort. See the package specification for the full requirements.

An edge-native Solid Pod: a stateless Worker front door over a per-pod Durable Object that is the consistency, authorization, and notification authority, with R2 for blob bodies. This is the only @dwk package that ships a Durable Object. It composes the reusable libraries @dwk/dpop (edge DPoP validation), @dwk/rdf (Turtle/JSON-LD), @dwk/wac (access control), and @dwk/store (DO-SQLite quads + R2 copy-on-write blobs).

What it does

  • LDPGET / HEAD / OPTIONS / PUT / POST / PATCH / DELETE with resource and basic-container semantics (ldp:contains).
  • Content negotiation — Turtle and JSON-LD (plus the other Turtle-family types) on read, via @dwk/rdf.
  • N3 Patch / application/sparql-updatesolid:where is matched against the current graph with minimal (non-SPARQL) semantics: no exact single binding ⇒ 409; deletes then inserts apply in one SQLite transaction.
  • Web Access Control — walks to the nearest effective .acl (acl:accessTo / acl:default), evaluating Read/Write/Append/Control, agents, groups, acl:agentClass foaf:Agent, and acl:origin via @dwk/wac. Append authorizes insert-only patches; any delete requires Write. The pod owner always has full access (bootstraps .acl management).
  • Auth (Resource Server) — DPoP-bound bearer tokens validated at the edge (issuer JWKS pinned by kid, header typ: at+jwt, aud/exp/nbf/webid, proof htu/htm/ath/cnf.jkt). Strict single-use jti replay is enforced in the DO for writes, pruned by expiry; reads do not consume a jti (a documented tradeoff).
  • Concurrency — all writes funnel through the single-threaded DO; the If-Match / If-None-Match (create-only) check and the write are TOCTOU-free, evaluated inside the store's write transaction. Deleting a non-empty container is likewise rejected inside that transaction.
  • Oversized / binary bodies — content-addressed R2 copy-on-write with an atomic DO pointer flip; orphaned keys are reclaimed by an out-of-band GC cron (createSolidPodGc), never by waking a DO.
  • Notifications — Solid Notifications over WebSocket channels on the DO's hibernatable WebSockets (v1 channels carry the changed resource IRI only).

v1 is a Resource Server only (no OIDC OP) and runs one Durable Object per pod (no sharding).

Usage

import { createSolidPod, createSolidPodGc, SolidPodObject } from "@dwk/solid-pod";

const pod = createSolidPod({
  baseUrl: "https://pod.example",
  issuer: "https://issuer.example",
  jwksUri: "https://issuer.example/jwks",
  owner: "https://pod.example/profile/card#me",
});

const gc = createSolidPodGc({
  baseUrl: "https://pod.example",
  gcSafetyWindowMs: 300_000,
});

export default {
  fetch: pod,
  scheduled: gc,
};

// Bind the per-pod Durable Object class in your Worker.
export { SolidPodObject };

Required bindings & wrangler.toml

compatibility_date = "2025-01-01"
# N3.js (via @dwk/rdf) uses Node's stream/buffer; the pod runs the parser in the DO.
compatibility_flags = ["nodejs_compat"]

[[durable_objects.bindings]]
name = "POD"
class_name = "SolidPodObject"

[[migrations]]
tag = "v1"
new_sqlite_classes = ["SolidPodObject"]

[[r2_buckets]]
binding = "BLOBS"
bucket_name = "solid-pod-blobs"

# Optional: shared D1 table for out-of-band R2 garbage collection.
[[d1_databases]]
binding = "GC_DB"
database_name = "solid-pod-gc"

[triggers]
crons = ["*/5 * * * *"]

The POD (Durable Object) and BLOBS (R2) bindings are required; the handler fails loudly at startup if either is missing. GC_DB (D1) is optional — when bound, the DO forwards orphaned blob keys to it for the GC cron to reclaim.

License

ISC