The Decision Layer
Postgres stores facts, Qdrant stores meaning, Redis stores time — QAIL decides.
Qail::get("users")
.select_all()
.filter("active", Eq, true) SELECT * FROM users WHERE active = true { "must": [{ "key": "active", "match": true }] } Code → Parse → AST → SQL String → DB Parses Again → Execute "SELECT..." → DB Parses → Execute Errors at runtime. AST → Binary Protocol → Execute Errors at compile-time. cargo install qail npm i qail-wasm zig fetch --save ...qail-zig/v0.2.0.tar.gz Native Rust • Universal C-API • WASM
AST-first. Native drivers. Zero transpilation overhead.
Build queries as native data structures. No string parsing. No text-to-AST-to-text overhead.
Direct wire protocol. No SQLx middleman. Full control over connection and execution.
Injection impossible by design. Code and data separated at the AST level, not string level.
Same Qail AST encodes to PostgreSQL and Qdrant. Relational AND vector search, one syntax.
No runtime parsing. AST is built at compile time, serialized directly to wire protocol.
Schema validation at build time. Wrong queries don't compile. Wrong types don't bind.
One AST. Three powerhouses. Facts + Meaning + Time.
Relational • Transactions • ACID
Vector • AI/ML • Semantic Search
Cache • Sessions • TTL
The modern stack: PostgreSQL for facts, Qdrant for meaning, Redis for time.
Native packages for your language. All powered by one Rust core.
Pure Zig • TLS • Pool v0.2.0 cargo add qail-core Cargo 31K q/s • 2.6x Eloquent
>
GitHub 126K q/s • 4.2x GORM GitHub 130K rows/s COPY GitHub npm i qail-wasm NPM The only migration tool that reads your code before it touches your data.
Searches .rs, .ts, .js, .py for queries that reference changing columns
Shows exactly where your code needs updating before migration
Use --force to override when you know better