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+ onebuild.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.
Then run the build:
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:
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.
- 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.
-
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. ↩