Open-source infrastructure / Developer education
PostHog Handbook Library
An unofficial living reader for PostHog's public handbook: searchable site, dated eBooks, source links, manifests, and change digests.
A rebuildable publishing layer for PostHog's public handbook. It treats the handbook as living source material, then generates a searchable reader, mobile-friendly eBooks, section volumes, print-ready HTML, source manifests, and human-readable change notes.
Status
Live
Timeline
Live reader and rebuild pipeline
Domain
Developer education
Why
Open-source infrastructure
Living handbook
Source → Reader → Editions → Diff
Mode
OSS
Reader
Live
Digest
Diffs
A rebuildable reader for a handbook that changes too often to become a static book.
Stack
Languages, services, data sources, and operating pieces behind the build.
Code Proof
What The Build Actually Contains
Version
0.2.2
Source
969 LOC
Outputs
10+
Schedule
Weekly
Live
Pages
Product proof
Living handbook
Source → Reader → Editions → Diff
Mode
OSS
Reader
Live
Digest
Diffs
A rebuildable reader for a handbook that changes too often to become a static book.
Implementation
Code Behind The Surface
Build from public source
jsThe generated reader is not manually maintained. It rebuilds from PostHog's public handbook source.
const SOURCE_REPO = "PostHog/posthog.com";
const TREE_API =
"https://api.github.com/repos/PostHog/posthog.com/git/trees/master?recursive=1";
const handbookFiles = tree
.filter((file) => file.path.startsWith("contents/handbook/"))
.filter((file) => file.path.endsWith(".md") || file.path.endsWith(".mdx"));Dated generated editions
jsEvery edition gets source links and a generated date so readers know exactly what they are holding.
const manifest = {
generatedAt: today(),
sourceRepo: "PostHog/posthog.com",
sourceRef: "master",
pages: pages.map((page) => ({
title: page.title,
sourceUrl: githubUrl(page.sourcePath),
hash: hash(page.content),
})),
};Change digest
jsThe point is not just downloadability. It shows what changed since the prior generated release.
const changes = diffManifests(previousManifest, currentManifest);
await writeFile("dist/latest/changes.md", renderMarkdownDigest(changes));
await writeFile("dist/latest/changes.json", JSON.stringify(changes, null, 2));Project Logic
Why This Exists
The useful part is the path: what was broken, what I built, and where the leverage showed up.
Mission
What makes a constantly changing public handbook easier to read without freezing it into a stale book?
PostHog's handbook is public and unusually useful, but it changes constantly. A normal eBook would be convenient for readers and immediately wrong over time. The useful product is not a static copy. It is a rebuildable reader with dates, source links, and diffs.
Build
What Had To Work
I built a Node-based publishing pipeline that discovers the live handbook source from PostHog/posthog.com, rebuilds the reader, generates complete and section-level editions, writes manifests, compares changes against the previous release, publishes to GitHub Pages, and attaches dated artifacts to GitHub Releases.
Why It Matters
Source → Reader → Editions → Diff
Makes PostHog's handbook easier to consume and revisit, and has already drawn direct thank-yous from PostHog team members.
Hard Parts
The handbook is valuable because it changes
The hard part was designing around drift. A static EPUB would be convenient for a week and misleading later.
Attribution has to be obvious
Every generated edition points back to PostHog's live handbook as the source of truth, with source links and dates attached to generated pages.
The output had to work for different readers
Some people want a web reader. Some want Apple Books or Kindle. Some want one section. Some want a full archive. The build produces each without turning the source into hand-maintained content.
Decisions
Proof
Live artifact with inspectable product surface, implementation details, and proof points.
Version: 0.2.2
Source: 969 LOC
Outputs: 10+
Searchable hosted reader
Installable offline-friendly web reader
Complete-library eBook
Tell Me About Your Project
Bring Me The Bottleneck.
I’ll Build The Answer.
Tell me what people are trying to do, where the current path breaks, and what kind of useful answer should exist.
Market Gap
Demand exists, but the answer is missing.
Workflow Drag
The work is still too manual, slow, or scattered.
Product Wedge
A small surface could prove the larger opportunity.