A modern Vue 3 frontend for the support roster platform, delivering public on-call visibility, authenticated workspace management, and operational tools through a polished single-page application.
Support Roster UI is the user-facing web interface for managing and viewing on-call schedules. It provides a public roster viewer, an admin workspace for planning and operations, contact information pages, product release notes, and protected toolsβall built with Vue 3, Vite, and Tailwind CSS.
This repository is designed to work as a Git submodule within support-platform, where backend services, automated tests, development scripts, and curated screenshots are centrally coordinated.
- π― Vue 3 Composition API with
<script setup>and reusable feature structure - β‘ Lightning-fast development powered by Vite 7 with HMR
- π¨ Modern styling using Tailwind CSS 4 with custom design tokens
- π£οΈ Smart routing via Vue Router 5 with role-based access guards
- π Access control enforcing workspace policies on protected pages
- π¦ Modular architecture with feature-based organization
- π Internationalization support via Vue I18n
- π³ Production-ready with Docker + Nginx deployment path
- π Comprehensive specs maintained in
.specs/for all features
| Public Viewer | Workspace Overview |
|---|---|
![]() |
![]() |
| Monthly Roster Planner | Validation Center |
|---|---|
![]() |
![]() |
| Surface | Route | Access | Purpose |
|---|---|---|---|
| Public Viewer | /viewer |
Public | Read-only on-call timeline with date picker, timezone selector, and responsive layout |
| Login | /login |
Public | Staff ID authentication and account activation flow |
| Admin Workspace | /workspace/* |
Authenticated + Policy | Complete roster management: overview, monthly planning, staff, shifts, teams, validation, import/export, accounts |
| Contact Hub | /contact-information |
Public + Protected | Public viewing and admin management of contact details |
| Host Hub | /linux-passwords |
Protected | Operational password vault gated by workspace access policy |
| Product Updates | /product-updates |
Public | User-facing release notes tracking visible product changes |
Note: Navigating to
/workspaceredirects users to the appropriate workspace entry page based on their authenticated permissions and workspace policy.
| Category | Technology |
|---|---|
| Framework | Vue 3.5 (Composition API) |
| Build Tool | Vite 7 |
| Router | Vue Router 5 |
| State Management | Vue reactivity + Pinia stores |
| Styling | Tailwind CSS 4 |
| UI Components | Radix Vue (headless primitives) |
| Icons | Lucide Vue Next |
| Utilities | clsx, tailwind-merge, class-variance-authority |
| Date Handling | date-fns, date-fns-tz |
| i18n | Vue I18n |
| Runtime | Node.js ^20.19.0 || >=22.12.0 |
- Node.js
^20.19.0 || >=22.12.0 - npm (comes with Node.js)
- Backend API running at
http://127.0.0.1:8080/api(see Backend Dependency)
# Clone the repository (if standalone) or init submodules (if from parent workspace)
git submodule update --init --recursive
# Navigate to the UI directory
cd support-roster-ui
# Install dependencies
npm install# Start the Vite dev server (default port: 5173)
npm run devThe app will be available at http://localhost:5173 with hot module replacement enabled.
Default API Configuration:
VITE_API_BASE_URL=http://127.0.0.1:8080/apiYou can override this in .env.development.local (not tracked by Git).
# Build for production
npm run build
# Preview the production build locally
npm run previewThe build output will be in the dist/ directory.
| Command | Description |
|---|---|
npm run dev |
Start Vite development server with HMR |
npm run build |
Build production-ready static bundle to dist/ |
npm run preview |
Preview production build locally |
npm run format |
Format src/ with Prettier |
| Variable | Purpose | Default (Dev) | Example (Prod) |
|---|---|---|---|
VITE_API_BASE_URL |
Backend API base URL | http://127.0.0.1:8080/api |
https://supportui.servier/api |
VITE_XMATTERS_URL |
External Systems drawer link for xMatters | https://www.xmatters.com/ |
|
VITE_SERVICENOW_URL |
External Systems drawer link for ServiceNow | https://www.servicenow.com/ |
|
VITE_MESSAGE_DELIVERY_KB_URL |
Message Delivery Knowledge Base link | https://learn.microsoft.com/ |
Configuration Files:
.env.developmentβ Development defaults.env.productionβ Production defaults.env.development.local/.env.production.localβ Local overrides (not committed)
See Vite's environment variables documentation for more details.
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β Browser β
β β
β βββββββββββββββββββββββββββββββββββββββββββββ β
β β Vue 3 SPA (Vite) β β
β β β β
β β βββββββββββββββββββββββββββββββββββββββ β β
β β β /viewer # Public roster view β β β
β β β /login # Auth & activation β β β
β β β /workspace/* # Admin workspace β β β
β β β /contact-information/* # Contact flows β β β
β β β /linux-passwords # Protected vaultβ β β
β β β /product-updates # Release notes β β β
β β βββββββββββββββββββββββββββββββββββββββ β β
β β β β
β β βββββββββββββββββββββββββββββββββββββββ β β
β β β src/api/ (API Client Layer) β β β
β β βββββββββββββββββββββββββββββββββββββββ β β
β βββββββββββββββββββββββββββββββββββββββββββββ β
β β β
β βΌ β
β HTTP Requests β
βββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
βββββββββββββββββββββββββββββββββ
β support-roster-server β
β (PostgreSQL backend) β
βββββββββββββββββββββββββββββββββ
Key Concepts:
- Single-page application with client-side routing
- API layer (
src/api/) abstracts backend communication - Route guards enforce authentication and workspace policies
- Feature modules encapsulate domain logic (workspace, contact-info, etc.)
- Pinia stores manage cross-component state when reactivity isn't enough
support-roster-ui/
βββ .specs/ # π Frontend specifications
β βββ spec.md # Main spec navigation
β βββ architecture.md # Architecture decisions
β βββ development.md # Local dev workflow
β βββ deployment.md # Deployment guides
β βββ ui-design.md # Design system & patterns
β βββ product-updates.md # Product update log rules
β βββ modules/ # Module-specific specs
β βββ workspace/ # Workspace feature specs
β βββ index.md
βββ build/ # π³ Deployment configs
β βββ build-frontend.sh
β βββ push-to-ecr.example.sh
β βββ ecs-task-definition.example.json
βββ public/ # Static assets (served as-is)
βββ src/
β βββ api/ # π Backend API wrappers
β βββ assets/ # π¨ Global styles, images
β βββ components/ # π§© Shared UI components
β βββ data/ # Static data (teams, etc.)
β βββ features/ # π― Feature modules
β β βββ contact-information/
β β βββ linux-passwords/
β β βββ product-updates/
β β βββ workspace/ # Admin workspace feature
β βββ i18n/ # π Internationalization
β β βββ locales/
β βββ lib/ # π οΈ Utility functions
β βββ pages/ # π Top-level route pages
β βββ router/ # π£οΈ Route config & guards
β βββ stores/ # π¦ Pinia state stores
β βββ App.vue # Root component
β βββ main.js # App entry point
βββ Dockerfile # Production container
βββ nginx.container.conf # Nginx config for SPA routing
βββ package.json
βββ vite.config.js
βββ tailwind.config.js
The UI communicates with support-roster-server, which must expose:
| API Scope | Base Path | Purpose |
|---|---|---|
| Public Data | /api/** |
Viewer roster data, public contacts |
| Workspace Admin | /api/workspace/** |
CRUD for staff, shifts, teams, rosters, validation |
| Authentication | /api/auth/** |
Login, logout, account activation |
- Start PostgreSQL (required by backend)
- Start backend server (
support-roster-serveron port8080) - Start frontend dev server (
npm run devin this directory)
Convenience script (from parent workspace):
../scripts/dev/restart-all.shThis script handles restarting both backend and frontend services together.
For detailed backend setup, see the support-roster-server repository README.
-
Linux + Nginx (static hosting)
- Build with
npm run build - Serve
dist/with Nginx - Configure reverse proxy to backend API
- Build with
-
Docker + Nginx (containerized)
- Build Docker image:
docker build -t support-ui . - Run with environment variables for
VITE_API_BASE_URL - Suitable for AWS ECR/ECS Fargate or any container orchestrator
- Build Docker image:
Dockerfileβ Multi-stage build for productionnginx.container.confβ Nginx config with SPA fallbackbuild/build-frontend.shβ Build scriptbuild/ecs-task-definition.example.jsonβ AWS ECS task templatebuild/push-to-ecr.example.shβ ECR push script example
Production Environment Variables:
See .env.production for default production config. Override as needed in your deployment environment.
All frontend technical specifications live in the .specs/ directory:
| Document | Description |
|---|---|
.specs/spec.md |
ποΈ Main spec navigation hub |
.specs/architecture.md |
ποΈ Architecture decisions & patterns |
.specs/development.md |
π» Local dev workflow, health checks, restarts |
.specs/deployment.md |
π Deployment guides (Nginx, Docker, AWS) |
.specs/ui-design.md |
π¨ Design system, colors, typography, components |
.specs/product-updates.md |
π Product update log maintenance rules |
.specs/workspace/index.md |
π’ Workspace feature navigation |
.specs/modules/ |
π¦ Individual module specs |
When to update specs:
- Adding or changing routes, pages, components
- Modifying state management, API integration, or data models
- Changing visual rules, interaction patterns, or development workflow
- Adding or removing features
We welcome contributions! Please follow these guidelines:
Critical: Specs are not optional. They are part of the implementation.
- β
Always update
.specs/docs when changing routes, pages, components, state, APIs, or workflows - β
Update navigation files (
.specs/spec.mdor relevantindex.md) when adding new spec documents - β Keep specs synced with code in the same commit/PR
- β Don't create scattered spec files outside
.specs/
- β
Maintain
src/features/product-updates/data/productUpdates.jsfor user-visible changes - β
Update both
zh-CNandenentries (bilingual requirement) - β Write for users, not developers (focus on value, not implementation)
β οΈ Skip for internal refactors (note "no user-visible changes" in PR description)
- Follow Vue 3 Composition API best practices
- Use
<script setup>for new components - Maintain consistent code style (use
npm run format) - Write meaningful commit messages
For detailed agent instructions, see AGENTS.md.
This project is licensed under the MIT License. See LICENSE for details.
Made with β€οΈ using Vue 3, Vite, and Tailwind CSS



