Next.js web application for OboApp - a civic engagement platform for residents of Sofia, Bulgaria. Aggregates and visualizes public announcements about local events, infrastructure work, and service disruptions on an interactive map.
This package is part of a pnpm workspace. Run pnpm install at the repository root, not in this directory.
Next.js uses transpilePackages: ['@oboapp/shared'] to automatically transpile and hot-reload changes from the shared package during development. No manual rebuild of shared is needed while running pnpm dev.
- Next.js 16 with React 19 and TypeScript
- Firebase (Authentication, Firestore, Cloud Messaging)
- Google Maps API for interactive mapping
- Turf.js for geospatial analysis
- Tailwind CSS v4 with centralized theme system
- @oboapp/shared - Shared Zod schemas from workspace
Hosted on Vercel.
The application uses a centralized Tailwind CSS theme system:
- Theme colors: Defined in lib/colors.ts as the single source of truth
- CSS variables: Implemented in app/globals.css using Tailwind v4 @theme
- Utilities: Button styles and helpers available in lib/theme.ts
See AGENTS.md for usage guidelines.
- Interactive map displaying geolocated messages from municipal sources
- User-defined interest zones with customizable radius
- Push notifications for new messages in areas of interest
- Progressive Web App with offline support
Push notifications are supported on:
- Chrome/Edge/Opera (Desktop & Android) - works in regular browser
- Firefox (Desktop & Android) - works in regular browser
- Safari (macOS 16.4+) - works in regular browser
- Safari (iOS 16.4+) - requires PWA installation
Important: On iOS Safari, push notifications only work when the app is installed as a PWA (added to Home Screen). This is a platform limitation by Apple.
To enable notifications on iOS Safari:
- Open the app in Safari
- Tap the Share button (square with arrow)
- Select "Add to Home Screen"
- Open the app from your Home Screen
- Grant notification permission when prompted
The app automatically detects iOS Safari and displays installation instructions when needed.
Backend data ingestion handled by the /ingest folder.