Portfolios · React
Journalist & writer
Editorial portfolio for a journalist and author, with selected stories, a book and editor references.

What you get
A text-first portfolio for a reporter or writer: selected stories, a book feature, a career timeline, notes from editors, speaking topics and a pitch form. All content lives in src/site.ts.
Files
Exactly what is copied into a new project: 13 files, nothing generated.
Explorer 13
import type { Site } from "./types"; /** Everything this site shows. Edit freely. */export const site: Site = { "brand": "Tom Achterberg", "nav": [ { "label": "Stories", "href": "#stories" }, { "label": "Book", "href": "#book" }, { "label": "Bylines", "href": "#bylines" }, { "label": "Talks", "href": "#talks" } ], "navCta": { "label": "Pitch me", "href": "#contact" }, "sections": [ { "kind": "hero", "variant": "editorial", "eyebrow": "Reporter & author · Rotterdam", "title": "I write about water, ports and the people who keep cities dry.", "text": "Fifteen years reporting on climate adaptation and infrastructure for newspapers and magazines in Europe. My first book, The Dyke Keepers, came out in spring 2026.", "primary": { "label": "Read selected stories", "href": "#stories" }, "secondary": { "label": "About the book", "href": "#book" }, "visual": { "type": "card", "tone": "#7f1d1d", "title": "Latest: The Dyke Keepers", "lines": [ "Non-fiction, 312 pages", "Published April 2026", "Out in English and Dutch" ] } }, { "kind": "projects", "id": "stories", "eyebrow": "Selected stories", "title": "Reporting I'm proud of", "items": [ { "title": "The last ferry to Pernis", "tag": "Long read on a harbour village being bought out", "year": "2026", "tone": "#3f3f46" }, { "title": "Who pays when the pumps fail", "tag": "Investigation into flood insurance gaps", "year": "2025", "tone": "#7f1d1d" }, { "title": "Sand", "tag": "Three-part series on the global sand trade", "year": "2024", "tone": "#78716c" }, { "title": "Night shift at the storm barrier", "tag": "Reportage, 14 hours with the operators", "year": "2023", "tone": "#1c1917" } ] }, { "kind": "split", "id": "book", "eyebrow": "The book", "title": "The Dyke Keepers", "text": "A year with the engineers, farmers and volunteers who maintain 17,000 kilometres of Dutch flood defences, and what the rest of the world might learn from them.", "bullets": [ "Two years of reporting across six provinces", "Available in hardback, ebook and audiobook", "Book club notes on request" ], "visual": { "type": "card", "tone": "#991b1b", "title": "Book events", "lines": [ "Readings at libraries and festivals", "Q&A with local water boards", "Signed copies by post" ] }, "reverse": true }, { "kind": "timeline", "id": "bylines", "eyebrow": "Bylines", "title": "Where my work has run", "items": [ { "period": "2020 – now", "title": "Freelance correspondent", "text": "Features and investigations for national newspapers and monthly magazines in four countries." }, { "period": "2015 – 2020", "title": "Climate reporter, regional daily", "text": "Covered the port, the water boards and two major flood seasons." }, { "period": "2011 – 2015", "title": "General news reporter", "text": "Courts, council meetings and the night desk. Learned to file in forty minutes." } ] }, { "kind": "quotes", "eyebrow": "Editors", "title": "What it's like to work with me", "items": [ { "quote": "Tom files clean copy, on time, and his sources pick up the phone when the fact-checker calls.", "name": "Ingrid V.", "role": "Features editor" }, { "quote": "He can make a pumping station interesting. I didn't think that was possible.", "name": "James O.", "role": "Magazine editor" }, { "quote": "Careful with people's stories and stubborn about the numbers. The right way round.", "name": "Femke B.", "role": "Investigations editor" } ] }, { "kind": "faq", "id": "talks", "eyebrow": "Talks", "title": "Speaking and workshops", "items": [ { "q": "What do you talk about?", "a": "Climate adaptation, how flood defences are run, and how to report on infrastructure without boring readers." }, { "q": "Do you run workshops for journalists?", "a": "Yes, a half-day workshop on reading engineering and budget documents. Up to 20 people." }, { "q": "What are your fees?", "a": "Talks start at €750 plus travel. Reduced fees for schools, libraries and student newsrooms." } ] }, { "kind": "contact", "eyebrow": "Contact", "title": "Pitches, commissions and talks", "text": "Editors: send a line about the story and your deadline. For book rights, please contact my agent through the same form.", "fields": [ "name", "email", "company", "message" ], "button": "Send" } ], "footer": { "text": "Tom Achterberg, reporter and author based in Rotterdam.", "columns": [ { "title": "Read", "links": [ "Stories", "The Dyke Keepers", "Newsletter" ] }, { "title": "Contact", "links": [ "tom@achterberg.nl" ] } ], "legal": "© Tom Achterberg. Sample content: replace it in src/site.ts." }};Remix
Remix this template
Describe what to change and the agent starts from Journalist & writer's files. The box is already started for you: finish “Start from Journalist & writer and …”
Dependencies
Documented from the template's package.json. The runtime has a prebuilt dependency set for Vite + React + TypeScript, so installs are fast.
- react^19.1.0
- react-dom^19.1.0
- vite^6.3.0
- @vitejs/plugin-react^4.4.0
- tailwindcss^4.1.0
- @tailwindcss/vite^4.1.0
- typescript^5.8.0
How it runs
- Framework
- Vite + React + TypeScript
- Dev command
- npm run dev
- Build command
- npm run build
- Output directory
- dist
- Port
- 5173
- Entry route
- /
Projects run in an isolated sandbox with a live preview. Read the projects documentation for settings, snapshots and deployment.
Keep browsing
All templates
Brand design studio
Bold dark site for an independent brand and identity studio, with case work, services and team.

Product designer
Case-study portfolio for a product designer, with process, experience timeline and references.

3D & motion designer
High-contrast dark portfolio for a 3D and motion designer, with reels, projects, rates and process.
Build on Journalist & writer
Create a free account, start from this template, and ask the AI agent to turn it into your app.