Static website for the Institutional Privacy Task Force (IPTF), live at https://iptf.ethereum.org/.
Astro static site. Content for patterns, approaches, use-cases, vendors, domains, and jurisdictions is sourced from the iptf-map repo via a git submodule at content/. Writeups (blog posts) live in src/posts/.
- Astro generates every page at build time from data in
content/(iptf-map) andsrc/posts/(writeups). - GitHub Pages auto-deploys from
mainvia.github/workflows/deploy.yml. Changes go live within a few minutes. - CNAME (
public/CNAME) points the deployment atiptf.ethereum.org.
iptf-web/
├── astro.config.mjs Astro configuration (site URL, integrations)
├── content/ iptf-map submodule (patterns, approaches, etc.)
├── public/ Static assets served verbatim
│ ├── assets/images/ Post hero images, diagrams
│ ├── assets/css/
│ ├── assets/js/
│ ├── tee-protocol-page.html Standalone interactive whiteboard
│ ├── CNAME
│ └── robots.txt
├── scripts/
│ └── build-graph.mjs Reads iptf-map → src/data/graph.json
├── src/
│ ├── data/ Generated at build (graph.json, glossary.json)
│ ├── posts/ Blog post markdown
│ ├── lib/ Data access, markdown rendering, post loader
│ ├── layouts/ Guide.astro (default), Post.astro (writeups)
│ ├── components/ React islands for /explore/* (D3, Galaxy)
│ ├── pages/
│ │ ├── index.astro Landing
│ │ ├── about.astro
│ │ ├── blog/index.astro /blog
│ │ ├── [slug].astro /<post-slug>/ (writeups)
│ │ ├── approaches/ Case studies
│ │ ├── use-cases/
│ │ ├── patterns/
│ │ ├── vendors/
│ │ ├── domains/
│ │ ├── jurisdictions/
│ │ ├── explore/{galaxy,tree,browse}.astro D3 explorer
│ │ ├── faq.astro
│ │ ├── glossary.astro
│ │ └── feed.xml.js RSS feed
│ └── styles/
└── tests/ vitest suite
Requires Node 22.
npm install
npm run dev # http://localhost:4321
npm run build # → ./dist
npm testDrop a file into src/posts/ named YYYY-MM-DD-slug.md with frontmatter:
---
title: "Post Title"
description: "Brief description (shown in social cards and the blog index)."
date: 2026-01-09
author: "Author Name"
image: /assets/images/2026-01-09-slug/hero.png # optional, hero image
---The published URL is derived from the title (/<title-slugified>/). Hero images live under public/assets/images/.
Set published: false in frontmatter to keep a post out of the deployed site.
git submodule update --remote content
git add content
git commit -m "chore(content): bump iptf-map submodule"iptf-map main is the only source of truth for patterns, approaches, vendors, etc. Anything sourced from the submodule renders verbatim. Pages that emit map content mark each render site with SOURCE: iptf-map field — do not alter.
UI chrome (landing copy, FAQ, blog index, post layout) is the site's own and stays curated here.
- Branch from
main. - Run
npm install && npm run dev, verify your change. - Open a PR. Once merged, GH Pages redeploys within a few minutes.