Full-stack web application
Student Portal
Shared classroom resources, with a review step before publication.
What I brought to the project
I connected student submissions, administrator moderation, persistent records and uploaded files in one application. The important boundary is publication: submitting a resource does not make it public.
What the application delivers
The application provides a complete submit → review → publish workflow, with Cloudinary uploads and file open/download endpoints. PDFs are proxied for inline viewing and download; rejection also removes uploaded files.
- Classrooms grouped by subject and section
- Pending submissions with approve/reject moderation
- Room management and cookie-authenticated administrator access
- Approved file viewing and download, including inline PDFs
Engineering decisions
ClassRoom, ContentItem and ContentFile records, together with content/status enums, express room membership, submission state and file metadata. EF Core with Npgsql persists them in PostgreSQL.
Cloudinary handles optional JPG, PNG, WEBP, GIF and PDF uploads. Application endpoints handle approved-content access and PDF delivery rather than making the upload form the publication boundary.
Startup checks required database, administrator and upload configuration. Local development uses user-secrets; the repository also contains a separate Capacitor Android wrapper for a hosted portal.
The problem
Notes, links, images and PDFs need a shared classroom home. Publishing every submission immediately gives administrators no opportunity to review what becomes visible.
The approach
Students browse subject/section classrooms and submit metadata with an optional file. New records enter Pending status. Cookie-authenticated administrators approve or reject submissions and manage classrooms; approved items appear in the room.
Scope and limitations
Running the portal requires PostgreSQL, Cloudinary and administrator configuration. The Android project is a web wrapper, not a separate native implementation.
Based on the project README, reviewed 24 October 2026.
Have a similar problem to solve?
I’m open to backend and full-stack roles, and freelance projects.