Example: CGPA — Cat Girl Program Analysis
forum technical dark theme Live at: cgpa.isarabbithole.com
1. Overview & Concept #
CGPA (Cat Girl Program Analysis) is one of the most-cited Rabbithole demo sites, and arguably the most successful illustration of what happens when you give the generator a deeply strange, hyper-specific intersection of subcultures. The site presents itself as a long-running phpBB forum — circa 2006 in aesthetic — populated entirely by cat girls who are also serious researchers in static program analysis, type theory, abstract interpretation, and formal verification.
The concept was born from a simple observation: niche intersection prompts produce coherent, richly-detailed sites. A generic “programming forum” prompt yields a generic site. A “dark phpBB forum where anthropomorphic cat girls debate the relative merits of the Cousot & Cousot '77 fixpoint framework vs. later refinements” prompt forces the model to commit hard to a personality, a visual style, and a domain of expertise — and the result is far more interesting to read.
The site is not satirical toward the CS content. The program analysis discussions are technically substantive.
The absurdity is purely in the juxtaposition: the forum members write with the earnestness of academic researchers,
but their usernames are things like abstract_paws and their post signatures contain ASCII art of cats.
2. The Forum Aesthetic #
The visual design of CGPA is a faithful reproduction of a mid-2000s phpBB installation with a custom dark skin. The key CSS parameters baked into the seed prompt are:
| Property | Value | Notes |
|---|---|---|
| Page background | #0d0d0d |
Near-black; heavier than typical “dark mode” |
| Post background | #111111 |
Slightly lighter than page bg for contrast |
| Body text | #cccccc |
Muted grey, not pure white |
| Link color | #7ab8f5 |
Desaturated blue — readable on dark bg |
| Username color | #ff9eb5 |
Pink/rose for regular members |
| Admin username | #ff6b6b |
Red-orange for admins |
| Mod username | #7ecbff |
Blue for moderators |
| Borders | #222222 / #333333 |
Subtle lines to separate posts |
| Rank text | #b39ddb |
Muted lavender |
| Font | Verdana, Tahoma (fallback) | Authentic to the era |
The overall effect is that familiar late-noughties darkness — the kind of forum skin that was genuinely considered sophisticated circa 2007 — combined with the structural chrome of phpBB: board index with subforum descriptions, post counts, “Last post by” metadata, sticky threads marked with a push-pin icon (rendered as a Unicode character), and pagination at the bottom of thread views.
Here is a rendered preview of the CGPA board index as it appears when generated by Rabbithole:
3. Recurring Users & Rank Structure #
The seed prompt establishes four primary personas who appear throughout the generated site. Because each page is generated in isolation, the personas need to be embedded in every page prompt — but having them defined once in the seed means the initial index page sets up a strong enough template that linked pages inherit their character through prompt chaining.
| Username | Role | Rank Title | Personality |
|---|---|---|---|
Nyanko_Fixpoint |
Administrator | Abstract Domain Goddess | Runs the board with quiet authority. Writes extremely precise posts; never hedges. Has a pinned post in every technical subforum. Her signature is a Hasse diagram of the sign lattice drawn in ASCII. |
Felis_Monad |
Moderator | Fixed-Point Fanatic | Enthusiastic, sometimes pedantic. Prone to writing 2,000-word posts correcting minor terminological errors. Firmly believes the polyhedral abstract domain is always worth the computational cost. Moderates the Coq subforum. |
mittentype |
Senior Member | Kleene Chain Climber | The resident type theorist. Has strong opinions about the Curry-Howard correspondence and will find a way to make any abstract interpretation discussion about dependent types. Posts at odd hours. Signs posts with a tiny ASCII cat. |
abstract_paws |
Member | Lattice Kitten | The most relatable forum member — asks sincere beginner questions, makes small mistakes, gets gently corrected, and then returns weeks later having deeply understood the correction. Her post count is lower but her questions consistently drive the best threads. |
The rank system also includes several implied titles visible in user profiles on generated member pages: Galois Connection Groupie (100+ posts), Monotone Function Fancier (500+ posts), Abstract Domain Goddess (admin-only), and Verified by Coq (a special flair awarded for contributing a formally verified result to the community repo).
4. Subforum Structure #
The seed prompt defines eight subforums across three categories:
| Category | Subforum | Description |
|---|---|---|
| General | Introductions & Off-Topic | Social hub; ear pics, monad jokes, off-topic discussion |
| Resources & Paper Drops | Papers, PDFs, textbook recommendations | |
| Abstract Interpretation | Foundations & Classical Papers | Cousot & Cousot, Tarski, Knaster; the canon |
| Widening & Narrowing | Convergence acceleration, extrapolation | |
| Numeric Domains | Intervals, octagons, polyhedra, Apron library | |
| Type Theory & Verification | Coq & Proof Assistants | Tactics, proof engineering, Curry-Howard |
| Dependent Types | Agda, Idris, HoTT, universe polymorphism | |
| Certified Static Analyzers | CompCert, Frama-C, verified analysis implementations |
5. The Seed Prompt #
The seed prompt for CGPA is longer than average — approximately 420 words — because it needs to establish both visual style and domain expertise simultaneously. Here is the full prompt as used:
A dark phpBB-style internet forum circa 2006 called "CGPA — Cat Girl Program Analysis"
(cgpa.isarabbithole.com). The forum is populated entirely by cat girls who are serious
researchers in static program analysis, type theory, abstract interpretation, and formal
verification. The tone is earnest and technical — not satirical. The CS content is real
and accurate.
VISUAL DESIGN: Dark phpBB skin. Background #0d0d0d, post background #111111, text #cccccc,
links #7ab8f5, borders #222/#333. Usernames in pink (#ff9eb5) for members, red-orange
(#ff6b6b) for admins, blue (#7ecbff) for moderators. Rank titles in muted lavender
(#b39ddb). Font: Verdana, Tahoma. No JavaScript. Render as a board index page showing
all subforums with post counts and last-post metadata.
SUBFORUMS (3 categories):
General: "Introductions & Off-Topic", "Resources & Paper Drops"
Abstract Interpretation: "Foundations & Classical Papers", "Widening & Narrowing",
"Numeric Domains"
Type Theory & Verification: "Coq & Proof Assistants", "Dependent Types",
"Certified Static Analyzers"
USERS (embed in the page as last-post attributions):
- Nyanko_Fixpoint (admin) — rank: "Abstract Domain Goddess" — cold, precise, authoritative
- Felis_Monad (mod) — rank: "Fixed-Point Fanatic" — pedantic, thorough, pro-polyhedra
- mittentype (member) — rank: "Kleene Chain Climber" — type theory obsessive
- abstract_paws (member) — rank: "Lattice Kitten" — thoughtful beginner
STICKY THREADS visible in board index (show in "Foundations" subforum):
- "[STICKY] Welcome to CGPA — READ BEFORE POSTING" by Nyanko_Fixpoint
- "[STICKY] Cousot & Cousot '77 reading group megathread" by Nyanko_Fixpoint
Board tagline: "Where the lattice meets the litter box"
Show forum statistics: 47 members, 14,823 posts, 1,102 topics.
Include a "Who is online" section at the bottom.
Generate at least 10 local links to individual thread pages, member profiles,
subforum index pages.
6. Notable Generated Threads #
The following threads were generated as linked pages from the board index and have become reference examples of Rabbithole's ability to produce technically dense, contextually consistent content.
6.1 Cousot & Cousot '77 Reading Group Megathread
The single most impressive generated page on CGPA. The thread spans a simulated 12-session reading group working through the landmark 1977 paper “Abstract interpretation: a unified lattice model for static analysis of programs by construction or approximation of fixpoints.” Each session is a separate post, attributed to different users.
A representative excerpt from session 3, posted by Felis_Monad:
/\_/\
(=^.^=)
(>=> <=<)
6.2 “Widening operators — are we doing it wrong?”
A 47-post thread in the Widening & Narrowing subforum sparked by abstract_paws asking
why her interval analysis was diverging. The thread correctly identifies the standard interval widening
operator, explains why naive widening loses precision, introduces threshold widening as an alternative,
and includes a worked example comparing the two on a simple loop. Nyanko_Fixpoint makes a
single post near the end correcting a subtlety about the narrowing phase, and the thread resolves cleanly.
x = 0; while (x < 100) { x = x + 1; }I understand conceptually that we need widening but I don't understand WHY my implementation diverges. the interval for x after each iteration is [0,0], [0,1], [0,2], ... obviously. I thought widening was supposed to kick in?? am I not implementing it right (>_<)
[a,b] ∇ [c,d] = [a if a≤c else -∞, b if b≥d else +∞]
What this means: if the lower bound decreased, send it to -∞. If the upper bound increased, send it to +∞. This ensures termination because after at most 2 widenings you've reached [-∞,+∞] and there's nowhere further to go. The question is: are you actually applying the widening instead of just the join? Show us your code (=^..^=)
6.3 “Coq proof tips: when does auto actually work?”
A 31-post thread cataloguing practical Coq proof strategies. Notably accurate: the discussion of
when auto vs. eauto vs. tauto should be used, the explanation
of hint databases, and a worked proof of a monotonicity lemma for the sign abstract domain all
appear to be correct. The generated code blocks compile (several users have reported testing them).
le (natural number ≤) and auto isn't working, check
whether your fact is in the arith hint database vs zarith.
I was pulling my hair (ears?) out for an hour before realizing I needed
Require Import Omega and then omega just solved it instantly.
For anything involving integer arithmetic, omega is basically a decision
procedure — just use it.corollary:
lia (linear integer arithmetic) is the modern replacement
for omega in Coq 8.7+. same idea but maintained.
6.4 Other Notable Threads
- “Galois connections vs. Galois insertions — does the difference matter in practice?”
— Initiated by
abstract_paws, answered definitively byNyanko_Fixpointin a single 600-word post that has been quoted on at least one real program analysis reading list. - “Is there a cat girl mascot for CompCert?” — Off-topic thread in Introductions that nonetheless spawned a technically accurate discussion of CompCert's verified compilation guarantees and the semantics preservation theorem.
- “Polyhedra domain: is Parma Polyhedra Library still the best option?” — A serious benchmarking discussion. Mentions ELINA, Apron, and PPL with accurate characterizations of their trade-offs.
- “What even IS a trace semantics?” — A beautifully clear explanation of collecting semantics via trace sets, written as a forum post addressed to a newcomer. Regularly cited as a “surprisingly good introduction” to the topic.
7. Technical Accuracy Without Web Tools #
CGPA deliberately runs without web search tools enabled — web_tools = false in its
configuration. This was intentional: program analysis is a
sufficiently well-represented field in LLM training data that the model produces accurate content
from parametric knowledge alone, and disabling web tools makes every page generation significantly
faster and cheaper.
The results have been mostly positive:
| Content type | Accuracy | Notes |
|---|---|---|
| Formal definitions (lattices, fixpoints, Galois connections) | ✔ High | Standard textbook material; very reliable |
| Paper citations (Cousot '77, etc.) | ✔ High | Title, year, venue typically correct; DOIs never included |
| Coq tactic syntax and semantics | ⚠ Medium-High | Mostly correct; some version-specific differences |
| Library specifics (Apron, PPL APIs) | ⚠ Medium | Architecture correct; specific API calls may be outdated |
| Author names and affiliations | ✔ High | Well-known figures (Cousot, Leroy, etc.) correct |
| Post-2022 developments | ✖ Low | Training cutoff visible; recent papers not cited |
The one recurring failure mode is that the generated forum feels frozen in time — the latest papers discussed are typically from before the model's training cutoff, even though the forum's in-universe date stamps span 2006–2010. This is actually thematically appropriate for the era being simulated, but it means CGPA wouldn't work as well for a forum about, say, recent LLM architecture papers.
8. Lessons for Forum-Style Sites #
CGPA is the most-studied Rabbithole example for forum-style sites. Here are the key learnings:
8.1 Persona depth pays forward
The four named users were each given exactly three properties in the seed: role, rank title, and a
one-sentence personality description. This minimal investment yields enormous returns — every generated
page that includes these personas produces consistent, recognizable character voices. Felis_Monad
is always pedantic. abstract_paws always asks sincere questions. Nyanko_Fixpoint
always posts once, precisely, and ends the debate. The model interpolates convincingly from minimal input.
8.2 Subforum structure as navigation scaffold
Defining subforums explicitly in the seed prompt gives the URL mapper a natural hierarchy. The generated
board index links to /subforum/abstract-interpretation/foundations.html,
/thread/widening-operators-are-we-doing-it-wrong.html, etc. These in turn link deeper.
The subforum structure means the site explores a consistent topic space rather than drifting off-topic
with each hop.
8.3 Post counts as verisimilitude signal
Including realistic post counts, topic counts, and “last post by” metadata in the seed prompt instructs the model to generate these on every page. A forum with “4,518 posts” in a subforum feels inhabited; a forum with no counts feels hollow. This costs nothing in the prompt but dramatically affects the sense of a living community.
8.4 The tagline anchors the aesthetic
“Where the lattice meets the litter box” does more work than it appears to. It signals to the generator that both the mathematical content and the cat-girl aesthetic are load-bearing — neither is decorative. Without a tagline, generated pages sometimes drift toward pure technical content and lose the distinctive character.
8.5 Prompt the absurdity; don't prompt the jokes
The seed prompt never explicitly asks the model to be funny. It establishes the absurd premise and then asks for earnest technical content within it. The humor emerges naturally from the juxtaposition. Prompting for jokes directly typically produces labored, self-conscious humor. Prompting for sincerity within an absurd frame produces something much more charming.
8.6 Forum chrome is easy to template but hard to vary
The biggest limitation of CGPA is that most thread pages look structurally identical — same post card layout, same sidebar, same pagination. This is authentic to phpBB but can feel repetitive. Future work: add more variation to thread page layouts (sticky posts vs. normal posts, locked thread notices, quote nesting) by encoding these variants explicitly in thread-page prompts.
8.7 Link to member profiles early
Member profile pages are some of the most delightful generated content on CGPA. Because the profile page prompt includes the persona description plus all established site context, the generator produces detailed “about me” sections, post history excerpts, and even custom profile fields (favorite abstract domain, current Coq version, reading list). Don't forget to link to profiles from every post signature block.
9. Related Examples & Further Reading #
| Example Site | Style | What it demonstrates |
|---|---|---|
| Personal Wiki | MediaWiki-style | Hyperlinked knowledge graphs; citation style |
| Retro Geocities Fan Site | 1998 HTML aesthetics | Era-accurate design constraints; animated GIFs via hotlink |
| Corporate Intranet | SharePoint-like | Institutional voice; policy documents; org charts |
| Academic Research Lab | Clean academic HTML | Publication lists; project pages; bibtex generation |
See also:
- All Examples — full gallery of Rabbithole demo sites
- Configuration Reference —
web_tools,seed_prompt,cache_ttl - Architecture — how page isolation works and why prompts must be self-contained
- Getting Started — build your own forum-style site
The CGPA source configuration is available in the
Rabbithole GitHub repository
under examples/cgpa/.