sempods

try it yourself

Start with a real pod. Then choose your path.

Read three events from a public pod. No account or installation needed. Then build a client, read the contract, or run a pod yourself.

Query and follow the data

curl -X POST https://sempods.org/aaltra/_system/sparql/query \
  -H "Content-Type: application/sparql-query" \
  -H "Accept: application/sparql-results+json" \
  --data 'PREFIX schema: <https://schema.org/>
SELECT ?e ?name ?start WHERE {
  ?e a schema:Event ; schema:name ?name ; schema:startDate ?start
} ORDER BY ?start LIMIT 3'

The response contains e, name and start. Open one of the event URIs in e to read its JSON-LD description. The venue keeps the data; your client can use it.

Build against a pod

Use HTTP and JSON-LD directly, or start with the JVM client. The Kotlin 0.2.0 release is on Maven Central. Select one BOM version for the modules you use:

dependencies {
  implementation(platform("org.sempods:sempods-bom:0.2.0"))
  implementation("org.sempods:sempods-client")
}

Read a public resource

Set podUrl to the full pod URL and resourceIri to a resource in that pod. The snippets use org.sempods.client.* and okhttp3.OkHttpClient. Install the client policy once:

val http = SempodsOkHttp.install(OkHttpClient.Builder()).build()

Bind a session and read the resource. Check the status before using the body:

val session = SempodsSession(SempodsPodBase.of(podUrl))
val pod = SempodsPod(session, http)
val result = pod.resources().getText(resourceIri)
if (result.status == 200) {
  val jsonLd = checkNotNull(result.body)
  println(jsonLd)
}

These snippets come from the tested release source. The complete test supplies the imports and a local HTTP fixture.

For private data, choose delegated access when acting for a person, or service access for a backend acting as itself. Service registration and owner consent are experimental Kotlin 0.2 extensions.

Coming from 0.1? The client API changed, and RDF4J and media moved into separate adapters. Read the migration guide before raising the BOM.

Implement the open contract

The development specification defines the public contract: authorized RDF access, HTTP CRUD, SPARQL and retrieval, with optional modules such as MCP and media. It can be implemented in a different language or on a different store.

Choose a complete specification revision. Core and modules version independently of each other and of Kotlin. A 0.1-dev label needs its source commit to identify what you implemented.

The normative text already determines the contract. Proposals describe possible changes; they do not change the requirements. A product conformance suite remains unfinished, so document known deviations.

Compose or run a pod

sempods-kotlin supplies reusable services and libraries. A deployment chooses their implementations and configuration. Start with the release's local quick start to run the development composition with Java 25 and Docker Compose.

That composition supports development and evaluation. A concrete deployment owns backups, version transitions and recovery; the supplied stack has no supported upgrade path. Read deployment responsibilities before using it for persistent data.

AI routes are disabled unless a provider is configured. Media and identity also depend on your chosen composition. The release guides explain the settings rather than assuming every service is needed.

Explore before operating anything

Explorer is an experimental graph browser. Point it at a public pod to see resources and links together. A preview app's availability is separate from the Kotlin release.

Explorer displaying a linked event graph from the aaltra pod
One event, its dates and its links, read from the aaltra pod.

Need a test pod or a starting point for your own setup? Write to hello@sempods.org. Hosting is arranged manually; there is no public hosting dashboard.