Skills ljagiello ctf-skills ctf-skills
ctf-writeup
- Use it when:
- You have solved a CTF challenge and want a clean writeup for teammates or organizers.
- It does:
- Gathers the metadata, artifacts and timeline from the session and fills a submission template.
- You get:
- A writeup.md file with summary, step-by-step solution, one complete solve script and the flag.
- Runs:
- When you invoke it by name, after the solve.
Skill 11 of 11 in the ctf-skills bundle, after ctf-misc.
TL;DR
A category skill in the ctf-skills suite that runs after a solve. You invoke it by name; it collects the challenge metadata (name, event, category, difficulty, points, flag format), the exploit scripts and artifacts, and the timeline from the session, then writes a standardized submission-style writeup to writeup.md (or writeup-<name>.md) using a fixed template: summary, numbered solution steps, one complete solve script, and the flag. It optimizes for speed and reproducibility so a teammate or organizer can validate the solve.
Summarizes the skill at 2ad85d3.
npx skills add https://github.com/ljagiello/ctf-skills --skill ctf-writeup skills.sh pageSource on GitHubAll skills from ljagiello/ctf-skills
- Total Downloads
- 8,500 on skills.sh, Nov 9, 2026
- Repo stars
- 3,662 ljagiello/ctf-skills
- First seen
- Mar 27, 2026 on skills.sh
Weekly values
| Week to | Installs |
|---|---|
| Sep 21 | 297 |
| Sep 28 | 240 |
| Oct 5 | 142 |
| Oct 12 | 193 |
| Oct 19 | 281 |
| Oct 26 | 258 |
| Nov 2 | 338 |
| Nov 9 | 256 |
| Category |
Compliance, guardrails, skill vetting and browser fingerprinting. Everything for building software: planning, coding, debugging, design, frameworks, cloud, agents and skills. |
|---|---|
| Type |
A one-shot action you invoke by name, such as turning the conversation into a PRD. |
| Effect |
Its own steps create or change files, git state or local tools. |
| Needs |
Instructions only. Works in any agent that supports skills. |
| Publisher |
Everyone else. Unverified vendor claims default to community. |
| Topics |
SKILL.md
From ljagiello/ctf-skills at 2ad85d3. Checked daily, last changed Nov 6, 2026.
Frontmatter
name: ctf-writeup
description: Generates a single standardized submission-style CTF writeup for competition handoff and organizer review. Use after solving a CTF challenge to document the solution steps, tools used, and lessons learned in a structured format.
license: MIT
compatibility: Requires filesystem-based agent (Claude Code or similar) with bash and Python 3.
allowed-tools: Bash Read Write Edit Glob Grep Task WebFetch WebSearch
metadata:
user-invocable: "true"
argument-hint: "[challenge-name]"
author: Lukasz JagielloCTF Write-up Generator
Generate a standardized submission-style CTF writeup for a solved challenge.
Default behavior:
- During an active competition, optimize for speed, clarity, and reproducibility
- Keep writeups short enough that a teammate or organizer can validate the solve quickly
- Always produce a
submission-style writeup - Prefer one complete solve script from challenge data to final flag
Workflow
Step 1: Gather Information
Collect the following from the current session, challenge files, and user input:
- Challenge metadata — name, CTF event, category, difficulty, points, flag format
- Solution artifacts — exploit scripts, payloads, screenshots, command output
- Timeline — key steps taken, dead ends, pivots
# Scan for exploit scripts and artifacts
find . -name '*.py' -o -name '*.sh' -o -name 'exploit*' -o -name 'solve*' | head -20
# Check for flags in output files
grep -rniE '(flag|ctf|eno|htb|pico)\{' . 2>/dev/null
Step 2: Generate Write-up
Write the writeup file as writeup.md (or writeup-<challenge-name>.md) using the submission template below.
Templates
Submission Format
---
title: "<Challenge Name>"
ctf: "<CTF Event Name>"
date: YYYY-MM-DD
category: web|pwn|crypto|reverse|forensics|osint|malware|misc|ai-ml
difficulty: easy|medium|hard
points: <number>
flag_format: "flag{...}"
author: "<your name or team>"
---
# <Challenge Name>
## Summary
<1-2 sentences: what the challenge was and the core technique. Keep it direct.>
## Solution
### Step 1: <Action>
<Explain the key observation in 3-8 short lines. Keep it direct.>
\`\`\`python
<one complete solving script from provided challenge data to printing the final flag>
\`\`\`
### Step 2: <Action> (optional)
<Only add this when a second short step genuinely helps readability, such as separating the core observation from final verification.>
### Step 3: <Action> (optional)
<Use only if the challenge really needs it. Keep the total number of steps small.>
## Flag
\`\`\`
flag{example_flag_here}
\`\`\`
Guidance:
- Prefer 1-3 short steps total
- Keep code to the smallest complete solving script
- Do not split "recover secret", "derive key", and "decrypt flag" into separate partial snippets
- The script should start from the challenge data and end by printing the flag
- Avoid long background sections
- Avoid dead ends unless they explain a key pivot
- Avoid multiple alternative solves; pick one clean path
- Redact the flag only if the user explicitly asks for redaction
Best Practices Checklist
Before finalizing the writeup, verify:
- [ ] Metadata complete — title, CTF, date, category, difficulty, points, author all filled
- [ ] Flag handling matches request — keep the real flag unless the user asked for redaction
- [ ] Reproducible steps — a reader can follow your writeup and reproduce the solution
- [ ] Code is runnable — exploit scripts include all imports, correct variable names, and comments
- [ ] No sensitive data — no real credentials, API keys, or private infrastructure details
- [ ] Length stays concise — the writeup is short enough for fast review
- [ ] Tools and versions noted — mention specific tool versions if behavior depends on them
- [ ] Proper attribution — credit teammates, referenced writeups, or tools that were essential
- [ ] Grammar and formatting — consistent heading levels, code blocks have language tags
Quality Guidelines
DO:
- Explain just enough for fast verification
- Include one complete solving path, not multiple alternative routes
- Include one complete script that goes all the way to the final flag
- Show actual output (truncated if very long) to prove the approach worked
- Tag code blocks with language (
python,bash,sql, etc.) - Keep the main path front-loaded so a reader can validate it quickly
DON'T:
- Copy-paste raw terminal dumps without explanation
- Paste several partial snippets that force the reader to reconstruct the final solve
- Leave placeholder text in the final writeup
- Include irrelevant tangents that don't contribute to the solution
- Assume the reader knows the specific challenge setup
Challenge
$ARGUMENTS