Web app
The PlanningSup web app is the primary way to use the service. It’s a modern Progressive Web App (PWA) built with Vue 3, Vite, and DaisyUI.Features
The web app includes all PlanningSup features:Full calendar viewsDay, week, month grid, and month agenda with real-time updates
Rich customizationColors, filters, timezones, and event display preferences
Offline supportService Worker caching for offline access
Passkey authenticationWebAuthn support for passwordless login (web only)
Accessing the web app
Visit planningsup.app in any modern browser:- Chrome / Edge: Full PWA support with install prompt
- Safari: PWA support via “Add to Home Screen”
- Firefox: Works as a regular web app (no PWA install)
PlanningSup requires JavaScript to be enabled. The app does not render server-side.
Architecture
The web app is built with:Frontend stack
- Vue 3: Composition API with
<script setup>syntax - ScheduleX: Calendar component library
- DaisyUI: Tailwind CSS component library
- VueUse: Vue composables for common patterns
- Temporal Polyfill: Modern date/time API
Backend API
The web app communicates with the API via Eden Treaty, a type-safe API client:Service Worker
The PWA uses vite-plugin-pwa for Service Worker generation:- App shell (HTML, CSS, JS)
- Planning data (API responses)
- Static assets (fonts, icons)
Deployment
The web app is deployed to production using:- Docker: The Dockerfile builds the web app and API together
- GitHub Actions: Automated CI/CD pipeline (
.github/workflows/docker-publish.yml) - Container registry: Published to
ghcr.io/kernoeb/planningsup
Build process
apps/web/dist/, which are served by the API using Elysia’s static file middleware:
Environment variables
The web app uses the following environment variables:import.meta.env.
Runtime configuration
The web app receives runtime configuration from the API via/config.js:
Performance optimizations
Code splitting
Vue components are lazy-loaded where possible:Virtual scrolling
The planning picker uses VueUse’suseVirtualList to render thousands of plannings efficiently:
Debounced search
Browser compatibility
PlanningSup supports:- Chrome / Edge: 90+
- Safari: 14+
- Firefox: 88+
The app uses the Temporal polyfill for browsers that don’t support the native Temporal API.
Accessibility
The web app follows accessibility best practices:- Semantic HTML:
<dialog>,<nav>,<main>, etc. - ARIA labels:
aria-label,aria-describedbyon interactive elements - Keyboard navigation: All actions accessible via keyboard
- Focus management: Dialogs trap focus and restore on close
Analytics
PlanningSup optionally integrates with Plausible Analytics for privacy-friendly usage tracking:Next steps
Browser extension
Install the Chrome extension for quick access
Desktop & mobile
Install native apps with Tauri