Skip to content

Commit b022a1e

Browse files
Initial: solid-apps catalog + first app (todos)
Catalog of working LOSOS apps. Each entry is a single-HTML-file application built on the LION + urn-solid + solid-schema + solid-panes + LOSOS stack, with an app.json catalog manifest declaring the urn:solid types it handles. Scaffolding (mirrors urn-solid/solid-schema/solid-panes patterns): - schema/app.schema.json — meta-schema for app.json - scripts/validate.js — manifest schema check + entry-file existence - scripts/build.js — emits index.json catalog + reverse-index by type - index.html — catalog landing page that fetches index.json and lists apps - README.md, SKILL.md — discovery docs (5th SKILL.md in the stack) First app — todos: - todos/index.html — Tracker with three sample Vtodos inline - todos/app.json — claims urn:solid:Tracker + urn:solid:Vtodo - Composes panes: todo-pane (Tracker), schema-pane (Vtodo edit), schema-view (Vtodo display), source-pane (raw JSON) - Uses autoSchema for the schema-driven panes; bespoke todo-pane fires off canHandle('Tracker') as before - Demonstrates the "registry routes a type to a bespoke pane" feature that wasn't shippable before because Tracker wasn't in the registries Enabled by the prior three commits across the chain: - urn-solid: added urn:solid:Tracker (536 terms) - solid-schema: added Tracker schema (8 schemas) - solid-panes: added Tracker manifest pointing at todo-pane.js (8 manifests) Stack now five repos, all five interlinked, todos works end-to-end at solid-apps.github.io/todos/.
0 parents  commit b022a1e

14 files changed

Lines changed: 661 additions & 0 deletions

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
node_modules/
2+
.DS_Store
3+
.claude/
4+
*.log

