Skip to content
AzuAzu

Introduction

Azu is an admin panel for AdonisJS 7. Build searchable lists, detail pages, and forms using your existing Lucid models, Bouncer policies, and VineJS validators.

Azụ means “back” in Igbo, as in your app’s back office.

Building an admin panel from scratch often means writing the same tables, forms, filters, and permission checks again. Or you can bolt on a generic tool with its own config, permissions, and validation. Those slowly drift from your app’s real rules.

Azu takes a different route. It doesn’t add a second set of rules. It uses the ones you already have:

  • Lucid models for data and relationships.
  • Bouncer policies for who can see and do what.
  • VineJS validators for form rules and error messages.
  • Drive for file and image uploads.
  • Inertia and React for the UI, so you can replace every page and field with your own component.

When a rule changes, update the policy or validator your app already uses.

A resource is one file. It points at a Lucid model and borrows the model’s policy and validators. Azu turns it into a list, a detail page, and create and edit forms. This is the demo store’s product resource:

app/admin/resources/product_resource.ts (part)
label: 'Products',
group: 'Catalog',
icon: 'package',
order: 1,
title: 'name',
search: ['name', 'sku'],
policy: ProductPolicy,
validators: {
create: createProductValidator,
update: updateProductValidator,
// The update validator's unique rule reads productId
meta: ({ record }) => ({ productId: record?.id }),
},
query: (q) => q.preload('category'),

Resources are typed against the model, so a typo like column.text('nmae') fails tsc, not your client’s demo.

The core is free and MIT licensed, and it always will be. Azu is built by Mezie Labs. Azu Pro will add paid extensions later.