- Case Study

CTF Write-Up Portfolio

·web

A modern, responsive Next.js portfolio for showcasing Capture the Flag write-ups and cybersecurity research. Built to present write-ups in a format that's engaging and easy to read.

#NextJS#TypeScript#Tailwind CSS
CTF Write-Up Showcase project header

CTF Write-Ups Portfolio

A modern, responsive Next.js portfolio for showcasing Capture the Flag write-ups and cybersecurity research. Built to present write-ups in a format that's engaging and easy to read — kept separate from the main portfolio at kpritchard.co.uk.

Features

  • Markdown write-ups — author CTF solutions in plain Markdown. Supports GitHub Flavored Markdown, syntax highlighting, tables, and images.
  • Dynamic routing — each write-up gets its own dedicated page at /write-ups/[slug], generated automatically from the filename.
  • Reports grid — browse write-ups in Grid, Card, or List view with real-time category filtering and search.
  • Stats dashboard/stats auto-aggregates data from your Markdown files: category breakdown, monthly activity, and a chronological timeline. No manual updates needed.
  • Animations — scroll-triggered fade-ups and transitions built with Framer Motion.
  • Dark theme — frosted-glass, hacker-inspired aesthetic. Built for cybersecurity content.
  • Mobile optimised — fully responsive with a collapsible hamburger navigation menu.

Tech Stack

LayerTech
FrameworkNext.js 16 (App Router)
UIReact, Tailwind CSS, shadcn/ui
AnimationFramer Motion
IconsLucide React, React Icons
MarkdownReact-Markdown, Gray-Matter

Getting Started

Prerequisites: Node.js installed.

git clone <your-repo-url>
cd capture-the-flag-write-up
npm install
npm run dev

Adding Write-Ups

Create a .md file in content/reports/. Add this frontmatter at the top:

---
title: "Your Report Title"
slug: "url-friendly-slug"
category: "web-application"   # linux | windows | password-cracking | osint | cryptography
description: "Brief summary of the challenge and approach."
date: "YYYY-MM-DD"
---

Save the file. The portfolio picks it up automatically — no config changes needed.

Customisation

WhatWhere
Colours and themeapp/globals.css and tailwind.config.ts
Navigation linkscomponents/Main/Navigation/NavigationBar.tsx
Contact / social linkscomponents/Contact/ContactForm.tsx