The problem
Passing the CPALE (Certified Public Accountant Licensure Examination) in the Philippines is brutal. Six subjects, thousands of topics, and most review materials are either outdated PDFs or expensive classroom sessions. Students study in isolation with no way to track weak areas or measure readiness.
Existing review apps either cover too little or dump content without any intelligence. There's no feedback loop between practice and study strategy.
What I built
Akawntant is a full review platform covering all six CPALE subjects: FAR, AFAR, MAS, Auditing, Taxation, and RFBT. It offers multiple study modes, mock exams, progress tracking, and collaborative study features.
The journey
I thought the hard part would be building the quiz engine. The real challenge was designing a system that adapts to how students actually learn and forget.
Tech stack
| Layer | Technology | Why |
|---|---|---|
| Frontend | Next.js 16 | App Router, React 19 transitions |
| Language | TypeScript | Type safety across the stack |
| Database | Supabase | PostgreSQL + Auth + Row Level Security |
| Styling | Tailwind CSS v4 | Utility first, fast iteration |
| UI | shadcn/ui | Accessible component primitives |
| Hosting | Vercel | Edge caching, easy deploys |
What building this taught me
1. Study modes are not one-size-fits-all
I started with just a quiz mode. Users immediately asked for flashcards. Then review mode where they could see answers immediately. Then a mode that only surfaces questions they got wrong before.
Each mode required different UI, different state management, and different progress tracking logic. What seemed like "just showing questions differently" turned out to be fundamentally different interaction patterns.
2. Progress tracking drives motivation more than content
The activity calendar, streak counters, and mastery scores became the most used features. Students opened the app to maintain streaks even when they didn't feel like studying. The gamification wasn't gimmicky; it mapped to real study consistency.
I learned that in edtech, the meta-experience (tracking, goals, social proof) matters as much as the content itself.
3. Row Level Security changes how you think about multi-tenancy
Supabase's RLS meant every query was automatically scoped to the authenticated user. Study group permissions, bookmarks, notes, all enforced at the database level. This eliminated entire categories of authorization bugs I would have written in application code.
-- RLS policy: users only see their own progress
CREATE POLICY "Users read own progress"
ON daily_progress FOR SELECT
USING (auth.uid() = user_id);
-- Study group members see shared content
CREATE POLICY "Group members can view sessions"
ON public.group_study_sessions FOR SELECT
USING (
group_id IN (SELECT public.get_user_active_group_ids(auth.uid()))
);
The group policies route through a get_user_active_group_ids helper rather than an inline subquery over
group_members. Writing the membership check inline means the policy on one table queries a table whose
own policy queries back, and Postgres either recurses or re-evaluates it per row. A SECURITY DEFINER
function breaks that cycle and is evaluated once. Across 292 policies, that difference stops being
academic.
4. Native iOS extends reach but doubles complexity
Building the companion iOS app with SwiftUI and Supabase gave students offline study capabilities. But maintaining feature parity across web and iOS meant every feature took twice as long. I learned to ship web first, then port only the high-value features to mobile.
The bigger realization
Building Akawntant taught me that edtech products succeed not because of content volume, but because of study experience design. The adaptive algorithm that resurfaces forgotten material, the streak that keeps students coming back, the study group that adds accountability; these "soft" features drive outcomes more than having 10,000 questions.
What I would do differently
Start with a smaller subject scope. Launching with all six CPALE subjects meant spreading content quality thin. I'd pick one or two subjects, nail the depth and quality, then expand. Depth beats breadth in educational content.
References
Links
- Live Site: akawntant.review
