Inspiration

Short films are everywhere online, but they are surprisingly hard to discover intentionally. Viewers often scroll through endless platforms without knowing what to watch, especially when they only have a limited amount of time. At the same time, many short film creators struggle to reach audiences on platforms optimized for fast, repeatable content rather than cinematic discovery. Lens was built as a lightweight bridge between these two problems: helping viewers find meaningful short films while giving existing artistic work a better chance to be seen.

What it does

Lens recommends YouTube short films based on the user’s mood, available time, and viewing intent. Users choose how they feel, how long they have, and whether they want a single film, a curated session, or a surprise. The app then shows a short calibration flow where users can accept or reject film cards to refine their taste. Based on that profile, Lens generates personalized recommendations or multi-film watch sessions designed to fit within the user’s available time.

How we built it

We built Lens as a lightweight front-end web app using HTML, CSS, and JavaScript. The recommendation pipeline is split into several steps: loading an enriched film dataset, creating an initial user profile, refining it through calibration cards, scoring individual films, building possible two- or three-film sessions, scoring those sessions, and selecting final recommendations through weighted randomization. YouTube metadata was collected through the YouTube Data API, then enriched into a structured JSON dataset containing genres, mood vectors, intensity, themes, summaries, thumbnails, and recommendation copy.

Challenges we ran into

The main challenge was making the recommendation feel both technically structured and emotionally natural. We had to avoid results that felt too random, while also avoiding recommendations that were always the same. Building session recommendations added another layer of complexity because the app had to consider total duration, individual film scores, ordering, variety, and the quality of the final film in a session. We also ran into practical data issues: repeated descriptions, uneven metadata quality, floating-point duration bugs, mobile safe-area behavior, swipe interactions, and GitHub Pages deployment constraints.

Accomplishments that we're proud of

We are proud of having built a complete recommendation pipeline rather than a simple random picker. Lens can score films, assemble sessions, refine user preferences through interaction, and present recommendations in a clean mobile-first interface. We are also proud that the app feels playful and usable: the calibration flow gives it a gamified feel, while the final recommendations are presented like curated cinematic playlists instead of a static list of links.

What we learned

We learned that recommendation systems are not only about scoring. The user experience depends heavily on data quality, copywriting, randomness, variety, and interface design. We also learned how quickly small technical decisions can affect the perceived intelligence of an app: repeated card descriptions, aggressive weighting, or duplicated session permutations can make a good algorithm feel broken. Finally, we learned how useful it is to separate the pipeline into clear modules so that scoring, selection, UI rendering, and data preparation can evolve independently.

What's next for Lens

Next, we would improve the dataset quality, add richer metadata, and make the recommendation engine more adaptive over time. We would also like to add better session logic, stronger diversity constraints, watch history, creator discovery pages, and direct embedded playback where possible. A future version could also include mobile-specific features such as push notifications, saved watchlists, and daily curated short film sessions.

Built With

HTML CSS JavaScript YouTube Data API JSON GitHub Pages

Built With

Share this project:

Updates