Communitygithub.com

swapit — Inventar und Austauschmaschine für Haushaltsschadstoffe

Ein zustandsbehafteter, lokaler Erstanbieter-Inventar- und Austausch-Engine für Haushaltsschadstoffe. Identifiziert Gegenstände mit endokrinen Disruptoren und persistenten Chemikalien (BPA/BPS, Phthalate, PFAS/PTFE, Parabene, Flammschutzmittel, VOCs, Mikroplastik), bewertet jede nach tatsächlicher Exposition und verfolgt den Austausch gegen eine sicherere Alternative.

Was ist swapit — Inventar und Austauschmaschine für Haushaltsschadstoffe?

Das Skill `swapit` verwandelt die vage Sorge über Schadstoffe im Haushalt in einen konkreten, priorisierten und nachverfolgbaren Plan. Es ist zustandsbehaftet (das Inventar bleibt auf der Festplatte erhalten) und lokal-first (keine kostenpflichtigen Dienste, Daten verlassen das Gerät nur bei explizitem Opt-in). Der Skill erstellt ein detailliertes Inventar, berechnet Risikowerte basierend auf der tatsächlichen Exposition (Schweregrad x Anwesenheit x Nutzung x Zustand), erstellt eine priorisierte Austauschliste und verfolgt den Status der Beschaffung und des Austauschs. Er unterstützt verschiedene Modi wie `add`, `assess`, `swap`, `score` und `report`, sowie eine Live-Dashboard-Option mit `serve`. Der Skill ist für CLI (z.B. Claude Code, Cursor) konzipiert und verwendet ein fundiertes Wissensnetzwerk mit etwa 20 Gefahren, 40 Artikelklassen und 40 Alternativen. Die Privatsphäre wird durch eine strenge Trennung zwischen öffentlichem Wissen und privatem Inventar gewährleistet, wobei private Daten niemals das Gerät verlassen.

Funktioniert mit~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/broomva/skills/tree/HEAD/skills/commerce/swapit

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

Was macht swapit — Inventar und Austauschmaschine für Haushaltsschadstoffe?

Was dieses Skill ist

swapit verwandelt eine vage Sorge („Da ist wahrscheinlich viel Plastik und BPA in meinem Haus“) in einen konkreten, priorisierten und nachverfolgbaren Plan. Es ist zustandsbehaftet: Ihr Haushaltsinventar lebt auf der Festplatte und bleibt über Sitzungen hinweg erhalten. Es ist lokal-first: null kostenpflichtige Dienste, nichts verlässt Ihr Gerät, es sei denn, Sie entscheiden sich explizit für die (M3) Commons.

Ein Durchlauf erzeugt:

  1. Ein Inventar der Gegenstände, die Sie besitzen, jeweils gekennzeichnet mit seiner generischen Artikelklasse.
  2. Eine Risikobewertung pro Gegenstand, die die tatsächliche Exposition widerspiegelt – eine zerkratzte Antihaftpfanne, die täglich bei hoher Hitze verwendet wird, liegt weit über einem ungeöffneten Plastikbehälter in der Garage.
  3. Eine sortierte „Austausch-zuerst“-Liste – die 5 % der Änderungen, die die meiste Exposition reduzieren.
  4. Austauschverfolgung – gewählte Alternative, Beschaffungsstatus, Checkliste, Lesezeichen.
  5. Einen teilbaren HTML-Bericht (und in M2 ein Live-Dashboard unter swapit serve).

Die drei Bereiche (und das Datenschutz-Invarianz)

BereichWas er enthältTeilen
1 · WissenGefahren → Artikelklassen → Alternativen (generisch, zitierte Fakten)teilbar; zwischengespeichert + (M3) Commons-synchronisiert
2 · InventarIhre Gegenstände, Räume, Mengen, Marken, Fotos, Tauschvorgänge, LesezeichenPRIVAT – verlässt nie das Gerät
3 · Commons (M3)Anonymisierte Beiträge, die das gemeinsame Wissensnetzwerk bereichernOpt-in, überprüft, nur generische Fakten

