A modern web application for brass ensemble management, featuring a public website and an internal "Notendatenbank" (sheet music database) system.
- 🎵 Notendatenbank (NDB) - Comprehensive sheet music management system
- Score catalog with metadata (composer, arranger, instrumentation, difficulty)
- File management (parts, full scores, audio samples)
- Advanced filtering and column configuration
- Setlist creation and management
- Player allocations for performances
- 📄 Content Management - Dynamic pages and content via PayloadCMS
- 🔐 Authentication - User management and role-based access control
- 📅 Event Management - Calendar and event information
- 📱 Responsive Design - Mobile-first, fully responsive UI
- ⚡ Performance Optimized - Server-side caching and static generation
- Frontend: Next.js 15 (App Router) + React 19
- CMS: PayloadCMS 3
- Database: PostgreSQL
- Styling: TailwindCSS 4
- Storage: Vercel Blob Storage
- Email: Nodemailer
- Testing: Jest + React Testing Library + MSW
- Node.js 20.x or higher
- PostgreSQL database
- npm or yarn package manager
-
Clone the repository
git clone https://github.com/holtschn/ensemble-web.git cd ensemble-web -
Install dependencies
npm install
-
Set up environment variables
Copy the example environment file and configure it:
cp .env.example .env.local
Key environment variables to configure:
POSTGRES_URL- PostgreSQL connection stringPOSTGRES_SCHEMA- Database schema namePAYLOAD_SECRET- Secret for PayloadCMS sessionsNDB_API_URL- External NDB API base URLNDB_USERNAME/NDB_PASSWORD- NDB API credentialsBLOB_READ_WRITE_TOKEN- Vercel Blob Storage tokenNODEMAILER_HOST/NODEMAILER_USER/NODEMAILER_PASS- Email configuration
See
.env.examplefor the complete list of required variables. -
Run database migrations (if needed)
npm run payload migrate
-
Generate TypeScript types
npm run generate:types
Start the development server:
npm run devThe application will be available at:
- Main site: http://localhost:3000
- PayloadCMS admin: http://localhost:3000/admin
# Development with cache clearing
npm run devsafe
# Code quality
npm run lint # Run ESLint
npm run format # Format code with Prettier
# Build for production
npm run build
# Start production server
npm startThe project uses Jest with React Testing Library and MSW for API mocking.
# Run all tests
npm test
# Run tests in watch mode
npm run test:watch
# Run tests with coverage
npm run test:coverage
# Run NDB-specific tests
npm run test:ndb
# Run tests in CI mode
npm run test:ciCurrent test coverage:
- 162 tests across 9 test suites
- Comprehensive coverage of NDB utilities and components
- MSW handlers for all API endpoints
.
├── src/
│ ├── app/ # Next.js App Router
│ │ ├── (pages)/ # Public pages group
│ │ │ ├── intern/ndb/ # Internal sheet music database
│ │ │ └── api/ # API routes
│ │ └── (payload)/ # PayloadCMS admin group
│ │
│ ├── next/ # Next.js-specific code
│ │ ├── ndb/ # Notendatenbank module
│ │ │ ├── api/ # API client and proxy
│ │ │ ├── components/ # UI components
│ │ │ ├── hooks/ # React hooks
│ │ │ └── utils/ # Utility functions
│ │ ├── auth/ # Authentication
│ │ └── components/ # Shared components
│ │
│ └── payload/ # PayloadCMS configuration
│ ├── collections/ # Data collections
│ └── globals/ # Global configs
│
├── old.gui/ # Legacy reference code (READ-ONLY)
└── .github/workflows/ # CI/CD workflows
This application is designed to be deployed on Vercel:
- Connect your repository to Vercel
- Configure environment variables in Vercel dashboard
- Deploy - Vercel will automatically build and deploy
npm run buildEnsure all variables from .env.example are configured in your Vercel project settings.
Access the PayloadCMS admin panel at /admin to manage:
- Users and authentication
- Media files
- Pages and content
- Events
- Site settings (header, footer)
After modifying PayloadCMS collections or globals:
npm run generate:typesThis updates src/payload-types.ts with TypeScript type definitions.
For development guidance and architectural decisions, see CLAUDE.md.
- Check the roadmap in CLAUDE.md
- Create a feature branch from
develop - Implement changes with tests
- Run tests and linting
- Submit a pull request to
develop
This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.
- API Proxy Pattern: All NDB API calls go through Next.js API routes for security (Basic Auth credentials hidden server-side)
- Server Components: Leverages Next.js 15 Server Components for performance and SEO
- Data Cache: Built-in caching with tag-based revalidation
- User Preferences: Hybrid storage with Payload Preferences API + localStorage
For detailed architecture documentation, see CLAUDE.md.
See CLAUDE.md - Known Issues for current issues and planned fixes.
For bugs and feature requests, please open an issue.