Daily Blog (Karpathy 90)
Daily high-signal digest from 90 curated engineering blogs, with multilingual output support.
Daily Blog fetches posts from the Karpathy 90 source pool, runs a two-stage AI curation pipeline, and generates:
content/digests/YYYY-MM-DD.mdcontent/digests/YYYY-MM-DD.jsoncontent/digests/YYYY-MM-DD.report.jsoncontent/digests/index.json
The web app reads JSON artifacts and renders digest/archive/source/tag pages.
pnpm install
cp .env.example .env
# fill real provider API keys in .env
pnpm --filter @daily-blog/runner digest --date today -zhpython3 -m venv .venv
source .venv/bin/activate
pip install -r packages/ai-worker-py/requirements.txtRun with Python backend:
DAILY_BLOG_PYTHON_BIN=$(pwd)/.venv/bin/python \
pnpm --filter @daily-blog/runner digest --date today --ai-backend pythonpnpm --filter @daily-blog/runner digest --date today -zh
pnpm --filter @daily-blog/runner digest --date 2026-02-14
pnpm --filter @daily-blog/runner digest --from 2026-02-10 --to 2026-02-14pnpm --filter @daily-blog/runner digest --date 2026-02-16 -zh
pnpm --filter @daily-blog/runner digest --date 2026-02-16 -en
pnpm --filter @daily-blog/runner digest --date 2026-02-16 --lang jaLanguage precedence:
-zhmaps tozh-CN-enmaps toen--lang <tag>supports any BCP-47-like language tag (for exampleja,fr,de)
pnpm --filter @daily-blog/runner digest --date today --model deepseek-reasoner
pnpm --filter @daily-blog/runner digest --date 2026-02-14 --model deepseek-chat
pnpm --filter @daily-blog/runner digest --from 2026-02-10 --to 2026-02-14 --model kimi-k2.5pnpm --filter @daily-blog/runner digest --date today --ai-backend ts
DAILY_BLOG_PYTHON_BIN=$(pwd)/.venv/bin/python \
pnpm --filter @daily-blog/runner digest --date today --ai-backend python --model deepseek-reasonerpnpm --filter @daily-blog/runner digest --date today --policy config/run-policy.json --coverage-mode warn
pnpm --filter @daily-blog/runner digest --date today --fetch-retries 2 --max-window-hours 96
pnpm --filter @daily-blog/runner digest --date today --hours 48 --topN 12
pnpm --filter @daily-blog/runner digest --date today --dry-run--dry-run validates the full pipeline but does not write md/json/report/index files.
config/run-policy.json controls quality and throughput:
- candidate thresholds and auto-window expansion (
48 -> 72 -> 96) - low-coverage behavior (
warnorerror) - fetch retries and cache TTL
- quality eligibility and category mix constraints
- AI execution profile (batch sizes, concurrency, provider limits)
Prompt templates live in:
skills/prompt-editorial/references/scoring.zh.mdskills/prompt-editorial/references/scoring.en.mdskills/prompt-editorial/references/synthesis.zh.mdskills/prompt-editorial/references/synthesis.en.mdskills/prompt-editorial/references/highlights.zh.mdskills/prompt-editorial/references/highlights.en.mdskills/prompt-editorial/references/style-guard.zh.mdskills/prompt-editorial/references/style-guard.en.mdskills/prompt-editorial/references/banned-lexicon.zh.txtskills/prompt-editorial/references/banned-lexicon.en.txt
Runtime strategy is file-first with built-in fallback. For a new language, add files with the same key pattern (for example synthesis.ja.md). Missing prompt files are recorded in report.json warnings.
Supported provider env prefixes:
OPENROUTER_*SILICONFLOW_*MOONSHOT_*DEEPSEEK_*MINIMAX_*
Default model pipeline is in config/model-pipeline.json.
Precedence:
--modeloverridesscoringModel,summaryModel, andinsightModelfor that run.- Without
--model, values come fromconfig/model-pipeline.json. fallbackModelsare still used.
pnpm test
pnpm --filter @daily-blog/web build
DAILY_BLOG_PYTHON_BIN=$(pwd)/.venv/bin/python \
pnpm --filter @daily-blog/runner digest --date today --ai-backend python --model deepseek-reasoner- Python worker fails to start:
- ensure
.venvexists andpackages/ai-worker-py/requirements.txtis installed - set
DAILY_BLOG_PYTHON_BINto the venv python path
- ensure
- Protocol timeout (
python-worker-timeout):- increase
ai.requestTimeoutMsinconfig/run-policy.json - reduce
ai.synthesisConcurrencyfor slower models
- increase
- Model/provider mismatch:
- verify the required key (for example
DEEPSEEK_API_KEY) exists in.env
- verify the required key (for example
- High fallback ratio in report:
- inspect
runtimeMetrics.aiCalls.synthesisFallbackCount - lower synthesis batch size or switch to a more stable summary model
- inspect
MIT