Datenschutz-Invarianz (bindend): Das Inventar aus Bereich 2 (Gegenstände, Räume, Mengen, Marken, Fotos, Kaufinformationen, Standort) überschreitet niemals die Synchronisationsgrenze. Nur generische Fakten aus Bereich 1 sind teilbar, und zwar über explizites Opt-in + einen überprüfbaren swapit sync --dry-run. Durchgesetzt durch einen Allowlist-Serialisierer (scripts/anonymize.py) auf dem Client und eine Absicherung auf dem Commons-Server, plus Fuzz-Tests, die sicherstellen, dass jeder reale Inventargegenstand vom Gate abgelehnt wird. Liste der verbotenen Felder: anonymize.CONTRIBUTION_FORBIDDEN (die inventarstrukturelle Teilmenge von state.PRIVATE_FIELDS).

Datenmodell

Der Zustand befindet sich unter ~/.config/swapit/ (überschreibbar mit $SWAPIT_HOME; beachtet $XDG_CONFIG_HOME).

~/.config/swapit/
├── knowledge/   hazards.jsonl · item-classes.jsonl · alternatives.jsonl · products.jsonl · procurement.jsonl
├── inventory/   events.jsonl (anfügegeschützte Audit) · items.json · swaps.json · rooms.json · bookmarks.json
├── contributions/ queue.jsonl   (M3)
├── sync/        config.json · sync-log.jsonl   (M3)
└── photos/

