This repo carries a self-contained copy of ExamSpectrumAI, the engine that generates Essential and Deep-Dive articles (Read + Listen + Watch/Video + Social) from small series specs. This page is the 5-step quick start. For depth see:
ExamSpectrumAI/README.md — portability, keyless Azure auth, config, architecture.ExamSpectrumAI/EXAMSPECTRUMAI-GUIDE.md — the full command reference and authoring guide.The engine auto-detects this folder as its repo root (it resolves the folder two levels
above ExamSpectrumAI/src/engine), so it reads specs from content/…/series and writes output to
site/…/Articles here — fully independent of any other repo.
cd C:\Repo\#GithubPages\ExamSpectrum
python -m venv .venv
.venv\Scripts\Activate.ps1
pip install -e ExamSpectrumAI # installs the engine and its Python deps
pip install edge-tts # free text-to-speech for Listen/Video (no Azure needed)
playwright install chromium # only needed for Video / VideoWB rendering
ExamSpectrumAI runs in two modes — pick per your needs:
| LLM (writing) | Speech (TTS) | When to use | |
|---|---|---|---|
| Free | Copilot handoff (the in-editor model services a bridge file) | edge-tts | You drive ExamSpectrumAI from inside VS Code with an agent; zero Azure cost |
| Azure | Azure OpenAI | Azure Speech | Unattended runs; production; no editor agent needed |
Set the env for a session (run from the repo root):
$env:PYTHONUTF8 = '1'
$env:PYTHONPATH = 'ExamSpectrumAI/src'
$env:EXAMSPECTRUMAI_LLM_PROVIDER = 'handoff' # 'handoff' = free/Copilot; omit or configure for Azure
Only for the Azure path. Stands up one keyless multi-service AI Services account
(serves both Speech and Azure OpenAI), assigns your RBAC roles, and writes
ExamSpectrumAI/src/engine/config.local.json. Requires the Azure CLI.
az login --tenant <TENANT_ID>
python -m engine.cli init # scaffold folders + config
python -m engine.cli provision -g rg-examspectrum -l swedencentral -n examspectrum-ai
# add the paid GPT deployment too (optional):
python -m engine.cli provision -g rg-examspectrum -l swedencentral -n examspectrum-ai --deploy-openai
config.local.json is git-ignored and never leaves the machine.
Series specs live in content/essential/series/*.yaml and content/deep-dive/series/*.yaml.
The <series-id> is the spec’s id (its file name without .yaml).
Essential article (defaults to content/essential/series → site/essential/Articles) —
run in a shell where the Deep-Dive profile is not loaded:
python -m engine.cli read <series-id> --topic <slug>
python -m engine.cli listen <series-id> --topic <slug>
python -m engine.cli video <series-id> <slug>
Deep-Dive article — dot-source the Deep-Dive profile first (isolates input/output under
content/deep-dive/series → site/deep-dive/Articles):
. tools/deepdive_env.ps1
python -m engine.cli read <series-id> --topic <slug>
python -m engine.cli listen <series-id> --topic <slug>
python -m engine.cli listenwb <series-id> --topic <slug> # whiteboard Watch (Deep-Dive only)
python -m engine.cli social <series-id> --topic <slug>
python -m engine.cli video <series-id> <slug>
python -m engine.cli videowb <series-id> # all built boards, sequential
Video / VideoWB use Chromium screen-recording — never run two renders at once (concurrent captures corrupt frames). Run them sequentially.
tools/deepdive_env.ps1 still sets EXAMSPECTRUMAI_SITE_URL / EXAMSPECTRUMAI_SITE_NAME to
topicspectrum — change these to ExamSpectrum’s domain/name..github/workflows/deploy-pages.yml is topicspectrum-specific (CNAME, domain) — adapt
before publishing.content/ are templates from the source site; replace them with
your own ExamSpectrum series.Included: the engine (ExamSpectrumAI/), tooling (tools/), series-spec templates (content/),
deploy workflow, pagefind.yml, .gitattributes, and the guides. Not included (recreated
on demand): the ExamSpectrumAI/cache/ scratch, generated site/ output, and the machine-specific
config.local.json.