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