Local-first knowledge index for computer graphics. The goal is to keep classic rendering papers, modern papers, engine documentation, GPU vendor references, talks, and practical resources in one navigable Markdown repo.
The curator can:
- index hand-picked seed entries such as Kajiya's Rendering Equation, Veach's thesis, pbrt, Unreal/Unity/Godot documentation, and NVIDIA references,
- collect recent candidates from RSS feeds such as arXiv cs.GR,
- skip URLs that were already processed,
- ask a local Ollama model for a short Korean summary and category when an entry does not already have a curated summary,
- generate deterministic Markdown files by category and resource type,
- optionally publish the generated output to a local GitHub clone.
The project is designed for copyright-safe curation. It stores links and short original summaries only; it does not rehost full source text.
- Python 3.13+
- Ollama
- A local chat model, for example:
ollama pull qwen2.5:7bFor semantic search, also pull a local embedding model:
ollama pull nomic-embed-textFor more natural Korean summaries, you can also try:
ollama pull exaone3.5:7.8bconda create --prefix .\.conda python=3.13 -y
conda activate .\.conda
python -m pip install -r requirements.txt
python -m pip install -e . --no-depsThis repository is currently verified against the local .conda environment:
.\.conda\python.exe --version
# Python 3.13.13Edit config/sources.toml for personal picks and local overrides. Maintained source packs live under config/sources.d/*.toml and are loaded automatically:
feeds.toml: recent RSS sources such as arXiv and NVIDIA Technical Blogfoundations.toml: classic rendering papers and booksengine-docs.toml: Unreal Engine, Unity, and Godot official documentationgpu-docs.toml: NVIDIA, Microsoft DXR, Vulkan, Metal, and GPUOpen referenceslearning.toml: practical learning resources such as Ray Tracing in One Weekend and Scratchapixel
Edit config/categories.toml if you want different category labels.
Static entries can include summary_ko and category. Those entries are indexed without calling Ollama, which is useful for foundational papers and official documentation you already trust.
Check the currently loaded source set:
python -m curator sourcespython -m curator run --limit 10 --skip-publishIndex only the curated seed catalog without RSS or Ollama:
python -m curator run --static-only --skip-publishIndex the seed catalog and build semantic embeddings in one pass:
python -m curator run --static-only --build-semantic-index --skip-publishUse a different local model:
python -m curator run --limit 10 --model exaone3.5:7.8b --skip-publishGenerated Markdown appears under output/:
output/README.mdis the top-level index.output/categories/*.mdgroups by topic.output/types/*.mdgroups by resource type such asPaper,Book,Engine Doc,GPU Doc, orVideo.
The semantic index is for vague questions like "전역 조명 이론부터 엔진 구현까지 보려면 뭐 보면 돼?" It does not do keyword matching. It embeds the curated title, type, category, source, and Korean summary with a local Ollama embedding model, then returns the closest resources.
Build or refresh the embedding cache after entries already exist:
python -m curator semantic-indexAsk a loose question:
python -m curator search "실시간 엔진에서 global illumination 구현을 보려면 뭐 봐야 해?"On Windows PowerShell 5.x, prefer --output over shell redirection for Korean text:
python -m curator search "실시간 엔진에서 global illumination 구현을 보려면 뭐 봐야 해?" --output resp.txtThis writes UTF-8 directly from Python instead of relying on PowerShell's > encoding behavior.
The cache is stored at state/embeddings.json.
Create or clone a separate GitHub repository locally, then run a dry-run first:
python -m curator run --limit 10 --dry-run --publish-repo C:\path\to\published-awesome-repoIf the diff looks good, publish for real:
python -m curator run --limit 10 --publish-repo C:\path\to\published-awesome-repoPublishing uses your local Git credentials. No token is stored in this codebase.
state/seen.jsonstores processed URLs for idempotency.state/entries.jsonstores the curated item metadata needed to regenerate stable Markdown.output/stores generated Markdown.