| name | deploy |
| description | Deploy bestanden naar de Delta Instituut website (preview.deltainstituut.nl) via een git push naar de gekoppelde GitHub-repo. Gebruik bij "deploy", "publiceer", "push naar netlify", "zet live", "deploy dit bestand", of wanneer de gebruiker een HTML-bestand wil publiceren op de website. |
| argument-hint | <bestandsnaam> |
| model | haiku |
Deploy — Delta Instituut
Publiceer een HTML-bestand op preview.deltainstituut.nl via een commit naar deltainstituut/preview-content. Netlify is gekoppeld aan deze repo en deployt automatisch (~20-30s) bij elke push naar main.
Site-info
| |
|---|
| Site URL | https://preview.deltainstituut.nl |
| GitHub repo | https://github.com/deltainstituut/preview-content (public) |
| Branch die deployed | main |
| Lokale clone (default) | ~/preview-content |
KRITISCH: gebruik geen Netlify MCP, geen npx @netlify/mcp, geen Netlify Deploy API direct. Alle deploys gaan uitsluitend via een git push. Dat houdt de Netlify-pipeline single-source-of-truth en vermijdt race-conditions tussen MCP-deploys en GitHub-deploys.
Auth
Op een lokale Mac met SSH-key (of gh auth login) en globale ~/.gitconfig werkt git push zonder extra setup — sla deze sectie over.
In een ephemeral sandbox (cowork e.d.) is filesystem-state weg per sessie en is gh meestal niet geïnstalleerd. Gebruik daar een fine-grained PAT (scope: Contents read/write op deltainstituut/preview-content) ingebakken in de remote-URL:
TOKEN="<fine-grained-pat>"
git clone https://x-access-token:${TOKEN}@github.com/deltainstituut/preview-content.git ~/preview-content
Op een bestaande clone die je opnieuw wilt authenticeren:
git -C ~/preview-content remote set-url origin "https://x-access-token:${TOKEN}@github.com/deltainstituut/preview-content.git"
PAT ophalen (Supabase)
De fine-grained PAT staat in de Supabase-project cywbhwaamxiipuywuhio in de tabel public.secrets onder key GITHUB_TOKEN_PREVIEW_CONTENT. Haal hem op met één Supabase-MCP call:
- Tool:
mcp__supabase__execute_sql
project_id: cywbhwaamxiipuywuhio
query: SELECT value FROM public.secrets WHERE key = 'GITHUB_TOKEN_PREVIEW_CONTENT'
Belangrijk: gebruik public.secrets, NIET vault.decrypted_secrets. Het schema is public. De waarde staat plaintext in de tabel (acceptabel binnen dit project — geen extra Vault-laag nodig).
Pas terugvragen aan de gebruiker als deze SQL leeg returnt of de Supabase-MCP-call faalt. Niet in elke sessie opnieuw proberen — log de waarde in een env-var voor de duur van de sessie:
TOKEN="<resultaat van de SELECT>"
Commit-identity zonder globale gitconfig: gebruik inline -c flags (geen env-vars):
git -c user.email="onno@herprogrammeerdeoverheid.nl" -c user.name="Onno Eric Blom" commit -m "..."
URL-structuur
Artikelen altijd in subdirectories: preview.deltainstituut.nl/artikelen/<slug>/
Repo-layout:
preview-content/
├── _headers ← X-Robots-Tag noindex + cache rules
├── index.html ← homepage
├── fonts.css ← gedeelde fonts (Merriweather + Lora)
├── og-image.jpg ← Open Graph image
└── artikelen/<slug>/index.html ← artikelen
Wel oppassen: een commit op een bestaand <slug> overschrijft het live artikel. Wil je dat niet — kies een andere slug of werk via een PR.
Workflow
Het bestand dat de gebruiker meegeeft (<bestandsnaam>) is een gegenereerde HTML, typisch uit de delta-html-documents skill. De skill plaatst hem in de juiste repo-locatie, commit, en pusht.
-
Slug afleiden — uit <meta property="og:url"> in de HTML, of uit een prominent argument. Slug-regex: ^[a-z0-9]+(-[a-z0-9]+)*$.
-
Lokale clone klaarmaken — als ~/preview-content niet bestaat:
git clone git@github.com:deltainstituut/preview-content.git ~/preview-content
git clone https://x-access-token:${TOKEN}@github.com/deltainstituut/preview-content.git ~/preview-content
Anders: git -C ~/preview-content pull --quiet origin main om laatste state op te halen.
-
Bestand op de juiste plek zetten:
mkdir -p ~/preview-content/artikelen/<slug>
cp <bestandsnaam> ~/preview-content/artikelen/<slug>/index.html
-
Commit + push:
cd ~/preview-content
git add artikelen/<slug>/
git commit -m "feat: <slug>"
git push origin main
-
Verifiëren — wacht 20-30 seconden tot Netlify de deploy heeft afgerond, dan:
curl -sI https://preview.deltainstituut.nl/artikelen/<slug>/ | grep -iE "HTTP|x-robots-tag"
Verwacht: HTTP/2 200 én x-robots-tag: noindex, nofollow, noarchive, nosnippet.
-
Slot-zin aan de gebruiker — geef de live URL en stel voor om hem te bekijken:
"Live op https://preview.deltainstituut.nl/artikelen/\/. Check git log -1 --pretty=format:'%h %s' om te zien welke commit dit was."
Gedeelde resources
/fonts.css en /og-image.jpg staan al in de repo. Niet opnieuw deployen tenzij je ze wilt updaten. Dezelfde flow: edit het bestand in de repo, commit, push.
_headers zet:
X-Robots-Tag: noindex, nofollow, noarchive, nosnippet voor alle paths
Cache-Control: public, max-age=31536000, immutable op /fonts.css
Cache-Control: public, max-age=2592000 op /og-image.jpg
Niet vervangen door robots.txt met Disallow: / — dat zou WhatsApp/Slack/LinkedIn link-previews breken.
Probleemoplossing
git push faalt met permission denied → check gh auth status. De gebruiker moet collaborator zijn op deltainstituut/preview-content met push-rechten.
- Push lukt maar URL blijft 404 → wacht langer (Netlify build kan tot ~60s duren bij druktes); check status op https://app.netlify.com/sites/preview-deltainstituut/deploys. Als een deploy faalt is dat zichtbaar in het Netlify-dashboard.
- Per ongeluk verkeerd artikel overschreven →
git revert <commit> op de repo, push opnieuw. Netlify deployt de revert automatisch.
- OG preview ontbreekt → check
<meta property="og:url"> in HTML wijst naar de juiste slug; check https://preview.deltainstituut.nl/og-image.jpg is 200.
- Fonts laden niet →
curl -sI https://preview.deltainstituut.nl/fonts.css moet 200 zijn. Zo niet: het bestand is uit de repo verwijderd; herstel met git checkout HEAD~1 -- fonts.css (of haal hem uit skills/delta-html-documents/references/fonts-base64.css, hernoem naar fonts.css).
- Merge conflict bij push — onwaarschijnlijk bij solo-werk, maar als 2 personen tegelijk deployen:
git pull --rebase origin main, los conflicten op, push opnieuw.
Wat er níet meer hoeft
- Geen
mkdir /tmp/delta-deploy, geen npx, geen Netlify-MCP-call. Het hele "deploy-dir voorbereiden" mechanisme uit eerdere versies is vervangen door één git push.
- Geen handmatige check op
/fonts.css//og-image.jpg 200/404 — die staan in de repo en blijven dus aanwezig.