System Architecture
Functional overview of how Axvero is structured — intended for product stakeholders, administrators, and anyone trying to understand how the pieces fit together.
The Three Layers
Axvero is organized around three distinct concerns: who people are, how they are organized, and what they work on.
A single user can simultaneously be an owner of their own organization, a staff member in a colleague's organization, and a client applicant in a bank — all with one account.
Organization Structure
Each organization owns one or more workspaces (work contexts). Staff access is controlled through teams. Clients are assigned directly to the organization and can participate in applications across all org workspaces.
Key insight: Teams are org-level — not tied to a single workspace. Assigning a team to a new workspace instantly grants all its members access. Clients are also org-level — they are not scoped to any single workspace.
How Access Works
A staff member's access to a workspace is determined by which team they belong to. Each team has a base role that applies to every workspace it is assigned to.
An individual role override can be set on a team member if one person needs a different permission than the team default — without creating a new team for them.
Role Hierarchy
Roles form a strict hierarchy. Each role includes all permissions of the roles below it.
Invitation & Account Creation Flow
Both staff and client accounts are pre-created immediately when invited. The office can assign them to applications and see them in rosters right away — the invited person completes onboarding at their own pace.
The invitation email contains an account-setup link (verify email + set password + update profile). It does not contain an org-join link — the user is already added to the org at invitation time. Activation into a team happens automatically once the scheduler detects that all required actions have been completed (runs every 2 minutes).
Pending invitations that are never accepted are cleaned up automatically:
- Day 20 — reminder email sent
- Day 30 — Keycloak account deleted and the
Member/Clientrecord is deleted
Org-to-Org Relationships
Organizations can formally partner with other organizations as Agents (submit applications on behalf of clients) or Sub-contractors (provide operational services).
Partner org members are regular TeamMembers in a specific team within the target org — no special access model is needed.
Application Lifecycle
Applications live in workspaces and move through a configurable workflow.
Document lifecycle:
Personal Workspace — Cross-Org Aggregation
Every user has a personal workspace (/p/$userSlug/). Its applications view is a unified inbox across all organizations the user participates in.
Clicking any application opens it in its own workspace context — the URL becomes /o/$orgSlug/w/$workspaceSlug/applications/$id/. The personal view is for discovery; work happens in the workspace.
Navigation Structure
The frontend renders a different sidebar depending on the active workspace type and purpose.
Workspace Switcher
The switcher at the top of the sidebar lists all workspaces. When a user has more than 3 org workspaces, a search input and filter tabs appear:
- Staff — workspaces with
workspacePurpose = STAFForMIXED - Client — workspaces with
workspacePurpose = CLIENTorMIXED - All — no filter
The switcher defaults to the Staff tab. Personal workspaces are always pinned below the scrollable list.
Staff Workspace Sidebar
Two sections, always rendered in this order:
WORKSPACE — scoped to the active workspace (/o/orgSlug/w/workspaceSlug/):
- Dashboard
- Applications
- Messages (with unread badge)
- App Setup (collapsible: Documents, Templates, Permissions) — permission-gated (
ManageApplicationSetup)
MANAGEMENT — scoped to the org (/o/orgSlug/), three sub-groups separated by dividers:
People:
- Contacts (collapsible: Users, Teams — gated by
ManageMembers | InviteMembers; Clients —ManageClients | InviteClients; Partners —ManagePartners | InvitePartners) - Workspaces — gated by
CreateWorkspace | ManageWorkspaces
Integrations:
- Connectors (collapsible: AI —
ManageAiConfig; Storage —ManageOrgSettings; Email —ManageEmailConfig) - Usage (collapsible: AI Usage —
ViewAiUsageHistory) - Email Templates — gated by
ViewEmailTemplates
Admin:
- Billing — gated by
MANAGE_BILLING - Settings (collapsible: Profile, Address, Permissions —
ManageSystemPermissions, Translations —ManageSystemPermissions)
Client Workspace Sidebar
Rendered when workspacePurpose = CLIENT. Simplified view for external clients:
- Dashboard
- My Applications
- Messages (with unread badge)
- About [Org Name] section: Profile & About, Address & Contact
Personal Workspace Sidebar
Rendered when workspaceType = PERSONAL:
GENERAL:
- Dashboard
- Applications
Account section:
- Organizations
- Billing
- Settings (collapsible: Profile, Account, Appearance, Notifications, Display)
Sidebar by Persona
| Persona | Sidebar shown | Key items |
|---|---|---|
| Owner / Admin | Staff | Full WORKSPACE + MANAGEMENT sections |
| Manager / Member | Staff | WORKSPACE only; MANAGEMENT items filtered by permissions |
| Client user | Client workspace | My Applications, Messages, About org |
| Personal | Personal | Dashboard, Applications, Account settings |
What Happens on Org Creation
When a user creates a new organization, the system automatically sets up the initial structure: