The /phoenix-be route (phoenix-be.astro, 4976 lines) — the long-form “Phoenix
Be hostile takeover” investigation/exposé, the single largest file in the repo.
It is one editorial article: a frontmatter block of imports + small data
assembly, then ~21 <h2> sections of prose, screenshots (<Image>), embedded
videos, two editorial succession diagrams, the reused coaching-scam findings
component, and a relationship-map island at the end. A single-file node — no
Children section. The documentation value is the page’s shape and wiring, not
its argument; the prose is not transcribed here.
:1-296)export const prerender = true (phoenix-be.astro:190) — static page.
Component/layout imports (:2-22): Image from astro:assets; MainLayout;
External, OfficialCoachingScamFindings, PersonProfile, Quote, Contact
(all ../components/*); and the two Vue islands BadActorsApp and
SuccessionGraphs (../components/bad-actors/*).
Data imports (:10-20): the dataset arrays people as rawPeople,
organizations as rawOrganizations, items, claims, relationships,
events, evidence from ../components/bad-actors/data; the BadActorsData
type from .../data/types; and pageMeta from ../data/pageMeta.
≈165 ../assets/* image imports (:24-188, including a few under
../assets/entities/** and ../assets/people/**). Several are dead —
declared but never rendered (see Invariants for the confirmed set); they are
not transcribed here.
Local image-array consts built from those imports (:192-246):
kimMiaPostImages, kimMiaAnswerInterpolImages, kimMiaFollowupImages,
kimMiaFinalImages, linaAninaComplicityImages, samSchulteComplicityImages,
shoshannaEmailImages — grouped screenshot lists .map-rendered in their
sections (or in commented-out blocks; three are dead — see Invariants).
SuccessionGraphs editorial data (:248-256):
const phoenixLiesPeople = [{ id:'aajonus', photoUrl: aajonusPhoto.src }, { id:'jim', … }, { id:'phoenix', … }] as any; and
const phoenixLiesExtraPhotos = { paul: paulPhoto.src }; — only .src strings,
passed to both SuccessionGraphs instances.
Build-time image-resolve bridge (:258-295) — mirrors bad-actors.astro:
badActorsPhotoMap: Record<string, ImageMetadata> (:258) maps 11 person ids
→ imported ImageMetadata. Note the deliberate swap: kimberly →
badActorsAvyannaProfile and avyanna → badActorsKimberlyProfile
(:262-263) — the two photos are crossed by id.badActorsLogoSources: Record<string, ImageMetadata[]> (:272) maps only
'primal-planitz' → 2 logos.const badActorsData: BadActorsData (:276-290) — spreads each rawPeople
entry adding photoUrl: badActorsPhotoMap[person.id]?.src ?? '', each
rawOrganizations entry adding logoUrls: …?.map((s) => s.src) ?? [], and
passes items/claims/relationships/events/evidence through unchanged.
This fills the data layer’s intentionally-blank photoUrl/logoUrls — see
src/components/bad-actors/data/DOCS.md and the same pattern documented in
src/pages/_utility.DOCS.md (don’t re-derive the mechanics).const badActorsExtraPhotos = { jim: jimPhoto.src, paul: paulPhoto.src }
(:292-295) — extra photos for ids with no Person record.Note this page resolves images via .src on the imported ImageMetadata
directly (build-time, synchronous), not via the async getImage() helper
that bad-actors.astro uses — same intent, simpler mechanism.
:298-368)Renders <MainLayout {...pageMeta.phoenixBe}> (:298) — spreads the
pageMeta.phoenixBe SEO block (a Phase 5 file; only the import is noted here).
Page chrome: a masked cover <Image> (:300-309), the .page-title h1
(:311-314), and an .article-meta block with a hard-coded “Last updated
June 1st, 2026” <time datetime="2026-06-01"> (:318) and a <details>
author card “By Rom” (:320-366). A plain table-of-contents (:601-624)
anchor-links the 20 sections below.
<h2>; one line each)#overview, :419) — bullet summary of the whole thesis;
intentionally media-free (“no media on purpose to stay as short as possible”,
:423). Prose only.#phoenix-the-impostor, :627) — the “official
successor” claim; screenshots + both SuccessionGraphs diagrams:
show="phoenix-lies" (:663) then show="reality" (:710).#attacking-primal-diet-websites,
:926) — screenshots, an inline <video> (:1015), and a <Quote>
attributed to “Phoenix Be” (:1025).#covering-up-aajonus-unreleased-data,
:1076) — screenshots + external link.#phoenix-2021-kim-mia-hostile-takeover, :1121) — <PersonProfile> for
Kim Mia (:1129) and a collapsible <details class="kim-mia-archive">
(:1175-1484) holding the screenshot archive, several rendered via the
kimMia*Images .map consts (:1309, :1324, :1392).#complicity-with-an-abuser-of-criminal-nature, :1639) — screenshots +
<External> to eatrawmeat.online (:1677).#sam-schulte-complicity, :1829) —
<PersonProfile> (:1835) + screenshots.#kimberly-williams-complicity, :2119) —
screenshots, a verbatim email <blockquote class="email-quote"> (:2223),
and a styled <article class="contract-document"> reproducing the “agreement”
text (:2287-2452).#the-scam, :2582) — a click-to-reveal
.findings-reveal button that unhides <OfficialCoachingScamFindings headingLevel={3} /> (:2594). One line + link: the 1778-line findings
component (incl. its comparison chart) is documented in
src/components/DOCS.md — not re-summarized here.#food-quality-issues-without-warnings, :2600) — one screenshot
(two more commented out).#phoenix-defamation-against-me,
:2647) — screenshots.#phoenix-avyanna-gender-ideology,
:2739) — screenshots.#other-accomplices-in-phoenix-lineup,
:2780) — an .accomplice-list (:2804-2847) with inline <Image>
avatars (Jeff Slay / Betsy / Tom) + one more screenshot.#refusal-to-address-issues, :2890) —
screenshot.#complicity-of-other-scammers-and-abusers, :2953) — .map-rendered
linaAninaComplicityImages (:2963) + three <External> cards (Lina,
Anina, residentraw) (:2981, :2989, :3003).#superficial-friendliness, :3032) —
screenshots.#motives-and-psychology-of-phoenix,
:3097) — the longest section; a .findings-reveal landing-page reveal
(:3162), three <Quote> blocks attributed to “Phoenix Be” (:3407,
:3421, :3518), inline <video>s, many screenshots, and an
.org-website-list of his 5 sites with logos (:3781-3817).#conclusion, :3896) — the open-letter demands list,
screenshots, and the <Contact /> component (:4005).#testimonies, :4013) — a run of screenshot <Image>s.#qa, :4145) — six <h3> sub-questions with ids:
qa-why-focus-on-those (:4147), qa-stance-on-conference (:4163),
qa-note-to-investors (:4198), qa-can-he-change (:4226),
qa-negative-intents (:4235), qa-what-to-do (:4248).#relationship-map, :4262) — the BadActorsApp
island (see below).<SuccessionGraphs people={phoenixLiesPeople} extraPhotos={phoenixLiesExtraPhotos} show="phoenix-lies" />
(:663) and the same with show="reality" (:710). This page is the real
consumer of the show prop — it renders one editorial card per call, unlike
the SPA which shows both. See src/components/bad-actors/DOCS.md.<BadActorsApp client:visible data={badActorsData} extraPhotos={badActorsExtraPhotos} variant="map-directory" />
(:4265, inside .bad-actors-embed). client:visible → hydrates on
scroll-into-view. This page is the real consumer of variant="map-directory"
(graph + directory only, no tab bar) — bad-actors.astro does not pass it. See
src/components/bad-actors/DOCS.md for what the prop does; not re-derived here.<script> (:4272-4329)A single module script with two behaviors:
:4273-4280): for every [data-findings-toggle] button,
on click removes hidden from the sibling [data-findings-content] and
removes the button. Drives the “The scam” / landing-page / etc. reveals.:4282-4328): injects a .heading-share
button after each #main-content > section > div > h2[id] / h3[id]. On click
copies location.origin + location.pathname + '#' + heading.id via
navigator.clipboard.writeText (:4303) with an execCommand('copy')
textarea fallback (:4311), then history.replaceState to the hash and shows
a transient “Link copied!” label (1600 ms timer). The selector depends on the
MainLayout/Layout DOM (#main-content > section > div) — static reading
insufficient for which headings actually match; behavior depends on the layout
markup (see src/layouts/DOCS.md)..heading-share* elements are styled via :global(...) rules
(:4350-4400) precisely because runtime-injected nodes don’t get Astro’s
scoped-style hash (noted in a source comment, :4350)./media/video/primaldiet_website_broken.mp4
(:1016), /media/video/phoenix_conscious_dating_baby_laugh.mp4 (:3326),
/media/video/phoenix_joint_mission.mp4 (:3462),
/media/video/phoenix_scream.mp4 + poster /media/video/posters/phoenix_scream.jpg
(:3560-3561) — served from public/, not bundled assets.<External>
evidence-site links (eatrawmeat.online, rawprimaldiet.info, therealanina.info,
residentraw.com).../layouts/MainLayout.astro — <MainLayout {...pageMeta.phoenixBe}>
(:298). See src/layouts/DOCS.md for the MainLayout → Layout chain
(<head>/SEO/JSON-LD, scroll-nav, sitemap).src/components/DOCS.md): External (×4), PersonProfile
(×2), Quote (×4), Contact (×1), and OfficialCoachingScamFindings
(headingLevel={3}, ×1, the 1778-line findings + comparison chart).src/components/bad-actors/DOCS.md): SuccessionGraphs
(show="phoenix-lies" / show="reality") and BadActorsApp
(client:visible, variant="map-directory").../components/bad-actors/data arrays + BadActorsData type
(src/components/bad-actors/data/DOCS.md); ../data/pageMeta → pageMeta.phoenixBe
(Phase 5 file — import only).astro:assets: Image component + the ≈165 ../assets/** imports;
ImageMetadata type used for the resolve maps.bad-actors.astro — the data
layer’s blank photoUrl/logoUrls are filled here at build (:276-290), via
.src on imported ImageMetadata rather than the async getImage() helper
bad-actors.astro uses. Same concept, lighter mechanism.badActorsPhotoMap crosses kimberly↔avyanna photos (:262-263):
kimberly → badActorsAvyannaProfile, avyanna → badActorsKimberlyProfile.
Confirm with the author whether the swap is intentional (see Open questions).SuccessionGraphs is driven by show here — one card per instance
(phoenix-lies, then reality) — unlike the standalone SPA which renders both.BadActorsApp uses variant="map-directory" — graph + directory only, no
tab bar; this page (not bad-actors.astro) is where that variant is exercised.pnpm check at 066ca22 —
16 declarations in this file, an import ≠ on-page use, matching the repo-wide
Phase 2/3 pattern). The brief listed 5; the actual set is larger:
.map blocks are commented
out): kimMiaPostImages (:192), samSchulteComplicityImages (:231),
shoshannaEmailImages (:239).kimMiaAnswerInterpol10 (:52),
kimMiaFinal05 (:60), phoenixIntroLogo (:85),
phoenixIntroPrimalDietLogoStrip (:90),
phoenixImpostorAngeliaTrademarkComment (:97),
phoenixImpostorJimTrademarkMessage (:102),
phoenixPsychologyBlossomAndBeAboutPrimalDiet (:116),
phoenixPsychologyVinceValiantHeavenOnEarth (:125),
phoenixPsychologyNoAuthority (:126),
phoenixWebsitePrimaldietPopup (:127),
phoenix2025ConferenceInvestigativeJournalist (:131),
phoenix2025ConferencePrimalNameFrozenMeat (:132),
samSchulteStoryHeartReaction (:174).
Most correspond to commented-out <figure> blocks still present in the source.phoenixLiesPeople is cast as any (:252) to satisfy the
SuccessionGraphs people prop with only { id, photoUrl } partials.document.execCommand('copy') is deprecated (:4311, flagged as a hint by
pnpm check) — kept as the clipboard fallback.:318) is editorial, not
derived — a staleness consideration.kimberly↔avyanna photo crossing in badActorsPhotoMap
(:262-263) intentional? It is legible as written but reads like a possible
copy/paste swap — needs author input.h2[id]/h3[id] set the copy-link script binds to depends on the
MainLayout/Layout #main-content > section > div wrapper structure
(:4289) — behavior unclear from this file alone; see src/layouts/DOCS.md.