Skip to main content
CharleOS uses a flexible permission system based on access levels and work types. All permission logic is centralized in lib/permissions.ts.

Permission Model

Two-Tier System

CharleOS combines two concepts for access control:

Access Level

System-wide permission tier
  • Admin: Full access (Luke)
  • Manager: Management features (Simon, Andre, Ben, Nic)
  • Staff: Standard access (everyone else)

Work Type

Role-based feature access
  • development/design/qa: IC features
  • pm: Project management features
  • csm: Client success features
  • sdr: Limited features

Combined Logic

The permission system uses both factors:
Result: A developer with manager access level sees the Manager Dashboard, not the IC Dashboard.

Permission Functions

All permission checks are in lib/permissions.ts:

Access Level Checks

Work Type Checks

Dashboard Access

Dashboard Types

CharleOS has 5 dashboard types based on role: Code:
Sidebar items are shown/hidden based on permissions:

Operational Permissions

Task Management

Quote Management

Client Management

Project Management

Implementation Patterns

Protected Server Component

Protected API Route

Conditional UI Rendering

Complete Permission Reference

Dashboard Access

Operational Permissions

Adding New Permissions

1

Add Permission Function

Add to lib/permissions.ts:
2

Use in Components

3

Protect Routes

Best Practices

Client-side checks are for UI only. Always verify on the server:
Don’t check accessLevel or workType directly:
For pages, redirect unauthorized users:

Authentication

Auth architecture overview

Better Auth

Auth configuration details

Sessions

Session management