# Greedy Snacks > Schlanker Git-Server: Repositories, Code, Commits, Releases mit Artefakten. > Basis-URL: https://greedy-snacks.com > Es gibt bewusst keine Issues, Pull Requests, Wiki oder CI. ## Anmeldung Menschen melden sich ueber Authentik an (https://greedy-snacks.com/login). Agenten und Skripte nutzen einen Personal Access Token (Praefix "gs_"), zu erstellen unter https://greedy-snacks.com/settings/tokens. - JSON-API und MCP: Header "Authorization: Bearer gs_..." - Git ueber HTTPS: Token als Passwort, Username beliebig git clone https://x:gs_...@HOST/namespace/repo.git - Git ueber SSH: eigener Public Key unter https://greedy-snacks.com/settings/keys Token-Scopes: read (lesen, klonen), write (zusaetzlich pushen, Releases), admin (zusaetzlich Repo-Einstellungen und Rechte). ## MCP (empfohlen fuer Agenten) Streamable-HTTP-Endpunkt: POST https://greedy-snacks.com/mcp claude mcp add --transport http greedysnacks https://greedy-snacks.com/mcp \ --header "Authorization: Bearer gs_..." Werkzeuge: whoami, list_repos, get_repo, create_repo, update_repo, delete_repo, list_tree, read_file, list_commits, get_commit, list_releases, create_release, upload_release_asset, update_release, delete_release, list_permissions, set_permission. ## JSON-API GET /api/v1/user GET /api/v1/repos POST /api/v1/repos {namespace, name, description, visibility} GET /api/v1/repos/{ns}/{repo} PATCH /api/v1/repos/{ns}/{repo} {description, visibility, default_branch, namespace, name} DELETE /api/v1/repos/{ns}/{repo}?confirm={ns}/{repo} GET /api/v1/repos/{ns}/{repo}/refs GET /api/v1/repos/{ns}/{repo}/tree?ref=&path= GET /api/v1/repos/{ns}/{repo}/file?ref=&path= GET /api/v1/repos/{ns}/{repo}/raw?ref=&path= GET /api/v1/repos/{ns}/{repo}/commits?ref=&path=&page= GET /api/v1/repos/{ns}/{repo}/commits/{sha} GET /api/v1/repos/{ns}/{repo}/permissions PUT /api/v1/repos/{ns}/{repo}/permissions {type: user|group, subject, level} DELETE /api/v1/repos/{ns}/{repo}/permissions?type=&subject= GET /api/v1/repos/{ns}/{repo}/releases POST /api/v1/repos/{ns}/{repo}/releases {tag, title, notes, prerelease, public} GET /api/v1/repos/{ns}/{repo}/releases/latest GET /api/v1/repos/{ns}/{repo}/releases/{tag} PATCH /api/v1/repos/{ns}/{repo}/releases/{tag} {title, notes, prerelease, public} DELETE /api/v1/repos/{ns}/{repo}/releases/{tag} POST /api/v1/repos/{ns}/{repo}/releases/{tag}/assets?name=datei[&overwrite=1] DELETE /api/v1/repos/{ns}/{repo}/releases/{tag}/assets/{datei} Fehler kommen als JSON: {"error": {"code", "message", "hint"}}. Das Feld "hint" sagt, was zu tun ist. Nicht vorhandene und nicht berechtigte Repos liefern beide 404. ## Stabile Download-URLs https://greedy-snacks.com/{ns}/{repo}/releases/download/{tag}/{datei} https://greedy-snacks.com/{ns}/{repo}/releases/latest/download/{datei} "latest" ist das neueste Release ohne Pre-Release-Kennzeichnung. ## Typischer Ablauf einer Veroeffentlichung 1. git tag v1.0.0 && git push origin v1.0.0 2. POST /api/v1/repos/{ns}/{repo}/releases {"tag":"v1.0.0","notes":"..."} 3. POST /api/v1/repos/{ns}/{repo}/releases/v1.0.0/assets?name=app.tar.gz (Body = Datei) Ein Release braucht einen existierenden Tag, sonst kommt 422. ## Oeffentliche Releases in privaten Repos Ein Release mit "public": true ist ohne Anmeldung abrufbar, auch wenn das Repository privat ist. Sichtbar sind dann ausschliesslich Titel, Notes und die Dateien dieses Releases - Quellcode, Commits und die uebrigen Releases bleiben geschuetzt. ## Regeln - Sichtbarkeit: private (nur Berechtigte), internal (alle Angemeldeten lesen), public (alle lesen). - Releases koennen einzeln oeffentlich geschaltet werden, unabhaengig vom Repo. - Rechte je Repo: read, write, admin, vergeben an User oder Authentik-Gruppen. - Uploads werden gestreamt; SHA-256 steht in der Antwort und im Header X-Checksum-Sha256.