mrkeyoor.com_
Fri 25 Sept 21:50 UTC
Dataevaluationupdated 26 Aug 2026

cocoindex review

CocoIndex is a Python framework with a Rust core for keeping derived data in sync with changing sources. You declare how files, databases, messages, or media become rows, vectors, graph nodes, or files, and it tracks what must be recomputed when either the input or transformation changes.

+16stars / 7d
Verdict

Our CocoIndex build passed in 9 seconds, but its test run finished with 309 passed, 192 failed, 125 skipped, and 8 setup or collection errors, so adoption should begin with the exact connectors you will operate. It is a strong candidate when re-embedding or re-extracting unchanged data is a real cost and Python is the primary authoring language. Choose a simpler loader for one-off jobs, and do not approve production use from the clean build alone.

We ran it

Lab card: what happened when we ran cocoindexScreenshot of cocoindex (cocoindex.io)
Install✓ · 143s40 packages · 97 MB
Build✓ · 9s
Tests✗ · 356s309 passed · 192 failed · 125 skipped · 8 errors of 509 (pytest)
Known vulns0(pip-audit)
Repo1169 files~185,892 lines of source · 44 MB · 10 CI workflows

Answers from our run

Does cocoindex build from source?

Dependencies installed in 143 seconds (40 packages), and the build succeeded in 9 seconds. We cloned commit aee7b27 into a clean Debian container with 3 CPUs and no project-specific setup.

Do cocoindex's tests pass?

Not all of them: 309 of 509 passed and 192 failed when we ran the project's own test command (pytest), with 8 collection errors. Some failures need services or credentials a bare container does not have.

Does cocoindex have known vulnerabilities in its dependencies?

pip-audit found none in the dependency tree at the time of our run.

Who should not use cocoindex?

Teams that require the full connector suite to pass in a plain isolated Python environment: our run ended with 192 failures and 8 collection or setup errors across database and storage connectors.

What are the alternatives to cocoindex?

Dagster, dlt, LlamaIndex. Our CocoIndex build passed in 9 seconds, but its test run finished with 309 passed, 192 failed, 125 skipped, and 8 setup or collection errors, so adoption should begin with the exact connectors you will operate.

Setup3/5Install and build pass; full connector tests fail in isolation
Docs5/5Quickstart, concepts, connectors, operations, and examples are detailed
Community5/511,408 stars with active August 2026 issues and pull requests
Maturity3/5v1 is active, but connectors and Rust parity are still moving

Discussed on

  1. hnShow HN: CocoIndex – Open-Source Data framework for AI, built for data freshness14 points
  2. hnShow HN: Open-Source Structured Extraction with LLM Using Ollama5 points
  3. hnShow HN: Open-Source ETL to index data4 points
  4. hnShow HN: CocoIndex – Open-Source Data transformation for AI, only process delta4 points
  5. hnCocoIndex – open-source ETL saves you >90% compute for AI workloads4 points

Who it’s for

AI teams whose document, code, or media indexes must stay current without full reprocessing.
Python developers building RAG, semantic search, extraction, or knowledge-graph pipelines.
Data engineers who need source-to-target lineage and per-step memoization around expensive model calls.
Claude Code users who want the repository's supplied skill to guide agents toward the v1 API.

Who it’s NOT for

Teams that require the full connector suite to pass in a plain isolated Python environment: our run ended with 192 failures and 8 collection or setup errors across database and storage connectors.
Event producers that need to push row changes directly into the engine: open issue 20 says the current model supports pull and requests a push API.
Storage-constrained deployments that plan to memoize large embeddings without measurement: issue 1779 reports tracking tables growing beyond the target vector table in one production use.
Rust-first teams expecting the same ergonomics as Python: issues 2273 and 2326 document batching, dispatch, schema, and streaming gaps in the Rust SDK.
Small one-off conversion scripts where change tracking, target state, and connector operations cost more than rerunning the job.

Setup reality

Our Python install succeeded in 143 seconds, adding 40 packages and using 97 MB. The build passed in 9 seconds. Tests failed after 356 seconds: 309 passed, 192 failed, 125 skipped, and 8 had collection or setup errors out of 509.

A local file pipeline can use SQLite through COCOINDEX_DB and needs no hosted key. RAG and extraction examples add their chosen model providers, databases, object stores, or message brokers, along with the matching credentials and optional packages.

The 44 MB checkout had 1,169 files and about 185,892 source lines. It had 10 CI workflows, no Dockerfile, and no root tests directory. Pip-audit found 0 known vulnerabilities, but connector services and fixtures remain part of a serious evaluation.

CocoIndex recomputes affected records instead of every record

CocoIndex treats a data pipeline as a declared relationship between source state and target state. A Python function can walk files, split text, call an embedder, and declare rows in Postgres. The engine records dependencies so a changed file can update its own rows while untouched inputs stay cached. If transformation code changes, CocoIndex can invalidate outputs that depend on that logic. This is useful for AI indexes, where embedding or extraction calls make full refreshes expensive.

