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:manager access level sees the Manager Dashboard, not the IC Dashboard.
Permission Functions
All permission checks are inlib/permissions.ts:
Access Level Checks
Work Type Checks
Dashboard Access
Dashboard Types
CharleOS has 5 dashboard types based on role:| Dashboard | Who Sees It | Permission Check |
|---|---|---|
| Manager Dashboard | Admin/Manager access level | canViewManagerDashboard() |
| PM Dashboard | PMs (staff level) | canViewPMDashboard() |
| CSM Dashboard | CSMs (staff level) | canViewCSMDashboard() |
| IC Dashboard | Developers/Designers/QA (staff level) | canViewICDashboard() |
| Executive Dashboard | Users with hasExecutiveAccess flag | canViewCommercialsDashboard() |
Sidebar Visibility
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
| Function | Who Gets Access |
|---|---|
canViewManagerDashboard | Admin, Manager |
canViewPMDashboard | PM (staff level) |
canViewCSMDashboard | CSM (staff level) |
canViewICDashboard | Dev/Design/QA (staff level) |
canViewCommercialsDashboard | Users with hasExecutiveAccess flag |
Sidebar Visibility
| Function | Who Gets Access |
|---|---|
canViewMyTasks | ICs (dev/design/qa) |
canViewMySchedule | ICs (dev/design/qa) |
canViewMyTimeTracking | ICs (dev/design/qa) |
canViewClients | Admin, Manager, PM, CSM |
canViewTasks | Admin, Manager, PM, CSM, ICs |
canViewSchedule | Admin, Manager, PM |
canViewQuotes | Admin, Manager, PM, CSM, ICs |
canViewProjects | Admin, Manager, PM, ICs |
canViewTimeTracking | Admin, Manager |
canViewCapacity | Admin, Manager |
canViewAnnualLeave | Admin, Manager |
canViewReports | Admin, Manager |
canViewAdmin | Admin only |
canViewKnowledgeBase | Everyone |
canViewRag | Everyone |
canViewHelpDesk | Admin, Manager, CSM |
Operational Permissions
| Function | Who Gets Access | What It Allows |
|---|---|---|
canCreateTasks | Admin, Manager, CSM, PM | Create new tasks |
canEditTasks | Admin, Manager, PM, CSM | Edit task title, description, estimatedTime, clientId, pmId |
canDeleteTasks | Admin, Manager | Delete tasks |
canAssignSubtasks | Admin, Manager, PM | |
canCreateQuotes | Admin, Manager, CSM | |
canDeleteQuotes | Admin, Manager, CSM | |
canEditQuote | Admin, Manager | |
canApproveQuote | Admin, Manager, CSM | |
canManageQuotes | Admin, Manager, PM, CSM | |
canEditClients | Admin, Manager | |
canEditClientSchedule | Admin, Manager, PM, CSM | |
canManageClientUsers | Admin, Manager, CSM | |
canCreateProjects | Admin, Manager | |
canEditProjectBudget | Admin, Manager | |
canManageProjectTasks | Admin, Manager, PM | |
canAddProjectPhases | Admin, Manager, PM | |
canEditRag | Admin, Manager | |
canViewActivityLog | Admin, Manager |
Adding New Permissions
1
Add Permission Function
Add to
lib/permissions.ts:2
Use in Components
3
Protect Routes
Best Practices
Always Check Permissions Server-Side
Always Check Permissions Server-Side
Client-side checks are for UI only. Always verify on the server:
Use Specific Permission Functions
Use Specific Permission Functions
Don’t check
accessLevel or workType directly:Redirect, Don't Hide
Redirect, Don't Hide
For pages, redirect unauthorized users: