An internal tool for reviewing catalogue-backed funding applications submitted by independent labels, publishers and music companies.
Frontend: https://music-ip-ae.vercel.app/
Backend API: https://musicip.onrender.com/api/applications/
GitHub Repository: https://github.com/Amit-Erez/MusicIP
- Overview
- Features
- Architecture
- Tech Stack
- Testing
- Quality & Performance
- Project Structure
- Why This Project
- Future Improvements
Music catalogue financing companies receive funding applications from independent labels, publishers and rights holders every day. Analysts review catalogue ownership, streaming performance, royalty income and funding requests before deciding whether an application should move forward.
This project recreates that internal workflow as a realistic business application rather than a public-facing website. Analysts can review applications, update funding decisions, leave timestamped internal notes and flag applications that require further attention.
Unlike many portfolio dashboards that only display data, this project includes a full Express backend with persistent write operations, allowing users to actively manage application data.
Main applications dashboard
Slide-in review panel with status management, IP summary and internal notes
Confirmation dialog before persisting status changes
- Review funding applications in a sortable, paginated table
- Filter applications by review status
- Search applicants by name
- Sort by submission date or requested funding amount
- Slide-in application review panel
- Status updates with confirmation dialog
- Timestamped internal notes
- Delete notes with confirmation dialog
- One-click application flagging
- Persistent backend updates through an Express REST API
- Responsive layout for desktop and tablet
- Accessible UI built with semantic HTML and keyboard-friendly components
The project is structured as a lightweight monorepo containing separate frontend and backend applications.
The frontend communicates with an Express REST API using TanStack Query for server-state management. Rather than connecting to a relational database, the backend reads from and writes to a local JSON database (db.json), allowing realistic CRUD operations while keeping the MVP simple.
A production implementation would replace the JSON datastore with PostgreSQL, introduce authentication and authorization, and persist audit history for every application update.
Component-based architecture for building reusable UI.
Strong typing for application models, API responses and component props.
Fast development server and optimized production builds.
Utility-first styling with responsive layouts.
Handles data fetching, caching, loading states, mutations and cache invalidation.
REST API serving application data and write operations.
JavaScript runtime powering the backend.
Runtime validation for status updates and note creation before writing to the database.
Persistent storage using db.json for the MVP.
| Method | Endpoint | Description |
|---|---|---|
| GET | /applications |
Retrieve all funding applications |
| GET | /applications/:id |
Retrieve application details |
| PATCH | /applications/:id |
Toggle application flag |
| PATCH | /applications/:id/status |
Update application status |
| POST | /applications/:id/notes |
Create a new internal note |
| DELETE | /applications/:id/notes/:noteId |
Delete an internal note |
The frontend uses Vitest, React Testing Library, user-event, and jest-dom.
Current test coverage includes 15 component tests across:
-
SheetStatus- Save Status button rendering
- Select menu status changes
- Save Status click handling
-
SheetNotes- Existing notes rendering
- Add Note button rendering
- Delete button rendering
- Textarea typing behaviour
- Add Note click handling
- Delete click handling
-
DeleteDialog- Dialog rendering
- Cancel behaviour
- Delete confirmation behaviour
-
ConfirmDialog- Dialog rendering
- Cancel status-change behaviour
- Save status-change behaviour
Run tests with:
cd Frontend
npm testThe MVP was audited using Google Lighthouse to validate performance, accessibility, SEO, and web best practices prior to deployment.
| Category | Score |
|---|---|
| Performance | 100 |
| Accessibility | 100 |
| Best Practices | 100 |
| SEO | 100 |
| Category | Score |
|---|---|
| Performance | 98 |
| Accessibility | 100 |
| Best Practices | 100 |
| SEO | 100 |
Highlights include:
- Semantic HTML with proper landmark elements (
<main>, accessible labels, etc.) - Fully responsive layout with zero cumulative layout shift (CLS)
- Optimized rendering with a 0 ms Total Blocking Time
- Fast initial page load with a 0.4 s Largest Contentful Paint (LCP)
- Meaningful metadata for improved search engine visibility
- Keyboard-accessible dialogs and interactive controls
- Accessible form labels and semantic table structure
MusicIP
│
├── Backend
│ ├── index.js # Express API and route handlers
│ ├── db.json # JSON mock database
│ ├── package.json
│ └── package-lock.json
│
├── Frontend
│ ├── src
│ │ ├── components
│ │ │ ├── ui # shadcn/Radix UI primitives
│ │ │ └── *.tsx # application components and tests
│ │ ├── lib
│ │ │ ├── api.ts # API request functions
│ │ │ └── utils.ts
│ │ ├── App.tsx
│ │ ├── main.tsx
│ │ ├── index.css
| | ├── types.ts
| | └── vitest.setup.ts
│ ├── public
│ ├── package.json
│ └── vite.config.ts
│
└── README.md
Clone the repository
git clone https://github.com/Amit-Erez/MusicIP.gitInstall dependencies
cd backend
npm install
cd ../frontend
npm installStart the backend
cd backend
npm run devStart the frontend
cd frontend
npm run devThis project was designed to complement my earlier Pulse dashboard by demonstrating capabilities that project intentionally did not include.
While Pulse focused on visualising campaign analytics, Music IP Funding Review Dashboard demonstrates full-stack CRUD workflows through an Express backend, persistent write operations, REST API design, request validation and realistic business data.
My background in the music industry also allowed me to model a believable domain using concepts such as catalogue valuation, master ownership, publishing ownership, streaming revenue and sync licensing rather than relying on generic placeholder data.
Planned stretch features include:
- PostgreSQL database
- Prisma ORM
- JWT authentication
- Role-based permissions
- React Hook Form application intake flow
- Revenue trend charts using Recharts
- Python scoring microservice (FastAPI or Flask)
- Audit history
- Advanced search
- Bulk application actions
- End-to-end testing with Playwright
This project demonstrates:
- Full-stack React + Express development
- REST API design
- Persistent CRUD operations
- Request validation with Zod
- Server-state management with TanStack Query
- Accessible UI development
- Component testing with Vitest and React Testing Library
- Realistic domain modelling using music catalogue financing data
This project was built for educational and portfolio purposes.




