Admin Overview
Introduction to the NapX PMS Admin Dashboard — what it is, who uses it, and how to access it.
Admin Dashboard Overview
The NapX PMS Admin Dashboard (apps/admin) is a self-contained Next.js application that gives super-administrators full visibility and control over the entire platform — across all tenants.
Who can access it?
Access is restricted to system administrators — users who exist in the system_admins table. Within that group, users with isSuperAdmin = true have additional write permissions (create, update, delete operations).
Important: The admin app connects directly to the database. It does not proxy through
apps/api. This means it runs independently and can be deployed separately.
Accessing the admin
| Environment | URL |
|---|---|
| Local dev | http://localhost:4000 |
| Staging | Configured via Amplify env |
| Production | Configured via Amplify env |
Local setup
-
Copy the example environment file:
cp apps/admin/.env.example apps/admin/.env.local -
Fill in the required values — see Getting Started for the full env reference.
-
Ensure the local database is running:
docker-compose -f docker-compose.yml up -d -
Seed an initial super-admin user:
pnpm --filter @repo/database run db:seed -
Start the admin app:
pnpm run dev:admin -
Sign in at
http://localhost:4000/loginwith the seeded credentials.
Default seeded credentials
The development seed creates a super-admin account. Check packages/database/prisma/seed.ts for the credentials — they are not used in production.
How index pages work
Every admin index page uses the same operational header pattern so lists behave consistently across the dashboard:
- Page title and supporting description on the left
- Primary action on pages that support writes
- Inline search in the header row
- Filter button that opens a right-side sheet with page-specific filters
Search filters the rows already loaded on the page. Filters are model-aware, and active filters remain visible so operators can see why a list is narrowed before changing views or sharing a URL.
Detail sheets and shareable URLs
Most list pages support deep-linkable detail sheets.
- Choosing View details from a row action opens the entity sheet and adds
?id=<recordId>to the URL - Closing the sheet removes the
idquery param again - Rooms, spaces, and space types also support
?propertyId=<propertyId>so filtered views can be shared directly
This keeps common admin workflows shallow: list, inspect in a sheet, copy identifiers if needed, then return to the same filtered list state.