LunarRepo

 A major challenge during the development of Vivify was figuring out how to deliver custom assets to players. While custom maps are typically hosted on BeatSaver, the platform doesn't allow external asset files to be packaged directly with the map. To address this, we decided to host the map files on BeatSaver and serve the asset bundles from a separate platform.

 To support this, I created LunarRepo, a repository for asset bundles that allows users to link their BeatSaver maps and upload corresponding asset files. Once uploaded, maps and their bundles become searchable on the site and are downloadable via the API.

LunarRepo
Map directory
Map directory
Listing
Listing for "42-flux"

 The frontend is built with SvelteKit, following a recommendation from a friend. Although I had previous experience with JavaScript, this project gave me the opportunity to learn TypeScript in a practical setting. For styling, I used the Bootstrap framework, which I was already familiar with from past projects.

 Every map has its own dedicated page with a description pulled from the BeatSaver API. Additionally, there is a sidebar on the right that shows all the information for the map, and more importantly, a download button for the latest version and a link to all released bundles.

 All uploaded assets are grouped under their respective maps, improving discoverability. Additionally, the site includes a directory view showing cover images, song names, and authors for all available listings.

 The backend is built with ASP.NET and uses Entity Framework with a MariaDB database. For performance, database queries are in-memory cached, and all files are served through Cloudflare R2 acting as a CDN. The site sits behind an NGINX reverse proxy, and is containerized with Docker Compose.

 For authentication, I decided to use Discord's OAuth2 API, as I found it smarter to leverage a mature authentication system that is already widely used in Beat Saber modding. This decision helped me avoid building a complex authentication system from scratch while ensuring a familiar and secure login experience for users.

 The site uses role-based access control to manage permissions for uploading, deleting, viewing unlisted entries, and moderating users.

Swagger documentation for API
Swagger documentation for API