WaveAdmin is a full-stack web application that enables artists to submit music for release consideration and allows an admin team to review, approve, or reject submissions from a single dashboard. Built independently end-to-end, covering backend architecture, database design, file storage, API development, and frontend implementation.
The backend is built with Django and Django REST Framework, connected to a managed PostgreSQL database on Render. Artists submit tracks through a form accepting MP3 and WAV files up to 50MB. File type and size are validated on both frontend and backend independently — protecting the system even if browser-side checks are bypassed. Validated files are uploaded directly to Cloudinary, which stores them persistently and returns a secure URL saved to the database. Audio is accessible and downloadable at any point after submission.
Each submission tracks artist name, track title, genre, file name, Cloudinary URL, release status, and timestamp. Status moves through three states — pending, approved, and rejected — updated by admins through a protected PATCH endpoint. Deletion is handled through a separate DELETE endpoint. Both are restricted to admin-role requests at the backend, returning 403 for any artist-token request.
Role-based access uses a demo token resolver on the backend, mapping two hardcoded tokens to their respective permission levels. The frontend includes an Artist / Admin view toggle that switches the active token and conditionally renders admin controls. Even if a request were sent manually with the artist token, the backend rejects it — making the access control model demonstrable without a full authentication system.
The React frontend features a submission form with file input validation, a data table with reusable StatusBadge components, real-time alert banners, and a loading spinner with a 60-second timeout fallback for Render cold starts. Cloudinary URLs render as clickable download links directly in the table.
The backend build script installs dependencies, collects static files, runs migrations, and creates demo users automatically on every deploy. All credentials are managed through environment variables — nothing sensitive is committed to the repository. The backend is deployed on Render, the frontend on Vercel.
This project was built as a direct proof of concept for a freelance brief requiring artist submission management, admin release controls, secure file handling, and role-based access — applying architectural patterns from a prior production Django accounting backend to a music distribution context.
Live demo: https://www.twine.net/signin
Code: https://www.twine.net/signin
MusicDistribution MusicTech AdminDashboard ReactJS Django PostgreSQL FullStackDevelopment WebApplication RoleBasedAccess FileUploadSystem RESTAPI BackendDevelopment FrontendDevelopment CloudStorage WorkflowAutomation SaaSDevelopment ArtistDashboard AdminPanel…WaveAdmin is a full-stack web application that enables artists to submit music for release consideration and allows an admin team to review, approve, or reject submissions from a single dashboard. Built independently end-to-end, covering backend architecture, database design, file storage, API development, and frontend implementation.
The backend is built with Django and Django REST Framework, connected to a managed PostgreSQL database on Render. Artists submit tracks through a form accepting MP3 and WAV files up to 50MB. File type and size are validated on both frontend and backend independently — protecting the system even if browser-side checks are bypassed. Validated files are uploaded directly to Cloudinary, which stores them persistently and returns a secure URL saved to the database. Audio is accessible and downloadable at any point after submission.
Each submission tracks artist name, track title, genre, file name, Cloudinary URL, release status, and timestamp. Status moves through three states — pending, approved, and rejected — updated by admins through a protected PATCH endpoint. Deletion is handled through a separate DELETE endpoint. Both are restricted to admin-role requests at the backend, returning 403 for any artist-token request.
Role-based access uses a demo token resolver on the backend, mapping two hardcoded tokens to their respective permission levels. The frontend includes an Artist / Admin view toggle that switches the active token and conditionally renders admin controls. Even if a request were sent manually with the artist token, the backend rejects it — making the access control model demonstrable without a full authentication system.
The React frontend features a submission form with file input validation, a data table with reusable StatusBadge components, real-time alert banners, and a loading spinner with a 60-second timeout fallback for Render cold starts. Cloudinary URLs render as clickable download links directly in the table.
The backend build script installs dependencies, collects static files, runs migrations, and creates demo users automatically on every deploy. All credentials are managed through environment variables — nothing sensitive is committed to the repository. The backend is deployed on Render, the frontend on Vercel.
This project was built as a direct proof of concept for a freelance brief requiring artist submission management, admin release controls, secure file handling, and role-based access — applying architectural patterns from a prior production Django accounting backend to a music distribution context.
Live demo: https://www.twine.net/signin
Code: https://www.twine.net/signin
MusicDistribution MusicTech AdminDashboard ReactJS Django PostgreSQL FullStackDevelopment WebApplication RoleBasedAccess FileUploadSystem RESTAPI BackendDevelopment FrontendDevelopment CloudStorage WorkflowAutomation SaaSDevelopment ArtistDashboard AdminPanelWW…