30817:edufeed-didactic
NIP-DIDACTIC
- signed by
- npub1hhppl...p2p4pk
- published
- 2026-08-27
- event
- a18bae2071...08a1
Funded Didactic Projects, Teaching Measures, and Project Publications
draft optional
Abstract
This NIP defines two addressable event kinds for representing funded
didactic projects (and their byproducts) on Nostr, and delegates the third
byproduct — project publications — to NKBIP-01 kind 30040:
| Kind | Entity | Schema-type |
|---|---|---|
30143 |
Projekt | Project |
30144 |
Maßnahme | TeachingMeasure |
| — | Publikation | Uses NKBIP-01 kind 30040 (see below) |
The first producer of these kinds is transferkiosk.net (the Stiftung Innovation in der Hochschullehre / Stil portal), but the shapes are generic enough to also describe BMBF / DFG / EU-funded teaching innovation projects.
This NIP is a companion to NIP-AMB:
- NIP-AMB (kind
30142) models consumable learning resources (videos, textbooks, OER). It does not have a slot for the funded project that produced a resource, nor for the documented teaching intervention that a resource arose from, nor for the scholarly publication that reflects on it. - NIP-DIDACTIC fills those gaps. The two kinds reuse NIP-AMB's flattening grammar and Nostr-native tag conventions so AMB-aware tooling can be extended uniformly.
- Vocabularies for the controlled fields below are published per
NIP-VOCAB (kinds
39737ConceptScheme /39738Concept) and referenced from event tags.
Authorship and trust model
These events are third-party catalog records. The event pubkey is the
publisher/indexer that mirrors the source catalogue (e.g. the edufeed importer
for transferkiosk.net) — not the project, its host institution, or a
publication's authors. Tags such as host:*, funder:*, and author:*
describe entities named in the source data; they are claims attested by the
publishing pubkey, not self-published identities. A consumer that needs
provenance should treat the pubkey as the asserting party and follow the r
tag back to the source record. When a described person or organisation has its
own Nostr identity, a p tag links to it (see below); absent that, the
flattened *:name fallbacks carry display metadata only, not identity.
Shared Conventions
This section covers the two native kinds, Projekt (30143) and Maßnahme
(30144); both inherit the NIP-AMB flattening grammar:
dtag — stable identifier, addressed askind:pubkey:d.typetag — human-readable schema-type label. Authoritative routing is done via the kind number.- Flattening with
:— nested objects are flattened with:as the delimiter (funder:program:name,host:location:name). - Arrays — repeat the same tag key in order. When an array element is itself
an object spanning several tags (a concept triple, an
author, aneditor), that element's tags MUST be emitted contiguously and led by its anchor key::idfor concept triples,:namefor persons/organisations. A repeat of the anchor key marks the start of the next element. This is the "boundary on repeated:id" rule inherited from NIP-AMB; consumers reassemble objects by splitting each repeated group at its anchor key. contentfield — duplicates thedescriptiontag for client display.ttag — keywords / Stichwort.rtag — external URLs (source page, DOI, project website).itag — external identifier URIs (ORCID, ROR, GND, w3id.org URIs).ptag — for project members / authors with a Nostr identity:["p", <pubkey-hex>, <relay-hint>, <role>]where<role>is"creator","contributor","author", or"participant". Persons without a Nostr identity use the flattenedcreator:*/author:*/participant:*fallbacks.ext:<ns>:<facet>:<sub>— extension namespace for source-specific fields not standardised here, exactly as in NIP-AMB. The transferkiosk producer usesext:tk:*.
Publications (delegated to NKBIP-01 kind 30040, see below) follow
NKBIP-01's own conventions instead: the content duplication rule above does
NOT apply to them (their content field MUST be empty), and their i tag
uses NIP-73-style code form (doi:10.x/…) rather than the identifier-URI
convention above.
Concept references (flat-concept triple)
Wherever a tag references a term from a controlled vocabulary, three flat tags together describe the concept:
["<facet>:id", "<concept URI>"]
["<facet>:prefLabel:<lang>", "<label>"]
["<facet>:type", "Concept"]
When a facet carries several concepts, the three tags repeat per concept. The
<facet>:id tag MUST come first within each concept and marks the concept
boundary (see Arrays above); consumers group each :prefLabel/:type with
the most recent :id.
The <concept URI> is always an external (resolvable or stable) URI —
never a Nostr coordinate. If the vocabulary is also published on Nostr per
NIP-VOCAB, an additional companion a tag SHOULD be emitted so vocab-aware
clients can fetch the underlying kind:39738 event for label translation,
narrower/broader concepts, etc.:
["a", "39738:<pubkey>:<concept-d>", "<relay>", "<facet>"]
The fourth element matches the flattened tag prefix (audience,
activity, about, …). Consumers without a vocab-aware index can ignore
the a and still group by <facet>:id.
Cross-entity relations
A relation between two events — either of the two native kinds, or between a
delegated NKBIP-01 publication event (kind 30040) and a native Projekt/
Maßnahme — is expressed with an a tag whose fourth element is a
relationship marker:
| Marker | Direction | Meaning |
|---|---|---|
isPartOf |
Maßnahme → Projekt; sub-Projekt → Verbund-Projekt | The subject belongs inside the referenced object. |
hasPart |
Inverse of isPartOf |
Optional; mostly used by indexers. |
isOutputOf |
Publikation (30040) → Projekt | The publication is an output of the referenced project. |
documents |
Publikation (30040) → Maßnahme | The publication reports on a specific measure. |
isPartOf and hasPart reuse NIP-AMB vocabulary; isOutputOf and
documents are introduced by this NIP.
Kind 30143 — Projekt
A funded didactic / teaching-innovation project. Time-bounded, hosted at one or more institutions, with at least one funding source.
Required tags
| Tag | Notes |
|---|---|
d |
Stable identifier (e.g. source URL). |
type |
"Project". |
name |
Project title. |
description |
Project summary. ALSO duplicated into content. |
Optional tags
| Tag | Source/meaning |
|---|---|
acronym |
Project acronym / Kurztitel. |
projectNumber |
Funder-internal number, e.g. "FR-599/2023". |
startDate, endDate |
ISO 8601 dates. |
extendedUntil |
ISO 8601 date; optional extension cutoff. |
status |
e.g. veroeffentlicht, laufend. |
inLanguage |
BCP47 code, repeatable. |
image |
URL of a representative image. |
dateCreated / datePublished / dateModified |
ISO 8601 (per NIP-AMB). |
funder:name / funder:type / funder:id |
Funding body. type=FundingScheme for programs. |
funder:program:name / funder:program:id |
Funding program inside the funder. |
funder:programLine:name / funder:programLine:id |
Sub-line inside the program. |
host:id / host:name / host:type |
Hosting institution. type=Organization. |
host:location:id / host:location:name |
E.g. federal state. |
host:kind:id / host:kind:name |
Institution type (Universität, Fachhochschule, …). |
participant:name / participant:role / participant:id |
Non-Nostr team members. |
p |
Team members with Nostr identity, role "participant". |
r |
Source URL, project website, … |
t |
Keywords. |
Concept references
Concept triples (with companion a tag) using these facets:
| Facet | Meaning | Vocab d-tag (transferkiosk producer) |
|---|---|---|
about |
Subject area (Fächergruppe/-bereich) | tk-faechergruppen, tk-fachbereiche |
objective |
Project goal (Projektziel) | tk-projektziele |
Relations
["a", "30143:<pub>:<d>", "<relay>", "isPartOf"]— sub-project of a Verbund-Projekt.
Example
{
"kind": 30143,
"tags": [
["d", "https://transferkiosk.net/p/101553"],
["type", "Project"],
["name", "Lernspiel für die Orthopädie und Unfallchirurgie"],
["acronym", "LeOpädchi"],
["projectNumber", "FR-599/2023"],
["description", "Ein wesentlicher Teil akuter medizinischer Konsultationen geht auf Erkrankungen und Verletzungen des Bewegungsapparates zurück …"],
["startDate", "2024-04-01"],
["endDate", "2026-03-31"],
["status", "veroeffentlicht"],
["datePublished", "2025-12-19"],
["inLanguage", "de"],
["host:id", "https://transferkiosk.net/vocab/tk-einrichtung/100448"],
["host:name", "Universitätsklinikum Bonn"],
["host:type", "Organization"],
["host:location:name", "Nordrhein-Westfalen"],
["host:kind:name", "Universitäten"],
["funder:name", "Freiraum 2023"],
["funder:type", "FundingScheme"],
["funder:program:name", "Freiraum"],
["funder:programLine:name", "Förderlinie C"],
["about:id", "https://transferkiosk.net/vocab/tk-faechergruppen/100004"],
["about:prefLabel:de", "Humanmedizin/Gesundheitswissenschaften"],
["about:type", "Concept"],
["a", "39738:d2689e2f…:tk-faechergruppen/100004", "wss://relay.edufeed.org", "about"],
["objective:id", "https://transferkiosk.net/vocab/tk-projektziele/100007"],
["objective:prefLabel:de", "Hochschule: Flexibilisierung & Individualisierung"],
["objective:type", "Concept"],
["a", "39738:d2689e2f…:tk-projektziele/100007", "wss://relay.edufeed.org", "objective"],
["r", "https://transferkiosk.net/p/101553"]
],
"content": "Ein wesentlicher Teil akuter medizinischer Konsultationen …"
}
Kind 30144 — Maßnahme
A documented concrete teaching intervention within a Projekt. Carries narrative sections plus rich classification across many didactic axes.
Required tags
| Tag | Notes |
|---|---|
d |
Stable identifier (e.g. source URL). |
type |
"TeachingMeasure". |
name |
Measure title (Maßnahmentitel). |
description |
Summary (Zusammenfassung). Also duplicated into content. |
a (isPartOf) |
["a", "30143:<pub>:<d>", "<relay>", "isPartOf"] to parent Projekt. |
Narrative section tags
Each MAY appear at most once. The value is short text; long prose SHOULD be
duplicated into content (as markdown headings) and the tag kept only for
queryability.
| Tag | Source |
|---|---|
summary |
Zusammenfassung |
challenge |
Herausforderungen |
approach |
Herangehensweise |
context |
Zusammenhang |
prerequisite |
Voraussetzungen |
procedure |
Vorgehen |
outcome |
Effekte |
learnings |
Learnings |
recommendation |
Empfehlung |
tips |
Tipps |
Method / format / tool annotations
Recommended and not-recommended values use distinct tag names so consumers can render the polarity:
| Tag | Meaning |
|---|---|
method:recommended |
A method the author recommends. |
method:notRecommended |
A method the author warns against. |
format:recommended |
… |
format:notRecommended |
… |
tool:recommended |
… |
tool:notRecommended |
… |
Concept references
| Facet | Meaning | Vocab d-tag (transferkiosk producer) |
|---|---|---|
audience |
Zielgruppe | tk-zielgruppen |
about |
Fachbereich / Fächergruppe | tk-massnahme-fachbereiche, tk-massnahme-faechergruppen |
activity |
Aktivität | tk-aktivitaeten |
actionScope |
Aktionsradius | tk-aktionsradius |
actionField |
Handlungsfeld | tk-handlungsfeld |
studyModel |
Studienmodell | tk-studienmodell |
effortLevel |
Zeitaufwand | tk-zeitaufwand |
staffNeed |
Personalbedarf | tk-personalbedarf |
materialNeed |
Sachmittelbedarf | tk-sachmittelbedarf |
investmentNeed |
Investitionsmittelbedarf | tk-investitionsmittelbedarf |
transferability |
Transferierbarkeit | tk-transferierbarkeit |
Extension namespace (ext:tk:*)
The following transferkiosk-specific facets are not in NIP-DIDACTIC core and use the ext namespace:
| Facet | Source |
|---|---|
ext:tk:projectCyclePhase |
Projektzyklusphase |
ext:tk:qualityDimension |
Qualitätsdimension |
ext:tk:qualityDevelopment |
Qualitätsentwicklung |
ext:tk:evaluationLevel |
Evaluationsebene |
ext:tk:evaluationCriterion |
Evaluationskriterium |
ext:tk:evaluationMethod |
Evaluationsverfahren |
ext:tk:fachbezug |
Fachbezug |
Each follows the flat-concept-triple grammar (ext:tk:<facet>:id,
ext:tk:<facet>:prefLabel:<lang>, ext:tk:<facet>:type).
Relations
["a", "30143:<pub>:<d>", "<relay>", "isPartOf"]— REQUIRED, to parent Projekt.
Publikationen (NKBIP-01 kind 30040)
Publications are not a NIP-DIDACTIC kind. A Publikation is published as
a standard NKBIP-01 Curated Publications index event of kind 30040.
(The NKBIP-01 spec document is itself a kind-30817 record — naddr…tn64lg,
whose own d-tag is nkbip-01. That is the spec's address, not a tag on any
publication event; the publication's own d-tag is the next item below.)
A Publikation carries d (lowercase letters/digits/hyphens,
deterministic tk-p{projekt}-pub{id} for Transferkiosk imports), title,
type (academic, or book for monographs), summary (abstract; the
event content MUST be empty), plain author tags, i external identifier
in code form (doi:10.xxxx/…), source (readable landing page),
published_on, published_by, and AMB-style creator:* runs
(creator:type/creator:name/creator:honorificPrefix) mirroring
edufeed-app's 30040 dialect.
NKBIP-01 permits additional tags; Transferkiosk publications carry these extensions:
| Tag | Meaning |
|---|---|
additionalType |
schema.org type: ScholarlyArticle, Book, Chapter. |
editor:name/:type/:honorificPrefix |
Herausgeber:innen (run per person). |
publicationLocation |
Ort. |
pageRange |
Umfang / Seitenzahlen. |
publicationType:* |
Publikationsart concept triple (vocab tk-publikationsart). |
["a", "30143:<pub>:<d>", "<relay>", "isOutputOf"] |
REQUIRED parent-Projekt link. |
Historical note: kind 30145 served this role until 2026-07; those events
were deleted (NIP-09) and re-published as kind 30040.
Querying
NIP-01 filter examples
// all projects
{"kinds": [30143]}
// project by its addressable coordinate
{"kinds": [30143], "authors": ["<pubkey>"], "#d": ["https://transferkiosk.net/p/101553"]}
// all measures belonging to a specific project
{
"kinds": [30144],
"#a": ["30143:<pubkey>:https://transferkiosk.net/p/101553"]
}
// all publications that came out of any project by this publisher
{"kinds": [30040], "authors": ["<pubkey>"]}
// publications of a specific project (NIP-50 field syntax; the relay
// resolves partOf against its facet — a bare #partOf tag filter is not
// supported)
{"kinds": [30040], "search": "partOf:30143:<pubkey>:<project-d>"}
// projects with a specific subject area
{"kinds": [30143], "#about:id": ["https://transferkiosk.net/vocab/tk-faechergruppen/100004"]}
// measures targeting a specific audience
{"kinds": [30144], "#audience:id": ["https://transferkiosk.net/vocab/tk-zielgruppen/100000"]}
nak CLI examples
PUB=<publisher-pubkey-hex>
# fetch a project
nak req -k 30143 -a $PUB -d https://transferkiosk.net/p/101553 wss://relay.edufeed.org
# all measures of a project
nak req -k 30144 -a $PUB --tag a=30143:$PUB:https://transferkiosk.net/p/101553 wss://relay.edufeed.org
# publication by DOI (code form)
nak req -k 30040 --search "doi:10.3224/gender.v17i3.02" wss://relay.edufeed.org
Reverse Conversion (Nostr event → JSON-LD-ish)
Mirrors NIP-AMB's reverse-conversion section:
- Extract
tagsarray. - Group flat tags by prefix; reassemble nested objects via
:. - Duplicate-key tags become array elements (order preserved).
dtag →id.ttags →keywordsarray.rtags → out-of-band see-also references (no JSON-LD equivalent).ptags with role →creator/contributor/author/participant, resolved via kind:0 profiles.atags with markerisPartOf/hasPart/isOutputOf/documents→isPartOf/hasPart/isOutputOf/documentsproperties whoseidis anostr:naddr1…URI (NIP-19 / NIP-21).atags with marker matching a flattened-concept facet → resolve to the referencedkind:39738event for label translation, then merge into the concept object under<facet>alongside the:id/:prefLabeltriple.ext:<ns>:<facet>:<sub>tags → siblingext.<ns>.<facet>array of concept objects, exactly as in NIP-AMB. Producers MUST NOT fold ext into core properties on reverse conversion.
Reference Implementations
- transferkiosk crawler + converter
— Python reference:
crawl.py(raw fetch),extract-vocabs.py,publish-vocabs.py(NIP-VOCAB publish),convert.py(raw → 30143/30144 + NKBIP-01 30040). - edufeed amb-relay — generic Nostr relay that already supports addressable events in this range.
References
Cited links
Discussion
Connect a key to comment.