Yearly Budget: Built Smarter
Building the Yearly Budget app involved more than creating a simple subscription tracker. Behind its dark-grey interface is a combination of cloud storage, account security, automated notifications, and carefully designed background processes.
One of the biggest challenges was finding a reliable way to send automatic reminders without introducing paid Firebase Cloud Functions.
After experimenting with different approaches, we developed a solution combining Google Apps Script, GitHub Actions and Firebase.
Each service has its own responsibility, allowing the application to send personalised reminders automatically while remaining on Firebase's free Spark plan.
A Simple Way to Manage Yearly Subscriptions
Yearly Budget is an app designed to help users track their yearly subscriptions and upcoming payments in one place.
Users can add subscriptions, enter payment amounts and months, and view their total yearly costs. Subscriptions can be edited or deleted, and reminders can be created for important dates.
Although the app has a simple dark-grey interface, several technologies work together behind the scenes.
Firebase Authentication and Cloud Firestore
Firebase Authentication manages user registration, login and email verification.
Each user has their own account, with subscriptions and reminders stored securely in Cloud Firestore. Security rules help prevent users from accessing other people's information.
Local caching also helps reduce unnecessary database activity and keeps the app responsive.
How Automatic Reminders Work
One of the biggest challenges was creating automatic notifications without using paid Firebase Cloud Functions.
Our original approach relied on GitHub Actions to schedule reminders, but its automatic scheduling was unreliable during testing.
We solved this by introducing Google Apps Script as the scheduler.
The system now works like this:
- Google Apps Script automatically starts the process at approximately 9:30 AM UK time every day.
- It securely triggers the existing GitHub Actions reminder workflow.
- GitHub connects to Firebase and checks for unfinished reminders due the following day.
- Firebase Cloud Messaging sends the relevant notifications to each user's registered devices.
- The app's service worker displays notifications on supported devices, even when the app is closed.
This allows reminders to work automatically without requiring a continuously running server.
Keeping Notifications Private and Secure
Every reminder belongs to a specific Firebase user account.
The system checks which user owns each reminder and sends notifications only to devices registered to that account.
GitHub authenticates with Firebase using Google Cloud Workload Identity Federation, which provides temporary credentials without storing permanent service-account private keys.
Google Apps Script uses a restricted GitHub token stored privately in Script Properties.
The system also includes duplicate-notification protection and removes invalid device registrations when detected.
Keeping Firebase Free
Yearly Budget remains on Firebase's free Spark plan.
Google Apps Script handles scheduling without directly accessing Firestore, so it performs no Firebase reads or writes.
GitHub performs the actual reminder check once daily under normal operation, helping keep database usage low.
No paid scheduled Firebase Cloud Functions are required.
Testing the New Notification System
We tested the complete process using an automatic Google Apps Script trigger.
The test successfully started GitHub Actions, authenticated with Firebase and processed an eligible reminder.
Firebase accepted two notification messages without reporting sending failures.
Most importantly, an actual notification appeared on an Android phone:
“Ice cream is due tomorrow.”
This confirmed that the automatic process could deliver a real reminder from Google Apps Script through GitHub and Firebase to a registered device.
The old GitHub scheduling system was then removed, leaving Google Apps Script responsible for the daily timing.
Notification delivery still depends on device permissions, connectivity and supported browser features.
A Progressive Web App With Android Support
Yearly Budget is a Progressive Web App hosted on GitHub Pages.
It also supports Android distribution through Bubblewrap, allowing the web-based app to be published on Google Play.
Because reminders use web push notifications, updating the scheduler did not require rebuilding the Android app.
Final Thoughts
Yearly Budget combines straightforward subscription tracking with secure cloud storage and automatic reminders.
By bringing together Google Apps Script, GitHub Actions and Firebase, we created and tested a personalised notification system while keeping Firebase on its free Spark plan.
The goal remains to make the app practical, secure and affordable to maintain.
Built and developed by Ventsharm.

Comments
Post a Comment
Please be polite ~ Ventsharm blogs