A daily publication of AI-generated speculative stories and curated links from obscure corners of the web.
Every day Obscure Bit publishes:
- Daily Bits: one story
- Obscure Links: one curated links post
- Daily Edition: a combined edition snapshot
Obscure Bit now uses a queue-first publishing model.
GitHub Actions schedule
↓
prepare_queue.py stages one or more dated editions
↓
publish_prepared.py promotes today's prepared edition into docs/
↓
MkDocs site updates and GitHub Pages deploys
That means the public site is no longer supposed to depend on live discovery succeeding in the same step that publishes the day’s content.
scripts/backfill_registry.pybootstraps link-memory state if neededscripts/prepare_queue.pybuilds staged content underdata/edition_queue/<date>/scripts/publish_prepared.py --update-homepublishes today’s prepared editionscripts/publish_substack.pygenerates newsletter markdown/history- GitHub Actions commits and pushes the resulting changes
workflow_dispatchstill runsscripts/run_daily.pydirectly as a one-off escape hatch- Developers can also run
generate_story.py,generate_links.py, andupdate_landing.pyindividually - Backfills should usually use
prepare_queue.pyfollowed bypublish_prepared.py
git clone https://github.com/obscurebit/b1ts.git
cd b1ts
uv venv
uv pip install --python .venv/bin/python -r requirements.txt
uv run --python .venv/bin/python mkdocs serve# Prepare staged content for today and the next few dates
uv run --python .venv/bin/python scripts/prepare_queue.py
# Prepare a specific date
uv run --python .venv/bin/python scripts/prepare_queue.py --date 2026-04-19 --force
# Publish a prepared date
uv run --python .venv/bin/python scripts/publish_prepared.py --date 2026-04-19
# Direct manual run
uv run --python .venv/bin/python scripts/run_daily.py --date 2026-04-19- Story generation uses deterministic date-seeded style modifiers from
prompts/style_modifiers.yaml - Link generation is lane-first and repo-memory-backed using
prompts/source_lanes.yamlanddata/discovery/ run_daily.pycan fall forward through multiple rotating themes when link generation fails for the first candidate theme
The repo still contains Substack tooling:
scripts/publish_substack.pyscripts/substack_playwright.py
In practice:
- CI currently uses
publish_substack.pyfor newsletter markdown/history generation - actual draft/publish actions remain explicit operator actions
- cookie/browser-based auth may still be needed because Substack automation is brittle
- DEVELOPMENT.md: setup, commands, workflows, backfills, style modifiers
- SYSTEM_DESIGN.md: architecture, queue model, data flow, failure handling
- Site: MkDocs Material
- Generation: OpenAI-compatible API, currently NVIDIA NIM by default
- Hosting: GitHub Pages
- Automation: GitHub Actions
MIT