// the find
refinedev/refine
A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility.
Refine is a React meta-framework specifically targeting CRUD-heavy enterprise apps: admin panels, internal tools, dashboards. It sits between rolling your own and a fully generated low-code tool by providing headless hooks for data fetching, auth, access control, and routing, with optional UI layer integrations for Ant Design, MUI, Mantine, and Chakra UI.
- Genuinely headless architecture: business logic lives in hooks (@refinedev/core) decoupled from UI, so you can swap out Ant Design for Tailwind without rewriting data or auth logic
- Broad data provider ecosystem with 15+ official connectors (Supabase, Strapi, Hasura, NestJS CRUD, GraphQL, etc.) that all conform to the same interface, so switching backends doesn't require rewriting list/form components
- Extensive E2E test coverage with Cypress across every supported UI framework and data provider combo — this is the kind of thing most open-source frameworks skip and it actually matters when you're picking a foundation for internal tooling
- Monorepo is well-structured with proper changesets, conventional commits, and NX — contributing or forking a specific package is straightforward without pulling in the whole thing
- The abstraction layers stack up quickly: Refine context → data provider → router provider → auth provider → UI package. Debugging something subtle like a redirect loop after login means tracing through 4 different provider chains, and the error messages rarely tell you which layer is misbehaving
- Access control (usePermissions / accessControlProvider) is too coarse for real enterprise RBAC — field-level permissions and dynamic resource-based rules require you to build essentially everything yourself on top of a thin interface
- The 'inferencer' feature that auto-generates CRUD UIs from API responses sounds compelling but outputs code you'd be embarrassed to ship; it's useful for prototyping but the generated code has enough edge-case issues that you'll rewrite it anyway
- Heavy dependency on React Query internals means upgrading React Query is often blocked until Refine releases a compatible version, and the repo has a history of this creating multi-month lag on major RQ releases