Skip to content
codexa

Portfolios · React

Journalist & writer

Editorial portfolio for a journalist and author, with selected stories, a book and editor references.

Journalist & writer starter, as built from its own files
Starter screenshot captured from this template's own build at 1440×900. It shows the template as it ships, not output generated from a prompt.

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.

Raw data: GET /api/v1/templates/portfolio-journalist

src/site.ts
src/site.ts
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 …”

Agent ready

Creates a free account first; your idea is carried over.

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.

All templates

Build on Journalist & writer

Create a free account, start from this template, and ask the AI agent to turn it into your app.