cocoindex vs fenic
Rust-core incremental indexing engine: declare Target = F(Source) in Python and it keeps vector/graph/relational targets fresh forever, reprocessing only the delta — with per-row lineage. — versus — Semantic DataFrames: PySpark-style select, filter and join alongside AI operators — extract, classify, summarize, embed, semantic join — compiled on an engine built for inference.
Two declarative takes on AI data transformation in Python. CocoIndex optimizes for incremental freshness — reprocess only the delta, forever; fenic optimizes for expressiveness — semantic joins and extraction as first-class operators over a lazy plan.
| cocoindex | fenic | |
|---|---|---|
| Stars | 11k | 665 |
| Forks | 887 | 41 |
| Language | Rust | Python |
| License | Apache-2.0 | Apache-2.0 |
| Last activity | 6 days ago | 3 days ago |
| Topics | rag | data, orchestration |
| Curated connections | 6 | 3 |
cocoindex — the curator's take
The mental model sells it — 'React for data engineering': you declare what the index should contain, and the engine reconciles it against source changes forever, re-running only affected rows (cached by hash of input AND code, so editing your transform also invalidates precisely). That's the honest answer to stale agent context: sub-second freshness at a fraction of the re-embedding bill, with every vector traceable to its source byte. Sources span code, PDFs, Slack, audio; targets span pgvector, LanceDB, Neo4j, Kafka. The flagship application is cocoindex-code, an AST-aware incremental code-index MCP for coding agents. Use it when your corpus changes constantly and batch re-indexing is bleeding you; overkill for a static document pile — any one-shot RAG ingester handles that.
fenic — the curator's take
Use it when an agent's data discovery has to survive the chat: express the work as typed operators and the pipeline is already the artifact — `explain()`-able, rerunnable, row-level lineage, per-query cost and tokens, promotable to a table, view or MCP tool. `semantic.extract(PydanticModel)` replacing regex-plus-one-off-prompt is the whole pitch, and the engine handles batching, rate limits, retries and response caching so you aren't hand-rolling them. Not the tool for streaming or petabyte scale, and not a pandas replacement: it's a lazy query engine you configure models on, so single-row interactive work feels heavy and every operator is a real inference bill.