Why paginate?
What paginate solves — consistent filtering, sorting, search, and portable cursors across a polyglot Python and TypeScript stack, on one Rust core.
Choosing a package
All three packages wrap the same Rust core, so they share semantics and the
How it compares
How paginate differs from focused alternatives like fastapi-pagination, fastapi-filter, and sqlalchemy-pagination — a unified API, a shared Rust core, and cross-language parity.
Architecture
How paginate is designed — a fat Rust core and thin native adapters, the plain-data Value boundary, index-based returns, and the resident Dataset.
Cross-language parity
Because the engine has a single implementation, the Python and TypeScript packages
Pagination models
Offset (page/limit) vs. keyset (cursor) pagination — how each works, their trade-offs, and which to choose.
Cursors
Keyset (cursor) pagination encodes the
Filtering & operators
Filtering is described by specs that are evaluated by the Rust core, so the
Sorting semantics
Sorting is described by one or more SortSpec keys evaluated by the Rust core, so
Search & ranking
Search runs an in-memory full-text query and returns matching items in ranked
Errors & limits
The shared exception hierarchy (PaginateError and friends), what raises each one, how to handle them in Python and TypeScript, and the engine's built-in limits.
FAQ
Common questions about paginate — native builds, performance, cursors, async, Pydantic, and choosing between offset and keyset pagination.
Glossary
Definitions of the core terms used across paginate — offset, keyset, cursor, spec, operator, marshalling, columnar, Dataset, and more.