Gemeinsame Nachrichten: mit den Galerie-Tools zusammenarbeiten
Damit viele Tools zusammenpassen, ohne dass jedes jedes andere kennen muss, sprechen die Galerie-Tools eine gemeinsame Sprache. Deine eigenen Tools können sie ebenfalls sprechen.
Statt jedes Tool mit jedem zu verdrahten, gibt es sechs Nachrichtenarten. Jedes Tool spricht nur die Arten, die zu ihm passen. Ein paar Tools sammeln, was andere melden: Das sind die Sammelstellen. Andere lassen sich fertig eingestellt öffnen. So kann jedes Tool mit vielen anderen zusammenarbeiten, ohne mehr als zwei oder drei Namen zu kennen.
Technisch ist das nichts Neues: Alles läuft über ARTEFAKT.senden, eingang und oeffnen, wie auf der Seite „Tools verknüpfen“ beschrieben. Neu ist nur die Absprache, wie eine Nachricht aussieht.
Die fünf Sammelstellen
| Sammelstelle | Frage, die sie beantwortet | versteht |
|---|---|---|
| Gewohnheits-Kette | Was habe ich getan? | erledigt |
| Belohnungstafel | Was hat das Kind geschafft? | erledigt |
| Einkaufsliste | Was brauche ich? | einkauf |
| Haushaltsbuch | Was kostet es? | betrag |
| Tagesabschluss | Was ist heute passiert? | notiz |
Auf Englisch heißen sie Habit chain, Reward chart, Shopping list, Budget book und Evening review. Der Name ist die Adresse: Die deutsche Fassung eines Tools sendet an die deutschen Namen.
Die gemeinsame Hülle
Jede Nachricht hat dieselben vier Felder. Das Feld text macht sie auch für Tools verständlich, die die Art nicht kennen: Sie können einfach den Text anzeigen. Wer gesendet hat und wann, ergänzt die Toolbox selbst (von und zeit im Eingang).
{
typ: 'erledigt', // eine der sechs Arten
v: 1, // Version der Art
id: 'lq2x9k-4f7a', // eindeutig, gegen Doppelte (höchstens 64 Zeichen)
text: 'Atemübung, 5 Minuten', // immer lesbar (höchstens 500 Zeichen)
/* … Felder der Art … */
}Die Feldnamen sind in jeder Sprache gleich. Nur Inhalte wie text, was oder artikel sind in der Sprache des Tools.
Die sechs Arten
| Art | Bedeutung | Felder (neben der Hülle) |
|---|---|---|
| einkauf | „Das brauche ich“ oder „Das habe ich gekauft“ | artikel: Liste von Texten (Pflicht, je höchstens 120 Zeichen); aktion: 'brauche' oder 'gekauft'; anlass; posten: [{ name, menge, einheit }] für Tools, die rechnen |
| erledigt | „Das habe ich getan“ | was (Pflicht, höchstens 80 Zeichen); menge; einheit (z. B. 'min'); datum als JJJJ-MM-TT; wer (für die Belohnungstafel) |
| betrag | „Das kostet es“ | betrag als Zahl (Pflicht); waehrung (z. B. 'EUR'); art: 'ausgabe', 'fix' (monatlich) oder 'plan'; topf; datum |
| notiz | „Das ist passiert“ | text (Pflicht); datum |
| personen | „Diese Leute sind dabei“ | gruppen: [{ name, namen: [ … ] }] |
| start | „Mach dich so bereit“ | einstellung: Ausschnitt aus dem Block ANPASSEN des Empfängers; danach ARTEFAKT.oeffnen(ziel) |
{ typ: 'einkauf', v: 1, id, text: 'Lasagne: 500 g Hackfleisch, 2 Dosen Tomaten',
aktion: 'brauche', anlass: 'Lasagne',
artikel: ['500 g Hackfleisch', '2 Dosen Tomaten'],
posten: [{ name: 'Hackfleisch', menge: 500, einheit: 'g' }, { name: 'Tomaten', menge: 2, einheit: 'Dose' }] }
{ typ: 'erledigt', v: 1, id, text: 'Üben, 20 Minuten', was: 'Üben', menge: 20, einheit: 'min', datum: '2026-10-04', wer: 'Mia' }
{ typ: 'betrag', v: 1, id, text: 'Einkauf, 23,40 €', betrag: 23.40, waehrung: 'EUR', art: 'ausgabe', topf: 'Lebensmittel', datum: '2026-10-04' }
{ typ: 'notiz', v: 1, id, text: 'Entscheidung: Wohnung B (4,2 zu 3,8 Punkte)', datum: '2026-10-04' }
{ typ: 'personen', v: 1, id, text: 'Heute da: Mia, Tom, Ali', gruppen: [{ name: 'Heute', namen: ['Mia', 'Tom', 'Ali'] }] }
{ typ: 'start', v: 1, id, text: 'Metronom: 92 BPM, 3/4', einstellung: { tempo: 92, takt: '3/4' } }
// danach: ARTEFAKT.oeffnen('Metronom')Fernsteuern mit „start“
Mit „start“ stellt ein Tool ein anderes für einen Lauf ein, zum Beispiel öffnet das Liederbuch das Metronom mit 72 Schlägen pro Minute. Der Empfänger übernimmt nur die Einstellungen, die er in KONFIG.vonAussen freigegeben hat, nur mit dem passenden Datentyp und nur für diesen Lauf. Deine gespeicherten Einstellungen bleiben unverändert, und ein Banner zeigt, wer was eingestellt hat, mit einem Knopf zum Zurücksetzen.
Zehn Regeln
Jedes Tool läuft allein
Verknüpfung ist ein Zusatz. Ohne window.ARTEFAKT verschwinden nur die Sende-Knöpfe.
Senden nur nach einer Handlung
Ein Knopf oder das Ende einer Übung löst das Senden aus. Nichts wird heimlich verschickt.
Empfangen löst nie Senden aus
So kann keine Schleife zwischen zwei Tools entstehen.
Abholen beim Start und beim Zurückkehren
ARTEFAKT.eingang() beim Start und bei visibilitychange aufrufen, damit nichts liegen bleibt.
Streng prüfen
Nur bekannte typ, nur v bis zur eigenen Version, Felder auf Art und Länge prüfen, alles andere ignorieren. Anzeige nur mit textContent.
Keine Doppelten
Der Empfänger merkt sich die letzten 200 id.
Ziele sind einstellbar
Ziel-Namen stehen im Block ANPASSEN, zum Beispiel KONFIG.ziele = { erledigt: 'Gewohnheits-Kette' }.
Herkunft sichtbar, Übernahme umkehrbar
Jeder übernommene Eintrag zeigt „von …“ und lässt sich zurücknehmen.
Bündeln
Eine Handlung ist eine Nachricht, zum Beispiel alle Zutaten zusammen. Der Eingang fasst höchstens 100 Einträge.
Inseln sind erlaubt
Nicht jedes Tool muss verknüpft sein. Eine Notfall-Karte zum Beispiel sendet und empfängt nichts.
Empfangen: so prüfst du streng
const VERSTEHT = 'erledigt';
const text = (v, max) => typeof v === 'string' && v.length <= max;
const zahl = v => v == null || (typeof v === 'number' && Number.isFinite(v));
const tag = v => v == null || (typeof v === 'string' && /^\d{4}-\d{2}-\d{2}$/.test(v));
function gueltig(n) {
if (!n || typeof n !== 'object' || n.typ !== VERSTEHT) return false; // nur unsere Art
if (n.v != null && n.v > 1) return false; // neuere Version: lieber nicht
if (n.text != null && !text(n.text, 500)) return false;
return text(n.was, 80) && n.was.trim() !== '' && zahl(n.menge) && tag(n.datum);
}
function abholen() {
if (!window.ARTEFAKT || typeof ARTEFAKT.eingang !== 'function') return;
let liste = [];
try { liste = ARTEFAKT.eingang(); } catch { return; }
const gesehen = lesen('ids', []);
for (const e of liste) {
const n = e && e.daten;
if (!gueltig(n)) continue; // Unbekanntes ignorieren
if (n.id) { if (gesehen.includes(n.id)) continue; gesehen.push(n.id); }
eintragen({ was: n.was, menge: n.menge, datum: n.datum, von: String(e.von || '?') });
}
schreiben('ids', gesehen.slice(-200));
zeichnen(); // Anzeige mit textContent
}
abholen();
document.addEventListener('visibilitychange', () => { if (document.visibilityState === 'visible') abholen(); });Prompt: eigenes Tool, das mitspielt
Erstelle mir ein Tool als EINE einzige HTML-Datei für die Artefakt Toolbox: [Ziel in einem Satz].
Zusammenspiel nach dem gemeinsamen Nachrichtenformat der Artefakt-Galerie:
- Hülle jeder Nachricht: { typ, v: 1, id (eindeutig, höchstens 64 Zeichen), text (lesbar, höchstens 500 Zeichen), … }.
- Das Tool SENDET nach einem Tipp auf [Knopf] eine Nachricht der Art [z. B. 'erledigt' mit was, menge, einheit, datum als JJJJ-MM-TT] mit ARTEFAKT.senden(ziel, nachricht). Der Ziel-Name steht einstellbar im Block ANPASSEN: KONFIG.ziele = { [art]: '[z. B. Gewohnheits-Kette]' }; leer = aus.
- Das Tool VERSTEHT [Art oder „nichts“]: Es holt beim Start und bei visibilitychange mit ARTEFAKT.eingang() ab, übernimmt nur diese Art mit v höchstens 1, prüft alle Felder auf Art und Länge, ignoriert alles andere, merkt sich die letzten 200 id gegen Doppelte, zeigt die Herkunft („von …“) und bietet „Rückgängig“ an.
- Empfangen löst nie ein Senden aus. Alles Zusammenspiel läuft über EIN Objekt im Code (prüfen, senden, abholen, öffnen), damit es sich später leicht austauschen lässt.
- Prüfe vor jedem Gebrauch, ob window.ARTEFAKT und die Funktion vorhanden sind. Ohne Toolbox läuft das Tool vollständig, nur ohne Sende-Knöpfe.
- Fremde Texte nur mit textContent anzeigen, nie mit innerHTML.
Technik: eine einzige HTML-Datei, keine externen Dateien, localStorage mit try/catch, funktioniert offline, mobil zuerst, dunkles Design, Tippflächen mindestens 48 px, Deutsch. Gib die komplette Datei in einem Block aus.Siehe auch: Tools verknüpfen · Bauplan der Galerie · Ausblick: Verbindungsschicht