From Monolith to Masterpiece
With the... unimpressive results and horrible underlying architecture of FNote v1 (all 2100+ lines in one file), I chose to abandon the project and start from scratch. FNote v1 was built with an older AI, and I knew the newer models were capable of so much more. This time, I also made a crucial architectural decision: use an HTML/CSS/JS frontend with a Python backend.
To this day, AIs still suck at creating complex UIs with Python libraries like `tkinter` or `PyQt`. But they are masters of web technologies—this very website is proof. By leveraging this strength, I knew I could create something special. The very first prototype Gemini produced had a solid layout, and from there, I continued to build. The result is a testament to the power of this approach, though my ambition to write everything in vanilla JS without a framework like React ultimately introduced a host of bugs. I call it my "Notion-inspired" lesson in humility.

Ambition and Its Pitfalls
Despite my best efforts to optimize, the project became a victim of its own complexity. By choosing to write everything in vanilla JavaScript, I essentially had to reinvent the wheel for features that frameworks like React or Svelte provide for free. This led to a brittle codebase where about 90% of my intended features were implemented, but a frustrating 40% of those were plagued with bugs. It's a classic case of biting off more than you can chew, and a valuable lesson in choosing the right tools for the job.
A Symphony of Features
FNote v2 includes every feature from its predecessor and introduces a host of powerful new ones:
- Modern UI: All the basic music player features (play/pause, seek, shuffle, loop) wrapped in a clean interface with slick animations.
- Miniplayer Mode: A sleek, compact miniplayer that expands on hover, providing full functionality without taking up screen space.
- Song Markers: Per-song markers allow you to highlight and jump to the best part of any track.
- Comprehensive Tagging: A powerful tagging system lets you create custom tags and apply them to individual or multiple songs for easy filtering.
- Playlists & Queues: Full playlist and queue management.
- Import/Export: Share and back up your playlists with the custom
.fnlist
file type—a glorified zip file containing all song data, covers, and a JSON manifest. - Windows Integration: An optional setting registers the
.fnlist
file type, allowing you to import playlists simply by double-clicking them. - YT-DLP Integration: Download songs or entire playlists from the web directly into the app.
- The Prized Feature: My favorite feature from v1, perfected. The app auto-pauses when it detects external audio and resumes when it's gone. You can even manage an ignore list for apps like Lively Wallpaper or FxSound.
View on GitHub
The full code for FNote v2 is open-source and available on GitHub. Feel free to explore the codebase, but be warned: it's a vanilla JS rabbit hole!
Go to RepositoryThe Full Backstory
FNote v2 is the result of lessons learned from my very first major project. To fully appreciate the journey and the massive leap in quality, you need to see where it all started.
Check out the story of FNote v1, the one-file wonder that sparked it all.