Faircamp 0.16.0
Good news everyone: Faircamp 0.16.0 is out!
This is yet another release made possible through the fantastic support of the NGI Zero coalition, financed by the European Commission's Next Generation Internet initiative - all the major parts in this release would not have been possible without this, so thank you so much to all the people and organizations involved!
Intro and core takeaway
Before going into all the updates I want to outline the story behind this release and give you guidance on whether you want to update already:
Faircamp 0.16.0 is (and likely will remain) the largest stand-alone release in 2024 on the way to Faircamp 1.0. It introduces complex, entirely new user interface elements, addresses accessibility at a large scope, revisits and rewrites the entire theming approach, and much, much more. I believe that small, incremental change is generally the more healthy and productive approach to design and development, but once in a while thresholds are reached that require fanning out in all directions, unfolding all problems on the table and making foundational, interconnected changes that enable the next period of incremental change - and faircamp 0.16.0 is that kind of step.
You will (I hope!) find that Faircamp 0.16.0 contains a plethora of major and minor improvements, but you might also find that it still has some rough edges, particularly around some aspects of the layout. The release could have been delayed until all of that was addressed, but I felt that the general momentum was already beginning to suffer from the scope, complexity and anxiety that a massive release like this one brings, hence I opted to make a trade-off here and come out with the release now, even if not everything is a 100% worked out yet.
So this is Faircamp 0.16.0 then: A first step on the next level, ready for building ahead. If you don't mind being on board already, hop in, otherwise follow the upcoming releases and pick your next pickup point, there's much ahead to come still.
And now, the release!
Stand-alone track pages
While a previous release already introduced the technical foundation for generating stand-alone track pages, this release officially integrates them in the interface, meaning that track pages are now directly linked from the release player track list. Additionally, the release player track list features buttons for directly copying links to tracks for sharing.
Major accessibility upgrades
A huge number of changes has been introduced to make all pages, and especially the complex player widgets, fully navigateable by keyboard, including fine-grained control and screenreader announcements for waveform/seekbar/volume slider elements.
I'd like to specifically thank James Fenn for suggesting, providing and pointing to research for a good number of these changes.
Commits:
4b0c05f
,
3cbc01b
,
ba953a8
Theming overhaul
Theming is completely overhauled in this release: Rather than a distinct, limited set of base themes, faircamp now provides a simple distinction between a dark and light base theme, on top of which a seamless dynamic range slider allows for a large variety of base aesthetics. Internally, the entire color system has been switched to OKLCH, which unlocks highly saturated accent colors previously not available within the limited sRGB color space - as a consequence some of the color parameters have changed as well to reflect the new system. The utilization of color in the design has been generally redesigned, shifting it more towards a few select accent elements, which can be controlled with the theming options of that same name - this was done not only for aesthetic reasons but also to improve readability for people with various forms of color blindness and to better differentiate interactive elements on the page. Lastly, the theming widget has been completely redesigned as well, now offering interactive adjustment for the entire set of (appearance-related) theming options, as well as a toggleable advanced subwidget to visualize dynamic range and all colors in a theme's palette.
Commits:
b6a5b91
,
7e3d469
,
64253fc
Layout changes
As a start (but not the end!) of revisiting faircamp's general layout in order to address various long-standing issues, this release makes some foundational layout changes: All pages, be it the catalog homepage, a release page, a track page or an artist page, now separate between a landing/overview area, which may feature a new, short synopsis text, and the further, more detailed sections like the track list, release list, release description etc.
The intent at this point is to establish a well-working, functional separation between first-glimpse information and long-form information("About"), whereas the definite way in which this is presented (i.e. how spacious the pages are or how they are navigated exactly or in which order they present the various sections) will be further shaped in an on-going refinement process over the coming months.
Commits:
db00518
,
462cb4b
,
5d86ab9
Player state handling, buffering and control
This release adds numerous changes to improve visual state indication and robustness of the release/track player: Buffering, both intermittent and during the initial playback request is now smoothly indicated through a debounced visual transition of the pause icon to a loading animation and seeking through a track while it is still loading is now correctly handled. On top of this, media key shortcuts and their interaction with the player state are also correctly handled now.
Commits:
94159d6
,
bcf0b76
,
9d3b942
,
51907a9
Docked player
Up to now, playback interaction with the tracks happened only through the track list and waveform element(s) on each release page. This release introduces a new player element that appears on playback start, docks to the bottom of the page and scrolls along wherever you go on a page. It also features a new control that was not previously available - skipping to the next track - and allows you to jump to stand-alone artist or track pages by clicking the respective titles in the player element. It also brings one more additional control, which is ...
Commits:
efad8df
,
3b22f06
,
c1af5dc
,
a2ea77e
,
8f763dc
Volume control
Through the addition of the docked player, faircamp now also offers adjustable volume!
Commits:
c2affc5
,
3ab89ea
,
d9d471f
Waveform-less player
Previously, disabling waveforms only removed the amplitude changes in the waveform graph, leaving a straight line, which made sense because this used to be the only way to click/seek through the track. Now that the newly introduced docked player allows seeking through a track, the waveform-less player is indeed 100% waveform-less, leaving a compact track list without waveform graphs at all.
Commit: 0951d6a
Additional track numbering styles
On top of the previous options ("03", "III", "0x03") there are now additional non-padded and dotted options for track numbering ("3", "3.", "0x3", "III.").
Commit: bccf6b8
Improved indication/listing of artists
Faircamp now automatically displays track artists both in the track list and docked player if the tracks of a release feature differing artists. If there are a lot of artists to list (e.g. for a compilation), faircamp will automatically truncate the listing in various places, linking to a section or page where all artists are listed in full.
Simplifying manifest options
This release introduces a first set of changes (that will be continued in future releases) that aims to make it easier to determine the right location and placement for certain manifest options. In this first batch this is done by removing specific contexts from four different options, moving them into broader parent contexts instead:
- The language option now goes directly into the catalog section (
f760d43
) - The streaming quality option now goes directly into a catalog or release section (
20af519
) - The cache optimization option now goes directly into the catalog section (
53d27f6
) - The embedding option now goes directly into a catalog or release section (
5d10bc9
)
Lastly, catalog-wide options can now only be specified in manifests at the root directory of the catalog, making it easier to reason about what affects what, and to simplify trouble-shooting when people need support with their faircamp setup.
Breadcrumbs
The previous (somewhat redundant) breadcrumb links/labels in the header have been for now replaced by a static link/label to the catalog only. In their stead, an upcoming release is planned to introduce an expandable navigation dialog for directly navigating to/searching releases and/or artists within the faircamp catalog.
Commit: 1871fb5
Custom styling for markdown texts
Many people use extended markup capabilites in markdown-enabled text fields (e.g. descriptions), such as bullet points, horizontal rules, and so on. Previously there was no bespoke styling to visually integrate these decorations into the look of a faircamp page, but now there is!
Commit: b044f02
New translations
Thanks to contributions from atomkarinca and Miró Allard, faircamp is now available in turkish and swedish! <3
Miscellaneous improvements
- The embed choices page layout was overhauled (
03249c4
) - Empty and undecodable input audio files are now skipped, printing relevant errors (
95192c1
) - Some cache optimization messages looked confusing or broken (although they weren't), these have been improved (
366120a
) - Computed source metadata is now persisted to cache right after computation in some spots where it wasn't yet (
c25c6cd
) - Multiple artists are now supported in ID3 tags (
ed82dcb
) - Unsupported aac/m4a audio file extensions are now explicitly recognized and rejected in the catalog (
40b2ff7
) - A command-line flag for printing basic debugging information for a catalog was added (
2447627
)
Bugfixes
- Faircamp now ensures sufficient preloading when a track is directly played from a seek offset (
0ba880d
) - An issue where the total sample count in opus-encoded audio was sometimes miscomputed was resolved (
e9aa120
) - In rare cases, release extra filenames could previously collide with those of cover or track filenames, these are automatically renamed now (
5eec1be
)
Outro
That is all! Summer is over in my neighborhood and it's getting cold outside, no better time to snuggle up in a blanket and write some code. Be back with more soon! o/