README.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# solid-apps
2+
3+
Working LOSOS applications built on the [LION](https://linkedobjects.org/) + [urn-solid](https://urn-solid.github.io/) + [solid-schema](https://solid-schema.github.io/) + [solid-panes](https://solid-panes.github.io/) + [LOSOS](https://losos.org/) stack.
4+
5+
Each app is a single-HTML-file application that handles one or more `urn:solid:` types. Open the URL to use it.
6+
7+
## Apps
8+
9+
```
10+
todos/ → https://solid-apps.github.io/todos/
11+
```
12+
13+
(Catalog at https://solid-apps.github.io/ updates as more apps land.)
14+
15+
## Repo layout
16+
17+
```
18+
<slug>/ One app per directory
19+
index.html The app entry point (open this URL to use it)
20+
app.json Catalog manifest (name, description, types handled, etc.)
21+
... Custom panes, data, assets as needed
22+
schema/app.schema.json Meta-schema for app.json
23+
scripts/validate.js Validate every app.json + check entry exists
24+
scripts/build.js Generate index.json catalog + reverse-index by type
25+
index.html Catalog landing page
26+
index.json Generated: slug → catalog entry
27+
reverse-index.json Generated: urn:solid:Type → array of app slugs
28+
corpus.jsonl Generated: every manifest, one per line
29+
```
30+
31+
## Adding an app
32+
33+
```bash
34+
mkdir my-app
35+
# write my-app/app.json (see schema/app.schema.json)
36+
# write my-app/index.html (the actual application)
37+
npm run validate
38+
npm run build
39+
git commit -am "add: my-app"
40+
git push
41+
```
42+
43+
## License
44+
45+
[AGPL-3.0](LICENSE)

SKILL.md

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
---
2+
name: solid-apps
3+
description: Find working LOSOS apps that handle a urn:solid type, or contribute a new app to the catalog. Use when the user wants a real application (not just a demo) for some Solid data, or when packaging a LOSOS app for discoverability.
4+
---
5+
6+
# solid-apps
7+
8+
Working LOSOS applications, one per directory. Each is a single-HTML-file app built on the full stack (LION + urn-solid + solid-schema + solid-panes + LOSOS) and ships with a catalog manifest declaring what `urn:solid:` types it handles.
9+
10+
```
11+
LION → urn-solid → solid-schema → solid-panes → LOSOS → solid-apps (this)
12+
```
13+
14+
## When to use this skill
15+
16+
- The user has Solid data of some `urn:solid:` type and wants a ready-to-use app for it.
17+
- The user is building a new LOSOS app and wants to publish it for discovery.
18+
- The user asks "what apps work with my pod?" or "what handles `urn:solid:X`?"
19+
20+
## Finding an app for a type
21+
22+
Reverse index maps each handled type to the apps that handle it:
23+
24+
```
25+
curl -s https://solid-apps.github.io/reverse-index.json
26+
# { "urn:solid:Tracker": ["/todos/"], "urn:solid:Vtodo": ["/todos/"], ... }
27+
```
28+
29+
Catalog index has the full manifests: `https://solid-apps.github.io/index.json`.
30+
31+
## Anatomy of an app
32+
33+
```
34+
todos/
35+
app.json Catalog manifest (required)
36+
index.html The app — opens at https://solid-apps.github.io/todos/
37+
... Optional: custom panes, sample data, screenshots
38+
```
39+
40+
`app.json` shape (validated by `schema/app.schema.json`):
41+
42+
```json
43+
{
44+
"name": "Todos",
45+
"description": "A list of tasks. Built on LOSOS's bespoke todo-pane via the urn:solid:Tracker manifest.",
46+
"entry": "./index.html",
47+
"types": ["urn:solid:Tracker", "urn:solid:Vtodo"],
48+
"icon": "\u2705",
49+
"author": "Melvin Carvalho",
50+
"status": "stable",
51+
"added": "2026-04-19"
52+
}
53+
```
54+
55+
## What's in an app's index.html
56+
57+
A typical app composes the stack:
58+
59+
```html
60+
<!-- 1. JSON-LD data island, inline (or load from a pod via ?uri= query param) -->
61+
<script type="application/ld+json">{ "@type": "Tracker", "issue": [...] }</script>
62+
63+
<!-- 2. Panes — declare which to load (LOSOS picks via canHandle) -->
64+
<script type="module" data-pane src="https://losos.org/panes/todo-pane.js"></script>
65+
<script type="module" data-pane src="https://losos.org/panes/schema-pane.js"></script>
66+
<script type="module" data-pane src="https://solid-panes.github.io/schema-view.js"></script>
67+
<script type="module" data-pane src="https://losos.org/panes/source-pane.js"></script>
68+
69+
<!-- 3. Mount point -->
70+
<div id="losos"></div>
71+
72+
<!-- 4. Boot: autoSchema patches $schema based on @type, then shell -->
73+
<script type="module">
74+
import { autoSchema } from 'https://solid-panes.github.io/auto-schema.js'
75+
await autoSchema()
76+
await import('https://losos.org/losos/shell.js')
77+
</script>
78+
```
79+
80+
That's the universal pattern. What changes between apps is mostly: the data, which panes are declared, and the type the manifest claims.
81+
82+
## Adding a new app
83+
84+
1. **Make sure the types you handle exist in urn-solid + have schemas in solid-schema + have manifests in solid-panes.** If not, add them upstream first.
85+
2. Create `<slug>/` with `app.json` and `index.html`.
86+
3. `npm run validate && npm run build`.
87+
4. Commit + push.
88+
5. The catalog (https://solid-apps.github.io/) and reverse-index update automatically.
89+
90+
## Don't
91+
92+
- Don't list types in `app.json#types` that aren't in urn-solid.
93+
- Don't ship an app that depends on private LOSOS APIs — only use the URL-stable ones (`losos.org/losos/*.js`, `losos.org/panes/*.js`).
94+
- Don't bundle LOSOS or panes into the app — fetch them at the stable URLs so updates propagate.
95+
- Don't put pane *implementations* in solid-apps — they belong in LOSOS or solid-panes. solid-apps composes; it doesn't define new core machinery.
96+
97+
## Reference URLs
98+
99+
- Catalog: https://solid-apps.github.io/index.json
100+
- By-type index: https://solid-apps.github.io/reverse-index.json
101+
- Corpus: https://solid-apps.github.io/corpus.jsonl
102+
- Manifest schema: https://solid-apps.github.io/schema/app.schema.json
103+
- Site: https://solid-apps.github.io/
104+
105+
## Related skills
106+
107+
- `urn-solid` — vocabulary registry
108+
- `solid-schema` — type contracts
109+
- `solid-panes` — pane registry (which pane handles which type)
110+
- `losos` — runtime

corpus.jsonl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"name":"Todos","description":"A list of tasks. Built on LOSOS's bespoke todo-pane via the urn:solid:Tracker manifest.","entry":"./index.html","types":["urn:solid:Tracker","urn:solid:Vtodo"],"icon":"","author":"Melvin Carvalho","status":"stable","added":"2026-04-19"}

index.html

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="utf-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1">
6+
<title>solid-apps</title>
7+
<style>
8+
body { font-family: Georgia, serif; max-width: 720px; margin: 2rem auto; padding: 0 1rem; color: #2c2c2c; background: #fafaf8; }
9+
header a { color: #888; text-decoration: none; margin-right: 1.2rem; }
10+
h1 { margin-bottom: 0.25rem; }
11+
.subtitle { color: #888; margin-top: 0; }
12+
ul { list-style: none; padding: 0; }
13+
li { background: #fff; border: 1px solid #e5e3de; border-radius: 6px; padding: 16px; margin: 0.75rem 0; }
14+
li a.title { color: #1a5276; text-decoration: none; font-weight: 600; font-size: 1.05em; }
15+
li .types { color: #888; font-family: monospace; font-size: 0.85em; margin-top: 6px; }
16+
li .icon { float: right; font-size: 1.5em; opacity: 0.7; }
17+
.urn { font-family: monospace; background: #f0efeb; padding: 0.1em 0.4em; border-radius: 3px; }
18+
</style>
19+
</head>
20+
<body>
21+
<header>
22+
<a href="/">solid-apps</a>
23+
<a href="/index.json">catalog</a>
24+
<a href="/reverse-index.json">by type</a>
25+
<a href="https://urn-solid.github.io/">urn-solid</a>
26+
<a href="https://solid-schema.github.io/">solid-schema</a>
27+
<a href="https://solid-panes.github.io/">solid-panes</a>
28+
</header>
29+
30+
<h1>solid-apps</h1>
31+
<p class="subtitle">Working LOSOS applications, each built on the LION + urn-solid + solid-schema + solid-panes + LOSOS stack. Open any URL to use the app.</p>
32+
33+
<h2>Apps</h2>
34+
<ul id="catalog">
35+
<li><em>Loading…</em></li>
36+
</ul>
37+
38+
<h2>What this is</h2>
39+
<p>Each app is a single-HTML-file LOSOS application that handles one or more <span class="urn">urn:solid:</span> types. Schema-driven where possible (form auto-generated from the type's JSON Schema), bespoke where warranted (e.g. Tracker uses LOSOS's native todo-pane for the list view).</p>
40+
41+
<p>The whole stack visible at one click per app:</p>
42+
<ol>
43+
<li><strong>LION</strong> — the data is just JSON-LD</li>
44+
<li><strong>urn-solid</strong> — bare type names like <code>Tracker</code> default to <code>urn:solid:Tracker</code></li>
45+
<li><strong>solid-schema</strong> — JSON Schema describes the shape</li>
46+
<li><strong>solid-panes</strong> — manifest routes the type to the right pane</li>
47+
<li><strong>LOSOS</strong> — runtime renders panes, syncs writes back to the pod</li>
48+
</ol>
49+
50+
<footer style="margin-top: 3rem; color: #888; font-size: 0.85em;">
51+
<p><a href="https://github.com/solid-apps/solid-apps.github.io">github.com/solid-apps/solid-apps.github.io</a></p>
52+
</footer>
53+
54+
<script>
55+
(async () => {
56+
const list = document.getElementById('catalog')
57+
try {
58+
const res = await fetch('/index.json')
59+
const cat = await res.json()
60+
const entries = Object.entries(cat)
61+
list.innerHTML = ''
62+
if (!entries.length) { list.innerHTML = '<li><em>No apps yet.</em></li>'; return }
63+
for (const [slug, app] of entries) {
64+
const li = document.createElement('li')
65+
li.innerHTML = `
66+
<span class="icon">${app.icon || ''}</span>
67+
<a class="title" href="${app.entry}">${app.name}</a>
68+
<div>${app.description}</div>
69+
<div class="types">${app.types.map(t => `<span class="urn">${t}</span>`).join(' ')}</div>
70+
`
71+
list.appendChild(li)
72+
}
73+
} catch {
74+
list.innerHTML = '<li><em>Failed to load catalog.</em></li>'
75+
}
76+
})()
77+
</script>
78+
79+
</body>
80+
</html>

index.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"todos": {
3+
"name": "Todos",
4+
"description": "A list of tasks. Built on LOSOS's bespoke todo-pane via the urn:solid:Tracker manifest.",
5+
"entry": "/todos/index.html",
6+
"types": [
7+
"urn:solid:Tracker",
8+
"urn:solid:Vtodo"
9+
],
10+
"icon": "",
11+
"status": "stable",
12+
"manifest": "/todos/app.json"
13+
}
14+
}

package-lock.json

Lines changed: 93 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{
2+
"name": "@solid-apps/registry",
3+
"version": "0.0.1",
4+
"description": "Catalog of LOSOS apps — each entry is a working application built on the urn-solid + solid-schema + solid-panes + LOSOS stack.",
5+
"type": "module",
6+
"scripts": {
7+
"validate": "node scripts/validate.js",
8+
"build": "node scripts/build.js"
9+
},
10+
"devDependencies": {
11+
"ajv": "^8.17.0",
12+
"ajv-formats": "^3.0.1"
13+
},
14+
"license": "AGPL-3.0",
15+
"homepage": "https://solid-apps.github.io",
16+
"repository": {
17+
"type": "git",
18+
"url": "https://github.com/solid-apps/solid-apps.github.io.git"
19+
}
20+
}

reverse-index.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"urn:solid:Tracker": [
3+
"/todos/"
4+
],
5+
"urn:solid:Vtodo": [
6+
"/todos/"
7+
]
8+
}

0 commit comments

Comments
 (0)