|
2 | 2 |
|
3 | 3 | ## Project Overview |
4 | 4 |
|
5 | | -This is the IPTF (Institutional Privacy Task Force) website repository. It's a simple Jekyll-based GitHub Pages site deployed at https://iptf.ethereum.org/. |
| 5 | +This is the IPTF (Institutional Privacy Task Force) website repository. Astro static site deployed at https://iptf.ethereum.org/. |
| 6 | + |
| 7 | +Map content (patterns, approaches, use-cases, vendors, domains, jurisdictions) is the projection of the [`iptf-map`](https://github.com/ethereum/iptf-map) repo, pinned as a submodule at `content/`. Blog writeups live in `src/posts/`. |
6 | 8 |
|
7 | 9 | ## Tech Stack |
8 | 10 |
|
9 | | -- **Jekyll**: Static site generator |
10 | | -- **Minima theme**: Minimal Jekyll theme |
11 | | -- **GitHub Pages**: Hosting and auto-deployment |
12 | | -- **Markdown**: Content format |
| 11 | +- **Astro** (static site generator, Node 22) |
| 12 | +- **React** islands for the `/explore/*` D3 explorer views |
| 13 | +- **marked** for Markdown rendering |
| 14 | +- **Tailwind CSS v4** |
| 15 | +- **GitHub Pages** for hosting + auto-deploy from `main` |
13 | 16 |
|
14 | 17 | ## Key Files |
15 | 18 |
|
16 | | -- `_config.yml`: Site configuration (title, description, theme, blog settings) |
17 | | -- `index.md`: Homepage content |
18 | | -- `blog.html`: Blog index page |
19 | | -- `_posts/`: Published blog posts (filename: `YYYY-MM-DD-title.md`) |
20 | | -- `_drafts/`: Draft posts not published to live site |
21 | | -- `_layouts/`: Custom page layouts (post.html, default.html) |
22 | | -- `_includes/`: Reusable components (head.html with Twitter cards) |
23 | | -- `assets/images/`: Hero images and media |
24 | | -- `CNAME`: Custom domain configuration (iptf.ethereum.org) |
25 | | - |
26 | | -## Development Guidelines |
27 | | - |
28 | | -### Content Editing |
29 | | - |
30 | | -- Main content is in `index.md` (Markdown format) |
31 | | -- Keep content focused on IPTF mission and contact information |
32 | | -- Maintain professional, concise tone |
33 | | - |
34 | | -### Configuration |
| 19 | +- `astro.config.mjs` — Astro config (site URL, integrations). |
| 20 | +- `content/` — iptf-map submodule. |
| 21 | +- `scripts/build-graph.mjs` — Reads iptf-map → `src/data/graph.json`. |
| 22 | +- `src/posts/` — Blog post markdown (filename: `YYYY-MM-DD-slug.md`). |
| 23 | +- `src/pages/` — Routes. `blog/[slug].astro` is the post detail page. |
| 24 | +- `src/layouts/` — `Guide.astro` (default), `Post.astro` (writeups). |
| 25 | +- `src/lib/` — Data access (`data.ts`), post loader (`posts.ts`), markdown renderer (`render.ts`). |
| 26 | +- `public/` — Static assets served verbatim (`assets/`, `CNAME`, `robots.txt`, `tee-protocol-page.html`). |
| 27 | +- `.github/workflows/deploy.yml` — GH Pages build + deploy. |
35 | 28 |
|
36 | | -- Site settings in `_config.yml` |
37 | | -- Changes require Jekyll server restart when testing locally |
38 | | -- Do not modify `CNAME` unless changing domain |
| 29 | +## Development |
39 | 30 |
|
40 | | -### Testing Locally |
41 | | - |
42 | | -Run Jekyll server before committing changes: |
43 | 31 | ```bash |
44 | | -bundle exec jekyll serve |
| 32 | +npm install |
| 33 | +npm run dev # http://localhost:4321 |
| 34 | +npm run build # → ./dist |
| 35 | +npm test |
45 | 36 | ``` |
46 | | -View at `http://localhost:4000` |
47 | | - |
48 | | -### Commit Conventions |
49 | 37 |
|
50 | | -Use semantic commit messages following conventional commits format: |
| 38 | +Requires Node 22. |
51 | 39 |
|
52 | | -- `feat:` New features or content additions |
53 | | -- `fix:` Bug fixes or corrections |
54 | | -- `docs:` Documentation changes |
55 | | -- `chore:` Maintenance tasks, dependencies |
56 | | -- `refactor:` Code restructuring without behavior changes |
57 | | -- `style:` Formatting, whitespace changes |
| 40 | +## Source-of-truth rule |
58 | 41 |
|
59 | | -Examples: |
60 | | -- `docs: add README and CLAUDE.md` |
61 | | -- `feat: add new initiative section` |
62 | | -- `fix: correct contact email` |
| 42 | +iptf-map main is the only source of truth for map content. Anything sourced from the submodule renders verbatim. Render sites are marked with `SOURCE: iptf-map field — do not alter` comments. |
63 | 43 |
|
64 | | -### Deployment |
| 44 | +UI chrome (landing copy, FAQ, blog index, post layout) is the site's own and stays curated. |
65 | 45 |
|
66 | | -- **Branch**: We deploy from `main` branch only (legacy `gh_pages` branch removed) |
67 | | -- **Auto-deploy**: GitHub Pages automatically deploys on push to `main` |
68 | | -- **Timeline**: Changes go live within 1-3 minutes |
69 | | -- **No manual steps**: Simply push to `main` or merge PR |
70 | | -- **Live site**: https://iptf.ethereum.org/ |
| 46 | +## Commit conventions |
71 | 47 |
|
72 | | -## Typical Tasks |
| 48 | +Semantic / conventional commits: |
73 | 49 |
|
74 | | -- **Update homepage**: Edit `index.md` |
75 | | -- **Create blog post**: Add `YYYY-MM-DD-title.md` to `_posts/` |
76 | | -- **Create draft**: Add to `_drafts/` or use `published: false` frontmatter |
77 | | -- **Add hero image**: Place in `assets/images/`, reference in post frontmatter |
78 | | -- **Change site settings**: Edit `_config.yml` |
| 50 | +- `feat:` new features or content |
| 51 | +- `fix:` bug fixes |
| 52 | +- `docs:` documentation |
| 53 | +- `chore:` maintenance, dependencies |
| 54 | +- `refactor:` reorganization without behaviour change |
79 | 55 |
|
80 | | -## Blog Post Guidelines |
| 56 | +## Blog posts |
81 | 57 |
|
82 | | -### Frontmatter Template |
| 58 | +### Frontmatter template |
83 | 59 |
|
84 | 60 | ```yaml |
85 | 61 | --- |
86 | | -layout: post |
87 | 62 | title: "Post Title" |
88 | | -date: YYYY-MM-DD |
| 63 | +description: "Brief description (shown in social cards and the blog index)." |
| 64 | +date: 2026-01-09 |
89 | 65 | author: "Author Name" |
90 | | -image: /assets/images/hero-name.jpg |
91 | | -description: "Brief description for SEO and social cards" |
| 66 | +image: /assets/images/2026-01-09-slug/hero.png |
92 | 67 | --- |
93 | 68 | ``` |
94 | 69 |
|
95 | | -### Hero Images |
| 70 | +The published URL derives from the title via Jekyll-compatible slugify. Hero images live under `public/assets/images/`. Set `published: false` to keep a post out of the live site. |
| 71 | + |
| 72 | +### Hero images |
96 | 73 |
|
97 | | -- **Size**: 1200x600px (2:1 ratio) for optimal Twitter/X card display |
98 | | -- **Location**: `assets/images/` |
99 | | -- **Format**: JPG, PNG, or SVG |
100 | | -- Always include alt text consideration in design |
| 74 | +- Recommended size: 1200x600px (2:1 ratio) for OG / Twitter cards. |
| 75 | +- Location: `public/assets/images/<date-slug>/`. |
| 76 | +- Format: JPG, PNG, WEBP, or SVG. |
101 | 77 |
|
102 | | -### Draft Workflow |
| 78 | +## Updating iptf-map content |
103 | 79 |
|
104 | | -1. Create draft in `_drafts/` folder (no date in filename) |
105 | | -2. Preview locally: `bundle exec jekyll serve --drafts` |
106 | | -3. When ready to publish: Move to `_posts/` with date prefix |
107 | | -4. Alternatively: Use `published: false` in frontmatter |
| 80 | +```bash |
| 81 | +git submodule update --remote content |
| 82 | +git add content |
| 83 | +git commit -m "chore(content): bump iptf-map submodule" |
| 84 | +``` |
108 | 85 |
|
109 | | -## Important Notes |
| 86 | +## Deployment |
110 | 87 |
|
111 | | -- This is a public-facing website representing Ethereum Foundation |
112 | | -- Keep content accurate and professional |
113 | | -- Test locally before pushing to main |
114 | | -- Changes to main branch go live immediately |
| 88 | +- Deploy from `main` only. |
| 89 | +- Push or merge → GitHub Actions builds Astro and deploys to GH Pages. |
| 90 | +- Live within a few minutes. |
| 91 | +- Don't modify `public/CNAME` unless changing the domain. |
115 | 92 |
|
116 | 93 | ## License |
117 | 94 |
|
|
0 commit comments