Repository navigation
Releases: Thelost77/pine
Release list
pine and spruce v0.8.3
pine and spruce v0.8.3
This release corrects the Enter key on a bookmark in pine. Enter now plays the
book or the podcast episode of the bookmark. spruce has no change.
Installation
go install github.com/Thelost77/pine@v0.8.3
go install github.com/Thelost77/pine/cmd/spruce@v0.8.3As an alternative, download an archive from the release page. See "Binaries".
Binaries
The release has one archive for each program and each system. The name of an
archive is <program>_v0.8.3_<system>_<architecture>:
| System | Architecture | File type |
|---|---|---|
linux |
amd64, arm64 |
.tar.gz |
darwin (macOS) |
amd64, arm64 |
.tar.gz |
windows |
amd64 |
.zip |
Each archive contains the program, the LICENSE file of pine, and a licenses
directory. That directory has the license texts of Go and of the modules that
the program links.
- A binary needs libmpv. See "Requirements".
- On Windows, put
libmpv-2.dllin the directory of the program. The archive
does not contain it. - The binaries are not signed.
- A GitHub Actions workflow builds the binaries on Linux with
CGO_ENABLED=0.
No binary of this release has run on a test machine.
pine
Reliability and Correctness
Bookmarks:
- Enter on a bookmark moved the item that played, not the item of the
bookmark. While book A played, Enter on a bookmark of book B moved book A
to the time of the bookmark. pine now stops book A, and then starts book B
at the time of the bookmark. - Enter on a podcast bookmark did not use the episode of the bookmark. An
Audiobookshelf bookmark has no episode. While an item played, pine moved
that item to the time of the bookmark. While no item played, pine asked the
server to play the podcast with no episode. pine now finds the episode from
the title of the bookmark, and starts that episode at the time of the
bookmark.
Changes of Behavior
- Enter on a bookmark seeks the player only if the book or the episode of the
bookmark plays. If not, Enter stops the current playback, and then starts
the book or the episode of the bookmark at the time of the bookmark. - pine finds the episode of a podcast bookmark from the title of the bookmark.
pine puts the episode title and—before the title of a podcast bookmark
that it makes. Each release of pine does this. If you edit the title of a
podcast bookmark, keep that part. - Some podcast bookmarks have no episode title at the start of their title:
the user changed the title, or a different program made the bookmark. For
such a bookmark, Enter seeks the player if the podcast of the bookmark
plays. If not, pine shows the errorcannot find the episode of this bookmark, and the playback does not change. - If two episodes of a podcast have the same title, pine uses the first of
them in its episode list.
spruce
spruce has no change in this release. The changed packages, internal/app and
internal/screens/detail, are part of pine only.
Development
- Each correction has a test that failed before the correction. The tests use
a fake Audiobookshelf server and the mock player of the app tests. - No real Audiobookshelf server ran for these corrections, and pine did not
run in a terminal. The tests send messages to the model and read its state. - The statement that an Audiobookshelf bookmark has no episode is from the
bookmark type of pine, ininternal/abs/types.go. The source of
Audiobookshelf was not read for this release. - The answer of Audiobookshelf to a play request for a podcast with no episode
is not known. pine does not send that request for a bookmark now. - The notes of v0.8.2 named two tests that failed at times in CI on Windows:
TestE2E_LoginFailureandTestE2E_CacheSurvivesRestart. The two tests now
wait up to 15 seconds for the commands that can be slow. Each other command
of a test has a wait of 200 ms, as before. CI ran two times on that change,
and the two runs passed. Two runs do not show that the fault is gone.
Requirements
- Go 1.26.4 or newer, for an installation from source
- libmpv from mpv 0.34 or later
- pine: an Audiobookshelf server
- spruce: a Jellyfin account with a music library
pine and spruce v0.8.2
pine and spruce v0.8.2
This release corrects faults in the bookmarks, the playback, and the text
inputs of pine. It removes the keys n and N of pine. spruce has two
corrections.
Installation
go install github.com/Thelost77/pine@v0.8.2
go install github.com/Thelost77/pine/cmd/spruce@v0.8.2As an alternative, download an archive from the release page. See "Binaries".
Binaries
The release has one archive for each program and each system. The name of an
archive is <program>_v0.8.2_<system>_<architecture>:
| System | Architecture | File type |
|---|---|---|
linux |
amd64, arm64 |
.tar.gz |
darwin (macOS) |
amd64, arm64 |
.tar.gz |
windows |
amd64 |
.zip |
Each archive contains the program, the LICENSE file of pine, and a licenses
directory. That directory has the license texts of Go and of the modules that
the program links.
- A binary needs libmpv. See "Requirements".
- On Windows, put
libmpv-2.dllin the directory of the program. The archive
does not contain it. - The binaries are not signed.
- A GitHub Actions workflow builds the binaries on Linux with
CGO_ENABLED=0.
No binary of this release has run on a test machine.
pine
Reliability and Correctness
Bookmarks:
- The detail screen showed no bookmarks for an item that has bookmarks.
pine read the bookmarks from the progress of the item. Audiobookshelf gives
no bookmarks there. A bookmark that the user added was in the list only
until the user left the detail screen. pine now reads the bookmark route,
which Audiobookshelf has from 2.36.0. For an older server, pine reads the
bookmarks of the user and keeps those of the item. - The detail screen could show the bookmarks of a different item. The
answer for an item can come after the user opened a different item. pine
now ignores the bookmarks of an item that the detail screen does not show. bmade a bookmark on an item that did not play. The bookmark got the
position of the player. On the detail screen of a different item,bmade
a bookmark on that item, at a position of the item that plays. pine now
makes no bookmark and shows an error.
Playback:
- A new player played at the speed 1.0, while the footer showed the speed of
pine. This occurred after the start of a session, and after the change to
the next file of a book. The keyspeedof the config file had no effect
on the player. pine now sets its speed in each new player. - The time of a stalled stream counted as listening time. mpv reports no
pause while it waits for data. pine now counts no listening time while the
player plays no audio. - The close of the terminal lost the last position and the listening
time. The process ended before pine sent them. pine now quits at the
close of the terminal as it does withq. - A pause state, a speed, or a volume that the player refused gave no
error. The footer then showed a state that the player did not have. pine
now shows the error.
Text inputs:
- The bookmark title editor lost keys.
qquit the program,?opened
the help overlay, andescwent to the previous screen. During a playback,
the playback keys did their function, for examplel,h,p, and space.
The left arrow closed the editor, and the text was lost. The editor now
gets each key.esccancels the edit, and the left arrow moves the cursor. - The login screen lost the keys
?andC.?opened the help
overlay, and a typedChad no effect. So a password with one of these
characters could not be typed. - The metadata editor lost the key
?.?opened the help overlay. qin the confirmation dialog of a deletion quit the program.qnow
cancels the dialog, asnandescdo.- The error banner took the first key of a text input. A key closes the
banner. While a text input or the confirmation dialog has the keys, the key
now goes to it, and the banner closes after 5 seconds.
Changes of Behavior
- The keys
nandN(next and previous chapter) are gone. Use the chapter
list (C), or the actions "Next Chapter" and "Previous Chapter" of the
command palette (ctrl+p). - The config keys
next_chapterandprev_chapterare gone. A config file
that has them still loads, and the two keys have no effect. pine wrote the
two keys to each config file that it made. - While a text input or the confirmation dialog has the keys, the global keys
and the playback keys have no function.ctrl+pdoes not open the command
palette, and space does not pause the playback.ctrl+cquits the program
on each screen. The hint line then shows no global key and no playback key. ?closes the help overlay on each screen.- A stall of the stream can lose up to 1 second of listening time, as a pause
does. - For Audiobookshelf before 2.36.0, each read of the bookmarks reads the user
with all bookmarks.
spruce
- spruce did no cleanup at the close of the terminal. The process ended
before spruce closed its media cache and its players. spruce now quits its
program at the close of the terminal, and then does the cleanup. - A pause state, a speed, or a volume that the player refused gave no
error. spruce now shows the error.
The shared packages internal/player and internal/ui have changes for
pine. spruce gets the new idle state of the player in each position tick, and
does not use it.
Development
- Each correction has a test that failed before the correction, but not the
cleanup of spruce at the close of the terminal. The tests use a fake
Audiobookshelf server and the mock player of the app tests. The test of the
stalled stream plays a stream through the real libmpv. - No real Audiobookshelf server ran for these corrections. The statements
about Audiobookshelf are from the source of the versions 2.35.1, 2.36.0, and
2.37.1. - pine and spruce did not run in a terminal for the corrections of the keys
and of the bookmarks. The tests send messages to the models and read the
views. - The close of a terminal has a test for the function that the two programs
call. No test runs themainfunction of a program, because it needs a
terminal. For the first form of this correction, pine ran one time in a
pseudo-terminal, with no session. spruce did not run. - No test makes libmpv refuse a pause state, a speed, or a volume. The tests
use a player that fails these calls. - In CI on Windows, the tests
TestE2E_LoginFailureand
TestE2E_CacheSurvivesRestartfailed at times, and passed in the next run
of the same commit. The test helper waits 200 ms for a command. This release
does not change the two tests or the helper.
Requirements
- Go 1.26.4 or newer, for an installation from source
- libmpv from mpv 0.34 or later
- pine: an Audiobookshelf server
- spruce: a Jellyfin account with a music library
pine and spruce v0.8.1
pine and spruce v0.8.1
This release corrects nine faults in the progress sync of pine. The progress
sync sends the position and the listening time to the Audiobookshelf server.
spruce has no change.
Installation
go install github.com/Thelost77/pine@v0.8.1
go install github.com/Thelost77/pine/cmd/spruce@v0.8.1As an alternative, download an archive from the release page. See "Binaries".
Binaries
The release has one archive for each program and each system. The name of an
archive is <program>_v0.8.1_<system>_<architecture>:
| System | Architecture | File type |
|---|---|---|
linux |
amd64, arm64 |
.tar.gz |
darwin (macOS) |
amd64, arm64 |
.tar.gz |
windows |
amd64 |
.zip |
Each archive contains the program, the LICENSE file of pine, and a licenses
directory. That directory has the license texts of Go and of the modules that
the program links.
- A binary needs libmpv. See "Requirements".
- On Windows, put
libmpv-2.dllin the directory of the program. The archive
does not contain it. - The binaries are not signed.
- A GitHub Actions workflow builds the binaries on Linux with
CGO_ENABLED=0.
No binary of this release has run on a test machine.
pine
Reliability and Correctness
Finished items:
- A stop removed the finished mark of the last finished item. pine restores
the last session at each start. For a finished item, that session starts at
the position 0. A quit, or the play of a different item, then told the server
that the item is not finished. pine now sends no progress for a session with
no new position and no listening time, and it closes that session with no
position. - The end of a book could lose its finished mark. At the end of a book,
pine sent the last position with the value "not finished". If the server
handled the close of the session first, it marked the book as finished. The
progress update then removed the mark, and the server stored the position 0.
A stop now sends the position with no finished value, and the server applies
its own rule. Only "mark as finished" and "mark as not finished" send the
value.
Listening time:
- Each sync sent the total listening time of the session. pine sends a
sync each 30 seconds, and the server adds the listening time of each sync.
For one hour of play, the server stored about 61 hours. A sync now sends
only the listening time that the server does not have. - The listening time was the change of the position. At the speed 2.0, one
hour of play counted as two hours. The listening time is now the time of the
clock while the player plays. A pause adds nothing. - A quit with ctrl+c sent the last listening time two times. pine sent the
close of the session and the progress update two times. pine now sends them
one time.
Position:
- A paused session sent a sync each 30 seconds. The server stored the old
position again. That could replace a newer position from a second device.
pine now sends a sync only if the position or the listening time has a
change of 1 second or more. - A quit with
qcould lose the last position and the listening time. The
program could end before the two requests left. pine now sends the two
requests and waits for the server before it ends.
Sessions:
- Each sync failed after the server lost the session. Audiobookshelf has
no open session after a restart, or after 36 hours with no change of the
session. pine wrote a log line and continued. The server stored no listening
time for the rest of the playback, and it stored the position only at the
stop. pine now opens a new session for the item, and sends the position and
the listening time to it. - The close of a session could fail at the play of a different item. pine
sent the close of the old session and the play request at the same time. The
server closes the old session at a play request, and it then refused the
close of pine. The listening time of that close was lost. pine now waits for
the close before it sends the play request.
Changes of Behavior
- A quit waits until the server has the last position. If the server does not
answer, a quit can take up to 5 seconds. Before, a quit withqended
immediately. - The play of a different item waits for the close of the old session. If the
server does not answer, the wait ends after 10 seconds. - The listening time that pine sends is lower than before, because the old
values were too high. This release does not correct the values that the
server has. - A position tick that comes more than 5 seconds after the last tick adds no
listening time, for example after a suspend of the machine. One pause can
lose up to 1 second of listening time.
spruce
spruce has no change in this release. The changed packages, internal/abs and
internal/app, are part of pine only.
Development
- Each correction has a test that failed before the correction. The tests use
a fake Audiobookshelf server and the mock player of the app tests. - No real Audiobookshelf server ran for these corrections, and no real
playback ran. The statements about Audiobookshelf are from the source of
version 2.37.1. - No quit ran in a real terminal, and no playback ran at a speed other than
1.0. - The position that libmpv reports for a paused session is not measured. If it
is 1 second or more from the start position of the session, a stop sends
that position, with no finished value.
Requirements
- Go 1.26.4 or newer, for an installation from source
- libmpv from mpv 0.34 or later
- pine: an Audiobookshelf server
- spruce: a Jellyfin account with a music library
pine and spruce v0.8.0
pine and spruce v0.8.0
Each release now has binaries for Linux, macOS, and Windows. pine and spruce
also have an MPRIS server of their own. It replaces a module with a GPL-3.0
license. All the code in the two programs now has a permissive license.
Installation
go install github.com/Thelost77/pine@v0.8.0
go install github.com/Thelost77/pine/cmd/spruce@v0.8.0As an alternative, download an archive from the release page. See "Binaries".
Binaries
The release has one archive for each program and each system. The name of an
archive is <program>_v0.8.0_<system>_<architecture>:
| System | Architecture | File type |
|---|---|---|
linux |
amd64, arm64 |
.tar.gz |
darwin (macOS) |
amd64, arm64 |
.tar.gz |
windows |
amd64 |
.zip |
Each archive contains the program, the LICENSE file of pine, and a licenses
directory. That directory has the license texts of Go and of the modules that
the program links.
- A binary needs libmpv. See "Requirements".
- On Windows, put
libmpv-2.dllin the directory of the program. The archive
does not contain it. - The binaries are not signed.
- A GitHub Actions workflow builds the binaries on Linux with
CGO_ENABLED=0.
The binaries forlinux_arm64, macOS, and Windows have not run on a test
machine.
Licenses
pine and spruce have the MIT license. From v0.8.0, each module that the two
programs link has an MIT, BSD, or Apache-2.0 license.
Versions v0.2.0 to v0.7.0 link the module
github.com/quarckster/go-mpris-server, which has the GPL-3.0 license. spruce
v0.1.0 and v0.2.0 from its old repository link it too. If you distribute a
binary of one of these versions, the GPL-3.0 applies to that binary. These
versions have no binaries on the release page.
pine and spruce
What's New
- Binaries on the release page: an installation does not need Go.
- An MPRIS server of our own: the server is written from the MPRIS 2.2
specification. It usesgodbus/dbusand no other module.
Reliability and Correctness
- A D-Bus client that set
Volumeto a value of a wrong type stopped the
program. The server now returns an error. - The MPRIS metadata contains only the fields that have a value. Before, it
contained 22 fields, and most of them were empty. - The introspection data shows only the interfaces that the programs have.
Before, it also showedTrackListandPlaylists. - The
PropertiesChangedsignal does not containPositionorCanControl.
The MPRIS specification excludes them from that signal.
Platforms
- Linux: pine was tested with the buttons of Bluetooth headphones, through
BlueZ 5.72 andmpris-proxy. - BlueZ gives the headphone buttons to the first MPRIS player on the session
bus. If a browser plays media before pine or spruce starts, the buttons
control the browser. This is the behavior of BlueZ. pine and spruce cannot
change it.
Development
- The
Releaseworkflow builds the archives when a GitHub Release is
published. - A new test starts the MPRIS server on a private D-Bus session bus and checks
it as an MPRIS client does. WithPINE_REQUIRE_DBUS=1, the test fails if
dbus-daemonis absent. Without the variable, the test skips.
Requirements
- Go 1.26.4 or newer, for an installation from source
- libmpv from mpv 0.34 or later
- pine: an Audiobookshelf server
- spruce: a Jellyfin account with a music library
pine and spruce v0.7.0
pine and spruce v0.7.0
pine and spruce now play audio through libmpv, which they load into their own
process. Before, the two programs started the mpv program and controlled it
through a socket.
This release changes the requirement. Install libmpv before you upgrade. See
"Upgrade".
Installation
go install github.com/Thelost77/pine@v0.7.0
go install github.com/Thelost77/pine/cmd/spruce@v0.7.0Upgrade
The two programs need libmpv from mpv 0.34 or later. The mpv program is not
necessary.
- Debian and Ubuntu:
sudo apt install libmpv2. On Ubuntu 22.04 the package is
libmpv1. - Arch:
sudo pacman -S mpv - macOS:
brew install mpv
If libmpv is absent, the program starts. The first playback then shows an error
that names the package to install.
The two programs do not load the mpv config files. The options in mpv.conf do
not apply. With v0.6.0, the mpv program applied them.
pine and spruce
What's New
- Playback in the app process: there is no mpv process, no IPC socket, and
no temp file for the HTTP headers. - Faster start: the player does not start a process and wait for its
socket. On the test machine, the start of the player went from more than
100 ms to about 15 ms. - mpv messages in the log: the warnings and errors of mpv go to the app
log. The log shows why a stream did not load, for example
HTTP error 404 Not Found.
Reliability and Correctness
- The two programs find the end of a track through a typed player state.
Before, pine compared the text of an error message. - A stream that fails to load does not start
yt-dlp. - On macOS, the player sends stereo audio to the output. On a test machine
with macOS 27.0 and mpv 0.41.0, mono audio played at double speed. Thempv
program has the same fault there, so v0.6.0 has it too. Audio with more than
two channels is mixed down to stereo on macOS.
Security
- The library search on Windows and macOS does not include the current
directory. - The app log does not contain the query of a stream URL, because a query can
hold a token.
Platforms
- Linux: tested with mpv 0.34.1, 0.35.1, 0.37.0, and 0.41.0.
- macOS: tested on Apple Silicon and on Intel, with mpv from Homebrew.
- Windows: the tests pass with
libmpv-2.dllin the directory of the
program. The two programs have not run on a Windows machine. - FreeBSD: a build with
CGO_ENABLED=0fails.
Development
- A GitHub Actions workflow runs
go vet,golangci-lint, and the tests on
Linux, macOS, and Windows. - A Linux build with
CGO_ENABLED=0is now dynamically linked.
Requirements
- Go 1.26.4 or newer
- libmpv from mpv 0.34 or later
- pine: an Audiobookshelf server
- spruce: a Jellyfin account with a music library
pine and spruce v0.6.0
pine and spruce v0.6.0
This release puts pine and spruce in one repository and one Go module. The two
programs now share the player, MPRIS, logger, and UI code. One tag releases the
two programs.
Installation
go install github.com/Thelost77/pine@v0.6.0
go install github.com/Thelost77/pine/cmd/spruce@v0.6.0The spruce install path is new. The old path, github.com/Thelost77/spruce,
stays at v0.2.0.
pine
What's New
- Captions — pine shows VTT captions from Audiobookshelf sidecar files.
Presscduring playback. - Finished marks — the series and detail screens mark finished books.
Reliability and Correctness
- Pine waits while mpv opens a long stream.
- Pine fully evicts the progress caches on cleanup and restart.
- An MPRIS Play or Pause request now sets that state. Before, each request
toggled playback. - An MPRIS SetPosition request now seeks to the absolute position in the
current track. - Pine now passes the current volume to mpv at launch.
- The error banner removes terminal escape sequences and stays on one line.
Security and Storage
- The Audiobookshelf token is not in the mpv process arguments.
- The log file has mode
0600. If a second pine process is in operation, it
writes topine-<pid>.log.
spruce
- An MPRIS SetPosition request now seeks in the current track. Before, spruce
ignored each request. - There are no other functional changes.
- The version number changes from v0.2.0 to v0.6.0, because spruce now uses the
tag of the shared module.
Requirements
- Go 1.26.4 or newer
- mpv installed and available in
PATH - pine: an Audiobookshelf server
- spruce: a Jellyfin account with a music library
pine v0.5.0
pine v0.5.0
This release expands search, separates playback sessions by installation, and
hardens playback, cache, and local-secret handling.
What's New
- Fuzzy search everywhere — command-palette search now tolerates partial and
approximate matches across books, podcasts, and series. - Podcast episode search — individual podcast episodes now appear in global
search and can be played directly from the result. - In-place list filtering — press
/on the home, library, series, or
series-list screen to filter the visible list by title, author, podcast, or
series context. Pressescto clear the filter before navigating back. - Per-install playback identity — Pine generates a stable
device_idand
editabledevice_name, preventing Audiobookshelf from merging playback
sessions from different machines. Pine also reports its installed version to
Audiobookshelf. - Editable default configuration — Pine creates
config.tomlon first run,
including its default theme values and playback identity.
Reliability and Correctness
- Stale mpv launch events can no longer interfere with a newer playback session.
- Seek commands now run through the Bubble Tea update loop, and a missing mpv
seek confirmation no longer freezes position tracking. - Pine stops playback, closes the active session, and clears queue and sleep
state before returning to login after a401 Unauthorizedresponse. - mpv startup fails promptly when the subprocess exits before IPC is available.
- MPRIS playback state is synchronized for safe concurrent D-Bus access.
- Cancelled cache fills can be retried by other callers instead of spreading a
stale cancellation result. - Search snapshots are invalidated after cache clearing, metadata updates, and
item or episode deletion. - Books belonging to multiple series now use the selected series sequence when
sorted.
Security and Storage
- Pine restricts its SQLite database to owner-only
0600permissions. - Native mpv IPC sockets now live in an owner-only
0700directory, protecting
stream URLs and authorization headers from other local users. - Default-account updates are transactional, ensuring only one account remains
selected as default.
Pine continues to store the Audiobookshelf token directly in the protected local
SQLite database; no desktop keychain is required.
Upgrade Notes
Existing config.toml files are migrated in place with device_name and
device_id while preserving unrelated settings. Keep device_id stable for one
installation. When copying the config to another machine, remove or replace that
value so Pine generates a separate identity.
Installation
go install github.com/Thelost77/pine@v0.5.0Requirements
- Go 1.25+
- mpv installed and available in
PATH - An Audiobookshelf server
pine v0.4.0
pine v0.4.0
What's New
- Instant library loading — the library view now shares the same local cache as the command palette, so switching libraries or opening a library feels immediate.
--clear-cacheflag — runpine --clear-cacheto wipe the local API/search cache and exit. Useful when cache data looks stale or after server-side changes.- Delete items from the server — remove books or podcast episodes directly from the detail view with a confirmation overlay. Deleted items are evicted from the local cache immediately.
- Background cache pre-warm — pine keeps the cache warm in the background, reducing wait time when you first open a library.
Fixes
- Resolved cache race conditions and missing cache prebuilds on library open.
- Cache-ready messages are now routed to the active screen correctly.
- Legacy/empty SQLite schemas are ignored instead of crashing on startup.
- Fixed a search cache index limit collision that could return wrong items.
- Deleted episodes and items are removed from home/library caches immediately.
- Corrected the podcast episode delete flow and help bar text clipping.
- Prevented
escfrom exiting views unexpectedly. - Worked around a Ghostty
AltGrtyping issue for international characters. - Truncated long titles in the player footer to prevent line wrapping.
- Fixed text offset shifting in overlays.
Installation
go install github.com/Thelost77/pine@v0.4.0Requirements
- Go 1.25+
- mpv installed and available in
PATH - An Audiobookshelf server
pine v0.3.0
pine v0.3.0
What's New
- Persistent API Cache: Experience instant startup and near-instant library switching. Data is cached locally and updated intelligently.
- Metadata Editor: Edit book and episode metadata directly within pine.
- Search Palette: The dedicated search screen has been replaced by a sleek, ubiquitous search palette accessible from anywhere.
Fixes
- Terminal Scroll Bug: Fixed a severe rendering glitch that caused the UI to duplicate and interleave (the "doubled" view) when switching libraries rapidly. This was caused by terminal auto-wrapping on the bottom-right corner in macOS Terminal and iTerm2.
- Podcast Deduplication: Fixed an issue where podcast episodes in "Continue Listening" were not properly hidden from the "Recently Added" shelf.
- MPV Socket Path: Fixed an issue with double slashes in the mpv IPC socket path.
- Search Palette Routing: Fixed a bug where searching for a series incorrectly routed to the detail view instead of the series view.
pine v0.2.0
pine v0.2.0
Feature release adding a command palette for quick navigation, search, and
actions.
Highlights
- Command palette (
Ctrl+P) — a "Search Everywhere" modal with grouped
static actions (navigation, playback, sleep timer), screen-contextual
actions, and fuzzy content search against the local cache j/k, arrow keys, andCtrl+J/Knavigate the palette list; typing any
character auto-focuses the search input- Series data is now indexed in the search cache alongside library items,
making series discoverable from the palette - Pressing arrow keys or
Ctrl+J/Kfrom the search input defocuses back
to the result list
Other changes
- Search cache extended to fetch and index series metadata
- Screen models expose
SelectedPaletteActions()for contextual items - Fixed palette dialog height stability and item text truncation
Installation
go install github.com/Thelost77/pine@v0.2.0Requirements
- Go 1.25+
mpvavailable inPATH- An Audiobookshelf server
Notes
- Existing installs can update in place with
go install ...@v0.2.0