agentleFS
Yesterday-AIYesterday-AI/ytstack/skills/deutschland-stack-api/SKILL.md

deutschland-stack-api

Skill2 starsChanged 30 days agoMITView on GitHub

Looks up the German government's Deutschland-Stack catalogue of graduated open-source standards (live data from technologie.deutschland-stack.gov.de). Use when choosing technology for German public-sector projects (Bund, Laender, Kommunen), when a project must be DS-konform, or when the user mentions Verwaltungs-IT or Deutschland-Stack. Not for private-sector EU sovereignty choices (european-alternatives-api).

The file

Files
SKILL.md

Deutschland-Stack

Offizieller Technologiekatalog des Bundes für Verwaltungs-IT. 128 Open-Source-Projekte, alle graduated oder sandbox, BSI-auditiert. Quelle: https://technologie.deutschland-stack.gov.de/.

Kernprinzip: In Projekten mit Bezug zu Bund/Ländern/Kommunen, GAIA-X, EVB-IT, digitaler Souveränität oder EU-Ausschreibungen IMMER zuerst im DS nachschlagen, bevor Technologie empfohlen wird. DS-Eintrag schlägt persönliche Präferenz.

Wann anwenden

  • Tech-Stack-Entscheidung für Behörden/ÖR/Verwaltung
  • Architektur-Reviews mit Souveränitäts-Anforderung
  • User erwähnt "DS-konform", "Deutschland-Stack", "Verwaltungs-IT", "GAIA-X", "OZG"
  • Ausschreibungs-/Vergabe-relevante Komponenten

Nicht anwenden bei rein privatwirtschaftlichen Projekten ohne ÖR-Bezug.

Die 4 Kategorien

KategorieSubkategorien
ZugangBrowser, Native Apps
PlattformDaten, Integration, KI, LowCode
InfrastrukturAnschluss, Transport, Verteilung
BetriebEntwicklung, Inbetriebnahme, Sicherheit

Workflow

  1. Vor jeder Tech-Empfehlung im ÖR-Kontext: Full-JSON fetchen (siehe Lookup-Patterns).
  2. Wenn DS-Eintrag existiert: diesen vorschlagen, mit Begründung über maturity und letztes audits[].date.
  3. Wenn kein DS-Eintrag: explizit benennen ("nicht im Deutschland-Stack gelistet"), Alternative aus DS vorschlagen, erst dann Nicht-DS-Option.
  4. Bei Konflikt zwischen User-Präferenz und DS: DS-Begründung liefern (Souveränität, Auditierung, Vergaberecht), User entscheidet.

Endpoints

Base: https://technologie.deutschland-stack.gov.de/data

EndpointGrößeInhalt
/full.json~240 KB128 items mit allen Metadaten (annotations, audits, maturity)
/guide.json~2 KBCategory/Subcategory-Baum

Beide liefern ohne Auth/Rate-Limit. Für wiederholte Lookups in einer Session einmal cachen (-o /tmp/ds-full.json).

Eintrags-Schema

id, name, description, summary, website, homepage_url, logo,
category, subcategory, additional_categories[],
maturity (sandbox|graduated), oss (alle true), featured,
accepted_at, incubating_at, graduated_at,
tag[], audits[{date,type,url,vendor}],
annotations{ cf_sovereignty_value, cf_market_value,
             cf_interoperability_value, cf_sustainability_value,
             cf_actuality_value, cf_trustworthiness_value,
             + _label-Varianten "N von 5",
             bs_owner, bs_number, dstype }

Die cf_*_value-Scorecards (Souveränität, Markt, Interoperabilität, Nachhaltigkeit, Aktualität, Vertrauen) sind der zentrale Entscheidungs-Input -- nicht die reine Listung.

Lookup-Patterns

BASE="https://technologie.deutschland-stack.gov.de/data"
curl -s "$BASE/full.json" -o /tmp/ds-full.json

# Ist Kubernetes im DS?
jq '.items[] | select(.name | test("kubernetes";"i")) | {name, maturity, subcategory}' /tmp/ds-full.json

# Alle KI-Einträge
jq '.items[] | select(.subcategory | ascii_downcase | contains("ki")) | .name' /tmp/ds-full.json

# Alle Einträge einer Subkategorie (z.B. Daten)
jq '.items[] | select((.subcategory|ascii_downcase|ltrimstr(" ")) == "daten") | .name' /tmp/ds-full.json
import json, urllib.request
d = json.load(urllib.request.urlopen("https://technologie.deutschland-stack.gov.de/data/full.json"))["items"]

# Souveränitäts-Champions (cf_sovereignty_value ≥ 80%)
def pct(v): return int((v or "0%").rstrip("%"))
top = [i for i in d if pct(i.get("annotations",{}).get("cf_sovereignty_value")) >= 80]
for i in sorted(top, key=lambda x: -pct(x["annotations"]["cf_sovereignty_value"])):
    a = i["annotations"]
    print(f"{a['cf_sovereignty_value']:>4}  {i['name']:<30} ({i['subcategory'].strip()})")

# Mit aktuellem Audit (< 12 Monate)
from datetime import date
recent = [i for i in d if i.get("audits") and
          (date.today() - date.fromisoformat(max(a["date"] for a in i["audits"]))).days < 365]

Siehe auch

  • european-alternatives-api -- Community-kuratierter Katalog (289 Einträge, breiter, weniger streng). Für Vergabe/ÖR gilt DS; EA ergänzt um Breite und Aktualität.

Caveats

  • DS-Listung ist notwendig, nicht hinreichend -- Einsatzpflicht pro Behörde unterschiedlich (OZG, BSI-Grundschutz, Landesrecht).
  • Audit-Datum (audits[].date) prüfen -- alte Audits können auf veraltete Versionen verweisen.
  • oss=true gilt für alle 128 Einträge; DS listet keine proprietären Produkte.
  • Deckt nur was auf gov.de publiziert ist -- weitere Behördenstandards (XÖV, FIM) können zusätzlich relevant sein.
  • API undokumentiert (aus JS-Bundle extrahiert). Kein SLA, kein Versions-Pinning.
  • category/subcategory haben Leading-Whitespace im Rohformat (" Plattform"). Trimmen vor Vergleich.

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.