AventaraBUILD FROM WHAT YOU KNOW
Access logoAccess logoAventara Access1.0.0-rc.2 · RC
PERMISSION WITH A CLEAR REASON

Know exactly who can do what.Every row. Every field.

Write role-first rules that follow your schema. Access decides which rows and fields a caller may use. Better Auth handles sign-in and credentials.

Release candidate·Read the documentation
A RULE. A CALLER. A DECISION.
access.policies.ts · excerptINPUT
.grants(({ grant, me }) => [  grant("signedIn", "update", "Note", {    where: { authorId: me.id },  }),]).denies(({ deny }) => [  deny("*", "*", {    if: { claims: { banned: true } },  }),]);
Illustrative decisionGrant matches
Caller    Ada · id user_adaAction    update NoteRow       authorId: "user_ada"Banned    false
ALLOW · author matches caller

The author can edit their own note. This is a local illustration of the quickstart rules.

Rules checked against your schemaDefault deny; matching denies winSessions, tokens and MCP agentsAudit the rule behind a decision
RULES YOU CAN REASON ABOUT

Who can do what should be easy to answer.

As your application grows, permission checks spread across handlers and services. Access gives those decisions a home: role-first rules, typed from your schema, with an explanation behind each decision.

THE BIG PICTURE

Identity in. A decision out.

Better Auth handles sign-in and credentials. Access resolves permissions. The framework validates and runs the operation. Each part has a clear job.

Access logoAccess logoAventara AccessEvery decision follows your rules.
01

Identify the caller

A session or bearer token supplies the principal for the request.

02

Resolve the rules

Access evaluates grants and denies for the resource, action, rows and fields.

03

Enforce the decision

The framework applies the decision. Refused requests return 403 A4002.

MAKE IT YOURS

Give every permission a place.

Start with the Note example. Write your first rules, allow a request, and see another refused.

Build with Access
A FEW GOOD QUESTIONS

Before you
start building.

Inside the documentation
Does Access sign users in?

Better Auth handles sign-in and issues credentials. Access adds authorization: which rows and fields a caller may use.

Can I use the authentication I already have?

Yes. Use the policy engine alone with your own authentication, add the Access plugin to your existing Better Auth setup, or set both up together with createAccess.

What happens when a grant and a deny both match?

The deny wins. Rule order does not change the result. A request with no matching grant is denied too.

Can several services share policies?

Each service can own a namespace in the Access registry. The CLI can push, pull and verify policy files; a generated client supports services that do not run on Aventara.