Help us shape the future of Go! Take the 2026 Go Developer Survey

forte

command module
v1.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 14, 2026 License: GPL-3.0 Imports: 35 Imported by: 0

README

Forte

Forte is a Linux desktop music player built with Go, Wails, Svelte, mpv, and SQLite. It plays internet radio out of the box, and can optionally manage a local music library with Subsonic and Jellyfin servers in the same collection.

image

What It Does

  • Radio first - browse Radio Browser and SomaFM stations, filter by country or codec, save favourites, pin stations, add custom streams, and keep playback history.
  • Library mode when you want it - add music directories in Settings, scan local FLAC, MP3, Ogg, Opus, and WAV files, then browse albums, artists, tracks, playlists, and listening stats.
  • Streaming libraries - connect Subsonic-compatible and Jellyfin servers, test credentials, sync catalogues, and play remote tracks alongside local files.
  • Playback built on mpv - queue management, shuffle, repeat, seeking, volume control, ReplayGain support, and gapless-style queue preloading.
  • Desktop integration - MPRIS controls, desktop notifications, a COSMIC-friendly themed tray icon, launcher icons, and configurable dark/light colour themes.
  • Scrobbling - Last.fm and ListenBrainz support with now-playing updates and a retry queue for missed scrobbles.
  • Metadata extras - full-text search, CUE sheet parsing, play history, top artists/albums/tracks, and cached artist information from Last.fm and MusicBrainz.

Installation

Linux Installer

Install Forte on Ubuntu, Debian, or Arch:

curl -fsSL https://raw.githubusercontent.com/willfish/forte/master/scripts/install.sh | sh
Nix

Build and run the current release from GitHub:

nix run github:willfish/forte

Or build the package:

nix build github:willfish/forte

In a NixOS or Home Manager flake, add the package from the Forte flake:

inputs.forte.url = "github:willfish/forte";

environment.systemPackages = [
  inputs.forte.packages.${pkgs.system}.default
];
From Source

Forte supports Linux and macOS (via Nix). The Nix flake provides a first-class Forte.app on darwin (proper Dock icon, menubar status item with menu on click, playback state, self-contained libmpv).

The flake pins nixos-25.11 for mpv, GTK, and WebKit (cache.nixos.org). Go 1.26 comes from a second nixpkgs-go input (nixos-unstable) until 25.11 carries that toolchain.

# Fast dev shell: Go, Node, mpv, linters (no GTK/WebKit download)
nix develop

# Full shell when linking Wails or running Playwright in Nix
nix develop .#full

task build
./bin/forte

Home Manager still builds the forte app from source on input changes; that is separate from downloading Go itself.

# After a Nix package build
./result/bin/forte --version

Without Nix, install:

  • Go 1.26+
  • Node.js 22+
  • GTK4
  • WebKitGTK 6.0
  • mpv
  • pkg-config
  • go-task

The build tasks install the pinned Wails 3 CLI into the repo-local .go/bin directory when needed.

Then build:

cd frontend
npm ci
cd ..
task build

Packaging

A nixpkgs-shaped derivation lives in nix/package.nix. The flake calls it with this tree as src. A later nixpkgs init can copy that file to pkgs/by-name/fo/forte/package.nix, switch src to fetchFromGitHub of a v* tag, and set maintainers = with lib.maintainers; [ willfish ];.

Do not open a GitHub PR just to iterate on hashes — nix build locally. Tagging v* on GitHub runs the Release workflow.

Development

# Hot reload with Wails and Vite
task dev

# Build the Linux desktop app
task build

# Local pre-PR verification
make check

# Seed demo data for screenshots and UI testing
task demo

# Go tests
go test -tags nocgo ./...

# Frontend type checking
cd frontend && npm run check

# Lint and vulnerability checks
golangci-lint run --build-tags nocgo
govulncheck -tags nocgo ./...

The demo task creates a fixture library with albums, tracks, playlists, play history, and radio data. It is safe to run more than once.

Architecture

frontend/          Svelte 5 UI, Vite build, Wails bindings
internal/library/  SQLite schema, scans, search, playlists, stats, servers
internal/player/   mpv engine and queue logic
internal/radio/    Radio Browser and SomaFM clients
internal/system/   MPRIS and desktop notifications
internal/metadata/ Audio tag reading
internal/scrobbling/
                   Last.fm and ListenBrainz clients
internal/streaming/
                   Subsonic and Jellyfin clients
libraryservice.go  Library, radio, settings, and integration RPC methods
playerservice.go   Playback, queue, tray, MPRIS, radio, and scrobbling runtime
main.go            Wails application setup

The backend owns I/O, playback, database access, desktop integration, and external services. The frontend is a Svelte app that talks to the backend through generated Wails bindings. User data is stored in SQLite under the app configuration directory.

Project Status

Forte is a personal Linux desktop app and is evolving quickly. Issues and feature requests are welcome at github.com/willfish/forte/issues.

License

GNU General Public License v3.0

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis
cmd
demo command
Command demo seeds the Forte database with realistic fixture data for screenshots and demonstrations.
Command demo seeds the Forte database with realistic fixture data for screenshots and demonstrations.
internal
config
Package config handles application settings and persistence.
Package config handles application settings and persistence.
cue
Package cue parses CUE sheet files into structured track data.
Package cue parses CUE sheet files into structured track data.
library
Package library handles the music library database, scanning, and search.
Package library handles the music library database, scanning, and search.
metadata
Package metadata reads audio file tags and properties.
Package metadata reads audio file tags and properties.
player
Package player handles audio playback via mpv.
Package player handles audio playback via mpv.
radio
Package radio provides a client for the RadioBrowser API.
Package radio provides a client for the RadioBrowser API.
scrobbling
Package scrobbling coordinates playback events with configured scrobble services.
Package scrobbling coordinates playback events with configured scrobble services.
scrobbling/lastfm
Package lastfm provides stateless functions for the Last.fm Scrobbling API v2.
Package lastfm provides stateless functions for the Last.fm Scrobbling API v2.
scrobbling/listenbrainz
Package listenbrainz provides stateless functions for the ListenBrainz API.
Package listenbrainz provides stateless functions for the ListenBrainz API.
streaming
Package streaming defines the interface and domain types for music streaming providers.
Package streaming defines the interface and domain types for music streaming providers.
streaming/jellyfin
Package jellyfin implements the Jellyfin streaming API client.
Package jellyfin implements the Jellyfin streaming API client.
streaming/subsonic
Package subsonic implements the Subsonic/OpenSubsonic streaming API client.
Package subsonic implements the Subsonic/OpenSubsonic streaming API client.
system
Package system provides desktop integration for media controls and notifications.
Package system provides desktop integration for media controls and notifications.
userconfig
Package userconfig exports and imports sectioned Forte user configuration (TOML).
Package userconfig exports and imports sectioned Forte user configuration (TOML).

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL