---
name: site-management
description: Betreibe eine Website auf Spaicely, nachdem sie gebaut ist: Versionen hochladen und veröffentlichen, zurückgehen, einen Teil einer Seite ändern, die Website auf ihre Domain bringen, DNS und Mail-Weiterleitung verwalten, Personen und Rollen, Freigaben, Übergaben, den Hosting-Tarif und Domainverlängerungen. Verwende das immer, wenn du an einer bestehenden Spaicely-Website oder einem Spaicely-Konto arbeitest, nicht nur beim Bauen.
---

# Eine Website auf Spaicely betreiben

Wie eine Website online kommt und online bleibt. Was eine gute Website enthält, steht im Skill `site-building`; wie man einen Namen findet, in `domain-search`. Jedes Tool, jeder Parameter und jeder HTTP-Endpunkt steht unter https://spaicely.com/developers/ und, für KIs, in https://spaicely.com/llms-full.txt.

## Anfangen

- Ruf zuerst `account.whoami` auf. Es sagt, für wen du handelst, welche Rechte (Scopes) du hast und pro Website deine Rolle und was du darfst. Gibt es noch keine Website, legt `sites.create` eine an; frag die Person nach dem Namen.
- Deine Rechte sind nie weiter als die Rolle der Person. Lehnt ein Tool ab, sag, was fehlt (Rolle, Scope oder Tarif), statt es auf einem anderen Weg zu versuchen.
- Steht ein hier genanntes Tool nicht in deiner Liste, ist deine Liste veraltet: Bitte die Person, den Spaicely-Connector neu zu verbinden (in claude.ai: Einstellungen > Konnektoren; in Claude Code: `/mcp`).
- Frag die Person vor allem, was ändert, was Besucher sehen, Geld kostet oder sich nicht rückgängig machen lässt. Manche Tools fragen in Claude Code selbst um Zustimmung.
- **Was du selbst darfst**, wählt die Person für jede Art von Handlung (`ai_permissions` in `account.whoami`): `self`, `ask` oder `never`. Standardmäßig stehen Kaufen, Personen, Mail, die Registry, Löschen und Rechnungsdaten auf `ask`. Ein solcher Aufruf antwortet mit `approval_required` und einer `url`: Gib der Person diesen Link und wiederhole den Aufruf nicht. Sie stimmt in Spaicely zu; wir führen den Aufruf dann genau so aus, wie du ihn geschickt hast, und `approvals.status` mit der `approval`-ID liefert die Antwort. Eine Art auf `never` wird abgelehnt; das kann nur die Person ändern, auf https://app.spaicely.com/ai.

## Eine Version online bringen

Eine Version ist immer die ganze Website, nie eine Sammlung von Änderungen. Nichts ist sichtbar, bevor es veröffentlicht ist.

1. **Hochladen**, auf einem von zwei Wegen:
   - `sites.deploy` mit jeder Datei: `path` ab dem Stammverzeichnis der Website, `sha256` in Hex und `size` in Bytes. Für ein Bild, das schon im Web steht, gib stattdessen `source_url` an (https, höchstens 20 pro Aufruf). Die Antwort nennt `missing`; schick genau diese mit `sites.files.put` (höchstens 50 Dateien und 2 MB pro Aufruf, Text als `utf8`, der Rest als `base64`).
   - Mit der Website als Ordner auf der Festplatte: `sites.upload_url`, dann `tar -czf site.tar.gz -C <folder> . && curl -T site.tar.gz <url>`. Die URL funktioniert einmal, 10 Minuten lang; `index.html` muss im Stammverzeichnis des Archivs liegen.
2. **Veröffentlichen** mit `sites.publish` und der Versionsnummer, nachdem die Person zugestimmt hat. Besucher wechseln auf einen Schlag, nie zu einer Mischung. Das dauert bis zu einer halben Minute; `sites.versions` zeigt, wann sie online ist.
3. **Den Bericht lesen.** `sites.versions` nennt pro Version die gesparten Bytes und `hints`, jeweils mit einem `fix`. Behebe, was zutrifft, und veröffentliche erneut.

Gut zu wissen:

- Wir bewahren die Dateien genau so auf, wie sie hochgeladen wurden; Besucher bekommen eine optimierte Kopie (minimiertes HTML, CSS und JavaScript, neu komprimierte Bilder bis 2560 Pixel).
- Alles unter `_private/` bleibt außerhalb des CDN; nur ein Downloadformular gibt es heraus. `_redirects` wird zu Weiterleitungen im CDN und wird selbst nicht ausgeliefert (siehe `site-building`).
- Hat jemand anderes veröffentlicht, nachdem deine Version begonnen hat? Dann werden deine Änderungen auf seine gesetzt, und das geht online. Ein Konflikt kommt pro Pfad zurück: Lies die Live-Datei mit `sites.files.get`, mach deine Änderung darauf neu und lade erneut hoch.
- **Zurück zur vorigen Version**: `sites.publish` mit `rollback: true`. Jede ältere Version: `sites.publish` mit ihrer Nummer.
- Bevor du eine Seite änderst, die jemand anderes gemacht hat, lies sie mit `sites.files.get` (die Live-Version, oder `deployment` für eine andere) und behalte, was da ist. `sites.files.list` zeigt die Dateien, mit `prefix` für einen Ordner.

## Einen Teil einer Seite ändern

Eine Seite kann Blöcke markieren, die eine Rolle für sich allein ändern darf:

```html
<!-- spaicely:edit news -->
<p>Ab 1. November sonntags geöffnet.</p>
<!-- /spaicely:edit -->

<!-- spaicely:append agenda -->
<li>12. November: Verkostung</li>
<!-- /spaicely:append -->
```

- `edit` darf ganz geändert werden; `append` nimmt nur Ergänzungen vor oder nach dem, was da ist. Namen: Kleinbuchstaben, Ziffern, `-` und `_`. Blöcke lassen sich nicht verschachteln.
- `sites.files.list` nennt die Blöcke pro Seite. `sites.region.update` mit `path`, `region` und `content` macht eine neue Version, die sich nur in diesem Block von der Live-Version unterscheidet (`mode` replace, prepend oder append; `index`, wenn ein Name mehr als einmal vorkommt). Dann veröffentlichen.
- Bau diese Markierungen dort ein, wo die Person erwartet, dass andere etwas aktuell halten (Neuigkeiten, Öffnungszeiten, Termine), damit ein Redakteur nie die ganze Seite braucht.

## Personen und Rollen

- **Im ganzen Konto**: `account.members`. Eigentümer kümmern sich um Zahlung, Domains und Personen; Mitglieder arbeiten an allen Websites. Einladen per E-Mail (der Link funktioniert 7 Tage).
- **Auf einer Website**: `access.list` zeigt, wer welche Rolle hat; `access.update` vergibt, ändert oder entfernt (`role: "none"`) eine. Nur der Eigentümer. Die Person braucht einen Spaicely-Login mit dieser Adresse.
- Rollen: `admin` (alles außer den Angelegenheiten des Eigentümers), `maintainer` (alle Dateien, Formulare und DNS), `designer` und `editor` (nur was ihre `rules` erlauben), `viewer` (lesen). `can_publish` lässt einen maintainer oder editor veröffentlichen.
- Regeln beschränken einen designer oder editor auf Aktionen auf Pfaden, optional auf markierte Blöcke: `[{"actions": ["update"], "paths": ["blog/**", "index.html"], "regions": ["news"]}]`.
- **Freigabe** (Tarife Pro und Shop): Wer Dateien ändern, aber nicht veröffentlichen darf, ruft `sites.review.request` mit einer `note` auf. Wer veröffentlichen darf, bekommt eine Mail; freigeben ist `sites.publish`, zurückschicken ist `sites.review.reject` mit einer Notiz. Im Tarif Site bittet die Person jemanden, der veröffentlichen darf.

## Eine Domain für die Website

- Eine Domain registrieren oder umziehen: siehe `domain-search` (`domains.register`, `domains.transfer`; ein Partner schlägt dem Kunden eine mit `domains.propose` vor). Der Kunde ist immer der Inhaber.
- **Verbinden**: `sites.domains.connect` mit der Domain selbst, ohne www. Spaicely liest die Einträge, die die Domain jetzt hat; ruf nach etwa einer halben Minute noch einmal auf für `records_to_confirm`. Zeig sie der Person: Behaltene Einträge (Mail, Verifizierungen) kommen mit, Einträge mit dem Grund `site` werden ersetzt, der Grund `certificate` ist ein CAA-Eintrag, der das Zertifikat blockieren würde. Ruf dann mit `confirm: true` auf (`skip` mit den Indizes, die wegbleiben sollen).
- Die Person stellt danach bei ihrem Registrar die Nameserver auf die beiden aus der Antwort um (`kiki.bunny.net` und `coco.bunny.net`). Bei Spaicely registrierte Domains haben sie schon. DNSSEC beim alten Anbieter muss vorher aus sein. Wir prüfen alle fünf Minuten, holen dann das Zertifikat und mailen der Person; `www` leitet Besucher zur Domain selbst weiter.
- `domains.status` zeigt den Stand: Einträge zum Bestätigen, Nameserver, DNSSEC, Zertifikat und die Einträge, die wir ausliefern.
- **DNS-Einträge**: `domains.dns.update` fügt A, AAAA, CNAME, TXT, MX, SRV und CAA hinzu oder löscht sie (`name` relativ zur Domain, `@` für die Domain selbst; löschen per id aus `domains.status`). Wohin die Domain und www zeigen, bleibt bei der Website. Eine Domain des Kontos ohne Website bekommt auf diesem Weg ebenfalls Spaicely-DNS.
- Signaturschlüssel für Mail (DKIM) eines ungewöhnlichen Dienstes können beim Verbinden fehlen: Die Person schickt eine Mail von einer Adresse auf der Domain an `dkim@spaicely.com` mit dem Code aus `dkim_mail` als Betreff.
- `sites.domains.disconnect` sorgt dafür, dass die Website nicht mehr auf der Domain antwortet; Mail-Einträge bleiben.

## Mail-Weiterleitung

Mail an `info@<domain>` kann an ein Postfach weitergehen, das die Person schon hat, etwa ihr Gmail. Als `info@` antworten geht noch nicht.

1. `mail.forward.enable` auf einer Domain, die mit einer bezahlten Website verbunden ist. Das setzt MX, Verifizierung, DKIM, SPF und DMARC. Empfängt die Domain schon anderswo Mail, hört das auf: Der Aufruf lehnt ohne `replace_existing_mail: true` ab, also frag vorher.
2. `mail.forward.add` mit `address` (`info`, oder `*` für jede Adresse ohne eigene Weiterleitung) und bis zu 5 `destinations`. Jedes neue Ziel bekommt eine Bestätigungsmail; nichts geht dorthin, bevor darauf geklickt wurde.
3. `mail.forward.status` zeigt die Adressen, den Stand jedes Ziels und Mail, die in den letzten 30 Tagen als möglicher Spam zurückgehalten wurde; `mail.forward.release` schickt eine davon doch weiter, nur wenn die Person sie erkennt.

Jede Adresse kostet 1,50 Euro pro Monat zzgl. MwSt. im Tarif der Website; Site erlaubt 1, Pro 5, Shop 10. `mail.forward.remove` und `mail.forward.disable` beenden es.

## Tarif, Abrechnung und Verlängerungen

- **Hosting**: `sites.subscription` zeigt Tarif, Status und Verlängerungsdatum. Mit `plan` (`site`, `pro` oder `shop`; 9, 19 und 39 Euro pro Monat zzgl. MwSt.) startet es das Hosting und gibt eine `checkout_url` für die Person, oder es wechselt den Tarif sofort. Ohne Tarif wird eine neue Website nach 14 Tagen entfernt. Karte, Rechnungen und Kündigung finden sich unter `portal_url`. Nur Eigentümer des zahlenden Kontos.
- **Rechnungsdaten**: `account.billing` (geschäftlich oder nicht, USt-IdNr., Adresse). Jeder Kauf braucht sie; eine USt-IdNr. wird über VIES geprüft. `account.invoices` listet unsere Rechnungen, jede mit einem Link.
- **Verbraucher** (ein Konto, das kein Unternehmen ist) müssen zustimmen, dass eine Bestellung sofort beginnt, was ihr Widerrufsrecht einschränkt. Gib `start_now: true` nur an, wenn sie das selbst gesagt haben.
- **Domains**: Die Verlängerung ist standardmäßig automatisch und wird 14 Tage vor Ablauf von der Karte oder dem Mandat abgebucht, mit dem die Domain bezahlt wurde (`domains.auto_renew`; ohne gespeicherte Zahlungsmethode enthält die Antwort eine `setup_url`). `domains.renew` gibt einen Zahlungslink, um jetzt zu verlängern.
- Ebenfalls für Eigentümer des Inhaberkontos: `domains.holder` (Inhaberdaten; ein anderer Name oder eine andere Organisation läuft über unsere Mitarbeiter), `domains.lock` (Transfersperre), `domains.nameservers` (`ours: true`, oder andere für eine Domain ohne Website) und `domains.transfer_code` (der Code geht per Mail an die Person und den Inhaber, nie an dich).

## Partner

- Ein Partner (ein Webdesigner oder eine Agentur) baut auf seinem eigenen Partnerkonto oder arbeitet mit einer Rolle an der Website des Kunden.
- `sites.handover` mailt dem Kunden einen Link (14 Tage), um eine fertige Website auf sein eigenes Konto zu übernehmen; `role` ist, was der Partner behält, `payer`, wer ab dann zahlt. `sites.handover.revoke` zieht sie vor der Annahme zurück.
- `domains.propose` schlägt eine Domain für die Website eines Kunden vor; der Kunde prüft zuerst die Inhaberdaten und stimmt per Mail zu.

## Im Blick behalten

- `sites.stats` liefert Anfragen, Bytes, `not_found` und CDN-Regionen pro Tag, über 7, 30 oder 90 Tage, ohne Cookies. Viele `not_found` bedeuten defekte Links: Finde sie und füg eine Weiterleitung hinzu oder korrigiere den Link.
- `scripts.list` zeigt den Stand jedes Formulars; `shop.orders` die neuesten Bestellungen.
- Eine Website löschen (`sites.delete`, nur der Eigentümer, mit dem Namen, den die Person eingetippt hat) nimmt jede Version, jedes Formular und den Shop endgültig offline. Die Domains bleiben ihre.

## Ohne MCP

Die Spaicely-CLI macht dasselbe aus einem Terminal oder aus CI: `spaicely login`, `spaicely deploy` (Vergleich mit live, hochladen, optional veröffentlichen), `spaicely publish`, `spaicely rollback`, `spaicely versions`, `spaicely domains ...`, `spaicely dns ...` und `spaicely call <tool>` für jedes andere Tool. Installation und Beispiele: https://spaicely.com/developers/#command-line.
