Part II — Developer's Guide

Understand the architecture, write code following project conventions, and contribute to Baander.

Architecture

Page Description
Architecture Overview DDD bounded contexts, four-layer structure, and shared kernel
Shared Kernel UUID v7, cursor pagination, search, Swoole async, caching, SSE/WebSocket
Real-Time Patterns WebSocket connection registry, SSE via Redis Pub/Sub, party sync
API Reference OpenAPI spec, REST patterns, and authentication flows

Development

Page Description
Development Environment Docker setup, Makefile commands, IDE config, and Xdebug
Coding Conventions Domain models, value objects, repositories, CQRS, ports, and anti-corruption
CQRS and Messaging Commands, handlers, domain events, and async processing
Search PGroonga full-text search, making a context searchable
Testing PHPUnit suites, conventions, and code examples
Frontend Development React + TypeScript + Vite + Tailwind CSS v4

Bounded Contexts

Page Description
Activity Listen history and favorites tracking
Auth OAuth 2.0 server, passkeys, TOTP, and DPoP
Catalog Artists, albums, songs, movies, videos, and genres
Command CLI utilities (OpenAPI export)
Filesystem MIME detection and inotify file watching
Library Media library management and file scanning
Lyrics Lyrics storage and retrieval
Media Image storage, streaming, and BlurHash
Metadata External API enrichment (Discogs, Last.fm, Spotify, MusicBrainz)
Notification Push, email, webhook, and in-app notifications
Party Synchronized watch-party playback
Playlist Manual and smart playlist management
Recommendation Music recommendation algorithms
Transcode CMAF video transcoding via FFmpeg and Swoole
User Preference Accent color and sidebar configuration
Shared Cross-cutting kernel: UUID, Swoole, caching, SSE, WebSocket

Contributing

Page Description
Adding a New Feature Step-by-step walkthrough for adding an API endpoint
Contributing Branch naming, commit style, PR process, and documentation maintenance
Glossary DDD, infrastructure, and data type terminology

See Also