A mobile-first web app that helps students create, organize, and track school assignments and other tasks.
Coursework lets a student keep every assignment in one place. Tasks have a title, description, course/subject, priority, and due date. The dashboard shows how things stand at a glance, and an alert panel highlights anything overdue, due today, or due tomorrow. The app was designed mobile-first and built entirely on a phone.
https://student-task-manager-2a4dgy3yo-sydney17.vercel.app/
https://github.com/OffixialSydney/student-task-manager
- Dashboard: total, completed, pending, and overdue counts, an overall progress bar, and recent tasks
- Due-date alerts: a "Needs your attention" panel for overdue, due-today, and due-tomorrow tasks, re-checked every 5 minutes and whenever the tab regains focus; optional browser notifications where the browser supports them
- Tasks page: every task shown as a card with title, subject, priority, due date, and status
- Full CRUD: create, view, edit, delete, and mark tasks as completed
- Task details: tap any task to see its complete information
- Add/Edit form with validation for the required fields (title, subject, due date)
- Search and filters: search by title or description; filter by status, priority, and subject; all combinable
- Polished UX: loading spinners, toast messages for success and errors, a custom delete confirmation, disabled buttons while saving, and an empty state when nothing matches
- Responsive: bottom tab bar on mobile, top navigation on tablet and desktop
| Area | Tools |
|---|---|
| Frontend | HTML5, CSS3 (custom properties, Grid, Flexbox), vanilla JavaScript (ES6+, async/await) |
| Database | Supabase (PostgreSQL) with Row Level Security |
| API | Supabase's built-in REST API (PostgREST), accessed through supabase-js |
| Fonts | Fraunces, Inter, IBM Plex Mono (Google Fonts) |
| Hosting | Vercel |
| Version control | Git and GitHub |
student-task-manager/
├── index.html # App shell: dashboard, tasks, add/edit form, modals
├── css/
│ ├── styles.css # Design system and components
│ └── alerts.css # Due-date alert panel
├── js/
│ ├── api.js # Supabase connection and data functions
│ └── app.js # Rendering, navigation, search/filter, validation, alerts
└── README.md
create table tasks (
id uuid primary key default gen_random_uuid(),
title text not null,
description text,
subject text not null,
priority text not null default 'Medium',
due_date date not null,
completed boolean not null default false,
created_at timestamptz not null default now()
);
alter table tasks enable row level security;
create policy "Allow all access to tasks (no auth yet)"
on tasks for all using (true) with check (true);- Create a Supabase project and run the SQL above in the SQL Editor.
- In
js/api.js, setSUPABASE_URLandSUPABASE_ANON_KEYto your project's values (Project Settings, then API). Use theanonpublic key, never theservice_rolekey. - Open
index.htmlin a browser, or serve the folder withnpx serve .. - To deploy, push to GitHub and import the repo into Vercel. No build step is needed.
The project was built over seven days, entirely on a phone, with AI assistance (Claude) for code generation and debugging:
| Day | Focus |
|---|---|
| 1 | Project structure, navbar, dashboard, tasks page, and responsive layout |
| 2 | Add Task form, validation, task cards and list |
| 3 | Full CRUD: create, read, update, delete, mark complete |
| 4 | Search and filters by status, priority, and subject |
| 5 | Moved storage from localStorage to a Supabase database |
| 6 | UI polish: loading states, toasts, delete confirmation, buttons and spacing |
| 7 | Due-date alerts, deployment to Vercel, and this documentation |
- Building on a phone. Editing multiple files, copying code, and committing from a mobile screen was slower and more error-prone than on a laptop.
- A backend I didn't need. I first built a Node/Express API, then found Supabase already provides GET, POST, PATCH, and DELETE endpoints for every table. I removed the server, which made the app simpler and cheaper to host.
localhoston a phone. The first deployed version failed with "Load failed" because the app was still callinglocalhost, which on a phone means the phone itself.- Row Level Security. Adding a task failed with "new row violates row-level security policy" until I created an access policy for the table.
- A wrong Supabase URL. A single mistyped project URL caused confusing errors. Re-checking the exact values in Project Settings fixed it.
- Vercel's login wall. Vercel's default Deployment Protection blocked the live site for anyone without a Vercel account. Turning it off made the link public.
- Overwritten CSS. Pasting a new block over
styles.cssinstead of appending it left the deployed site unstyled. Comparing the deployed file with my source showed what happened. - Git out of sync. The GitHub mobile editor refused to commit because my local branch was behind; pulling the latest changes first fixed it.
- Time zones. Using UTC dates for "overdue" checks could be off by a day near midnight, so the date logic now uses the user's local date.
- How a frontend, an API, and a database fit together, and how much a managed service like Supabase does for you
- How Row Level Security controls who can read and write data, and why the
anonkey is safe in the browser but theservice_rolekey is not - Working with
async/await, loading states, and error handling for real network requests - Deploying a static site with Vercel and debugging production problems that don't appear locally
- Designing mobile-first with a consistent design system (color tokens, type scale, spacing)
- Reading error messages carefully; most of the bugs above were solved by understanding exactly what the message said
- User accounts with Supabase Auth, and per-user policies so each student sees only their own tasks (right now the table is shared and has no login)
- Push notifications using a service worker and a scheduled Supabase Edge Function, so reminders arrive even when the app is closed
- Installable PWA support with offline access
- Calendar view and sorting options
- Custom subject colors and subtasks
- Dark mode
- Automated tests for the date and filter logic