Infogest is a daily briefing pipeline that surfaces new developments and incrementally grows a curated knowledge base. Each run collects fresh signals from X and external documents, synthesizes a concise brief, and applies a reviewable patch that extends the KB with the new, verified learnings.
From the repo root:
pip install -e .
Edit config/config.yaml to set watchlist handles, querypack, and limits.
Set x_sources.enabled to choose between timeline and search ingestion.
Copy config/.env.example to .env and set:
XAI_API_KEYfor xAI callsTWITTER_API_KEY,TWITTER_API_SECRET,TWITTER_ACCESS_TOKEN,TWITTER_ACCESS_SECRETfor timeline access and tweet lookupX_TIMELINE_USER_IDorX_TIMELINE_USERNAME(optional override)INFOGEST_LLM_ENGINE=commandorxaiINFOGEST_LLM_CMDif using the command engine (defaults to./scripts/claude_cmd.sh)
infogest init
infogest check-kb
infogest run
Each run produces a dated bundle under runs/YYYY-MM-DD/run_<timestampZ>/ with:
- A merged corpus of the latest inputs
- A daily brief focused on what is newly developed since the previous run
- A KB patch that incrementally updates the knowledge base
The patch is applied automatically by default, so the KB continuously compounds as new developments appear.
For a safe scaffolding check without API calls:
infogest run --dry-run
infogest ingest /path/to/file.pdf --kind paper
infogest ingest /path/to/folder --kind notes
If ingested content contains X/Twitter status links, Infogest will look up the tweet text via the X API (requires OAuth 1.0a keys).
infogest add /path/to/file.md
infogest add /path/to/folder
infogest normalize <input_id>
infogest synth --corpus runs/YYYY-MM-DD/run_<id>/10_inputs/merged_corpus.jsonl
infogest apply --patch runs/YYYY-MM-DD/run_<id>/20_decisions/kb.patch
infogest feedback --date YYYY-MM-DD
Set INFOGEST_LLM_ENGINE:
command: usesINFOGEST_LLM_CMDand expects JSON outputxai: uses xAI structured outputs
For Claude Code non-interactive runs, ./scripts/claude_cmd.sh reads the system
and user prompts from temp files (INFOGEST_SYSTEM_FILE/INFOGEST_USER_FILE)
and calls:
claude -p --no-session-persistence --tools "" --system-prompt "<system>" "<user>"
If you want to add model selection or other flags, edit scripts/claude_cmd.sh.
Note: very large prompts may exceed OS command-line length limits since prompts
are passed as CLI arguments. A potential fix is switching the wrapper to a
streaming/stdin input mode (e.g., Claude’s --input-format stream-json), but
this repo does not implement that yet.
Implement a new module under infogest/adapters/ that produces ContentRecord JSONL and wire it into the CLI.