Skip to content

Repository files navigation

VerseVault

Discover the story behind every song.

A polished JavaFX desktop experience for exploring music, publishing songs, and improving lyrics together.

Java JavaFX Gradle JUnit

Build and Test

VerseVault login screen

Why VerseVault?

VerseVault began as an Advanced Programming midterm and grew into a complete, portfolio-ready desktop application. It combines an editorial music experience with secure authentication, role-aware workflows, durable local persistence, and a modular Java architecture.

The catalog contains fictional artists and original demo lyrics, making the project safe to explore and present without relying on copyrighted material.

Experience at a Glance

Listener Artist Administrator
Discover songs, albums, and artists Publish songs and build albums Review artist applications
Follow favorite creators Edit owned lyrics Approve publishing access
Comment on songs Review lyric suggestions Protect privileged registration
Suggest lyric improvements Manage a personal catalog Maintain role boundaries

What Makes It Stand Out

  • Three real user journeys with listener, artist, and administrator access.
  • Secure local authentication using salted PBKDF2 password hashes while retaining compatibility with legacy SHA-256 records.
  • Moderated artist onboarding with pending applications and administrator approval before publishing access is granted.
  • A complete music catalog with songs, albums, artists, genres, tags, follows, comments, views, and lyric-edit requests.
  • Reliable persistence through flat JSON records and atomic file replacement.
  • A cohesive JavaFX design system with strong hierarchy, keyboard focus, validation states, styled dialogs, and confirmation for destructive actions.
  • Automated service tests covering authentication and a full catalog workflow.
  • Desktop packaging through Gradle and jlink, with no separate Java install required for the generated runtime image.

Architecture

flowchart LR
    UI["JavaFX Views"] --> CTX["AppContext"]
    CTX --> AUTH["AuthService"]
    CTX --> CATALOG["CatalogService"]
    AUTH --> ACCOUNTS["Account Models"]
    CATALOG --> DOMAIN["Catalog Models"]
    AUTH --> USERS["Local Account Store"]
    CATALOG --> JSON["Atomic JSON Store"]
Loading
src/main/java/org/example/musicapp/
├── Main.java                  Application entry point
├── AppContext.java            Shared service wiring
├── models/                    Accounts and catalog domain types
├── services/
│   ├── AuthService.java       Authentication and artist approval
│   └── CatalogService.java    Catalog operations and persistence
└── views/                     Programmatic JavaFX screens

Views receive the shared JavaFX Stage and typed domain context. Business rules live in services, while models remain flat and serialization-friendly. This keeps navigation straightforward without coupling the interface directly to file I/O.

Tech Stack

Area Technology
Language Java 17
Desktop UI JavaFX 17
Build Gradle 8.10 Wrapper
Persistence Gson 2.10.1 and local files
Testing JUnit Jupiter 5.10.2
Packaging Badass JLink Plugin

Run Locally

Requirements

  • JDK 17 or newer
  • A Windows, macOS, or Linux desktop environment
  • Internet access for the first dependency download

Start the application

Windows PowerShell:

.\gradlew.bat run --no-daemon --console=plain

macOS or Linux:

./gradlew run --no-daemon --console=plain

The first launch creates the local catalog automatically. Listener and artist accounts can be created from the sign-up screen; new artist accounts remain pending until approved by an administrator.

Create a Local Review Administrator

Administrator registration is intentionally unavailable in the public sign-up flow. For a local review session, provide temporary bootstrap credentials through environment variables:

$env:MUSICAPP_ADMIN_USERNAME = "reviewer-admin"
$env:MUSICAPP_ADMIN_EMAIL = "admin@example.com"
$env:MUSICAPP_ADMIN_PASSWORD = "ChooseYourOwnStrongPassword123"
.\gradlew.bat run --no-daemon --console=plain

The administrator is provisioned only if the username is not already present. Clear the variables after the first successful launch. Local account and catalog files are intentionally excluded from version control.

Test and Package

# Compile and run the JUnit suite
.\gradlew.bat test --no-daemon --console=plain

# Run the complete build
.\gradlew.bat build --no-daemon --console=plain

# Generate a self-contained desktop runtime ZIP
.\gradlew.bat jlinkZip --no-daemon --console=plain

The test suite covers listener registration, pending artist restrictions, administrator provisioning, legacy authentication compatibility, persistence, song and album creation, follows, comments, and lyric-edit approval.

Engineering Highlights

  • Role-based access is represented with explicit domain types instead of loose UI state.
  • Public input cannot create administrator accounts.
  • Password verification avoids storing or logging plaintext credentials.
  • Catalog records reference stable IDs and usernames rather than circular object graphs.
  • Persistence errors are propagated, and catalog writes replace files atomically.
  • Scene navigation preserves the authenticated account and shared application services.

Portfolio Summary

Designed and built a modular JavaFX music and lyrics platform with Java 17, role-based access control, PBKDF2 authentication, moderated artist onboarding, atomic JSON persistence, automated JUnit workflows, and a packaged desktop runtime.

Project Scope

VerseVault is an educational portfolio project demonstrating object-oriented design, inheritance, encapsulation, validation, service boundaries, persistence, exception handling, event-driven interfaces, and automated testing. It is not affiliated with or intended to replace any commercial music platform.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

2 watching

Forks

Releases

Packages

Contributors

Languages