Why I Built This
During my first year as an IT student at BulSU-Sarmiento Campus primarily being the class and current P.I.O, our section ran into a problem: every single announcement, homework deadline, and project submission was getting lost in Messenger group chats. Important reminders would get buried under hundreds of messages in minutes.
On top of that, tools like Notion or Trello are cool, but they take forever to open, feel way too bloated for quick student tasks, and straight up break when you have zero internet.
I didn't want another heavy corporate dashboard even though Messenger achieves it. I just wanted a simple, lightweight app that opens instantly, works 100% offline, and lets us see what's due today without burning mobile data.
How It Actually Works
I built 2agenda as an installable Progressive Web App (PWA) designed around three straightforward ideas:
1. Instant Cache-First Startup
When you visit the app once, a service worker caches the whole app on your phone. The next time you open it in a concrete classroom with zero bars of signal, it boots up in under 100ms.
2. Everything Happens Locally First
When you check off a task or add a new deadline, the app saves it immediately to IndexedDB on your device. You don't have to wait for a loading spinner. If you're offline, it queues the changes and silently syncs with Firebase the moment you get Wi-Fi back.
3. Shared Deadlines for the Whole Class
Instead of all 40+ of us manually typing the exact same homework deadlines every week, me being the admin can post an assignment once, and it automatically pops up on everyone else's screen in real time.
What We Used It For
1. Two-Column Task Board with Personal Progress
- Batch-Specific Filtering: Filtering assignments by student section (Batch 2A1, 2A2, or All) and category tags (Quizzes, Hands-on labs, Activities, Assignments, and Written exams).
- Independent Progress Tracking: Classmates can check off completed tasks locally without affecting other students' boards, caching individual completion states in IndexedDB.
- 1-Click Google Calendar Export: Exporting assignment deadlines directly into personal Google Calendars with one tap.
2. Interactive Calendar & Live Class Schedule
- Monthly Agenda View: Plotting due tasks, exam dates, and daily scheduled lectures onto a visual monthly calendar with an interactive day view.
- Dynamic Weekly Schedule Table: Checking room assignments, subject slots, and professor details offline before running across campus.
- Semester Countdown: Real-time progress bar tracking total days remaining in the academic semester.
3. P.I.O. Class Admin Hub & Announcement Feed
- Color-Coded Broadcasts: Posting urgent deadline alerts (๐ด), general updates (๐ต), or celebration notes (๐ข) with attached files.
- 5MB Base64 File Attachments: Attaching PDFs, lecture slides, Word docs, and image notes directly to Firestore (zero external storage billing) with a built-in fullscreen lightbox image viewer.
- Student Content Submissions: Classmates can suggest task edits or submit new reviewer materials for admin review and approval.
- Completion Analytics & PDF Reports: Live tracking of class-wide completion rates and exporting PDF reports for class records.
4. Built-in Student Utilities
- Global Search (
Ctrl + K): Instant keyboard search across all tasks, lecture notes, and announcements. - Pomodoro Focus Timer: Built-in study timer for crunch sessions with custom audio notifications.
- Offline Campus InfoBar: Real-time SJDM weather and date integration via the Open-Meteo API.
- PWA Home Screen Install: Instant install prompt for iOS/Android that runs completely offline with a heavily optimized 257kB bundle size (-81% from initial builds).
What I Learned
Welp, building 2A-genda showed me that you don't need excessive complexity to make software people love. Solving real, daily friction for 40+ classmates sitting right next to you teaches you practical lessons about offline-first architectures, service worker caching strategies, IndexedDB sync queues, and responsive UI performance under strict network constraints.