AI-assisted sheet-music and calendar management for music clubs
- Project overview
- Project goal
- Features
- Role matrix
- Test strategy for custom directives
- AI provenance
- Quickstart
- License
- Contributing
BestNote simplifies organizing music groups by providing role-based access to sheet music, calendars and uploads. It combines modern web technologies with AI-assisted development for maintainability and extensibility.
Provide role-based access to sheet music, calendars and uploads to simplify music club administration.
- Role matrix with granular permissions (Member, Conductor, Board, Treasurer, Librarian, Admin)
- Access to sheet music by voice and role
- Calendar integration (CalDAV-compatible)
- Upload logic via
v-can-uploaddirective - Reactive permission checks using Pinia
- Full test coverage with Vitest
- CI workflow with GitHub Actions
- Bilingual documentation (DE/EN)
| Role | Sheet access | Upload | Calendar | Admin |
|---|---|---|---|---|
| Member | Own voice | ❌ | ✅ | ❌ |
| Conductor | All voices | ❌ | ✅ | ❌ |
| Librarian | All voices | ✅ | ✅ | ❌ |
| Board | All voices | ❌ | ✅ | ❌ |
| Treasurer | Own voice (if musician) | ❌ | ✅ | ❌ |
| Admin | All | ✅ | ✅ | ✅ |
This project uses custom Vue directives such as v-can-upload that react to Pinia store data.
- Use
Vue Test Utils+Vitestwithjsdom - Ensure the directive and the test share the same Pinia instance
- Change roles in tests with
userStore.$patch(...) - Use
nextTick()and, if necessary,setTimeout(0)to allow reactive DOM updates to settle - Check visibility via
el.style.display('' or 'none') rather than relying onisVisible()
The tests cover:
- Visibility for allowed roles (e.g. Admin)
- Hidden state for disallowed roles (e.g. Treasurer without musician role)
This project was developed with help from Microsoft Copilot. The AI assisted with:
- Modular architecture
- Permission logic prompt design
- Test strategy and CI setup
- Bilingual documentation
- Node.js (LTS recommended)
- npm
- A
.envfile in the/serverfolder with Nextcloud credentials (if using Nextcloud integration)
Install dependencies for backend and frontend (if separate):
cd server
npm install
# then in the frontend root
cd ../
npm installBackend:
cd server
npm run devFrontend:
npm run devRun the server test script (mock mode):
npx ts-node scripts/testList.ts --mockstore/library.ts(pieces array) — interface Example included in repositorystore/user.ts(current user + roles)
PermissionService.tsexports permission helpers used across the app
src/views/LibraryView.vue— role-aware library viewsrc/components/AddPieceModal.vue— add new piece UIsrc/components/LibraryItem.vue— list itemsrc/lib/nextcloud/webdav.ts— frontend helper that calls backend/api/*src/directives/v-can.ts— template directive for permissions
GPLv3 – see LICENSE
See CONTRIBUTING.md