{"schema": "gwydion.glossary.v1", "source": "publish", "terms": {"access_request": {"audience": "user", "see_also": ["limit_request", "project"]}, "access_token": {"audience": "developer", "see_also": ["trust_level"]}, "auth_plugin": {"audience": "admin", "see_also": ["test_login"]}, "base_revision": {"audience": "developer", "see_also": ["revision", "submission"]}, "bundle_library": {"audience": "user", "see_also": ["file_store_limits", "prol"]}, "conflict": {"audience": "user", "see_also": ["base_revision", "revision"]}, "consent": {"audience": "user", "more": {"href": "/privacy"}, "see_also": ["project_access"]}, "csrf_token": {"audience": "user", "see_also": ["review", "profs"]}, "decision_id": {"audience": "developer", "see_also": ["submission_guide"]}, "display_name": {"audience": "user", "see_also": ["project-id", "presentation"]}, "draft": {"audience": "user", "see_also": ["review", "publication"]}, "editor_plugin": {"audience": "user", "see_also": ["profs"]}, "explain_mode": {"audience": "user", "see_also": ["submission_guide"]}, "fallback_page": {"audience": "user", "see_also": ["site"]}, "fetch_request": {"audience": "user", "see_also": ["access_request", "project"]}, "file_bundle": {"audience": "developer", "see_also": ["preview", "project"]}, "file_history": {"audience": "user", "see_also": ["revision", "restore"]}, "file_param": {"audience": "user", "see_also": ["upload_bridge", "submission"]}, "file_store_limits": {"audience": "user", "see_also": ["limit_group", "bundle_library"]}, "finding": {"audience": "developer", "see_also": ["submission_check"]}, "help_entry": {"audience": "user", "see_also": ["part_description"]}, "hidden_file": {"audience": "user", "see_also": ["profs", "submission_check"]}, "limit_group": {"audience": "user", "see_also": ["file_store_limits", "limit_rule"]}, "limit_request": {"audience": "user", "see_also": ["prol", "limit_group"]}, "limit_rule": {"audience": "developer", "see_also": ["limit_group", "limit_request"]}, "line_merge": {"audience": "user", "see_also": ["conflict", "revision"]}, "logbook": {"audience": "user", "see_also": ["on_air"]}, "login_state": {"audience": "user", "see_also": ["on_air"]}, "mark_terms": {"audience": "user", "see_also": ["explain_mode", "publication"]}, "on_air": {"audience": "user", "see_also": ["review"]}, "optional-login": {"audience": "user", "see_also": ["site", "project"]}, "own_fonts": {"audience": "user", "see_also": ["site"]}, "page_lock": {"audience": "user", "see_also": ["on_air"]}, "part_description": {"audience": "developer", "see_also": ["help_entry"]}, "persona_catalogue": {"audience": "user", "see_also": ["persona_pack", "share_alike"]}, "persona_pack": {"audience": "user", "see_also": ["persona_catalogue", "share_alike"]}, "personal_settings": {"audience": "user", "see_also": ["editor_plugin"]}, "presentation": {"audience": "user", "see_also": ["site", "project", "profs"]}, "preview": {"audience": "user", "see_also": ["project", "publication"]}, "profs": {"audience": "user", "see_also": ["revision", "prol", "file_history"]}, "project": {"audience": "user", "see_also": ["revision", "submission", "preview"]}, "project-id": {"audience": "user", "see_also": ["project", "submission"]}, "project_access": {"audience": "developer", "see_also": ["consent"]}, "project_type": {"audience": "user", "see_also": ["presentation", "tree"]}, "prol": {"audience": "user", "see_also": ["limit_group", "limit_rule", "limit_request"]}, "publication": {"audience": "user", "see_also": ["draft", "review"]}, "quarantined_file": {"audience": "user", "see_also": ["profs", "hidden_file"]}, "removed_file": {"audience": "user", "see_also": ["restore", "file_history"]}, "restore": {"audience": "user", "see_also": ["file_history", "revision"]}, "review": {"audience": "user", "see_also": ["draft", "trust_level"]}, "review_cascade": {"audience": "user", "see_also": ["review", "draft"]}, "revision": {"audience": "user", "see_also": ["base_revision", "submission"]}, "share_alike": {"audience": "user", "see_also": ["persona_pack"]}, "shared_include": {"audience": "user", "see_also": ["bundle_library"]}, "site": {"audience": "user", "see_also": ["presentation", "fallback_page", "project_access"]}, "stage_one": {"audience": "developer", "see_also": ["stage_two", "stage_three"]}, "stage_three": {"audience": "developer", "see_also": ["stage_one", "stage_two"]}, "stage_two": {"audience": "developer", "see_also": ["stage_one", "stage_three", "auth_plugin"]}, "submission": {"audience": "developer", "see_also": ["submission_check", "base_revision", "review"]}, "submission_check": {"audience": "developer", "see_also": ["finding", "submission_guide"]}, "submission_guide": {"audience": "developer", "more": {"href": "/.well-known/gwydion/submission.json"}, "see_also": ["submission", "submission_check", "explain_mode"]}, "tag_search": {"audience": "user", "see_also": ["tree", "publication"]}, "test_login": {"audience": "admin", "see_also": ["auth_plugin"]}, "tree": {"audience": "user", "see_also": ["site", "presentation"]}, "trust_level": {"audience": "admin", "see_also": ["review", "access_token"]}, "upload_bridge": {"audience": "user", "see_also": ["submission", "virus_scan", "file_param"]}, "vendored_build": {"audience": "user", "see_also": ["editor_plugin"]}, "virus_scan": {"audience": "user", "see_also": ["file_bundle", "finding"]}, "vote": {"audience": "user", "see_also": ["review"]}, "waiting_for_limit": {"audience": "user", "see_also": ["limit_request", "prol"]}, "wasm_right": {"audience": "user", "see_also": ["file_bundle", "bundle_library"]}}, "texts": {"de": {"access_request": {"example": "user/alice bittet um open für chatgpt-local; der Eigentümer stimmt zu", "title": "Zugangsanfrage", "what": "Eine Bitte an die Verwalter eines Projekts um das Recht, es zu öffnen oder zu ändern — von einer angemeldeten Person, die das Projekt sieht, aber das Recht nicht hat.", "why": "Ein 403 ist keine Sackgasse: ein Mensch entscheidet, wer hineinkommt, und die Entscheidung wird festgehalten.", "words": ["Zugangsanfragen", "Zugang anfragen"]}, "access_token": {"example": "Authorization: Bearer gwp_…", "title": "Persönliches Zugriffstoken", "what": "Ein Geheimnis, mit dem ein Programm oder eine KI als du handelt, mit höchstens deinen Rechten und einem Ablaufdatum.", "why": "Gespeichert wird nur sein Hash; du kannst es widerrufen, ohne dein Passwort zu ändern.", "words": ["Zugriffstoken"]}, "auth_plugin": {"example": "keycloak (wartend)", "title": "Anmelde-Plugin", "what": "Die Art, wie Menschen sich an diesem Server oder einem Projekt anmelden: Host-Login, Basic Auth, Keycloak oder ein Bündel davon.", "why": "Ein neues Anmelde-Plugin bleibt wartend, bis jemand seinen Testlogin besteht, damit sich niemand aussperrt.", "words": ["Auth-Plugin", "Anmeldeweg"]}, "base_revision": {"example": "mit base 20 einreichen; ein neues Projekt beginnt mit base 0", "title": "Basisrevision", "what": "Die Revision, auf der eine Einreichung aufbaut.", "why": "Ist das Projekt inzwischen weiter, lehnt der Server die Einreichung als veraltet ab, statt neuere Arbeit zu überschreiben."}, "bundle_library": {"example": "explain/explain.js 1.0.1 im Projekt statt /_gwydion/explain.js", "title": "Bibliothek bündeln", "what": "Eine Kopie einer Plattform-Bibliothek (explain.js, consent.js) ins Projekt legen, statt die bereitgestellte /_gwydion/<library>.js zu laden. Braucht das Recht bundle-library.", "why": "Eine gebündelte Kopie läuft offline und in Stufe 1, bekommt aber keine Updates der Plattform.", "words": ["bundle-library", "gebündelte Kopie", "bündeln"]}, "conflict": {"example": "du hast ab Revision 7 gespeichert, jemand anders Revision 8", "title": "Konflikt", "what": "Zwei Änderungen an derselben Datei vom selben Ausgangspunkt: deine und eine, die vorher gespeichert wurde. ProFs zeigt den Unterschied und behält deinen Text, damit du ihn erneut anwenden kannst.", "why": "Niemand überschreibt eine fremde Änderung, ohne sie zu sehen.", "words": ["Konflikte", "Konflikt", "conflict"]}, "consent": {"example": "tile.openstreetmap.org für map-tiles erlauben?", "more": "Datenschutz", "title": "Einwilligung", "what": "Deine Erlaubnis, bevor eine Seite Informationen von einer anderen Seite nutzt: diesmal, immer für dieses Projekt, oder nein.", "why": "Nichts von außen erreicht dich ohne Frage; ein \"immer\" kannst du widerrufen.", "words": ["Zustimmung"]}, "csrf_token": {"example": "Sie öffnen /review/, die Seite gibt Ihrem Browser eine Sitzung und das Token; ein von anderswo gesendetes Formular wird mit 403 abgelehnt.", "title": "Formular-Token", "what": "Ein geheimer Wert, den jedes schreibende Formular dieser Site trägt, gebunden an Ihre Browser-Sitzung (das Cookie gwydion_csrf). Der Server nimmt ein Formular nur mit dem Token Ihrer Sitzung an und nur von einer Seite dieser Site.", "why": "Eine andere Site kann Ihren Browser nicht in Ihrem Namen ein Formular hierher senden lassen (Cross-Site Request Forgery): Sie kennt Ihr Token nicht.", "words": ["CSRF-Token", "Formular-Token"]}, "decision_id": {"example": "1015b-Q12", "title": "Entscheidungs-ID", "what": "Die Kennung einer Frage und ihrer Antwort in der Form <sitzung>-Q<n>, eingetragen in DECISIONS.md.", "why": "Jeder kann später nachlesen, warum etwas so ist, und niemand stellt dieselbe Frage zweimal.", "words": ["Frage-ID"]}, "display_name": {"example": "Anzeigename „Schulfinder“, Kennung school-finder-k3x9qa", "title": "Anzeigename", "what": "Der Name eines Projekts, wie Menschen ihn sehen: der bei der Einreichung eingegebene Name, später von einer Person mit dem Recht write geändert (Umbenennen). Die Kennung in der Adresse ändert sich nie; jede Umbenennung ist ein Journaleintrag. Ein Mandant kann stattdessen den Titel aus presentation.json gewinnen lassen (Einstellung display_name_source).", "why": "Menschen erkennen einen Namen wieder; Adressen und Links brauchen eine Kennung, die sich nie bewegt.", "words": ["Projektname", "umbenennen"]}, "draft": {"example": "veröffentlicht, Entwurf wartet", "title": "Entwurf", "what": "Eine neue Fassung, die gespeichert, aber noch nicht live ist.", "why": "Änderungen einer KI oder eines Menschen landen zuerst als Entwurf, damit niemand sie vor der Prüfung sieht.", "words": ["Entwürfe"]}, "editor_plugin": {"example": "GwydionEditors.register(\"codemirror6\", …)", "title": "Editor-Plugin", "what": "Ein austauschbarer Editor für die Dateien-Seite hinter einer kleinen Schnittstelle (mount, getValue, setValue, destroy). Das eigene Textfeld ist Standard und Rückfall; ein anderer Editor wie CodeMirror 6 kann je Browser eingeschaltet werden.", "why": "Ein stärkerer Editor lässt sich ergänzen, ohne die Seite von fremdem Code abhängig zu machen.", "words": ["Editor-Plugin", "Editor-Plugins", "editor plugin"]}, "explain_mode": {"example": "das (i) im Kopf der Seite", "title": "Erklärmodus", "what": "Der Schalter (i): ist er an, erklären sich gepunktete Wörter beim Zeigen, Fokussieren oder Tippen.", "why": "Du lernst die Wörter der Plattform dort, wo du ihnen begegnest; der Schalter merkt sich seinen Zustand nur in diesem Browser.", "words": ["Schalter (i)"]}, "fallback_page": {"example": "/ zeigt „Under construction“, bis die Site live und für dich offen ist", "title": "Eingebaute Seite (Rückfall)", "what": "Die Seite, die publish selbst mitbringt: Startseite, Liste der Veröffentlichungen, Prüfung, Dateien, Grenzen und Anmeldung. Sie antwortet immer dann, wenn die Site fehlt, ungültig ist oder der Person nicht offensteht.", "why": "Eine kaputte Site sperrt niemanden aus: die eingebauten Seiten funktionieren immer.", "words": ["eingebaute Seite", "eingebaute Seiten", "Rückfall"]}, "fetch_request": {"example": "ein Holen von files.example.org wird abgelehnt; der Eigentümer lässt files.example.org auf /fetch-requests/demo zu", "title": "Host-Anfrage", "what": "Eine Bitte an die Verwalter eines Projekts, einen Host auf seine Host-Liste zu setzen — entstanden aus einem Holvorgang, der abgelehnt wurde, weil sein Host nicht auf der Liste stand.", "why": "Ein abgelehnter Download ist keine Sackgasse: Ein Mensch entscheidet, von welchen fremden Hosts der Server laden darf, und die Entscheidung wird festgehalten.", "words": ["Host-Anfragen", "Host-Anfrage"]}, "file_bundle": {"example": "index.html + app.js + style.css", "title": "Bündel", "what": "Eine Veröffentlichung aus Dateien (index.html, Skripte, Stile, geprüfte Binärdateien) statt eines Markdown-Textes.", "why": "Apps laufen als Bündel; ihre eigenen Skripte laufen, aber nichts lädt von anderen Seiten, die das Projekt nicht erklärt hat.", "words": ["Dateibündel"]}, "file_history": {"example": "index.html: Revisionen 1, 4, 9", "title": "Dateiverlauf", "what": "Die Revisionen, in denen eine Datei angelegt, geändert oder entfernt wurde — wann, von wem, mit welcher Nachricht. Von dort: zeigen, vergleichen, wiederherstellen.", "why": "Man sieht, wie eine Datei entstand, und kann zurückgehen.", "words": ["Dateiverlauf", "Verlauf", "file history"]}, "file_param": {"example": "import_zip {\"project\": \"oat-lagerverwaltung\", \"base\": 12, \"folder\": \"app\", \"file\": {\"download_url\": \"https://…\", \"file_id\": \"file_…\"}} → ein Ergebnis je Datei", "title": "Datei-Parameter", "what": "Eine Werkzeug-Eingabe, die ChatGPT mit einer Datei des Chats füllt: {download_url, file_id, mime_type?, file_name?} (das Werkzeug erklärt sie mit _meta openai/fileParams). publish holt die Download-Adresse während des Aufrufs mit jeder Prüfung eines Holens — https, nur ein Host der Holen-Liste des Projekts, eine öffentliche Adresse, höchstens die Archiv- oder Einzeldatei-Grenze — und importiert oder speichert die Datei dann wie jeden Upload. Rechenstufe L6; die Adresse wird nie gespeichert oder gezeigt, ein Host außerhalb der Liste wird in der Ablehnung genannt.", "why": "Ein ZIP, das die KI in ihrem Chat gemacht hat, kommt ohne Browser-Upload ins Projekt — und durchläuft trotzdem jede Prüfung.", "words": ["Datei-Parameter", "openai/fileParams"]}, "file_store_limits": {"example": "max_files 170, max_file_bytes 7 000 000, max_bundle_bytes 10 000 000, max_binary_project_bytes 20 000 000; erlaubte Typen wie js, mjs und cjs (CommonJS, seit 0.9.23)", "title": "Grenzen des Dateispeichers", "what": "Die Grenzgruppe von publish: Dateien je Projekt, Bytes je Datei, Bündelgröße, Binärgrößen, erlaubte Dateitypen; Speicher und Laufzeit für später angelegt.", "why": "Sie halten den gemeinsamen Dateispeicher fair und die Seiten schnell.", "words": ["file-store-limits", "Dateispeicher-Grenzen"]}, "finding": {"example": "submission.explain.script-missing (niedrig)", "title": "Befund", "what": "Ein Ergebnis der Einreichungsprüfung: Regel, Datei, Schwere, Meldung und ein Hinweis zur Behebung.", "why": "Befunde sind im Lernmodus Ratschläge; hohe verdienen einen Blick vor dem Veröffentlichen.", "words": ["Befunde"]}, "help_entry": {"example": "help/rights.json", "title": "Hilfeeintrag", "what": "Schritt-für-Schritt-Hilfe für einen Teil und eine Version in help/<part>.json: Ziel, Schritte, Test, bekannte Fehler.", "why": "Ändert sich der Teil, wird sein Hilfeeintrag als veraltet markiert, statt still falsch zu werden.", "words": ["Hilfeeinträge"]}, "hidden_file": {"example": "app/.htaccess steht in list_files; GET /p/<project>/app/.htaccess antwortet 404", "title": "Versteckte Datei", "what": "Eine Datei, deren Name mit einem Punkt beginnt. Ein Projekt darf nur diese halten: .htaccess, .gitignore, .gitattributes, .editorconfig, .env.example. Sie werden gespeichert, gelistet, gelesen und exportiert wie jede Datei, aber nie an einen Browser ausgeliefert (die Live-Seite, die Site und die Vorschau antworten 404). .env und jede andere versteckte Datei werden abgelehnt; die Geheimnis-Prüfung lehnt jede Datei mit einem erkennbaren Schlüssel oder Passwort ab.", "why": "Ein PHP- oder Git-Projekt behält seine Server-Regeln und Einstellungen — ohne sie Besuchern zu zeigen oder Geheimnisse zu speichern.", "words": [".htaccess", "Punktdatei"]}, "limit_group": {"example": "file-store-limits mit max_files 170 und max_bundle_bytes 10 000 000 (die Plattformwerte seit publish 0.9.23)", "title": "Grenzgruppe", "what": "Eine benannte Menge veränderlicher Grenzen (zum Beispiel Dateien, Bytes, Dateitypen) auf einer Ebene: Plattform, Mandant oder Projekt. Untere Ebenen dürfen nur strenger sein.", "why": "Eine Stelle sagt, was ein Projekt enthalten darf und woher jeder Wert kommt.", "words": ["Grenzgruppen", "limit group"]}, "limit_request": {"example": "max_files 60 → 65 für chatgpt-local", "title": "Grenzanfrage", "what": "Eine Anfrage, eine Grenze für ein Projekt anzuheben — gestellt von einer Einreichung über der Grenze oder direkt. Wer manage am Projekt hat, gibt sie frei oder lehnt ab.", "why": "Ein Projekt kann ohne Code-Änderung wachsen, und ein Mensch entscheidet jede Anhebung.", "words": ["Grenzanfragen", "limit request"]}, "limit_rule": {"example": "count(files) <= {file-store-limits.max_files}", "title": "Grenzregel", "what": "Eine Prüfung über die Werte einer Einreichung und die Grenzen einer Gruppe; bei Überschreitung weist sie ab, verlangt eine Grenzanfrage oder informiert nur.", "why": "Regeln machen die Grenzen wirksam; ihre Ausdrücke werden gelesen, nie als Code ausgeführt.", "words": ["Grenzregeln", "limit rule"]}, "line_merge": {"example": "<<<<<<< current … ======= … >>>>>>> yours", "title": "Zeilen-Zusammenführung", "what": "Dein Text und die Änderungen der anderen Person Zeile für Zeile zusammengesetzt, ausgehend von der Revision, mit der ihr beide angefangen habt. Wo beide dieselben Zeilen geändert haben, zeigt ein markierter Block beide Fassungen.", "why": "Zwei Menschen können eine Datei ändern, ohne dass einer Arbeit verliert; du prüfst den Vorschlag, bevor er gespeichert wird.", "words": ["Zusammenführungsvorschlag"]}, "logbook": {"example": "2026-10-19 · das Aussehen des Pi · publish 0.9.1 · installer 0.66.29 · Änderungen (3)", "title": "Logbuch", "what": "Die Liste der sichtbaren Schritte der Plattform — welche Einheiten sich geändert haben, auf welche Version, und was sich jeweils geändert hat (neu, geändert, behoben …). Der Installer schreibt es nach jedem Push und Live; nur Angemeldete sehen es.", "why": "Du siehst auf einen Blick, was sich zuletzt in welcher Version geändert hat, ohne Commits zu lesen.", "words": ["Logbuch"]}, "login_state": {"example": "PE am rechten Ende des Streifens", "title": "Anmeldestatus", "what": "Der Teil des On-Air-Lichts, der zeigt, ob du angemeldet bist — mit deinen Initialen — oder abgemeldet.", "why": "Du weißt, mit welchem Konto du die Seite ansiehst, bevor du sie änderst.", "words": ["angemeldet"]}, "mark_terms": {"example": "Mit mark-terms bekommt das Wort Revision in einem veröffentlichten Artikel die gepunktete Linie; ohne das Recht ändert sich nichts.", "title": "Markierte Plattformwörter", "what": "Das Projektrecht mark-terms: Die Plattformwörter (Projekt, Revision, …) in den veröffentlichten Markdown-Seiten des Projekts werden für den Erklärmodus markiert. Ohne das Recht bleibt der Text unverändert und der Schalter (i) sagt, dass die Seite nichts zu erklären hat.", "why": "Die Autorin entscheidet, ob die Plattform ihren Text anfassen darf.", "words": ["mark-terms"]}, "on_air": {"example": "der rote Balken auf einer öffentlichen Projektseite", "title": "On-Air-Licht", "what": "Ein schmales rotes oder gelbes Licht mit Abzeichen oben an einer Seite — nur für Superadmin und Berechtigte: rot „ON AIR · öffentlich“, wenn alle die Seite sehen, gelb „angemeldet“, wenn nur Angemeldete sie sehen; nichts, wenn sie privat ist.", "why": "Du siehst sofort, ob eine Seite öffentlich ist, bevor du sie änderst.", "words": ["ON AIR"]}, "optional-login": {"example": "Auf dev-pe.friendly-apps.de anmelden, zu / zurückkehren und „Deine Projekte“ sehen.", "title": "Freiwillige Anmeldung", "what": "Auf der Startseite kannst du dich anmelden, musst aber nicht. Angemeldet zeigt sie deine eigenen Projekte; ohne siehst du, was öffentlich ist.", "why": "Besucher bleiben ohne Konto willkommen, und die Eigentümerin findet ihre Arbeit sofort.", "words": ["anmelden"]}, "own_fonts": {"example": "Theme fonts: [{\"family\": \"Atkinson Hyperlegible\", \"file\": \"fonts/atkinson-hyperlegible.woff2\"}]", "title": "Eigene Schriften", "what": "Schriftdateien (nur woff2, höchstens 4, je ≤ 300 KB, mit Lizenztext fonts/LICENSE-<name>.txt) im Site-Projekt, im Theme als {family, file} benannt. Die eingebauten Seiten nutzen sie nur, wenn die Einstellung site.own_fonts an ist (Plattform, Mandant oder settings.own_fonts in site.json) und das Recht site-fonts gehalten wird; eine Schrift, die eine Regel verletzt, ist ein lernender Befund und wird erst ausgeliefert, wenn sie passt; sonst gilt die feste Liste der Systemschriften. Sie werden nur von dieser Site ausgeliefert (font-src 'self').", "why": "Eine Site darf ihr eigenes Gesicht tragen, ohne etwas von einem anderen Server zu laden.", "words": ["eigene Schriftdateien", "site-fonts", "site.own_fonts"]}, "page_lock": {"example": "das geschlossene Schloss auf einer Seite für Angemeldete", "title": "Seitenschloss", "what": "Das Schloss im On-Air-Licht: geschlossen, wenn die Seite beschränkt ist (nur Angemeldete oder nur du und die Berechtigten sehen sie), offen, wenn alle sie sehen.", "why": "Du siehst auf einen Blick, ob die Seite öffentlich ist.", "words": ["Schloss"]}, "part_description": {"example": "parts/renderer.json", "title": "Teilbeschreibung", "what": "Die Selbstbeschreibung eines Teils eines Projekts in parts/<part>.json: Anwendungsfälle, Bedarf, Schnittstellen, Daten und DSGVO-Angaben.", "why": "Menschen und KIs verstehen einen Teil, ohne seinen Code zu lesen, und der Katalog kann seine API anbieten.", "words": ["Teilbeschreibungen"]}, "persona_catalogue": {"example": "/_gwydion/personas/index.json → 9 Pakete", "title": "Persona-Katalog", "what": "Die Liste der kuratierten Persona-Pakete, die diese Seite dem Persona Store anbietet: /_gwydion/personas/index.json nennt jedes Paket mit Lizenz, Quelle und Zahl der Personas.", "why": "Du kannst fertige Rollen aus bekannten Quellen wählen und siehst immer, woher sie kommen und unter welcher Lizenz.", "words": ["Persona-Katalog", "Personakatalog", "persona catalogue"]}, "persona_pack": {"example": "fabric-patterns.json (MIT)", "title": "Persona-Paket", "what": "Eine Datei des Persona-Katalogs mit 15 bis 40 Rollen aus einer Quelle, umgeschrieben als Chat-Rollen, auf Prompt-Injection geprüft, jede mit Herkunft (Datei, Link, Änderungen). Nur durch einen geprüften Import geändert, nie automatisch abgeglichen.", "why": "Ein Paket hält eine Quelle und eine Lizenz zusammen, damit die Namensnennung mitreist.", "words": ["Persona-Paket", "Persona-Pakete", "persona pack"]}, "personal_settings": {"example": "Editor: CodeMirror 6", "title": "Persönliche Einstellungen", "what": "Entscheidungen, die für dein Konto auf dem Server gespeichert werden, etwa dein Editor auf der Dateiseite. Ohne Anmeldung bleibt die Wahl in deinem Browser.", "why": "Deine Wahl folgt dir auf jedes Gerät, auf dem du dich anmeldest.", "words": ["persönliche Einstellung"]}, "presentation": {"example": "presentation.json: {\"kind\": \"presentation\", \"format\": 1, \"title\": \"Link-Speicher\"}", "title": "Präsentation (Projektkarte)", "what": "Wie sich ein Projekt in der Galerie zeigt: presentation.json mit Titel, Kurztext, Icon, Bildschirmfoto, Schlagwörtern und Links, bearbeitet vom Eigentümer.", "why": "Jeder Eigentümer entscheidet, wie sein Projekt erscheint; Besucher sehen nur, was ihre Rechte erlauben.", "words": ["presentation.json", "Projektkarte", "Karte"]}, "preview": {"example": "/p/chatgpt-local/", "title": "Vorschau", "what": "Die laufende Fassung eines Projekts, die du im Browser unter /p/<projekt>/ öffnest.", "why": "Du probierst das Ergebnis aus, bevor du entscheidest; die Seite läuft mit strenger Sicherheitsregel und lädt nichts von anderen Seiten, außer das Projekt erklärt es.", "words": ["Vorschauprojekt"]}, "profs": {"example": "/files/chatgpt-local", "title": "ProFs", "what": "ProFs — Professional Filestore: die Dateien eines Projekts als Dateispeicher — Baum, Vorschau, ein leichter Editor, Hochladen, Verlauf, Unterschied und Wiederherstellen. Jede Änderung ist eine neue Revision.", "why": "Projekte ändern Menschen und KIs gleichermaßen; ein Speicher mit Verlauf heißt: nichts geht verloren, jede Änderung ist nachvollziehbar.", "words": ["Professional Filestore", "Dateispeicher", "file store"]}, "project": {"example": "chatgpt-local, dydeng", "title": "Projekt", "what": "Eine Sammlung von Dateien (eine App oder eine Seite), die Menschen und KIs auf diesem Server gemeinsam bauen, mit einer Geschichte von Revisionen.", "why": "Alles hier gehört zu einem Projekt: seine Rechte, seine Prüfungen, seine Vorschau und seine Dokumentation.", "words": ["Projekte"]}, "project-id": {"example": "Name „my-app“, Kennung my-app-k3x9qa", "title": "Projektkennung", "what": "Der kurze Name in der Adresse eines Projekts (/p/<Kennung>/). War der gewünschte Name vergeben oder verborgen, bekommt sie eine zufällige Endung; der eingegebene Name bleibt der Anzeigename.", "why": "Eine eindeutige Kennung, die kein verborgenes Projekt verrät, neben dem Namen, den man wiedererkennt.", "words": ["Kennung"]}, "project_access": {"example": "https://tile.openstreetmap.org GET für map-tiles", "title": "project-access", "what": "Die Datei project-access.json eines Projekts: welche fremden Seiten seine Seiten aus dem Browser nutzen dürfen, mit Methoden und Zweck.", "why": "Standardmäßig verlässt nichts die Seite; nur erklärte Herkünfte kommen in die Sicherheitsregel, und die Person wird vorher gefragt.", "words": ["project-access.json"]}, "project_type": {"example": "type/game", "title": "Projekttyp", "what": "Die Art einer Veröffentlichung als TagChef-Schlagwort type/<art> in presentation.json (webapp, site, module, document, demo, game, tool, dataset, theme, agent); ohne Schlagwort leitet die Liste eine aus den Dateien ab und kennzeichnet sie (abgeleitet).", "why": "Die Veröffentlichungen danach filtern, was sie sind.", "words": ["type/"]}, "prol": {"example": "die Regel max-files liest {file-store-limits.max_files} = 60", "title": "ProL (Professional Limiter)", "what": "Der Begrenzer der Plattform: Grenzen sind Daten — Gruppen veränderlicher Grenzen und Regeln darüber — statt Zahlen im Code.", "why": "Grenzen lassen sich sehen, erklären und je Projekt per Entscheidung anheben statt per Code-Änderung.", "words": ["Professional Limiter", "Begrenzer"]}, "publication": {"example": "eine Markdown-Seite unter /p/<name>", "title": "Veröffentlichung", "what": "Eine Seite oder ein Dateibündel, das nach der Prüfung live gegangen ist.", "why": "Andere sehen nur die Live-Fassung; ein Entwurf wartet, bis jemand mit dem Recht manage ihn veröffentlicht.", "words": ["Veröffentlichungen", "veröffentlichte Seiten", "veröffentlicht"]}, "quarantined_file": {"example": "data/app.sqlite steht in list_files und im ZIP-Download für Inhaber von write; GET /p/<project>/data/app.sqlite antwortet 404", "title": "Datei in Quarantäne", "what": "Eine Datei, die das Projekt Byte für Byte behält, aber nie zeigt, ausliefert, entpackt oder öffnet: Archiv-Originale (.zip, .tar, .tar.gz, .tgz, .gz) und SQLite-Datenbanken (.sqlite, .sqlite3, .db). Sie wird an ihren ersten Bytes geprüft, gescannt und gegen die Binär-Limits gezählt.", "why": "Sicherungen und Datenbanken bleiben beim Projekt, ohne Teil der öffentlichen Seite zu werden.", "words": ["Datei in Quarantäne", "aufbewahrtes Original"]}, "removed_file": {"example": "old.css in Revision 12 entfernt, aus Revision 11 wiederhergestellt", "title": "Entfernte Datei", "what": "Eine gelöschte Datei: sie fehlt in der neuen Revision, aber jede ältere Revision behält sie, darum lässt sie sich wiederherstellen.", "why": "Löschen ist sicher — nichts wird zerstört.", "words": ["entfernte Datei", "gelöschte Datei", "removed file"]}, "restore": {"example": "index.html aus Revision 3 wiederherstellen", "title": "Wiederherstellen", "what": "Eine Datei so zurückholen, wie sie in einer älteren Revision war. Das wird eine neue Revision; die Revisionen dazwischen bleiben.", "why": "Fehler und Löschungen lassen sich rückgängig machen, ohne etwas zu verlieren.", "words": ["Wiederherstellen", "wiederhergestellt", "restore"]}, "review": {"example": "die Knöpfe publish, reject, unpublish", "title": "Prüfung", "what": "Ein Mensch mit dem Recht manage sieht sich einen Entwurf an und veröffentlicht, verwirft oder nimmt ihn zurück — seit 0.9.0 standardmäßig an für jedes neue Projekt und die Projekte des Instanzeigentümers (die Prüfkaskade).", "why": "Wo die Prüfung an ist, geht nichts, was eine KI schrieb, ohne menschliche Entscheidung live.", "words": ["Review", "geprüft"]}, "review_cascade": {"example": "PUT /api/v1/publish/projects/<projekt>/review {\"review\": \"off\"}", "title": "Prüfkaskade", "what": "Ob eine Einreichung auf Prüfung wartet, entscheidet Projekt → Eigentümer → Site → Plattform: die Einstellung des Projekts, sonst die persönliche des Eigentümers (beim Instanzeigentümer standardmäßig an), sonst die Site (Mandant), sonst die Plattform. Jedes neue Projekt beginnt mit Prüfung an.", "why": "Der Schlüssel des Eigentümers veröffentlicht nie an seinen Augen vorbei; jedes Projekt kann trotzdem wählen.", "words": ["Prüfung an"]}, "revision": {"example": "Revision 20 von chatgpt-local", "title": "Revision", "what": "Ein nummerierter Stand eines Projekts; jede angenommene Einreichung erzeugt einen neuen.", "why": "Die Revision sagt genau, welchen Stand du siehst, und eine KI kann die Änderungen seitdem abfragen.", "words": ["Revisionen"]}, "share_alike": {"example": "maastricht-prompts.json: share_alike true", "title": "Weitergabe unter gleichen Bedingungen", "what": "Eine Lizenzbedingung (CC BY-SA): Wer das Werk ändert und weitergibt, muss dieselbe Lizenz verwenden. Das Maastricht-Paket ist so ein Paket; geänderte Rollen daraus bleiben CC BY-SA 4.0.", "why": "Sie sagt dir, ob deine eigenen Änderungen an einer Persona unter einer anderen Lizenz veröffentlicht werden dürfen.", "words": ["share-alike", "CC BY-SA", "gleiche Bedingungen"]}, "shared_include": {"example": "/_gwydion/includes/treegrid-r12/master/core.js", "title": "Gemeinsames Include", "what": "Eine gepinnte Kopie eines unserer Module (ui-kit, explain, treegrid, data-representations, ai, module-profile) unter /_gwydion/includes/<name>-<version>/ — unveränderlich und mit Subresource Integrity; ein Projekt pinnt es in dependency-lock.json, statt eine Kopie einzufügen.", "why": "Eine Quelle statt fünf auseinanderlaufender Kopien.", "words": ["dependency-lock.json"]}, "site": {"example": "site.json: {\"kind\": \"preview-site\", \"format\": 1, \"home\": \"index.html\"}", "title": "Site", "what": "Die bearbeitbare Vorderseite dieser Instanz: das Projekt site. Ist es live und gültig, antwortet seine Startseite unter / und seine Galerie unter /p/; die eingebauten Seiten übernehmen seine Farben und sein Logo.", "why": "Der Eigentümer ändert die Vorderseite wie jedes Projekt, mit Verlauf und Prüfung — und die eingebauten Seiten bleiben als Rückfall.", "words": ["Site-Projekt", "Vorderseite"]}, "stage_one": {"example": "index.html aus einem Ordner öffnen", "title": "Stufe 1 (lokal)", "what": "Das Projekt läuft, wenn man index.html öffnet: die Daten bleiben im Browser, es geht offline, kein Server ist nötig.", "why": "Jedes Projekt muss zuerst allein laufen; der Server ist eine Möglichkeit, keine Bedingung.", "words": ["Stufe 1"]}, "stage_three": {"example": "dev_pe auf dev-pe.friendly-apps.de", "title": "Stufe 3 (in Gwydion)", "what": "Das Projekt ist ein Mandant von Gwydion; Benutzer, Rollen und Rechte kommen von der Plattform.", "why": "Viele Menschen können es mit Anmeldung, Rechten und Sicherungen der Plattform teilen.", "words": ["Stufe 3"]}, "stage_two": {"example": "python3 server.py", "title": "Stufe 2 (eigenständig)", "what": "Das Projekt kommt mit einem eigenen kleinen Server und einem Anmelde-Plugin, das die Eigentümerin wählt.", "why": "Es läuft auf jedem Rechner ohne die Plattform und hat trotzdem eine echte Anmeldung.", "words": ["Stufe 2"]}, "submission": {"example": "MCP submit_changes oder POST /api/v1/projects/<projekt>/submissions", "title": "Einreichung", "what": "Ein Satz geänderter Dateien (oder ein Patch), den ein Mensch oder eine KI an ein Projekt sendet.", "why": "Jede Änderung geht durch eine Tür: sie wird geprüft, wo die Prüfung an ist begutachtet, und wird eine neue Revision.", "words": ["Einreichungen"]}, "submission_check": {"example": "MCP check_submission", "title": "Einreichungsprüfung", "what": "Die automatische Prüfung eines Dateisatzes gegen den Einreichungsleitfaden: Dokumente, Texte, Binärdateien, Zugriffe nach außen, Glossar.", "why": "Sie sagt, was fehlt oder riskant ist, bevor ein Mensch prüft; sie lernt und blockiert nie."}, "submission_guide": {"example": "/.well-known/gwydion/submission.json", "more": "Der Leitfaden als Daten", "title": "Einreichungsleitfaden", "what": "Die Regeln für Menschen und KIs, die hier ein Projekt bauen: Dateisatz, Plattformregeln, Abgleich und Einreichen.", "why": "Jede KI bekommt dieselben Regeln, auf Englisch als Referenz und auf Deutsch.", "words": ["Plattformregeln"]}, "tag_search": {"example": "tippe „sch“ → area › school (3 Projekte) → Enter → der Chip area › school filtert die Liste", "title": "TagChef-Suche", "what": "Das Suchfeld der Projektübersicht (/p/ und die Projekte der Startseite): Während du tippst, zeigt eine Auswahlliste die passenden TagChef-Tags, gruppiert nach ihrer Wurzel (type, me, school, area, category, dann die anderen) mit der Zahl der Projekte und dem Baumpfad, und die passenden Projekte. Die Liste folgt von selbst eine Sekunde nach deinem letzten Tastendruck. Du kannst mehrere Tags nacheinander wählen: Jeder wird zum Chip und filtert die Liste sofort — irgendein Tag einer Wurzel, jede gewählte Wurzel; ein gewählter Tag trägt ein Häkchen, erneutes Wählen entfernt ihn; ein gewähltes Proj", "why": "Ein Feld findet Tags und Projekte, ohne dass du den Tag-Baum vorher kennen musst.", "words": ["TagChef-Suche", "Suche beim Tippen"]}, "test_login": {"example": "/auth/test?project=dydeng", "title": "Testlogin", "what": "Die Seite /auth/test, auf der du dich mit einem wartenden Anmelde-Plugin anmeldest und es dann aktivierst.", "why": "Der alte Weg bleibt aktiv, bis der neue gezeigt hat, dass er dich kennt.", "words": ["Test-Login"]}, "tree": {"example": "Tag area/education/schools → area › education › schools", "title": "Startseitenbaum", "what": "Tags mit Schrägstrich bilden einen Pfad aus 2–6 Segmenten (area/education/schools). Die Startseite ordnet die Projektkarten danach: ein Selektor in site.json home.tree wählt, wo eine Sicht beginnt (eine Wurzel oder ein Teilpfad), wie sie gezeichnet wird (Überschriften, Liste, Raster, Karten), wie viele Einträge sie zeigt und ob sie blättert; mehrere Selektoren können denselben Baum verschieden zeigen. Ohne Selektoren erscheint jede Wurzel mit mindestens zwei Projekten als Überschriften, der Rest unter „mehr“.", "why": "Eine gegliederte Sicht auf viele Projekte ohne neue Datenstruktur — die Tags, die ohnehin geschrieben werden.", "words": ["Baumpfad", "Baum-Tag", "Tag-Wurzel"]}, "trust_level": {"example": "T1 — das persönliche Token der Eigentümerin", "title": "Vertrauensstufe", "what": "Wie sicher der Server ist, wer eine Änderung gesendet hat: T1 ist ein schlüsselgebundener Kanal wie der API-Schlüssel oder ein persönliches Zugriffstoken.", "why": "Jede angenommene Einreichung hält ihre Vertrauensstufe fest, damit die Prüfung weiß, wie genau sie hinsehen muss."}, "upload_bridge": {"example": "request_upload {\"project\": \"gallery\", \"mode\": \"put\", \"files\": [{\"path\": \"img/a.png\", \"size\": 2400000, \"sha256\": \"…\"}]} → curl -T img/a.png -H \"Authorization: Bearer <token>\" <url>", "title": "Upload-Brücke", "what": "Der Weg, auf dem die Laufzeit eines Werkzeugs Binärdateien ohne Person in ein Projekt bringt: eine Einmal-PUT-Adresse mit Einmal-Token (mit Netz), drei MCP-Werkzeuge, die eine Datei in Stücken tragen (ohne Netz), oder — wo das Projekt es erlaubt — der Server holt eine Download-Adresse, die der Client übergibt (Rechenstufe L6). request_upload nimmt bis zu 100 Dateien auf einmal (files) und antwortet je Datei: ein Ticket, exists (gleiche sha256 schon da) oder ein Fehler mit der Prüfung. Ein ZIP zählt gegen die Archivgrenze, seine Einträge gegen die Grenze je Datei. Dieselben Prüfungen wie bei je", "why": "Ein Agent kann ein Bild selbst ablegen — und nichts Ungeprüftes landet.", "words": ["upload_begin", "request_upload files", "mode fetch", "Datei-Parameter"]}, "vendored_build": {"example": "vendor/codemirror6.js, sha256 aa7b6aa4…", "title": "Eingebundener Fremd-Build", "what": "Fremder Code, den wir selbst aus festgelegten Versionen bauen und unverändert im Repository halten (vendor/), vor der Auslieferung über seine sha256 geprüft. Der CodeMirror-6-Editor ist so einer.", "why": "Nichts wird von einer anderen Seite geladen, und eine veränderte Datei fällt sofort auf.", "words": ["Fremd-Build", "vendor", "vendored build"]}, "virus_scan": {"example": "Ein Upload von foto.png wird in höchstens 20 s geprüft; die Antwort nennt die Signatur, wenn eine gefunden wird.", "title": "Virenprüfung", "what": "Jede Binärdatei (Bild, PDF, Schrift, wasm, Audio), die an diese Site übermittelt wird, geht vor dem Speichern an den Virenscanner (ClamAV). Eine infizierte Datei wird abgelehnt und vermerkt; ein nicht erreichbarer Scanner lehnt das Schreiben ebenfalls ab (fail closed).", "why": "Eine veröffentlichte Seite kann Dateien an viele Menschen weitergeben; eine Prüfung vor dem Speichern hält bekannte Bedrohungen fern.", "words": ["Virenscanner", "Schadsoftware-Prüfung"]}, "vote": {"example": "▲ 3 · tool 1, user 2", "title": "Stimme", "what": "Eine Stimme dafür (oder, für interne Prüfer, dagegen) zu einem Projekt, einem Funktionswunsch oder einem Entwicklungseintrag, mit der eigenen Identität abgegeben und vom Core verwahrt; die Zählung zeigt die Summe und die Arten der Stimmenden (Personen, Werkzeuge, Agenten, die Öffentlichkeit).", "why": "Die Reihenfolge der nächsten Schritte folgt dem, was Menschen und Werkzeuge brauchen — Abhängigkeiten gehen trotzdem vor.", "words": ["upvote"]}, "waiting_for_limit": {"example": "ein neues Projekt mit 120 Dateien bei einem Limit von 100", "title": "Wartet auf Limit", "what": "Der Zustand eines neuen Projekts, dessen erste Dateien über einem Limit liegen: die Dateien bleiben erhalten, eine Limit-Anfrage ist offen, und nichts wird ausgeliefert, bis sie genehmigt ist oder die Dateien passen.", "why": "Ein neues Projekt über einem Limit geht nicht verloren, und nichts über einem Limit geht ohne das Ja eines Menschen hinaus.", "words": ["wartendes Projekt"]}, "wasm_right": {"example": "Der Eigentümer gewährt user/alice das Recht wasm am Projekt; ihre sqlite3.wasm wird angenommen und die Seiten dürfen sie ausführen.", "title": "Recht, wasm zu liefern", "what": "Das Projektrecht wasm: Nur wer es hält, darf .wasm-Dateien übermitteln, und nur ein Projekt, das es hält, liefert seine Seiten mit der Browser-Erlaubnis aus, WebAssembly auszuführen ('wasm-unsafe-eval').", "why": "WebAssembly führt Code im Browser der Besucherin aus; der Eigentümer entscheidet, wer ihn mitbringen darf.", "words": ["wasm", "WebAssembly-Recht"]}}, "en": {"access_request": {"example": "user/alice asks for open on chatgpt-local; the owner approves", "title": "Access request", "what": "A request to the managers of a project for the right to open or to change it, made by a signed-in person who sees the project but lacks the right.", "why": "A 403 is not a dead end: a person decides who gets in, and the decision is written down.", "words": ["access requests", "request access"]}, "access_token": {"example": "Authorization: Bearer gwp_…", "title": "Personal access token", "what": "A secret that lets a program or an AI act as you, with at most your rights and an expiry.", "why": "Only its hash is stored; you can revoke it without changing your password.", "words": ["access token"]}, "auth_plugin": {"example": "keycloak (pending)", "title": "Auth plugin", "what": "The way people sign in to this server or one project: host login, basic auth, Keycloak, or a bundle of them.", "why": "A new auth plugin stays pending until someone passes its test login, so nobody locks themselves out.", "words": ["auth plugins", "pending auth plugin"]}, "base_revision": {"example": "submit with base 20; a new project starts with base 0", "title": "Base revision", "what": "The revision a submission was built on.", "why": "If the project moved on in the meantime, the server refuses the submission as outdated instead of overwriting newer work."}, "bundle_library": {"example": "explain/explain.js 1.0.1 in the project instead of /_gwydion/explain.js", "title": "Bundle a library", "what": "Put a copy of a platform library (explain.js, consent.js) into the project instead of loading the served copy /_gwydion/<library>.js. Needs the right bundle-library.", "why": "A bundled copy works offline and in stage 1, but it does not get the platform's updates.", "words": ["bundle-library", "bundled copy", "bundling"]}, "conflict": {"example": "you saved from revision 7, someone else saved revision 8", "title": "Conflict", "what": "Two changes to the same file from the same starting point: yours and one saved before yours. ProFs shows the difference and keeps your text so you can apply it again.", "why": "Nobody overwrites someone else's change without seeing it.", "words": ["conflicts", "outdated base"]}, "consent": {"example": "Allow tile.openstreetmap.org for map-tiles?", "more": "Privacy", "title": "Consent", "what": "Your permission before a page uses information from another site: this time, always for this project, or no.", "why": "Nothing from outside reaches you without asking; an \"always\" can be revoked."}, "csrf_token": {"example": "You open /review/, the page gives your browser a session and the token; a form sent from elsewhere is refused with 403.", "title": "Form token", "what": "A secret value every writing form of this site carries, bound to your browser session (the cookie gwydion_csrf). The server accepts a form only with the token of your session and only from a page of this site.", "why": "Another site cannot make your browser send a form here in your name (cross-site request forgery): it does not know your token.", "words": ["CSRF token", "form token"]}, "decision_id": {"example": "1015b-Q12", "title": "Decision id", "what": "The id of a question and its answer in the form <session>-Q<n>, written into DECISIONS.md.", "why": "Anyone can later find out why something is the way it is, and nobody asks the same question twice.", "words": ["decision ids", "question id"]}, "display_name": {"example": "display name “School finder”, id school-finder-k3x9qa", "title": "Display name", "what": "The name of a project as people see it: the name typed at submission, changed later by a holder of write (Rename). The id in the address never changes; every rename is a journal entry. A tenant may let the presentation.json title win instead (setting display_name_source).", "why": "People recognise a name; addresses and links need an id that never moves.", "words": ["project name", "rename"]}, "draft": {"example": "published, draft waiting", "title": "Draft", "what": "A new version that is stored but not live yet.", "why": "Changes from an AI or a person land as a draft first, so nobody sees them before a review.", "words": ["drafts"]}, "editor_plugin": {"example": "GwydionEditors.register(\"codemirror6\", …)", "title": "Editor plugin", "what": "An exchangeable editor for the files page behind a small interface (mount, getValue, setValue, destroy). The own text area is the default and the fallback; another editor such as CodeMirror 6 can be switched on per browser.", "why": "A stronger editor can be added without making the page depend on third-party code.", "words": ["editor plugins", "editor"]}, "explain_mode": {"example": "the (i) in the page header", "title": "Explain mode", "what": "The (i) switch: when it is on, dotted words explain themselves on hover, focus or tap.", "why": "You learn the words of the platform where you meet them; the switch remembers its state in this browser only.", "words": ["(i) switch"]}, "fallback_page": {"example": "/ shows \"Under construction\" until the site is live and open to you", "title": "Built-in page (fallback)", "what": "The page publish brings itself: the start page, the list of publications, review, files, limits and login. It answers whenever the site is missing, invalid or closed to the visitor.", "why": "A broken site never locks anyone out: the built-in pages always work.", "words": ["built-in page", "built-in pages", "fallback"]}, "fetch_request": {"example": "a fetch from files.example.org is refused; the owner allows files.example.org on /fetch-requests/demo", "title": "Host request", "what": "A request to the managers of a project to put a host on its fetch list, made by a fetch that was refused because its host was not on the list.", "why": "A refused download is not a dead end: a person decides which outside hosts the server may load from, and the decision is written down.", "words": ["host requests", "host request"]}, "file_bundle": {"example": "index.html + app.js + style.css", "title": "Bundle", "what": "A publication made of files (index.html, scripts, styles, checked binaries) instead of one Markdown text.", "why": "Apps run as a bundle; their own scripts run, but nothing loads from other sites that the project did not declare.", "words": ["bundles", "file bundle"]}, "file_history": {"example": "index.html: revisions 1, 4, 9", "title": "File history", "what": "The revisions in which one file was added, changed or removed — when, by whom, with which message. From there: show, compare, restore.", "why": "You see how a file came to be and can go back.", "words": ["history"]}, "file_param": {"example": "import_zip {\"project\": \"oat-lagerverwaltung\", \"base\": 12, \"folder\": \"app\", \"file\": {\"download_url\": \"https://…\", \"file_id\": \"file_…\"}} → one result per file", "title": "File param", "what": "A tool input that ChatGPT fills with a file of the chat: {download_url, file_id, mime_type?, file_name?} (the tool declares it with _meta openai/fileParams). publish fetches the download address during the call with every check of a fetch — https, only a host on the project's fetch list, a public address, at most the archive or single-file limit — and then imports or stores the file like every upload. Computing level L6; the address is never stored or shown, a host not on the list is named in the refusal.", "why": "A ZIP the AI made in its chat reaches the project without a browser upload — and still passes every check.", "words": ["file params", "openai/fileParams"]}, "file_store_limits": {"example": "max_files 170, max_file_bytes 7 000 000, max_bundle_bytes 10 000 000, max_binary_project_bytes 20 000 000; allowed types such as js, mjs and cjs (CommonJS, since 0.9.23)", "title": "File store limits", "what": "The limit group of publish: files per project, bytes per file, bundle size, binary sizes, allowed file types; memory and runtime declared for later.", "why": "They keep the shared file store fair and the pages fast.", "words": ["file-store-limits"]}, "finding": {"example": "submission.explain.script-missing (low)", "title": "Finding", "what": "One result of the submission check: rule, file, severity, message and a fix hint.", "why": "Findings are advice in learning mode; high ones deserve a look before you publish.", "words": ["findings"]}, "help_entry": {"example": "help/rights.json", "title": "Help entry", "what": "Step-by-step help for one part and version in help/<part>.json: goal, steps, test, known errors.", "why": "When the part changes, its help entry is marked needs-update instead of silently going stale.", "words": ["help entries", "help-entry"]}, "hidden_file": {"example": "app/.htaccess is in list_files; GET /p/<project>/app/.htaccess answers 404", "title": "Hidden file", "what": "A file whose name starts with a dot. A project may hold only these: .htaccess, .gitignore, .gitattributes, .editorconfig, .env.example. They are stored, listed, read and exported like every file, but never served to a browser (the live page, the site and the preview answer 404). .env and every other hidden file are refused; the secret check refuses any file with a recognisable key or password.", "why": "A PHP or Git project keeps its server rules and settings — without showing them to visitors or storing secrets.", "words": [".htaccess", "dotfile"]}, "limit_group": {"example": "file-store-limits with max_files 170 and max_bundle_bytes 10 000 000 (the platform values since publish 0.9.23)", "title": "Limit group", "what": "A named set of variable limits (for example files, bytes, file types) at a scope: platform, tenant or project. Lower scopes may only be stricter.", "why": "One place says what a project may hold, and where each value comes from.", "words": ["limit groups"]}, "limit_request": {"example": "max_files 60 → 65 for chatgpt-local", "title": "Limit request", "what": "A request to raise one limit for one project, made by a submission over the limit or asked directly. A holder of manage on the project approves or denies it.", "why": "A project can grow without a code change, and a person decides each raise.", "words": ["limit requests"]}, "limit_rule": {"example": "count(files) <= {file-store-limits.max_files}", "title": "Limit rule", "what": "A check over the values of a submission and the limits of a group; on a breach it refuses, asks for a limit request or only informs.", "why": "Rules make the limits act; their expressions are parsed, never run as code.", "words": ["limit rules"]}, "line_merge": {"example": "<<<<<<< current … ======= … >>>>>>> yours", "title": "Line merge", "what": "Your text and the other person's changes put together line by line, from the revision you both started from. Where both changed the same lines, a marked block shows both versions.", "why": "Two people can change one file without one of them losing work; you check the proposal before it is saved.", "words": ["merge proposal"]}, "logbook": {"example": "2026-10-19 · the Pi's look · publish 0.9.1 · installer 0.66.29 · changes (3)", "title": "Logbook", "what": "The list of the platform's visible steps — which units changed, to which version, and what changed in each (added, changed, fixed …). The installer writes it after every push and live; only signed-in persons see it.", "why": "You see at a glance what changed lately and in which version, without reading commits.", "words": ["logbook"]}, "login_state": {"example": "PE at the right end of the strip", "title": "Login state", "what": "The part of the on-air light that shows whether you are signed in — with your initials — or signed out.", "why": "You know with which account you look at the page before you change it.", "words": ["signed in"]}, "mark_terms": {"example": "With mark-terms the word revision in a published article gets the dotted underline; without it nothing changes.", "title": "Marked platform words", "what": "The project right mark-terms: the platform words (project, revision, …) in the project's published Markdown pages are marked for explain mode. Without it the text stays plain and the (i) switch says the page has nothing to explain.", "why": "The author decides whether the platform may touch her text.", "words": ["mark-terms"]}, "on_air": {"example": "the red bar on a public project page", "title": "On-air light", "what": "A thin red or amber light with a badge at the top of a page — shown only to the superadmin and holders of rights: red \"ON AIR · public\" when everyone sees the page, amber \"signed-in\" when only signed-in persons do; nothing when it is private.", "why": "You see at once whether a page is public before you change it.", "words": ["ON AIR"]}, "optional-login": {"example": "Sign in on dev-pe.friendly-apps.de, come back to / and see “Your projects”.", "title": "Optional login", "what": "On the start page you may sign in, but you do not have to. Signed in, the page shows your own projects; without, you see what is public.", "why": "Visitors stay welcome without an account, and the owner still finds her work at once.", "words": ["sign in"]}, "own_fonts": {"example": "theme fonts: [{\"family\": \"Atkinson Hyperlegible\", \"file\": \"fonts/atkinson-hyperlegible.woff2\"}]", "title": "Own fonts", "what": "Font files (woff2 only, at most 4, each ≤ 300 KB, with a licence text fonts/LICENSE-<name>.txt) in the site project, named in the theme as {family, file}. The built-in pages use them only when the setting site.own_fonts is on (platform, tenant or settings.own_fonts in site.json) and the right site-fonts is held; a font that breaks a rule is a learning finding and is not served until it fits; otherwise the fixed list of system fonts holds. They are served only from this site (font-src 'self').", "why": "A site may carry its own face without loading anything from another server.", "words": ["own font files", "site-fonts", "site.own_fonts"]}, "page_lock": {"example": "the closed lock on a page for signed-in persons", "title": "Page lock", "what": "The lock in the on-air light: closed when the page is restricted (only signed-in persons or only you and the holders of rights see it), open when everyone sees it.", "why": "You see at a glance whether the page is open to the public.", "words": ["lock"]}, "part_description": {"example": "parts/renderer.json", "title": "Part description", "what": "The self-description of one part of a project in parts/<part>.json: use cases, needs, interfaces, data and GDPR notes.", "why": "People and AIs understand a part without reading its code, and the catalogue can offer its API.", "words": ["part descriptions", "part-description"]}, "persona_catalogue": {"example": "/_gwydion/personas/index.json → 9 packs", "title": "Persona catalogue", "what": "The list of curated persona packs this site offers to the Persona Store: /_gwydion/personas/index.json names each pack with its licence, source and number of personas.", "why": "You can pick ready roles from known sources and always see where they come from and under which licence.", "words": ["persona catalogue", "catalogue of personas"]}, "persona_pack": {"example": "fabric-patterns.json (MIT)", "title": "Persona pack", "what": "One file of the persona catalogue with 15 to 40 roles from one source, rewritten as chat roles, reviewed for prompt injection, each with its origin (file, link, changes). Changed only by a reviewed import, never synced automatically.", "why": "A pack keeps one source and one licence together, so its attribution travels with it.", "words": ["persona packs", "pack"]}, "personal_settings": {"example": "editor: CodeMirror 6", "title": "Personal settings", "what": "Choices kept for your account on the server, such as your editor on the files page. Without signing in, the choice stays in your browser.", "why": "Your choice follows you to every device you sign in on.", "words": ["personal setting"]}, "presentation": {"example": "presentation.json: {\"kind\": \"presentation\", \"format\": 1, \"title\": \"Link store\"}", "title": "Presentation (project card)", "what": "How a project presents itself in the gallery: presentation.json with title, short text, icon, screenshot, tags and links, edited by its owner.", "why": "Each owner decides how the project appears; visitors see only what their rights allow.", "words": ["presentation.json", "project card", "card"]}, "preview": {"example": "/p/chatgpt-local/", "title": "Preview", "what": "The running version of a project you can open in the browser at /p/<project>/.", "why": "You try the result before you decide; the page runs with a strict security policy and loads nothing from other sites unless the project declares it.", "words": ["previews", "preview project"]}, "profs": {"example": "/files/chatgpt-local", "title": "ProFs", "what": "ProFs — Professional Filestore: the files of a project as a file store — tree, previews, a light editor, upload, history, difference and restore. Every change is a new revision.", "why": "Projects are changed by people and AIs alike; one store with history means nothing is lost and every change can be traced.", "words": ["Professional Filestore", "file store"]}, "project": {"example": "chatgpt-local, dydeng", "title": "Project", "what": "A set of files (an app or a page) that people and AIs build together on this server, with a history of revisions.", "why": "Everything here belongs to one project: its rights, its reviews, its preview and its documentation.", "words": ["projects"]}, "project-id": {"example": "name “my-app”, id my-app-k3x9qa", "title": "Project id", "what": "The short name in the address of a project (/p/<id>/). When the name you wanted was taken or hidden, it gets a random suffix; the name you typed stays the display name.", "why": "An id that is unique and reveals no hidden project, next to the name people recognise.", "words": ["id"]}, "project_access": {"example": "https://tile.openstreetmap.org GET for map-tiles", "title": "project-access", "what": "The file project-access.json of a project: which outside sites its pages may use from the browser, with methods and purpose.", "why": "By default nothing leaves the page; only declared origins enter its security policy, and the person is asked first.", "words": ["project-access.json"]}, "project_type": {"example": "type/game", "title": "Project type", "what": "The kind of a publication as a TagChef tag type/<kind> in presentation.json (webapp, site, module, document, demo, game, tool, dataset, theme, agent); without the tag the list derives one from the files and marks it (derived).", "why": "Filter the publications by what they are.", "words": ["type/"]}, "prol": {"example": "the rule max-files reads {file-store-limits.max_files} = 60", "title": "ProL (Professional Limiter)", "what": "The limiter of the platform: limits are data — groups of variable limits and rules over them — instead of numbers in the code.", "why": "Limits can be seen, explained and raised per project by a decision instead of a code change.", "words": ["Professional Limiter", "limiter"]}, "publication": {"example": "a Markdown page under /p/<name>", "title": "Publication", "what": "A page or file bundle that went live after review.", "why": "Only the live version is shown to others; a draft waits until someone with the manage right publishes it.", "words": ["publications", "published pages", "published"]}, "quarantined_file": {"example": "data/app.sqlite is in list_files and in the ZIP download for holders of write; GET /p/<project>/data/app.sqlite answers 404", "title": "Quarantined file", "what": "A file the project keeps byte for byte but never shows, serves, unpacks or opens: archive originals (.zip, .tar, .tar.gz, .tgz, .gz) and SQLite databases (.sqlite, .sqlite3, .db). It is checked by its first bytes, scanned and counted against the binary limits.", "why": "Backups and databases stay with the project without becoming part of the public site.", "words": ["quarantined file", "kept original"]}, "removed_file": {"example": "old.css removed in revision 12, restored from revision 11", "title": "Removed file", "what": "A deleted file: it is missing from the new revision, but every older revision keeps it, so it can be restored.", "why": "Deleting is safe — nothing is destroyed.", "words": ["removed in a revision", "deleted file"]}, "restore": {"example": "restore index.html from revision 3", "title": "Restore", "what": "Bring a file back as it was in an older revision. It becomes a new revision; the revisions in between stay.", "why": "Mistakes and deletions can be undone without losing anything.", "words": ["restores", "restored"]}, "review": {"example": "the buttons publish, reject, unpublish", "title": "Review", "what": "A person with the manage right looks at a draft and publishes, rejects or unpublishes it — since 0.9.0 on by default for every new project and the instance owner's projects (the review cascade).", "why": "Nothing an AI wrote goes public without a human decision where review is on.", "words": ["reviews", "reviewed"]}, "review_cascade": {"example": "PUT /api/v1/publish/projects/<project>/review {\"review\": \"off\"}", "title": "Review cascade", "what": "Whether a submission waits for review is decided project → owner → site → platform: the project's own setting, else its owner's personal setting (on by default for the instance owner), else the site (tenant), else the platform. Every new project starts with review on.", "why": "The owner's key never publishes past the owner's eyes; each project can still choose.", "words": ["review on"]}, "revision": {"example": "revision 20 of chatgpt-local", "title": "Revision", "what": "A numbered state of a project; every accepted submission makes a new one.", "why": "A revision tells exactly which state you look at, and lets an AI ask for the changes since then.", "words": ["revisions"]}, "share_alike": {"example": "maastricht-prompts.json: share_alike true", "title": "Share-alike", "what": "A licence condition (CC BY-SA): whoever changes the work and passes it on must use the same licence. The Maastricht pack is such a pack; changed roles from it stay CC BY-SA 4.0.", "why": "It tells you whether your own changes to a persona may be published under another licence.", "words": ["share alike", "CC BY-SA"]}, "shared_include": {"example": "/_gwydion/includes/treegrid-r12/master/core.js", "title": "Shared include", "what": "A pinned copy of one of our modules (ui-kit, explain, treegrid, data-representations, ai, module-profile) served at /_gwydion/includes/<name>-<version>/ — immutable and with Subresource Integrity; a project pins it in dependency-lock.json instead of pasting a copy.", "why": "One source instead of five diverging copies.", "words": ["dependency-lock.json"]}, "site": {"example": "site.json: {\"kind\": \"preview-site\", \"format\": 1, \"home\": \"index.html\"}", "title": "Site", "what": "The editable front of this instance: the project site. When it is live and valid, its home page answers at / and its gallery at /p/; the built-in pages take its colours and logo.", "why": "The owner changes the front like any project, with history and review — and the built-in pages stay as the fallback.", "words": ["site project", "front of the site"]}, "stage_one": {"example": "open index.html from a folder", "title": "Stage 1 (local)", "what": "The project runs by opening index.html: data stays in the browser, it works offline, no server is required.", "why": "Every project must work alone first; the server is an option, not a condition.", "words": ["stage 1"]}, "stage_three": {"example": "dev_pe on dev-pe.friendly-apps.de", "title": "Stage 3 (in Gwydion)", "what": "The project is a tenant of Gwydion; users, roles and rights come from the platform.", "why": "Many people can share it with the platform's login, rights and backups.", "words": ["stage 3"]}, "stage_two": {"example": "python3 server.py", "title": "Stage 2 (standalone)", "what": "The project ships with its own small server and one auth plugin the owner chooses.", "why": "It can run on any host without the platform, yet keeps a real login.", "words": ["stage 2"]}, "submission": {"example": "MCP submit_changes or POST /api/v1/projects/<project>/submissions", "title": "Submission", "what": "A set of changed files (or a patch) that a person or an AI sends to a project.", "why": "Every change goes through one door: it is checked, reviewed where review is on, and becomes a new revision.", "words": ["submissions"]}, "submission_check": {"example": "MCP check_submission", "title": "Submission check", "what": "The automatic check of a file set against the submission guide: documents, texts, binaries, outside access, glossary.", "why": "It tells what is missing or risky before a person reviews; it is learning and never blocks."}, "submission_guide": {"example": "/.well-known/gwydion/submission.json", "more": "The guide as data", "title": "Submission guide", "what": "The rules for people and AIs that build a project here: the file set, the platform rules, sync and submit.", "why": "Every AI gets the same rules, in English as the reference and in German.", "words": ["platform rules"]}, "tag_search": {"example": "type “sch” → area › school (3 projects) → Enter → the chip area › school filters the list", "title": "TagChef search", "what": "The search field of the project overview (/p/ and the start page's projects): while you type, a drop-down shows the matching TagChef tags, grouped by their root (type, me, school, area, category, then the others) with the number of projects and the tree path, and the matching projects. The list follows by itself one second after your last keystroke. You may choose several tags one after the other: each becomes a chip and filters the list at once — any tag of one root, every root chosen; a chosen tag shows a check mark, choosing it again removes it; a chosen project opens; your words match ever", "why": "One field finds both the tags and the projects, without knowing the tag tree first.", "words": ["TagChef search", "type-ahead search"]}, "test_login": {"example": "/auth/test?project=dydeng", "title": "Test login", "what": "The page /auth/test where you sign in with a pending auth plugin and then activate it.", "why": "The old way stays active until the new one has proven that it knows you."}, "tree": {"example": "tag area/education/schools → area › education › schools", "title": "Start page tree", "what": "Tags with a slash form a path of 2–6 segments (area/education/schools). The start page groups the project cards by them: a selector in site.json home.tree chooses where a view starts (a root or a sub-path), how it is drawn (headings, list, grid, cards), how many items it shows and whether it pages; several selectors may show the same tree differently. Without selectors every root with at least two projects appears as headings, the rest under “more”.", "why": "One structured view of many projects without a new data structure — the tags people write anyway.", "words": ["tree path", "tree tag", "tag root"]}, "trust_level": {"example": "T1 — the owner's personal token", "title": "Trust level", "what": "How sure the server is about who sent a change: T1 is a key-bound channel such as the API key or a personal access token.", "why": "Each accepted submission records its trust level, so a review knows how much to check."}, "upload_bridge": {"example": "request_upload {\"project\": \"gallery\", \"mode\": \"put\", \"files\": [{\"path\": \"img/a.png\", \"size\": 2400000, \"sha256\": \"…\"}]} → curl -T img/a.png -H \"Authorization: Bearer <token>\" <url>", "title": "Upload bridge", "what": "The way a tool's runtime brings binary files into a project without a person: a one-time PUT address with a one-time token (for runtimes with network), three MCP tools that carry a file in chunks (without network), or — where the project allows it — the server fetches a download URL the client hands over (computing level L6). request_upload takes up to 100 files at once (files) and answers per file: a ticket, exists (same sha256 already there) or an error naming the check. A ZIP counts against the archive limit; its entries against the per-file limit. The same checks as every write.", "why": "An agent can store an image itself — and nothing unchecked lands.", "words": ["upload_begin", "request_upload files", "mode fetch", "file params"]}, "vendored_build": {"example": "vendor/codemirror6.js, sha256 aa7b6aa4…", "title": "Vendored build", "what": "Third-party code we build ourselves from pinned versions and keep verbatim in the repository (vendor/), checked by its sha256 before it is served. The CodeMirror 6 editor is one.", "why": "Nothing is loaded from another site, and a changed file is noticed at once.", "words": ["vendored", "vendor bundle"]}, "virus_scan": {"example": "An upload of photo.png is scanned in 20 s or less; the answer names the signature when one is found.", "title": "Virus scan", "what": "Every binary file (image, PDF, font, wasm, audio) submitted to this site is streamed to the virus scanner (ClamAV) before it is kept. An infected file is refused and noted; a scanner that cannot be reached refuses the write too (fail closed).", "why": "A published page may hand files to many people; a scan before storing keeps a known threat out.", "words": ["virus scanner", "malware scan"]}, "vote": {"example": "▲ 3 · tool 1, user 2", "title": "Vote", "what": "An upvote (or, for internal reviewers, a downvote) on a project, a feature request or a development item, cast with your own identity and kept by the core; the tally shows the sum and the kinds of voters (persons, tools, agents, the public).", "why": "The order of the next steps follows what people and tools need — dependencies still win.", "words": ["upvote"]}, "waiting_for_limit": {"example": "a new project with 120 files where 100 is the limit", "title": "Waiting for limit", "what": "The state of a new project whose first files are over a limit: the files are kept, a limit request is open, and nothing is served until it is approved or the files fit.", "why": "A new project over a limit is not lost, and nothing over a limit goes out without a person's yes.", "words": ["waiting project"]}, "wasm_right": {"example": "The owner grants wasm to user/alice on the project; her sqlite3.wasm is accepted and the pages may run it.", "title": "Right to ship wasm", "what": "The project right wasm: only a holder may submit .wasm files, and only a project that holds it serves its pages with the browser permission to run WebAssembly ('wasm-unsafe-eval').", "why": "WebAssembly runs code in the visitor's browser; the owner decides who may bring it.", "words": ["wasm", "WebAssembly right"]}}}, "ui": {"de": {"close": "Schließen", "example": "Beispiel", "more": "Mehr", "none": "Erklärmodus an: Diese Seite hat keine Wörter zu erklären.", "off": "Erklärmodus aus.", "on": "Erklärmodus an: gepunktete Wörter erklären sich (zeigen, fokussieren oder tippen).", "only_now": "Nur jetzt", "remember": "Darf ich mir diese Wahl in diesem Browser merken?", "see": "Siehe auch", "toggle": "Erklärmodus", "why": "Warum", "yes": "Ja"}}, "version": "0.9.37"}