Knotenschemata (siehe seed/*.jsonl für den vollständigen, zitierten Datensatz):

  • hazard – id · name · aliases · class · mechanism · exposure_routes · regulatory · severity(0-3) · evidence_strength · sources
  • item_class – id · name · category · description · hazards[]{hazard_id, presence_likelihood, rationale} · detection_hints · sources
  • alternative – id · name · replaces[] · material · rationale · tradeoffs · caveats · avoids_hazards · residual_concerns · sources
  • procurement_option (wo zu kaufen, öffentlich) – id · alternative · item_class · retailer · region(ISO-3166-1 a2) · area · url · price_min · price_max · currency · as_of · availability · confidence · corroboration_count
  • item (privat) – id · name · item_class · room · quantity · brand · condition · usage{frequency, food_contact, heat, child_contact} · status · notes · photos
  • swap (privat) – id · item_id · chosen_alternative · procurement{status, cost, vendor} · checklist[] · bookmarks[]

Risikomodell

risk = severity × presence_likelihood × evidence × exposure_relevance × frequency × condition
  • exposure_relevance aktiviert den Expositionspfad einer Gefahr entsprechend der Nutzung des Gegenstands (Lebensmittelkontakt + Hitze maximiert einen Gefahrenpfad für Ingestion/Lebensmittelkontakt/Hitze; dermal ist für Körperpflege relevant; Inhalation für Reinigung/Möbel; Kinderkontakt verstärkt).
  • Gegenstandswert = skalierte Summe des Risikos pro Gefahr → Band hoch / mittel / niedrig.
  • Dies ist die Priorisierungsintelligenz – das Analogon zum „dominanten Fehlermodus“ des Beschaffers: Reparieren Sie zuerst die wenigen Gegenstände, die den Großteil der Exposition verursachen, nicht eine Schuldliste von allem aus Plastik.

Modi

ModusWas er tut
initZustand erstellen + das Seed-Wissensnetzwerk laden
addHaushaltsgegenstand hinzufügen (Name, Klasse, Raum, Zustand, Nutzung) → zeigt seine Bewertung
assessGegenstand oder eine Ad-hoc-Artikelklasse bewerten → Gefahren + Risiko + sortierte Alternativen
listInventar auflisten, filtern nach --room/--band/--status/--class/--hazard, sortieren nach Risiko
swapAustauschplan erstellen/aktualisieren: Alternative wählen, Status setzen, Checkliste, Lesezeichen, Kosten
scoreZusammenfassung der Haushaltsexposition + die Austausch-zuerst-Rangliste
reportEigenständigen HTML-Bericht erstellen (Kategorie-C)
procureBeschaffungsübergabe-Kurzfassung + bekannte Wo-zu-kaufen-Angebote für das Austauschziel (filtern nach --region); ein gefundenes Angebot (--retailer/--url/--price-*) im öffentlichen Commons aufzeichnen
knowledgeWissensnetzwerk durchsuchen/durchsuchen (list/search/show)
roomsRäume auflisten/hinzufügen
selfhealWissensedges + Inventarreferenzen + Fundierung validieren; bei Fehlern mit Nicht-Null beenden
serveLokales Live-Dashboard unter http://127.0.0.1:8731 – Kanban-Board, Checkliste, Lesezeichen, Status; jeder Klick schreibt zurück in den Zustand
contributeAnonymisierten Fakt in die Warteschlange stellen – product / hazard (item-class→hazard) / alternative / procurement (öffentliches Wo-zu-kaufen-Angebot) / item-class (neuer Taxonomie-Knoten); lokal angewendet + für die Commons geprüft
syncBeitragswarteschlange pushen + Community-Wissen pullen (Opt-in); --dry-run zeigt eine Vorschau, was genau gesendet würde; --configure setzt den Endpunkt

Typischer Ablauf

swapit init
swapit add --name "Alte Teflon-Pfanne" --class nonstick-cookware --room kitchen \
           --condition scratched --frequency daily --food-contact --heat
swapit score                      # was zuerst austauschen
swapit swap itm_xxxx --to cast-iron-skillet --status sourcing --add-task "10-Zoll-Pfanne kaufen"
swapit procure itm_xxxx           # -> Übergabe an das `procurer`-Skill
swapit report --open              # teilbares HTML

Kombination mit anderen Skills

  • procurer – swapit procure <item> erstellt den Bedarf („Ersetze 3 Polycarbonat-Flaschen durch Glas/Stahl“) und die fertige Beschaffungsaufforderung; der Beschaffer gibt zitierte Quellen + Budgetrahmen zurück.
  • bookkeeping (P6) – eine neuartige, dauerhafte Gefahren-/Produktentdeckung (z. B. eine neu charakterisierte Artikelklasse) wird proaktiv in research/entities/ abgelegt und kann später in die Commons fließen.
  • health – persönlicher Expositionskontext. content-creation – lehrreiche Beiträge aus dem Graphen.

Fundierungsdisziplin

Das Seed-Wissen zitiert nur autoritative Stellen (NIEHS, ATSDR/CDC, US EPA, US FDA, ECHA/EU REACH, CA OEHHA Prop 65, WHO, EWG). Jeder Datensatz trägt ≥1 Quelle; verified: false markiert diese als referenzfähig (nicht frisch abgerufen) – führen Sie einen Quellendurchlauf (oder die Commons) durch, um zu aktualisieren. selfheal schlägt fehl, wenn ein Knoten seine Zitation verliert. Dies ist eine Verbraucherberatung, die auf öffentlicher Gesundheitswissenschaft basiert, nicht medizinische oder rechtliche Beratung.

Ressourcen

  • scripts/swapit.py – CLI-Einstiegspunkt + Befehlshandler
  • scripts/state.py – Zwei-Bereich-Zustandsschicht (PRIVATE_FIELDS definiert die Synchronisationsgrenze)
  • scripts/ops.py – Der einzige Schreibpfad für Zustandsänderungen (von CLI + Dashboard gemeinsam genutzt)
  • scripts/knowledge.py – Laden des Wissensnetzwerks + Kantenauflösung
  • scripts/risk.py – Expositions-Risiko-Bewertungs-Engine
  • scripts/report.py – Generator für eigenständige HTML-Berichte (Kategorie-C)
  • scripts/server.py – swapit serve Live-Dashboard (stdlib http.server, nur localhost)
  • scripts/anonymize.py – Das Datenschutz-Gate: Allowlist-Fakt-Ersteller + der Scan nach verbotenen Feldern
  • scripts/sync.py – Commons-Synchronisationsclient (Warteschlange, --dry-run-Vorschau, Push/Pull, Merge)
  • scripts/selfheal.py – Integritätsvalidator
  • templates/dashboard.html – Das Live-Dashboard (Inline-CSS/JS, Kategorie-C)
  • commons/ – Der vernetzte Commons-Referenzserver (FastAPI + SQLite; Bereitstellung geprüft)
  • seed/{hazards,item-classes,alternatives}.jsonl – Abgesichertes Startwissen
  • tests/ – Risiko-, Wissens-, Selbstheilungs-, CLI-, Datenschutz-/Anonymisierungs-, Sync-, Berichts- und Server-Tests

Zusammenarbeit (die Commons)

Beiträge sind nur generische Fakten – swapit contribute product|hazard|alternative|procurement|item-class erstellt einen anonymisierten Fakt (eine öffentliche Produkt→Artikelklasse-Zuordnung, eine Gefahren-Kantenkorrektur, eine Alternative, ein Wo-zu-kaufen-Angebot oder einen neuen Taxonomie-Knoten), wendet ihn lokal an und stellt ihn in die Warteschlange. swapit sync --dry-run zeigt genau, was gesendet würde; swapit sync pusht die Warteschlange und pullt Community-Wissen (Opt-in, nach --configure). Identische Fakten von verschiedenen Benutzern bestätigen sich gegenseitig (inhaltsadressiert) anstatt zu duplizieren; die Commons dienen einen Fakt erst dann aus, wenn zwei verschiedene Beitragende ihn bestätigen (corroboration >= 2) – die Moderation ist bestätigungsabhängig, nicht vertrauensabhängig, da confidence vom Aufrufer stammt und ein einzelner Einreicher sich sonst selbst genehmigen könnte. Die Datenschutz-Invarianz wird auf beiden Seiten durchgesetzt (Client anonymize-Gate + Server-Rückhalt) – das Inventar überschreitet niemals die Grenze.

Wo-zu-kaufen (Beschaffungs-) Commons

Ein procurement_option-Fakt ist ein öffentliches Angebot: eine sicherere alternative, die von einem retailer in einer region (ISO-3166-1 alpha-2) verkauft wird, mit optionalem url, price_min/price_max + currency + as_of, area und availability. Er ist inhaltsadressiert über (alternative, retailer, region) – dasselbe Angebot wird von verschiedenen Benutzern bestätigt; eine andere Region ist ein anderer Fakt (die geografische Skalenachse). Preis/URL/Bereich sind verfeinerbare Marktdaten: Eine Bestätigung mit einem streng neueren as_of frischt den Preis nach vorne, ohne neuere Daten zu verschlechtern. Die Datenschutz-Trennlinie ist scharf – das öffentliche Angebot verwendet retailer + price_* und niemals den privaten vendor/cost (wo Sie gekauft haben und was Sie bezahlt haben, bleibt in Bereich 2). swapit procure <item> --region <CC> zeigt bekannte Angebote an und zeichnet neue auf, die Sie finden – und erstellt so einen offenen, detaillierten, geografisch skalierten Datensatz, den jeder nutzen kann.

Roadmap

  • M1 (ausgeliefert, 0.1.0) – Datenmodell, Seed-Wissen, CLI, Risiko-Engine, statischer HTML-Bericht, Selbstheilung.
  • M2 (ausgeliefert, 0.2.0) – swapit serve: Lokales Live-Dashboard mit Lese-/Schreibzugriff auf den Zustand.
  • M3 (0.3.0) – Anonymisierte Zusammenarbeit + vernetzte Commons (commons/, FastAPI + SQLite). Datenschutz-Invarianz durch Allowlist-Serialisierung + Fuzz-Tests sowohl auf Client- als auch auf Serverseite durchgesetzt.
  • M4 (diese Version, 0.4.0) – Geografisch skalierte Beschaffungs-Commons + Taxonomie-Wachstum: die procurement_option (öffentliches Wo-zu-kaufen, geschlüsselt nach (alternative, retailer, region), Vorwärts-Preisauffrischung) und item_class (bestätigungsabhängiges Taxonomie-Wachstum) Fakt-Arten; procure zeigt Angebote an und zeichnet sie auf; Seed-Angebote in den USA/CO/DE/GB; sprachübergreifende Hash-Parität durch festgelegte Vektoren gesichert. Live-Bereitstellung auf der broomva.tech-Infrastruktur ist an eine explizite Freigabe gebunden (Zugangsdaten/DNS); das Skill ist auch offline voll funktionsfähig.

Individual skills in this repo

This repo contains 7 individual skills — each has its own dedicated page.

broomva/skills

Local TTS, voice cloning, voice design, and video dubbing via the OmniVoice Studio MCP server (open-source ElevenLabs alternative; nothing leaves the machine, runs on MPS/CUDA/CPU). Use when: (1) generating speech from text in any of 646 languages, (2) cloning a voice from a 3-second reference clip, (3) designing a voice by gender/age/accent/pitch/style, (4) dubbing a video into another language, (5) listing voice profiles or personality presets, (6) producing narration where privacy, cost, or absent API keys matter, (7) non-English narration where Edge TTS/kokoro fall short, (8) batch audio for blog posts or content pipelines. Triggers: 'omnivoice', 'voice clone', 'clone this voice', 'tts', 'narrate', 'generate speech', 'voice synthesis', 'dub video', 'voice design', 'local tts', 'multilingual voice', 'narrate this post', 'elevenlabs alternative'.

broomva/skills

>- Speak an explanation out loud while working in any project — tiered text-to-speech with a pluggable backend (ElevenLabs by default and quota-guarded, macOS `say` via `--fast` for free instant local speech, local OmniVoice as an unlimited private tier). Markdown-aware, so code fences, URLs and deep paths collapse to short spoken placeholders instead of being dictated character by character, while snake_case identifiers survive intact so the listener can still search for them. Every utterance is saved to disk for later replay. Also carries a **talk mode** toggle: turn it on and the agent speaks a full readback of every turn, for as long as that session lasts — the whole response, not a summary of it, with `brief` and `marker` levels for when you want less. Talk mode is off by default and scoped to the single session that enabled it, so parallel agents in other worktrees stay silent. Use when the user asks to hear something rather than read it — an explanation of a change, a walkthrough of what just happen...

broomva/skills

Shop Tiendas D1 (Colombia, d1.com.co) from the command line — search the catalogue, resolve your nearest physical store, price a basket against that store's real stock, and quote delivery. D1 runs VTEX IO (account `d1tiendas`), so this drives its public storefront API with no admin key at all — catalogue and cart work fully anonymously, and a one-time emailed code unlocks order history. Handles the two traps that make naive D1 automation wrong — availability is regionalized (an unregioned query reports a national catalogue nobody can actually buy from) and prices arrive in two different units (search reports whole pesos, checkout reports hundredths, a silent 100x). Builds and prices baskets; it deliberately cannot pay, handing a checkout URL to a human instead. USE WHEN the user wants to find D1 products or prices, check whether D1 delivers somewhere, build or cost a D1 grocery basket, compare D1 items, or review their D1 orders. NOT FOR other Colombian retailers (Éxito, Jumbo, Ara, Alkosto), and not for c...

broomva/skills

Tekton — the shared architecture-intent substrate for co-designing systems with the agent. One typed graph across six tiers (system / journey / data / infra / decisions / qualities); views are queries, not separate diagrams. The canonical artifact is a diff-friendly YAML model both human and agent read and write; it renders to Mermaid (agent-legible, GitHub-native) and a self-contained tabbed HTML viewer (human-visual). Cross-tier traceability (`tekton query <from> <to>`) answers "which infra does this user-journey step touch?" as a path query. USE WHEN: designing or thinking deeply about architecture, a system, a data model, user journeys/flows, or a technical plan WITH the agent; when a Category-C HTML doc isn't enough because you need to see AND edit AND traverse the design across tiers; "let's design X", "architect this", "model the system", "draw the flow", "how does this fit together", "diagram this", "/tekton". NOT FOR: a one-off throwaway diagram (use Mermaid inline); prose-only ADRs (write the ADR...

broomva/skills

Generate a polished Remotion video and X thread showcasing the full agent skills inventory. Use when creating social media content about skills, rendering category-based skill visualizations, or producing animated showcases of agent capabilities. Triggers on "skills video", "showcase skills", "skills thread", "render skills", "social content for skills", or requests to visualize the skills inventory.

broomva/skills

OpenCaptions extension for Content Engine — adds intent-driven CWI (Caption With Intent) captions to the post-production pipeline. Hooks into the grade → caption → final stage. Generates captions that understand video intent (pitch, volume, emotion, emphasis) and style themselves accordingly with variable font weight, size, and color. Uses the OpenCaptions CLI or MCP server. Triggers on: 'add captions', 'opencaptions', 'CWI captions', 'intent captions'.

broomva/skills

Produce polished product launch videos using the Liquid Glass aesthetic — dark void backgrounds, 3D perspective floating UI panels, particle effects, spring animations, and cinematic pacing. Built on Remotion with Imagen 4.0 for frames and Veo 3.1 for B-roll. Use when: (1) creating a product demo or launch video, (2) showcasing a UI/app/tool with cinematic polish, (3) building a social-ready video from screenshots and renders, (4) applying the liquid glass floating panel style, (5) composing Remotion videos with 3D transforms and spring animations. Triggers on: 'launch video', 'product video', 'liquid glass video', 'demo video', 'showcase video', 'remotion video', 'floating panel', 'glass aesthetic'.

Verwandte Skills