The Hub model — items, kinds, versions
The Hub is FaustWave's community-publishing surface. You publish DSPs, sample packs, knowledge packs, full projects. Other users install with one click. Everything in this manual you're reading right now is on the Hub — each domain pack is its own item.
This section is the conceptual model: what you can publish, the item / version shape, how sign-in works. The next two sections cover browsing + installing, and publishing + iterating.
What you can publish
| Kind | Source format | What install does |
|---|---|---|
| builder | .builder graph document | Saves into the project's assets/ (Documents → PROJECT); no editor tab. Add to the mixer via "+ ADD AUDIO"/"+ ADD FX", or open from PROJECT to edit. |
| dsp | .dsp Faust source | Opens in a Faust DSP module. |
| lib | .lib Faust library | Pops a file dialog; writes to disk; mounts in libfaust's VFS so import("name.lib") resolves immediately in any compile. |
| book | .md markdown bundle with ## Section-headed blocks | Indexes sections into the local KB's community corpus; opens in the Book Reader. |
| sample-pack | A single .wav / .flac / .aiff audio file | Writes bytes to the sample store (sha-keyed; idempotent on re-install). |
| node-pack | A .nodepack.json manifest | Installs into userData/node-packs/; the Builder picks up the new node kinds on next refresh. The pack-author surface (Box-DSL toBox, per-kind imports, paired-port stereo) is covered in FaustWave — Node-Pack Authoring. |
| project | A .fwproject.zip (project.json + workspace.json + assets/) exported via project.export | Imports as a new project with the source's name (or server-suggested on collision). |
Each kind has its own content reader on the publish side (parses + validates the source) and its own installer on the install side (puts it where the IDE expects it). The reader / installer pairs are wired such that publishing a .builder then installing it back gets you bytes-identical content — round-trip-clean.
Items, versions, artifacts
A Hub item is the metadata row — slug, title, owner, license, visibility, tags, description. Items live forever (until you delete them) and carry a stable id.
Each item has one or more versions — v1, v2, v3, … — each with its own content + a changelog. Users install "the latest" by default but can browse to an older version. Version numbers are server-assigned (you don't pick v17; you upload, the server picks the next number).
Each version has one or more artifacts — the actual content bytes. A book version has a bundle artifact (the markdown) + a manifest artifact (metadata). A builder version has one artifact (the .builder file). A sample-pack version's artifact is the audio bytes.
The item-version-artifact split lets the Hub serve metadata cheap (search results carry summaries only) and download bytes on demand (the downloadUrl on each artifact).
Visibility
When you publish, pick one of:
public— listed in search; anyone can install.unlisted— installable by direct link / id, but not surfaced in search. Like a YouTube unlisted video.private— only YOU can see it. Drafts, work-in-progress.friends— planned visibility tier (not yet wired in the backend; the publish call accepts the string but treat it asprivatetoday).team— planned collaborative spaces (same caveat).
Visibility is mutable; use hub.item.update { visibility } to flip it.
License
Every item requires an SPDX license identifier. The Hub doesn't enforce licensing on installs (it can't — a content download is a download) but the license is visible on every item card so installers know what they're licensing. Common choices:
CC0-1.0— public domain, no strings. Everything FaustWave itself publishes (the manual, the demo projects, the bundled instruments) is CC0.CC-BY-4.0— attribution required.MIT— permissive; usually for code-bearing items (libs, builders).CC0-1.0— public domain dedication. "Use this for anything."GPL-3.0-or-later— copyleft. Derivatives must be GPL too.
The FaustWave manual you're reading is CC0-1.0 — copy from it freely.
Sign in
Hub access is sign-in-gated. FaustWave uses Logto OIDC for auth; the same account works for browsing, installing, publishing.
Not signed in yet? Click the user icon at the bottom-left of the rail (or Settings → Account). The login modal opens in a windowed flow; complete it and you're back in the IDE with your handle (@your-username) visible in the topbar.
For AI & automation · MCP
hub.status {} returns whether you're signed in + whether you've picked a username. Cheap precheck. auth.login {} opens the modal; auth.logout {} signs you out + clears local tokens.
The IDE stays fully usable signed-out — only the Hub features (browse, install, publish) require sign-in. You can build DSPs, run the sequencer, record takes, install local samples, all without a Hub account.
Items have owners
Every item has exactly one owner: the user who published it. You can:
- Update YOUR items' metadata via
hub.item.update. - Upload new versions of YOUR items via
hub.version.upload. - Delete YOUR items via
hub.item.delete(permanent; artifact bytes go too).
You CANNOT directly edit somebody else's item. To evolve another user's work into your own version, fork — see § 3.
A hub.status chain to ground orientation
actions:
- action_id: hub.open
input: {}
label: "▶ 0. Open the Hub tab"
- action_id: hub.status
input: {}
save_as: hs
label: "▶ 1. Am I signed in?"
- action_id: hub.items.my
input: {}
save_as: mine
label: "▶ 2. What have I published?"
What the Hub doesn't do (yet)
- Payments / commerce — every item is free. License governs reuse.
- Comments / discussion — no threads per item.
- Download counts in search ranking — sort is recency + star count.
- Automated content moderation — community-flag + manual admin review.
- Notifications — "somebody forked your item" pushes are planned, not wired.
Tracked in TODOs.
Next section: browsing + installing — the search bar, the kind filter, what hub.install actually does per kind.