How All 78 Zodiac Sign Pairs Get a Genuinely Different Description
There are 78 possible unordered pairs among the 12 zodiac signs, and each one gets its own `/zodiac/compatibility/[a]/[b]` page with a description that actually differs pair to pair — not a templated sentence with the sign names swapped in. Here's how that's done without writing 78 paragraphs by hand.
Three tables, composed together
Every pair's paragraph is built from three separate sentence tables: one for the aspect (the angular distance between the two signs — conjunction, semisextile, sextile, square, trine, quincunx, or opposition; 7 possible sentences), one for the element combination (whether the two elements traditionally flow well together; 7 sentences), and one for the modality combination (cardinal, fixed, or mutable — either the same or different; 2 sentences). The three matching sentences for a given pair are concatenated into one paragraph.
Why three axes instead of one
7 aspect sentences × 7 element sentences × 2 modality sentences works out to a large number of distinct combinations — far more real variety than any one axis alone could produce, and far cheaper to maintain than 78 hand-written paragraphs. Because the three facts come from `lib/compat.ts`'s actual `compatibility()` calculation for that specific pair (the same math behind the numeric score), the description that comes out is genuinely about that pairing, not a generic template with two names dropped in.
Same principle across every language
Each of the three sentence tables exists fully translated for all 8 site languages, so the composition happens after translation rather than being machine-translated as one finished paragraph — every language gets the same real per-pair variety, not a lower-quality fallback. Browse any pair on `/explore` or check your own on `/compat`. For entertainment.