A mobile-first Progressive Web App for recording studio engineers to schedule sessions, avoid booking overlap, and manage studio workflow in one shared calendar.
This repository is intentionally published as a reusable public template.
Created by Mitchell Gendron.
- Demo URL (GitHub Pages):
https://fosixty.github.io/StudioCal/ - Demo mode is read-only and does not require Google sign-in.
- Production mode still uses Firebase Authentication and Realtime Database.
- Google sign-in with Firebase Authentication.
- Realtime booking calendar powered by Firebase Realtime Database.
- Allowlist access model for engineers.
- Owner-only admin page for access management.
- Booking, cancellation, and session confirmation flows.
- PWA support (installable, service worker, manifest).
This project demonstrates:
- End-to-end Firebase integration in a real operations workflow.
- Practical role-aware authorization patterns (auth + rules + UI controls).
- Reliable form and state management in vanilla JavaScript.
- Production deployment readiness for a small business web app.
- Clone the repository.
- Install and verify Firebase CLI:
npx -y firebase-tools@latest --version
- Authenticate with Firebase:
npx -y firebase-tools@latest login
- Create your own Firebase project (or use an existing one), then replace placeholders in:
js/firebase-config.jsjs/auth.jsdatabase.rules.json.firebasercfirebase.json
- Select your Firebase project locally:
npx -y firebase-tools@latest use --add <your-project-id>
- Run local hosting:
npx -y firebase-tools@latest emulators:start --only hosting
- Open:
http://localhost:5000
- Open your repo settings: https://github.com/fosixty/StudioCal/settings/pages
- Under Build and deployment:
- Source:
Deploy from a branch - Branch:
main - Folder:
/ (root)
- Source:
- Save and wait for the Pages deployment to finish.
- Your demo will be available at:
https://fosixty.github.io/StudioCal/
This app is static HTML/CSS/JS (no bundler), so runtime config is read directly from js/firebase-config.js.
- Use
.env.exampleas a checklist/template for your values. - Copy those values into
js/firebase-config.js.
If you later add a build step (Vite/Next/Webpack), you can move to true environment-variable injection.
Sensitive project-specific values have been stripped and replaced with placeholders:
- Firebase project identifiers and web config values.
- Owner emails and owner UIDs.
- Security rule owner UIDs.
- Local auth export and sample booking data with real identifiers.
Before production use, replace every YOUR_... value with your own values.
- Owner
- Emails and UIDs are configured in
js/auth.js. - Can access
admin.htmlto manage allowlisted engineers.
- Emails and UIDs are configured in
- Engineer
- Must be allowlisted to access booking pages.
- Deploy Hosting:
npx -y firebase-tools@latest deploy --only hosting
- Deploy Realtime Database rules:
npx -y firebase-tools@latest deploy --only database
- Firebase web config in the client is public by design.
- Protection comes from strict database rules and auth checks.
- Keep
database.rules.jsonreviewed and deployed with each rules change. - Add every served domain to Firebase Auth authorized domains.
css/icons/js/admin.htmlbooking.htmlcalendar.htmlconfirm.htmldatabase.rules.jsonfirebase.jsonindex.htmlmanifest.jsonservice-worker.js
This project is licensed under the MIT License. See LICENSE.