Skip to main content

Package Ecosystem

Packages are the force multiplier. Install via the Platform Panel and use immediately. The install order for the core three is strict: AppBuilder → CRUD → Workflow.

The catalogue

AppBuilder core

The React shell. Provides ZangoApp, sidebar navigation, routing, themes, and auth UI. Routes and menus are configured in App Panel, no frontend rebuild for nav changes. Read the docs →

install order: 1 of 3

CRUD core

The data-management layer: BaseCrudView + ModelTable + BaseForm + CrudHandler. The most commonly used package, since most business UI is CRUD UI. Read the docs →

install order: 2 of 3

Workflow

Lifecycle management: statuses, transitions, tags, audit trail. Install after CRUD. Read the docs →

Communication

SMS, email, audio & video. Configure providers (e.g. Infobip), send from code or dashboard. Read the docs →

Appointment

A full scheduling vertical: types, hosts, reminders, custom workflows, CRUD UI.

Packages compose. Pair the Communication package with a workflow done method (when a case is approved, send the user an SMS), or call it from an AI agent's @tool function.

CRUD in practice

CRUD is the package you reach for most, since most business UI is list, create, edit, and delete on a model. A BaseCrudView wires a model, a ModelTable, and a BaseForm into one endpoint, and the CrudHandler React component renders the full screen. A complete management view is about twenty lines:

patients/views.py
from packages.crud.views import BaseCrudView
from packages.crud.table import ModelTable, DateCol, StatusCol
from packages.crud.forms import BaseForm
from .models import Patient

class PatientTable(ModelTable):
columns = ['name', StatusCol('status'), 'doctor', DateCol('modified_at')]

class PatientForm(BaseForm):
class Config:
model = Patient
fields = ['name', 'date_of_birth', 'gender', 'doctor']

class PatientCrudView(BaseCrudView):
model = Patient
table = PatientTable
form = PatientForm
add_btn_title = 'Add patient'

The route-to-component mapping is served at runtime via /appbuilder/initializer/, so adding a page or changing a menu needs no frontend rebuild. In practice the plugin writes this view, its table, and its form from your description.