A connected wiki of the UFO/UAP discourse. 2,258 pages, ~29,000 connections, growing.
The goal: map who is who, where things happened, what concepts recur, and how they all link across a fragmented field whose sources rarely cite each other directly. Most UFO content lives in long podcasts, books, and obscure documents that never connect to one another. This KB does the connecting.
| Count | |
|---|---|
| People (witnesses, researchers, officials, contactees, journalists) | 957 |
| Concepts & frameworks (claims-theses, disclosure-narratives, etc.) | 406 |
| Organizations (agencies, programs, occult orders, media) | 260 |
| Incidents (sightings, hearings, leaks, public events) | 138 |
| Places (bases, incident sites, regions) | 129 |
| Documents (FOIA, books, memos, leaks) | 103 |
| Programs (AAWSAP, Stargate, MK-Ultra, ATIP, …) | 84 |
| Tech artifacts (alleged materials, patents, implants) | 36 |
| Craft & entity phenomena (Tic-Tac, Greys, Mantids, …) | 18 |
| Synthesis pages (cross-source comparisons, gap analyses) | 13 |
| Source summaries (mostly YouTube transcripts) | 110 |
| Raw transcripts | 116 |
Every page lives in ufo-kb/wiki/ as plain Markdown with structured YAML frontmatter and [[wikilinks]] between pages. Every claim cites its raw source in ufo-kb/raw/.
You don't need any tooling to browse — the wiki is plain Markdown.
- Open
ufo-kb/CONSTITUTION.mdfirst to understand the schema (entity types, connection rules, naming conventions). - Browse pages directly:
ufo-kb/wiki/entities/people/— individualsufo-kb/wiki/concepts/— recurring claims and analytical lensesufo-kb/wiki/synthesis/— curated cross-source analyses (start here for the high-leverage stuff)ufo-kb/wiki/youtube-transcripts/— per-source summaries with claim extraction
- Tools like Obsidian render the wikilinks natively — point a vault at
ufo-kb/wiki/for a navigable graph view.
This repo ships with three Claude Code skills that together let an LLM walk the graph and answer questions with sentence-level path-as-citation grounding.
Setup:
- Install Claude Code.
- Install
qmd(the embeddings index used for cold seed-finding):pip install qmd
- Build the search index:
cd ufo-kb qmd update --collections ufo-kb qmd embed - Open the project in Claude Code:
cd ufo-kb claude - Ask a question. Claude auto-loads the right skill:
/kb-query "How does Lue Elizondo connect to the Skinwalker Ranch lineage?"— relational/kb-query "Compare Garry Nolan, James Lacatski, and Hal Puthoff"— comparison/kb-query "What don't we know about Project Stargate?"— gap analysis/kb-query "What do we know about Lockheed Skunk Works?"— factoid
The query skill returns answers as traced paths — [[A]] → [[B]] → [[C]] with the actual line on each predecessor page where the link appears, so you can verify every claim.
Two skills handle ingestion and maintenance:
/kb-import— stage a new YouTube transcript, article, book excerpt, or document outsideufo-kb/(usetranscripts/for YouTube — see below — or any path you control for other source types), then invoke/kb-import <path>. The skill moves the raw file into the correctufo-kb/raw/<type>/subdirectory itself; you don't place it there manually. From there it pulls graph context, creates/updates pages with alias-aware deduplication, predicts non-obvious connections via graph algorithms (Jaccard / Adamic-Adar / common-neighbors), auto-applies safe back-links, runs the audit at the boundary, and syncs the search index./kb-maintain— audit pass over the whole graph. Surfaces orphans, duplicates, dangling links, broken synthesis, hub-split candidates. Two safe auto-fix categories (synthesis back-links + exact-alias dangling rewrites) apply with--apply; everything else is flagged for human triage with concrete evidence.
Both skills enforce the rules in ufo-kb/CONSTITUTION.md — the spec the wiki is built against. Edits must satisfy it before sync.
scripts/youtube_import.py is the canonical entry point for adding a new YouTube transcript. It downloads captions, cleans them, prefills metadata frontmatter from yt-dlp, and stages the file in transcripts/ (gitignored) for /kb-import to consume.
One-time setup:
pip install -r requirements.txt # installs yt-dlp + qmdSingle video:
python scripts/youtube_import.py fetch https://www.youtube.com/watch?v=<id>
# or just the bare ID:
python scripts/youtube_import.py fetch <id>
# IDs starting with `-` need the argparse sentinel:
python scripts/youtube_import.py fetch -- -0g3lLGxNfcThe helper:
- Refuses if the video ID is in
ufo-kb/imports/off-topic-skipped.md. - Refuses if the file already exists in
transcripts/,ufo-kb/raw/youtube-transcripts/, orufo-kb/wiki/youtube-transcripts/(use--forceto overwrite). - Tries manually-uploaded English captions first, falls back to auto-generated.
- Writes
transcripts/<id>.mdwithvideo_id,title,channel,published,url,duration_minutesprefilled —/kb-importshould copy these verbatim rather than re-deriving from the transcript body.
Then in Claude Code:
/kb-import transcripts/<id>.md - YouTube Transcript
Many videos at once:
# From a YouTube playlist URL:
python scripts/youtube_import.py fetch --batch "https://www.youtube.com/playlist?list=..."
# From a text file (one URL/ID per line; blank lines + `#`-comments skipped):
python scripts/youtube_import.py fetch --batch my-queue.txtAfter staging, run /kb-import for each transcript. The helper has a built-in batch driver:
python scripts/youtube_import.py run-importsThis invokes /kb-import on every file in transcripts/, runs /kb-maintain periodically, and reuses one Claude session across all calls (via --session-id + --resume) so the model context — skill prompts, graph state, prior import work — is cached across files instead of being reloaded each time. Failures retry up to 3×; progress is checkpointed in import_log.json so you can interrupt and resume. Use --reset to wipe and start over, --retry-failed to re-attempt previously-failed files, or --new-session to force a fresh Claude session.
Cleanup utility:
python scripts/youtube_import.py clean <transcripts/file.md>Collapses any VTT-residue blank lines in an already-staged file. Most users won't need this — fetch produces cleaned output.
ufo-knowledge-base/
├── README.md ← you are here
├── LICENSE ← CC-BY-SA-4.0 on derived work; raw sources retain original copyright
├── ufo-kb/
│ ├── CONSTITUTION.md ← schema spec
│ ├── imports/ ← per-procedure import rules (one per source type)
│ ├── wiki/ ← the knowledge base (Markdown)
│ │ ├── entities/ ← people / orgs / places / programs / incidents / docs / tech / craft / symbols
│ │ ├── concepts/ ← claims-theses, disclosure-narratives, credibility-frameworks, etc.
│ │ ├── synthesis/ ← cross-source comparisons & gap analyses
│ │ └── youtube-transcripts/ ← per-source claim summaries
│ └── raw/ ← original source files (transcripts, articles, scanned docs)
├── .claude/skills/ ← Claude Code skills
│ ├── kb-import/ ← source-in pipeline
│ ├── kb-query/ ← graph walker for question-answering
│ ├── kb-maintain/ ← audit + auto-fix
│ └── kb-evolve/ ← schema/rule changes (rare)
├── scripts/ ← youtube_import.py (fetch + batch + run-imports + clean)
└── requirements.txt ← yt-dlp, qmd
The skills enforce a small set of load-bearing rules that took many iterations to converge on:
- Embeddings to enter, graph to ground. Vector search (qmd) is allowed only for cold seed-finding when no slug/alias resolves. Once on the graph, traversal is the sole grounding mechanism. No mid-walk semantic shortcuts.
- Every claim cites a path. Answers don't paraphrase — they trace
[[A]] → [[B]] → [[C]]and quote the line on each page where the link appears. - Anecdotes are the evidence. Interview/testimony sources are extracted as concrete-evidence bullets (named anecdotes, direct quotes, specific dates/places/people), not abstracted into concept claims. The "Headline Claims" section records specific events, not philosophical generalizations.
- Wikilink only what's worth a page. A
[[wikilink]]is a commitment that the target either is or should become a node. Tangential mentions stay plain text. - Auto-fix only what the schema mandates. Synthesis back-links and exact-alias dangling rewrites are constitution-derived. Everything else (merges, splits, fuzzy rewrites) requires human approval.
- A graph-grounded "I can't" beats a hallucinated "I can". When a walk hits a dead end, the answer reports the gap.
These rules live in the SKILL.md files under .claude/skills/. Read them if you want to understand why the KB looks the way it does.
The KB covers UFO/UAP discourse and its adjacents (consciousness research, intelligence community, paranormal, NHI, ancient mysteries, government secrecy programs). The framing is mapping the discourse, not adjudicating truth. Many pages document claims that are contested, unverified, or actively disputed — the wiki reflects the contest rather than picking winners. Where two sources disagree, the contradiction is flagged with > ⚠ Conflict: rather than silently resolved.
If you're looking for either confirmation or debunking, this isn't that project. It's a connection-finding instrument.
This is a personal sense-making project, not a multi-author wiki. PRs are welcome. If you spot a factual error, a misattribution, or want a raw source removed, open an issue.
CC-BY-SA-4.0 on the wiki, synthesis pages, constitution, skills, and tooling. Raw source material in ufo-kb/raw/ retains its original copyright. See LICENSE for details.