Logo Lanfrica

0xsmaiil/Permission

Domain:

digital infrastructure

Record type:

softwaretools
Creator:
0xs
Host:
Algerian leave calculator PWA: compute annual leave, track public holidays, and get push reminders. # Permission An Algerian leave calculator built as a mobile-first Progressive Web App. Calculate annual leave entitlements with automatic handling of Algerian public holidays, and get reminders via push notifications. 🔗 **Live app:** permission-kappa.vercel.app ## Features - **Leave calculator** — computes annual leave based on hire date and work schedule, accounting for Algerian public holidays. - **Dashboard** — overview of remaining leave, history, and upcoming entitlements. - **Notifications** — opt-in push reminders (web push + Supabase), with an in-app permission gate and notification bell. - **Bilingual UI** — supports Arabic and French with right-to-left layout. - **Theme support** — light/dark mode. - **Installable PWA** — full-screen install landing page for Android and iOS, offline support via service worker. ## Tech Stack - React 19 + TypeScript - Vite with `vite-plugin-pwa` - Tailwind CSS v4 - Supabase (backend) + web-push (notifications) - Telegram bot (admin) - Vitest for tests, oxlint for linting - Deployed on Vercel ## Getting Started Requirements: Node.js >= 20.19. ```bash npm install npm run dev ``` ## Available Scripts | Script | Description | | ------------------- | ------------------------------------ | | `npm run dev` | Start the Vite dev server | | `npm run build` | Lint, typecheck, and production build | | `npm run preview` | Preview the production build | | `npm run test` | Run the test suite (Vitest) | | `npm run lint` | Lint with oxlint | | `npm run typecheck` | Type-check with `tsc -b` | ## Project Structure ``` src/ components/ UI components (tabs, install page, push gate, ...) hooks/ React hooks (PWA install, push subscription, swipe, ...) lib/ Utilities (dates, holidays, storage, i18n, notifications, ...) App.tsx Root component: routes between install landing and the main …