Credits & methodology

How the archive was made

The tools, infrastructure, and authorship behind this digital collection.

02 · Archive process

From recordings to retrieval

The archive was transcribed with Python and faster-whisper, using the Whisper base.en model to produce timestamped Markdown drafts. Transcripts are indexed with SQLite FTS5 for keyword search and 768-dimensional Cloudflare Workers AI embeddings stored in Vectorize for semantic retrieval. “Ask Don” combines these results and normally uses OpenAI’s Responses API to generate transcript-grounded answers, with Cloudflare Workers AI available as an automatic fallback; AI supports transcription, retrieval, and interpretation, while the original recordings and transcripts remain the archival sources.

03 · Ask Don

A hybrid retrieval pipeline

Ask Don is a server-side retrieval-augmented generation system. The latest question drives retrieval, while up to 12 recent user and assistant messages supply conversational context for the answer.

How the persona was created

Ask Don was created as an AI interpretation, not through voice cloning or model fine-tuning. Recurring themes, stories, language, and recovery principles from the 82 recordings were distilled into a written persona guide and 20 tagged context summaries. Together they define the voice, Big Book framing, response style, attribution, and safety boundaries. At answer time, these curated materials are paired with question-specific timestamped excerpts so interpretation remains separate from the archival evidence.

How each answer is produced

  1. Index the transcript corpus

    Timestamped transcript segments and recording metadata live in D1. Their text is mirrored into a SQLite FTS5 virtual table, while 768-dimensional cls embeddings from Workers AI’s @cf/baai/bge-base-en-v1.5 model are stored in Vectorize.

  2. Search in parallel

    The Worker embeds the question and requests the 12 closest Vectorize matches. At the same time, normalized query terms run against FTS5, which returns up to 12 passages ordered by BM25 relevance.

  3. Fuse and diversify

    Reciprocal-rank fusion combines semantic and keyword positions, with a small weighting adjustment for the FTS5 results. Neighboring passages from the same recording are de-duplicated before the five strongest excerpts are selected. Either retrieval path can fail independently without preventing the other from supplying context.

  4. Build grounded instructions

    Each selected excerpt carries its recording ID and timestamp into the prompt. The Worker combines those raw passages with up to five curated cross-transcript context cards and explicit persona, attribution, recovery, medical-safety, crisis, privacy, and copyright boundaries.

  5. Generate the answer

    The Worker calls OpenAI’s POST /v1/responses endpoint with gpt-5.6-luna, the grounded instructions, recent conversation messages, a 750-token output ceiling, reasoning effort set to none, and the session UUID as a safety identifier. API-side response storage is disabled with store: false. If that request fails or times out, the Worker automatically retries generation with a Cloudflare Workers AI model.

  6. Retain an auditable record

    After a successful answer, the site writes the session ID, question, answer, grounding references, model name, and timestamp to a private D1 table. That archive has no public read route and omits IP addresses, browser headers, and geographic metadata. A storage failure does not withhold an otherwise successful answer.

04 · Infrastructure

Built for the archive

The private repository is hosted on GitHub and supports GitHub Codespaces and Cloudflare Workers Builds. The TypeScript site is deployed with Wrangler to a single production Cloudflare Worker, using D1 for structured data, R2 for audio, Vectorize for semantic search, and Cloudflare’s global network for hosting.

05 · Authorship

Site credit

Scott L architected and built the site.