Make convex
Searchable.
A bridge for fast reads connecting Convex to Manticore Search. It handles deep filters, aggregations, and large operational datasets while keeping the UI reactive in real time.
Don't compromise on real-time just to get complex filtering.
Convex is brilliant for transactional state. Lytibox adds the read layer needed for enterprise dashboards, admin tools, and rich search pickers.
Live Tables
Combine status, owners, dates, and full-text search without rebuilding your read layer every week. The UI gets Convex IDs, and your rows stay live.
Charts & Aggregations
One AST drives both the table and the summary stats. Manticore groups the data instantly.
Expressive AST
Nested AND/OR, typed operators (>, <, IN), and rapid text matching natively supported.
Search Pickers
Expose safe, contract-driven search components for your internal tools effortlessly.
Sub-second Sync
A headless Node.js daemon ensures your read-replica is never stale. Fully event-driven directly from Convex.
Clean mental model.
Define targets in your backend. Let the daemon sync. Hook it up in React.
1. Define Search Targets
Tell Lytibox which Convex tables to index and what fields the UI is allowed to query. It automatically manages the schema.
2. Start the Sync Daemon
Run the headless Node.js daemon anywhere (VPS, Railway, Fly). It discovers targets, rebuilds from snapshots, and maintains the live stream.
3. Bind the React Hook
Use the provided hook in your frontend. It manages the AST, pagination, and real-time hydration automatically.
A serious read model for developers.
Nested groups, typed operators, aggregations, and surface-specific contracts make the filter layer genuinely useful for complex dashboards.
Operations queue
Build live lists that can answer real operational questions without rewriting backend queries every week.
Key Context
- Keep page-one results fresh while the filter stays open
- Combine multiple operator types in one readable model
- Ideal for support, ops, moderation, and backoffice queues
Complex filters.
Live subscriptions.
The biggest fear of moving search out of the database is losing real-time reactivity. Lytibox solves this through Hydration and Cursor Sync.
Mutation Occurs
A user edits a document natively in Convex.
Daemon Syncs
Lytibox streams the update to Manticore (<1s).
Cursor Advances
Convex emits a new sync cursor to your UI.
UI Auto-Refreshes
Your filtered list updates reactively.
Under the Hood: Technical Deep Dive
If you're reading this, you probably want to know exactly what is happening behind the scenes. Lytibox isn't just a thin API wrapper; it's a robust sync engine and query compiler designed to bring complex, OLAP-style reads to Convex.
The Sync Engine & Fast Bootstrap
When you first connect a table with millions of rows, syncing them via individual events would take hours. Instead, the Lytibox daemon hooks directly into Convex's snapshot export system.
It requests a native snapshot, downloads the resulting .zip, and bulk-indexes the raw data into Manticore at blazing speeds. Once the baseline is established, it seamlessly transitions to polling the lytibox_events table for sub-second, real-time incremental updates. It efficiently batches insert, replace, and delete operations.
Dynamic Schema Evolution
Lytibox's schema management is completely decoupled from your Convex database schema. You can map arbitrary, dynamic, or user-defined custom fields directly into your search targets during the materialization phase.
When the daemon encounters a materialized document containing a previously unseen field, it dynamically infers the correct Manticore data type (float, multi64, text, etc.) straight from the JSON payload. It then automatically executes an ALTER TABLE command against the search engine before inserting the row. This means if your users create custom attributes in your app, those properties instantly become queryable, filterable, and sortable columns in Manticore, with no manual migrations required.
Native Types and Text Search
Manticore is a phenomenal C++ search engine. We don't just dump JSON into a text field. We map Convex data directly to Manticore's strongly-typed columns: integer, float, boolean (mapped efficiently), string, timestamp (for dates), and multi64 arrays.
Because the index is strictly typed, exact-match filters are computationally cheap. Simultaneously, Full-Text Search (FTS) runs in parallel on dedicated text fields using advanced tokenization, allowing you to build rich multi-field search bars that rank by relevance out of the box.
Expressive AST & The Operator Arsenal
Our React hook exposes an Abstract Syntax Tree (AST) that compiles down to highly optimized Manticore SQL on the server. You are not limited to simple equality checks. You can build infinitely nested AND / OR groups, paired with a massive standard library of operators:
Whether you are querying integer ranges, checking if an array HAS ALL required tags, or filtering dates IN LAST 7d, the compiler handles the exact translation logic safely.
Relational Queries Without Joins
Convex naturally handles relational data via Document IDs. Lytibox allows you to resolve and denormalize these during the materialization phase. For example, when indexing an order, you can fetch the associated customer's name and embed it directly into the Manticore search index. This allows you to filter and run text searches on nested relational data instantly, without relying on slow joins at query time.
Aggregations, Stats, and Suggestions
Because the query engine operates independently from the transactional database, we don't just return flat rows. A single query can simultaneously return:
- Hydration IDs: The paginated Convex Document IDs to pass back to your UI.
- Total Counts: The absolute match count of the filter, bypassing pagination limits.
- FTS Suggestions: Dynamic auto-complete for your inputs, returning exact occurrence counts for a given keyword within the currently filtered dataset.
- Stats & Graphs: Grouped statistical data (counts, sums, averages) perfect for rendering bar charts and complex reporting dashboards natively alongside your tables.
Sorting & Pagination
Every target supports sorting across multiple columns (ASC and DESC) with automatic stable fallback sorting to prevent pagination drift. The UI handles the cursors and offsets automatically, so building a massive, heavily filtered, paginated admin table takes minutes, not days.
A sneak peek of what we're building.
This is just a sneak peek of a component we've spent the last 6 months building for our own production apps. If this solves a real problem for you, join the waitlist or buy us a coffee to support continued development.
Buy me a coffeeJoin the Waitlist
Drop your email to get notified about future updates and beta access.