A civic-tech initiative providing transparent access to municipal services, programs, and public funds of LGU Aurora, Zamboanga del Sur, Philippines.
BetterAurora.org is a Next.js 15 + TypeScript application. The legacy static HTML version and separate react-app/ workspace have been retired; main now contains the single active codebase.
This repository is open source under the MIT License and CC BY 4.0 and is freely available for use, modification, redistribution, and publication by any individual or organization that wishes to implement it in their respective local government unit (LGU) across the Philippines.
We encourage adoption by other municipalities in support of:
- Transparency - Making government information accessible to citizens
- Accessibility - Ensuring services are available to all, including persons with disabilities
- Modernization - Bringing local government services to digital platforms
- Public Service - Improving the delivery of government services to the community
To adapt this project for your LGU, fork the repository and customize the content, styling, and data sources to match your municipality's requirements.
BetterAurora.org is a volunteer-driven, open-source project that empowers the people of Aurora, Zamboanga del Sur with easy access to local government information. The platform aggregates public data from official government portals and presents it in a user-friendly, accessible format.
Cost to the People of Aurora, Zamboanga del Sur = ₱0
Visit the live website: https://betteraurora.org
| Category | Technologies |
|---|---|
| Frontend | HTML5, CSS3, JavaScript (ES6+) |
| Styling | Custom CSS, CSS Variables, Flexbox, CSS Grid, Responsive Design |
| Icons | Bootstrap Icons (CDN) |
| Fonts | Google Fonts (Inter) |
| Maps | Leaflet.js, OpenStreetMap |
| Charts | Chart.js (Canvas-based) |
| Animations | Lottie (dotlottie-player web component) |
| Data Format | JSON |
| APIs | Open-Meteo (Weather), ExchangeRate API (Currency) |
| Build Tools | Node.js, npm, Bash, Babel (@babel/preset-env) |
| Minification | html-minifier-terser, clean-css-cli, terser |
| Code Formatting | Prettier (auto-format on commit via git pre-commit hook) |
| Version Control | Git, GitHub |
| Runtime | Bun |
| Server | Next.js static export + Apache (.htaccess) |
| Hosting | cPanel (Production), Vercel/Node-compatible static hosting |
| PWA | Serwist service worker, install prompt, offline fallback |
| SEO | Open Graph, Twitter Cards, XML Sitemap, robots.txt |
| Security | HTTPS, CSP Headers, HSTS, X-Frame-Options |
| Analytics | Google Analytics (gtag.js) |
| Accessibility | WCAG 2.1, ARIA, Semantic HTML |
| Performance | GZIP Compression, Browser Caching, Asset Minification |
| Feature | Description |
|---|---|
| Municipal Services Directory | Comprehensive guide to all LGU services with requirements, fees, and processing times |
| Government Officials | Directory of elected officials and department heads with contact information |
| Budget Transparency | Financial reports, income/expenditure breakdowns, and infrastructure projects |
| Legislative Documents | Searchable database of ordinances and resolutions from Sangguniang Bayan |
| Municipal Statistics | Demographics, economic data, and competitive index rankings |
| Appointment Services | Online appointment scheduling integration with the Mayor's Office (OASYS), featuring branded Lottie animation |
| Aurora Quiz | Interactive quiz about Aurora, Zamboanga del Sur history and culture, linked from homepage CTA and footer across all pages |
| Real-time Information | Live weather updates, currency exchange rates, and Philippine time |
| Emergency Hotline Marquee | Clickable scrolling marquee for emergency contacts on tablet and mobile viewports, with pause-on-hover/focus accessibility |
| Progressive Web App | Installable PWA with "Install App" prompt, seamless auto-updates via skipWaiting (no manual refresh), versioned service worker caching (static + runtime), offline fallback page with emergency hotlines, push notification foundation |
| Auto Version Management | Dynamic version display from version.json, auto-bumped on every git commit via pre-commit hook, synced across all 51+ HTML files, package.json, and React app |
| Multi-language Support | Full i18n coverage in English, Filipino, and Cebuano (5,546 keys per language with perfect parity) |
| Clean URLs | SEO-friendly URLs without .html extensions, powered by Apache mod_rewrite |
| Brief History of Aurora, Zamboanga del Sur | Interactive timeline with fully translated cards in all three languages |
| Mobile Navigation | Responsive menu with GPU-accelerated open/close transitions, body scroll lock, animation guard against rapid toggles, debounced resize handling, touch-safe hover scoping, click-outside-to-close, and focus trap |
| Accessibility | WCAG 2.1 compliant with skip links, ARIA labels, keyboard navigation, and semantic HTML |
| SEO Optimized | Meta tags, Open Graph, Twitter Cards, structured data, and XML sitemap |
| Performance | 90%+ size reduction through minification, GZIP compression, Babel transpilation, and browser caching |
# Clone the repository
git clone https://github.com/BetterAurora/betteraurora.git
# Navigate to project directory
cd betteraurora
# Install dependencies
bun install
# Start development server
bun dev
# Open in browser
# http://localhost:3000| Requirement | Version | Purpose |
|---|---|---|
| Bun | v1.3+ | Runtime and package manager |
| Git | Latest | Version control |
- Clone the repository
git clone https://github.com/BetterAurora/betteraurora.git
cd betteraurora- Install dependencies
bun install- Start the development server
bun dev- Open in browser
- Development: http://localhost:3000
- Production preview: http://localhost:8080 (after
bash build.sh)
| Command | Description |
|---|---|
npm run dev |
Start local development server (port 8000) |
npm run build |
Build minified production files to dist/ (auto-bumps patch version) |
npm run build -- --no-bump |
Build without incrementing the version number |
npm run build:minor |
Bump minor version and build |
npm run build:major |
Bump major version and build |
npm run serve:dist |
Serve production build (port 8080) |
npm run version:check |
Display current version |
npm run version:patch |
Bump patch version only |
npm run version:minor |
Bump minor version only |
npm run version:major |
Bump major version only |
npm run format |
Format all files with Prettier |
npm run format:check |
Check formatting without writing changes |
- Build production files
npm run build-
Output location
- Minified files are generated in the
dist/folder - Original size: ~17MB → Minified: ~3.9MB
- Minified files are generated in the
-
Deploy to server
- Upload contents of
dist/to your web server'spublic_htmldirectory - Ensure
.htaccessis included for clean URLs, CSP headers, and security
- Upload contents of
| Type | Permission | Numeric |
|---|---|---|
| Files | rw-r--r-- | 644 |
| Directories | rwxr-xr-x | 755 |
The site supports three languages with full translation coverage:
| Language | Code | Status |
|---|---|---|
| English | en |
Complete (5,546 keys) |
| Filipino | fil |
Complete (5,546 keys) |
| Cebuano | ceb |
Complete (5,546 keys) |
The static site uses a TranslationEngine in assets/js/translations.js with data-i18n attributes on HTML elements. The React version uses a LanguageContext provider with a t() function. Both systems support fallback to English for any missing keys.
The project maintains three synchronized versions:
| Version | Location | Purpose |
|---|---|---|
| Static Legacy | Root HTML files | Source of truth for all 52 pages |
| React + TypeScript | react-app/ |
Modern component-based homepage |
| Production Dist | dist/ |
Minified build for cPanel deployment |
All CSS, images, animations, and translations are kept in sync. The build script (build.sh) generates the production dist/ from the Next.js static export.
betteraurora/
├── src/
│ ├── app/ # Next.js App Router pages
│ ├── components/ # Reusable React components
│ └── contexts/ # React Context providers
├── public/ # Static assets and JSON data
│ ├── assets/ # Stylesheets, images, animations
│ └── data/ # Municipal data files
├── package.json
├── next.config.mjs
└── tsconfig.json
│ ├── ordinances.json # Legislative ordinances
│ └── resolutions.json # Legislative resolutions
├── react-app/ # React + TypeScript version
│ ├── src/
│ │ ├── app/ # Next.js app router (layout, page)
│ │ ├── components/ # React components (Header, Footer, HotlineBar, InfoBar, SearchAutocomplete, PWAManager)
│ │ └── contexts/ # LanguageContext (i18n provider)
│ └── public/ # Static assets, manifest, version.json (synced with root)
├── services/ # Service category pages (11 pages)
├── service-details/ # Individual service pages (22 pages)
├── government/ # Government directory pages
├── legislative/ # Legislative framework pages
├── budget/ # Budget transparency page
├── statistics/ # Municipal statistics page
├── news/ # News and announcements page
├── contact/ # Contact information page
├── faq/ # Frequently asked questions
├── sitemap/ # HTML sitemap page
├── scripts/ # Build, version, and translation scripts
│ └── bump-version.js # Cross-platform Node.js version bump script
├── dist/ # Production build output (gitignored)
├── index.html # Homepage
├── sw.js # Service worker (versioned caching, offline support)
├── manifest.webmanifest # PWA web app manifest
├── offline.html # Offline fallback page with emergency hotlines
├── serve.py # Local dev server with clean URL rewriting
├── .htaccess # Apache configuration (CSP, rewrites, caching)
├── .prettierrc # Prettier code formatting configuration
├── .prettierignore # Prettier ignore patterns
├── version.json # Version tracking (auto-bumped on commit)
├── build.sh # Build automation script
├── babel.config.json # Babel transpilation configuration
├── package.json # Node.js configuration
└── README.md # Project documentation
- Added "Install App" prompt banner using the
beforeinstallpromptAPI with Install/Dismiss buttons, respecting standalone mode and session dismissal - Replaced manual-refresh update flow with seamless
skipWaiting+controllerchangeauto-reload pattern - Service worker now accepts
SKIP_WAITINGmessage from clients to activate waiting worker on demand - Install banner goes full-width (no border-radius, no margins) on mobile viewports (<=575px) with slide-up animation
- Created
PWAManager.tsxReact component handling both install prompt and SW update lifecycle - Added
.pwa-install-bannerCSS styles to both static and React versions
- Added
text-align: centerfor.footer-taglinein the <=575px mobile breakpoint, overriding the tablettext-align: leftrule - Synced footer CSS fix to React version
- Removed CodeQL Advanced workflow (
.github/workflows/codeql.yml) as it is no longer required
- Standardized header vertical spacing (padding, min-height, logo size) across desktop (12px/48px), tablet (10px/40px), mobile (8px/36px), and small mobile (6px/32px) breakpoints
- Raised tablet breakpoint from 991px to 1024px to properly capture iPad Pro portrait (1024px) and iPad Air landscape
- Converted emergency hotline bar into a clickable scrolling marquee on all tablet and mobile viewports (≤1024px) with pause-on-hover/focus for accessibility
- Centered hamburger menu icon between logo and language toggle on tablet viewports using flexbox ordering (logo → hamburger → lang toggle)
- Tablet footer: left-aligned BetterAurora logo, tagline, and social icons to match the visual hierarchy of the brand column
- Replaced legacy
sw.jswith Serwist-generated service worker via@serwist/next - Precaches the app shell and uses runtime caching with offline fallback to
~offline - Manifest generated by Next.js metadata API at
/manifest.json - Service worker source at
src/app/sw.ts
scripts/bump-version.jsupdatesversion.jsonandpackage.json- Footer version displayed dynamically at runtime via
version.jsfetching from/version.json
- Single Next.js 15 application now lives at repository root
- Replaced legacy static HTML and separate
react-app/directory - Development server uses
bun devon port 3000 - Static export produces clean URLs under
out/;build.shpackages the finaldist/
- Migrated package manager from npm to Bun
- Next.js static export with clean URLs
- Serwist PWA integration
Historical release notes for the original static HTML and legacy React app have been archived in the git history.
- All CSS files synced between legacy and React:
footer.css,style.css,responsive.css,accessibility.css - All image and animation assets synced between legacy and React
- React LanguageContext updated with matching translation keys for homepage sections
We welcome contributions from everyone! Whether you're a developer, designer, data researcher, content writer, translator, or a concerned citizen of Aurora, Zamboanga del Sur, your participation helps shape this project for all.
- Fork the repository
- Create a feature branch
git checkout -b feature/your-feature-name
- Make your changes
- Test thoroughly on multiple browsers
- Commit with a descriptive message
git commit -m "Add: description of your changes" - Push to your fork
git push origin feature/your-feature-name
- Open a Pull Request with detailed description
| Area | Description |
|---|---|
| Bug Fixes | Report issues or submit fixes for existing bugs |
| Features | Propose or implement new functionality |
| Content | Update service information, add missing municipal data |
| Translations | Help translate content to Filipino or Cebuano |
| Design | Improve UI/UX, accessibility, and visual consistency |
| Data | Verify and update municipal statistics and records |
| Documentation | Enhance README, code comments, and guides |
| API Integration | Propose or implement API connections for real-time data feeds |
| Data Visualization | Enhance charts, graphs, and interactive presentations |
| Guideline | Description |
|---|---|
| Formatting | Prettier auto-formats on commit; run bun run format to format manually |
| HTML | Use semantic HTML5 elements; validate before committing |
| CSS | Follow BEM naming conventions; use CSS custom properties |
| JavaScript | Keep vanilla JS unless proposing framework for data visualization |
| Naming | Use meaningful, descriptive variable and function names |
| Comments | Add comments for complex logic and non-obvious implementations |
| Accessibility | Ensure WCAG 2.1 compliance (alt text, ARIA, keyboard navigation) |
| Performance | Optimize images; minimize DOM manipulation |
| Testing | Test on Chrome, Firefox, Safari, Edge; test mobile responsiveness |
| Validation | Validate HTML/CSS before pull requests |
All public information is sourced from official government portals:
| Source | URL | Data Type |
|---|---|---|
| LGU Aurora Official Website | aurorazds.gov.ph | Services, Officials |
| Sangguniang Bayan ng Aurora | sangguniangbayan.aurorazds.gov.ph | Ordinances, Resolutions |
| Bureau of Local Government Finance | blgf.gov.ph | Budget, Financial Reports |
| Philippine Statistics Authority | psa.gov.ph | Demographics, Census |
| DTI CMCI Portal | cmci.dti.gov.ph | Competitive Index |
This project is dual-licensed:
| License | Applies To | Details |
|---|---|---|
| MIT License | Source Code | Free to use, modify, and distribute |
| CC BY 4.0 | Content | Attribution required for content reuse |
See LICENSE for full details.
| Channel | Link |
|---|---|
| Website | betteraurora.org |
| volunteer@betteraurora.org | |
| @betteraurora.org | |
| BetterAurora | |
| Discord | Join Community |
| GitHub | BetterAurora/betteraurora |
- BetterGov.ph for the civic-tech initiative in the Philippines
- Abakada.org for supporting civic technology efforts
- LGU Aurora for public data availability and transparency
- All volunteers and contributors who dedicate their time
- Open-source community for the tools and libraries used
- Citizens of Aurora for their feedback and support
Made for the people of Aurora, Zamboanga del Sur
Ramon Logan Jr. is a UAE-based full-stack developer and IT professional specializing in web development, design, cloud services, and cybersecurity. He is the developer behind BetterAurora.org, Abakada.org, and the founder of the small cloud-based solutions initiative, HelloPinas.com. Ramon actively contributes to civic-tech efforts like BetterGov.ph and is an individual participant in the OpenJS Foundation.