In the wake of recent changes in the Open Policy Agent ecosystem, with the creators of OPA, along with some team members from Styra, having joined Apple, teams may rightfully be looking at practical Styra alternatives for new projects. OPA has been a popular open source policy engine in cloud and infrastructure circles, but its future direction is less clear after the commercial company backing the project ceases to exist. For teams starting fresh with authorization, this raises the question: is there a better approach?
This article examines why Cerbos stands out as the best alternative to Styra + OPA for authorization needs.
For a quick side-by-side comparison of OPA vs. Cerbos, see the table below. For a deeper analysis, refer to our detailed Cerbos vs. OPA blog post.
Open Policy Agent rose to prominence as a general-purpose policy engine capable of enforcing policies across the stack. Backed by Styra, the company founded by OPA’s creators, OPA turned into a CNCF-graduated project. However, recent news has cast uncertainty on OPA’s long-term stewardship. In August 2025, Apple hired OPA’s original maintainers - the founders of Styra - and Styra’s commercial OPA offering (Styra DAS) is being sunset in favor of community maintenance. In other words, the key people who guided OPA’s development are no longer leading the project, and the paid enterprise support and roadmap from Styra are winding down.
For the solution’s users, this development is a double-edged sword. On one hand, OPA remains an open source project under CNCF governance, so existing users are not left stranded overnight. On the other hand, losing the original maintainers and commercial backing introduces concerns about project maturity and future innovation.
The OPA community can continue, but there is uncertainty around who will drive major improvements or provide enterprise-grade support going forward. This is especially relevant for organizations that are just now considering OPA. Adopting a technology in transition, without its founding team at the helm, may pose risks in terms of stability, support, and evolution.
Cerbos is an open source authorization engine purpose-built for modern applications with fine-grained access control requirements. It offers significant advantages in simplicity, performance, and maintainability, and it’s built to scale alongside your business. From regulated environments to AI-driven interfaces and APIs, Cerbos provides the performance, governance, and flexibility that enterprises demand.
OPA is a general-purpose policy engine, but that broad scope can become a burden for teams that only need straightforward authorization in their apps. Cerbos picks up where OPA leaves off by providing a developer-centric experience tailored to application and API-level use cases, along with all the tooling and infrastructure needed to run it efficiently in production. In practice, this means teams can implement granular roles and permissions in hours, not months, and evolve authorization logic safely as requirements change.
Aspect | Cerbos | OPA |
---|---|---|
Use case focus | Purpose-built for application and API-layer authorization (fine-grained RBAC/ABAC in apps, APIs, AI agents, and gateway interfaces). Cerbos is also well-suited for protecting AI agents, RAG pipelines, and authorizing based on either human or non-human identities across strict data access boundaries. | General-purpose policy engine for any kind of policy (not just authZ) - used for infrastructure, Kubernetes, microservices, as well as application logic. Not specialized for app business logic by default. |
Policy language | YAML + CEL (declarative config). Policies are written in YAML with conditions in CEL expressions. Familiar format with a low learning curve; no new programming language needed. | Rego DSL (declarative code). Policies are written in Rego, a Datalog-like language. Very flexible and expressive, but has a higher learning curve and unique syntax. Policies can return arbitrary data structures, not just booleans. |
Policy model | Policy-as-data approach: policies are written as declarative and opinionated YAML with a defined structure. Cerbos has built-in support for common authZ models (RBAC, ABAC, PBAC, role hierarchies, tenant isolation, etc.), which means less boilerplate. The policy outcome is always an allow/deny decision (plus any additional request context), providing clarity and consistency. | Policy-as-code approach: you write rules in Rego. OPA doesn’t impose a specific domain model - which is flexible but means you must define your own schemas for roles, permissions, etc. There’s no first-class concept of “role” or “resource hierarchy”; you implement those via data and rules. |
Deployment model | Flexible deployment: Can run as a centralized PDP service or as a sidecar next to your app. Supports REST and gRPC APIs, so any language/platform can query it. Cerbos instances are stateless; they load policy files into memory and evaluate requests purely based on input (context you pass). Horizontal scaling is straightforward. | Distributed deployment: Typically run OPA as a sidecar or library within each service that needs policy decisions (ensures low latency local decisions). Each OPA keeps policies/data in-memory. No central server by default (to avoid single point of failure). Requires a way to distribute and sync policies/data to all those instances (e.g. bundles, control plane). |
External data & context | Cerbos is stateless and evaluates decisions based on context passed in the API request (principal attributes, resource data, etc.): It does not fetch external data during evaluation - you supply all needed info, often by pre-loading from a database in your app. This makes the data flow explicit and keeps the PDP fast (no mystery network calls during evaluation). | Allows policy to load data in various ways: static JSON data files can be packaged with policies, or policies can call out via the http.send builtin to fetch data at runtime. This flexibility is powerful but means you must manage data updates (e.g. push new bundles or accept the latency of in-policy HTTP calls). |
Performance | High-performance optimized for authorization: After initially using OPA internally, the Cerbos team built a custom engine - also in Go - for authZ, yielding up to 17× faster decision evaluations than the earlier OPA-based version. In real-world use, Cerbos can handle thousands of authZ decisions per second with sub-millisecond latency. The engine is optimized in memory and CPU footprint for access control scenarios. | High-performance engine written in Go: In sidecar mode, decisions are local and avoid network hops. Typical decisions in milliseconds or less. However, evaluating Rego can incur overhead, especially for complex policies or large data sets, and in practice OPA policy evaluation might be slower for app authZ use cases compared to a specialized engine. |
Observability & debugging | Cerbos provides detailed audit logs and explainability out-of-the-box: Every decision can include a reason and the policy rule that triggered it. This helps during development and in production audits to see why a request was allowed/denied. Cerbos also offers a CLI tool for policy testing and a Playground for trying out scenarios, which improve the developer experience. | OPA can produce decision logs (JSON structured logs of inputs/outputs) which you can aggregate. It also has a trace mode to debug how a decision was made, but the output is geared towards developers familiar with Rego. No built-in end-user-friendly explanations. |
Developer experience | Developer-friendly: Simple SDKs for most languages and frameworks to make checks (pass principal, resource, action) or integrate directly via REST/GRPC. Built-in policy test tools and human-readable policy files. Detailed decision explanations and audit logs help with debugging and compliance. | Engineer-centric: Requires writing policies as code (Rego). Integration via REST API, Go library, or sidecar calls. Strong integration with DevOps pipelines (treat policies like code with tests, CI/CD). Steeper learning curve for developers; less accessible to non-engineers. |
OPA can be applied in many scenarios, and it is often deployed as a sidecar policy agent to evaluate rules (written in Rego) against JSON data. This broad applicability, however, comes at the cost of substantial complexity. Rego - OPA’s policy language - is very expressive but not easy for newcomers. It’s a Datalog-like syntax that most developers must learn from scratch. Crafting policies in Rego can feel like writing code in a new paradigm, which lengthens the learning curve and requires significant expertise - writing and maintaining Rego policies can become a project of its own.
Another challenge is that OPA essentially provides a blank slate: it doesn’t impose any structure on your policies or data models. That means if you want to implement common patterns, say, role hierarchies or tenant-specific rules, you have to define those concepts yourself. There are no built-in primitives for “user,” “role,” or “resource hierarchy” - you model everything via JSON data and Rego code. This adds to the engineering effort and potential for errors, especially for teams without dedicated policy engineers.
Maintenance is also a consideration. Using OPA at scale usually means you need a system to distribute and manage policy updates across many OPA agents. Large OPA users often rely on bundles or the now-sunsetting Styra DAS to push policy updates and monitor decisions across instances. With Styra’s enterprise service winding down, new adopters have to either build their own tooling for policy lifecycle management or rely on community-driven solutions. For a team that wants to add role-based access control to a new application, this overhead can be daunting. It can feel like using a heavy-duty tool where a lighter touch would suffice.
In short, OPA’s general-purpose nature brings along significant complexity and upkeep. And given the uncertainty in OPA’s ecosystem right now, many teams are understandably seeking a smoother, more future-proof path for their authorization layer.
Cerbos was designed to provide the capabilities that developers need, like role- and attribute-based access control, without the steep learning curve and overhead of a general policy engine. Unlike OPA, which was created to be a broad policy framework for any system, Cerbos focuses on authorization across apps, APIs, AI agents, MCPs, services and workloads - think of protecting APIs, UI actions, microservice endpoints, and so on all with the same policy set.
One of the first things you notice is the policy language. Cerbos policies are written in declarative YAML (or JSON) that will feel familiar to most developers. There is no new programming language to master. Within these YAML policies, Cerbos uses the Common Expression Language (CEL) for writing conditions, which reads like simple expressions (e.g. request.resource.owner == request.principal.id
to check if a user owns a resource). This combination of YAML + CEL makes policy writing approachable - the syntax is clear and the structure is defined. In contrast, OPA’s Rego, while powerful, requires learning a different syntax and way of thinking. For a team starting fresh, being able to express rules in a straightforward YAML config can significantly speed up development and reduce errors.
Cerbos is also easier to embed and deploy in modern applications. You can run Cerbos as a sidecar service next to your application, as a centralized microservice, or even embed it as a library (the core engine is written in Go, and there is support for WebAssembly for other languages). Each Cerbos instance is stateless - it loads policy files into memory and evaluates requests purely based on the input you supply. There’s no need for an external database or heavy infrastructure. This stateless, lightweight design means you can scale authorization by simply running more instances behind a load balancer. Policy updates can be delivered by reloading files or pointing Cerbos at a Git repo or object storage - the process is straightforward and integrates with existing DevOps workflows (e.g. you can manage the YAML policies in Git like you manage code).
Essentially, Cerbos provides the policy engine and the tooling you need out-of-the-box, so you don’t have to build a custom control plane just to manage it.
Cerbos also provides an admin API, and through the commercial offering - an authorization management solution called Cerbos Hub, to manage policies centrally. Cerbos Hub is a control plane that organizations can use to collaborate on policy editing, continuous test running, and deploying policies from development to production. It offers capabilities like centralized policy management of multiple PDP instances, unified audit log viewing, and a policy testing playground. This means that a team can use a single control plane interface to update policies and push them out to all their Cerbos nodes, rather than dealing with each instance separately. The clarity and auditability of Cerbos policies also help streamline security reviews and demonstrate internal controls during audits.
One of Cerbos’s biggest advantages is its developer experience. The goal is to enable your team to get to production authorization quickly and with confidence. Because Cerbos policies use a familiar format and concepts (like users, roles, resources), developers and architects can reason about access rules without extensive training. Writing a policy for “users with the ADMIN role can delete records” in Cerbos is a simple YAML snippet, whereas in OPA/Rego it would involve crafting a rule, choosing data structures, and thoroughly testing the logic. Cerbos’s learning curve is much gentler, which means your team spends less time learning the tool and more time implementing actual permissions.
Cerbos also comes with tools that make development and testing easier. For example, it provides a CLI for validating and unit-testing your policies, plus an interactive Playground UI where you can load policies and simulate authorization queries. This means a developer can write a new access rule and immediately verify it works as intended with various inputs.
Cerbos automatically produces detailed audit logs and even explanation traces for every decision it makes. For instance, if an API call gets denied by Cerbos, you can inspect the logs to see exactly which rule was evaluated and why the decision was deny or allow. This level of built-in transparency greatly simplifies debugging of permission issues in development and even in production.
In contrast, while OPA can log decisions, the output is basically a data blob of inputs and outputs. Understanding why OPA made a decision often requires a developer to reconstruct the evaluation step-by-step (sometimes by using OPA’s own debugging REPL and trace mode) and interpret the Rego logic. Cerbos’s human-readable explanations mean you can quickly get to the root of an authorization decision without diving into low-level traces.
All these features add up to a faster path to production. With Cerbos, a team can define policies, test them thoroughly using provided tools, and deploy the Cerbos service alongside their app with minimal fuss. There is less custom integration code to write - you call Cerbos’s check API (REST or gRPC) to ask “can user X do action Y on resource Z?” and get an answer. The focus is on building your product and differentiating features, not building an authorization system from scratch. This developer-first approach means new projects can implement robust access control in days instead of months.
And you won’t outgrow Cerbos as your performance needs scale. As noted earlier, the Cerbos engine is optimized for speed. It can evaluate thousands of permission checks per second with sub-millisecond latency, so it will easily keep up with the throughput of all but the most extreme applications. And if you ever did hit a ceiling, you can just run more Cerbos instances in parallel. The Cerbos team’s decision to build a custom engine (after initially experimenting with OPA) resulted in order-of-magnitude performance gains, so you have plenty of headroom. In short, performance will not be a bottleneck for your authorization layer when using Cerbos.
Perhaps the most important difference is how well Cerbos aligns with modern application authorization requirements. Most apps today need a mix of role-based access control (RBAC) and attribute-based rules, often with some dynamic logic based on context. Cerbos was designed with these use cases in mind.
It has built-in support for common patterns like RBAC and ABAC, as well as more advanced concepts like derived roles (roles determined at request-time based on context) and hierarchical roles. For example, you might declare in Cerbos that any user with role “manager” gains an additional derived role of “approver” for resources within their department - without hard-coding that logic throughout your app. The policy model in Cerbos explicitly understands principals (users), resources, actions, and conditions, which makes it straightforward to express rules like “users can edit their own records” or “only admins or resource owners can delete this object.”
Cerbos handles multi-tenancy especially well. Applications serving many tenants often need to isolate policies or data by tenant. Cerbos allows you to segregate policies per tenant or include tenant context in decisions easily, ensuring that rules are evaluated in the right scope. Since Cerbos policies are just data, you can even templatize or reuse them for multiple tenants while keeping their decisions isolated. This is a level of first-class support for multi-tenant authorization that you would have to manually engineer with OPA. OPA could be made to handle multi-tenancy, but you would be responsible for structuring your policy data and enforcement logic to separate tenants - again, more work on your plate.
It’s also worth noting that Cerbos focuses on application and API-level enforcement, rather than low-level infrastructure. If your goal is to enforce who can access which API endpoints, which UI components are visible, or which operations a microservice can perform on behalf of a user, Cerbos is purpose-fit for that. It integrates cleanly with API gateways or microservice calls to handle authZ decisions in real time. OPA’s sweet spot, historically, has been lower-level or infrastructure policy (like admission controls in Kubernetes, or rules in CI/CD pipelines). You can certainly use OPA for application authorization, but you’ll essentially be creating your own app authorization framework on top of it. Cerbos gives you that framework out-of-the-box, reflecting authorization models (roles, permissions, ownership, attribute checks) in a ready-to-use way.
Given these considerations, Cerbos emerges as a modern, pragmatic alternative. It offers the clarity, precision, and features needed for fine-grained access control without the heavy lifting that OPA would require to achieve the same ends. Especially in light of OPA’s uncertain commercial support and shifting roadmap, using Cerbos can provide peace of mind that your authorization layer is backed by an active team and community focused on this problem space.
Choosing an authorization solution comes down to balancing capabilities, ease of use, and long-term viability. OPA was an early pioneer of the policy-as-code approach and continues to be used for certain scenarios.
But for most teams implementing user permissions in modern applications*,** APIs, AI agents, MCPs, services and workloads,* OPA’s one-size-fits-all scope ends up being a burden - even more so now, as its ecosystem adjusts after Styra’s pivot. Cerbos, by contrast, offers a focused solution for authorization with far less friction.
With Cerbos, you get a straightforward policy model, a familiar language and tooling, and an active community and company ensuring the project’s momentum. It enables your developers to add rich authorization to your product quickly and safely, without having to become policy language experts or build custom control systems.
In that sense, adopting Cerbos isn’t just choosing an OPA alternative - it’s a leap to a more pragmatic approach to authorization for the application layer.
If you’re looking to enforce fine-grained, contextual, and continuous authorization across apps, APIs, AI agents, MCPs, services and workloads - feel free to give Cerbos a try. If you’re curious how Cerbos could fit into your architecture or have specific requirements to discuss, feel free to book a call with a Cerbos engineer for a free 1:1 session. With Cerbos, you can achieve robust, scalable authorization without the steep learning curve - empowering your team to focus on building features rather than reinventing access control.
Book a free Policy Workshop to discuss your requirements and get your first policy written by the Cerbos team
Join thousands of developers | Features and updates | 1x per month | No spam, just goodies.