The quickstart is smaller than the repository's front page suggests. It converts PDFs from one directory into Markdown files in another, uses a local SQLite database through COCOINDEX_DB, and reruns only added or modified inputs. Deleting a source removes its declared target file. That example teaches the core idea without a vector database or model-provider key, although Docling is an extra dependency and the user's actual pipeline will choose its own source, transformation, and target services.

The 9-second build passed, while 192 tests failed

We cloned commit aee7b27 into a fresh unprivileged Debian container with 3 CPUs and 8 GB of RAM. Installing the Python environment took 143 seconds, added 40 packages, and used 97 MB. The build completed successfully in 9 seconds. Pip-audit found 0 known vulnerabilities in the installed dependencies. Those results make the base package approachable and say nothing about the latency or cost of a user's model and storage choices.

The checkout was 44 MB with 1,169 files and about 185,892 source lines. Our scan found 10 CI workflow files, no Dockerfile, and no tests directory at the repository root. The source does contain Python tests under its own tree, which the harness found and ran. The absence of a root directory is only a structural signal; the failed pytest result is the evidence that matters for this commit and environment.

What happened when we ran it

Our test command ran for 356 seconds and exited with code 1. Pytest reported 309 passed, 192 failed, 125 skipped, and 8 collection or setup errors out of 509. It stopped after reaching 200 failures. A substantial part of the suite executed successfully, but this was nowhere near a clean pass, so the successful 9-second build should not be read as proof that CocoIndex's complete connector matrix works in a fresh container.

The log tail named errors in Amazon S3, FalkorDB, Neo4j, Postgres source and target, SurrealDB, Turbopuffer, and Valkey tests. It also listed pytest-trio and pytest-twisted near the failure summary. The log provided no single diagnosis covering all 192 failures, and our sandbox had no secrets. We can say the suite needs more environment or service preparation than our isolated run supplied. We cannot assign every failure to a missing database, credential, plugin, or network service without the corresponding log evidence.

SQLite is enough to learn it, while useful indexes add services

A local file-to-file pipeline can keep its tracking state in ./cocoindex.db. The more compelling examples introduce Postgres with vector indexes, LanceDB, Neo4j, SurrealDB, Kafka, S3, Google Drive, model APIs, or local embedding packages. Each connector brings a different authentication and lifecycle problem. CocoIndex coordinates declared state across those systems; it does not provision every database or supply provider credentials.

Start with one source and one target. Confirm initial backfill, a single-record change, deletion, transformation-code invalidation, and restart recovery. Then record the tracking database's growth alongside the target. Open issue 1779 describes one enterprise code-search user whose memoization information reached 17 GB while the vector table was 16 GB. That report is one workload, not a general benchmark, but it makes cache storage a capacity metric rather than an invisible implementation detail.

Pull-based ingestion and Rust parity remain open design edges

Open issue 20 asks for an API that can accept row insertions, updates, and deletions directly, describing the current mechanism as pull-only. That matters for systems where an upstream event already contains the change and rescanning a source is awkward. CocoIndex does support message queues among its source and target categories, but the specific push API requested in that issue should not be presented as an existing feature.

The repository's primary GitHub language is Rust, yet the documented user path is Python 3.10 through 3.13. Issues 2273 and 2326 compare the Rust SDK with Python and call out extra wiring or missing parity around batching, dispatch, target-state declaration, and streaming behavior. Rust work is active, but a team choosing CocoIndex today should evaluate the Python interface first unless it has verified the exact Rust APIs it needs.

August activity is high, and connector correctness still needs scrutiny

GitHub showed 11,408 stars, 75 combined open issues and pull requests, and a last push on August 26, 2026. Release v1.0.20 arrived on August 12 with fixes for target invalidation through memoization and LanceDB schema evolution, plus dependency updates. Current issue 2358 alleges that one Doris schema-reconciliation path can swallow an ALTER TABLE failure and leave tracked schema state out of sync with the database.

That issue is connector-specific, but the failure mode reaches CocoIndex's main promise: target state must reflect declared state. Test error handling, schema evolution, deletion, and recovery against the database versions you run. CocoIndex earns a trial when incremental recomputation has measurable value. The 309 passing tests show real implementation depth, while the 192 failures on our box say the trial must extend beyond installation and a toy local flow.

Alternatives

ProjectWhat it isPick it when
DagsterA general data orchestrator centered on assets, lineage, schedules, and operations.pick this instead when your main problem is governing a broad analytics platform rather than incrementally maintaining AI indexes.
dltA Python library for loading data from APIs and other sources into warehouses and databases.pick this instead when extraction and schema-aware loading matter more than function-level recomputation.
LlamaIndex gh↗A broad framework for connecting data to LLM applications and retrieval systems.pick this instead when application-level retrieval components and agent integrations matter more than a stateful incremental engine.

What people are saying

  1. [github-trending] cocoindex-io/cocoindex

Sources

  1. CocoIndex README
  2. CocoIndex quickstart
  3. CocoIndex v1.0.20 release
  4. Issue 1779: memoization storage
  5. Issue 2358: Doris schema reconciliation
  6. CocoIndex repository metadata

More data reviews

go-stock · sqlitebrowser · hydradb · DouYin_Spider · helix-db · abu · the whole board →