algoatson.github.io ~/posts
segfault@algoatson.github.io
back to index

this site is a folder of text files

2026-01-054 min readmeta site

This is a seed post. It exists to show you what the site can do and how to write for it, then you delete it. Everything below renders from plain Markdown.

The whole site is posts/*.md + one build.py. No node, no framework, no account, no tracker. Run the script, get a folder of static HTML. That's it.

adding a post#

Drop a Markdown file in posts/. Name it YYYY-MM-DD-some-slug.md. Put a small block of metadata at the top — that's the --- fenced part — and write below it.

posts/2026-01-05-example.mdyaml
1
2
3
4
5
6
7
8
---
title: this site is a folder of text files
date: 2026-01-05
tags: [meta, site]
summary: one line for the index, search, and the RSS feed.
---

Your writeup starts here. Just Markdown.

Then run the build:

rebuild + preview locallysh
1
2
3
python3 build.py            # compiles posts/ + pages/ into dist/
python3 build.py --serve    # ...and serves it at http://localhost:8000
python3 build.py --drafts   # also include posts marked draft: true

That's the entire workflow. Edit text, run script, refresh.

code listings are the whole point#

A blog like this lives and dies by how code reads. Fences render as listings with a filename, a language tag, line numbers, and a copy button. You can highlight specific lines to point at the thing that matters:

vuln.cc
1
2
3
4
5
6
int authenticate(char *input) {
    char passwd[16];
    int authed = 0;
    strcpy(passwd, input);   // no bounds check
    return authed;           // ...but `authed` sits right above `passwd`
}

Highlighting is done with weight and inverse video, not color — the entire palette is greyscale on purpose. "Syntax highlighting" here means emphasis, the way a disassembler bolds a mnemonic, not a rainbow.

why monochrome

Acid-green-on-black is the single most over-used look in this scene. Going strictly black-and-white reads as a deliberate choice instead of a default, and it makes your screenshots and diagrams sit in the page instead of fighting it. If you disagree, set accent in site.json and it'll thread a single color through links and highlights.

know your target#

Every pwn writeup opens with the same question: what are we even looking at? There's a block for that — it renders a checksec-style panel, binary facts on one side, mitigations as a greyscale checklist on the other.

target./challenge
arch
amd64-64-little
libc
2.35 (Ubuntu glibc 2.35-0ubuntu3)
category
pwn · 487 pts
  • NXon
  • PIEon
  • RELROfull
  • canaryoff
  • ASLRon

Any key: value line is a fact; values that read like on / off / full / partial / none become mitigation rows with a ✓ or ✗. The file: (or binary:) line becomes the title. No color — the enabled walls sit back in grey and a disabled mitigation, your way in, stays bright.

the grep box#

Hit / (or Ctrl-P, or click grep) and you get an fzf-style fuzzy finder over every post — title, tags, and full body text. It scores subsequence matches, rewards consecutive hits and word boundaries, and shows a snippet of where your query landed. Arrow keys or Ctrl-j/Ctrl-k to move, Enter to open, Esc to bail. Try searching this site for heap or vm.

the rest of Markdown works too#

Tables:

technique primitive it gives you mitigation that hurts
tcache poisoning near-arbitrary write safe-linking, glibc≥2.32
ret2libc call any libc function ASLR, PIE
format string read/write where you point -Wformat, FORTIFY

Footnotes for the asides that would otherwise wreck a sentence.1 Task lists, for tracking a target:

  • dump the binary
  • find the check
  • actually beat the check

hiding the flag#

Half of writing a CTF post is not spoiling it. You want the walkthrough public but the flag folded away until the reader decides they want it. That's a spoiler block:

the flag

segfault{y0u_r34d_th3_wh0le_th1ng} — recovered by walking the tcache next pointer to __free_hook. Boring once you've seen the mechanic. That's the point.

It's a plain <details>, so it still folds shut with JavaScript off. Use ??? for any collapsible aside and ???+ to start it open; the first word (spoiler, note, warning, …) picks the style.

While you read, two things track you quietly: on a wide screen the contents list pins to the right and marks the section you're in, and the hairline along the top of the window is a reading-progress bar. Both are JavaScript sugar — kill it and the post is still a clean document. Posts that share a tag also grow a small related list at the foot.

keyboard-driven by default#

j/k move down the index, g g jumps to top, G to bottom, Enter opens the selected post, t flips to light mode, and ? shows every shortcut. None of it is required — kill JavaScript entirely and the site is still a clean, readable document. The keys are a bonus for people who live in the terminal.

That's the tour. Delete this file, write something real, run the script.


  1. Like this one. Footnotes render at the bottom and link both ways, so a reader can dip into the tangent and get back without losing their place.