An Audiobookshelf client for Smart TVs — LG webOS and Samsung Tizen.
Built on top of the Audiobookshelf Android app codebase, adapted for the TV experience with remote control navigation and a 10-foot UI. Originally developed for LG webOS; Tizen support added later.
- Connect to any self-hosted Audiobookshelf server
- Browse audiobook and podcast libraries
- Full audio playback with progress tracking
- Remote control navigation (D-pad, media keys, color keys)
- Bookshelf grid with keyboard navigation
- Server connection management
- Sleep timer and playback speed controls
- Bookmarks and chapter navigation
- Download management
- Multi-language support (30+ languages)
- LG Smart TV running webOS 3.0 or later, or Samsung Smart TV running Tizen 4.0 or later
- An Audiobookshelf server (self-hosted or remote)
-
Enable Developer Mode on your LG TV:
- Open the Developer Mode app from the LG Content Store
- Sign in with your LG account
- Enable Developer Mode and note the TV's IP address
-
Install the IPK:
# Install the webOS CLI tools npm install -g @webos-tools/cli # Set up your TV as a device ares-setup-device -a tv -a <TV_IP_ADDRESS> # Install the IPK ares-install -d tv bigbookshelf-webos.ipk # Launch the app ares-launch -d tv com.bigbookshelf.tv
If your TV is rooted and reachable over SSH, you can pull the latest build
straight from GitHub Releases onto the TV — no local build or scp required.
The releases/latest/download/... URLs always resolve to the newest release.
LG webOS:
# SSH into the TV
ssh root@<TV_IP_ADDRESS>
# Download to the large user partition (the root fs is a tiny read-only
# overlay — opkg fails there with "Only have 0K bytes available").
curl -L -o /media/internal/bigbookshelf-webos.ipk \
https://github.com/KTheMan/audiobookshelf-webos/releases/latest/download/bigbookshelf-webos.ipk
# Install via the webOS install service (routes into /media/developer; survives
# reboots). Use -i to watch status through to "installed".
luna-send -i 'luna://com.webos.appInstallService/dev/install' \
'{"id":"com.bigbookshelf.tv","ipkUrl":"/media/internal/bigbookshelf-webos.ipk","subscribe":true}'
# Launch
luna-send -n 1 'luna://com.webos.service.applicationManager/launch' \
'{"id":"com.bigbookshelf.tv"}'
opkg installalso works on some firmwares, but only if the root partition has space — the install service above is the reliable route.
To upgrade later, re-run the curl + install steps; remove the old copy first
with luna-send -n 1 'luna://com.webos.appInstallService/remove' '{"id":"com.bigbookshelf.tv"}'
if an install refuses to overwrite.
Samsung Tizen:
# Download the latest WGT onto the TV (or your dev machine, for sdb install)
curl -L -o /tmp/bigbookshelf-tizen.wgt \
https://github.com/KTheMan/audiobookshelf-webos/releases/latest/download/bigbookshelf-tizen.wgt
# Install with the Tizen Studio CLI from a connected dev machine
sdb connect <TV_IP_ADDRESS>
tizen install -n /tmp/bigbookshelf-tizen.wgt -t <device-id>One-liner (download + install on a webOS TV in a single SSH command):
ssh root@<TV_IP_ADDRESS> 'curl -L -o /media/internal/bbs.ipk https://github.com/KTheMan/audiobookshelf-webos/releases/latest/download/bigbookshelf-webos.ipk && luna-send -n 5 "luna://com.webos.appInstallService/dev/install" "{\"id\":\"com.bigbookshelf.tv\",\"ipkUrl\":\"/media/internal/bbs.ipk\",\"subscribe\":true}"'
- Download
bigbookshelf-webos.ipk(LG) orbigbookshelf-tizen.wgt(Samsung) from the latest release - Copy the package to a USB drive
- On your TV, open the Developer Mode (LG) or Device Manager (Samsung) app
- Select Install from USB and choose the package file
- Node.js 18+
- Docker (for builds) or the webOS TV SDK
# Install dependencies
npm install
# Start the dev server (serves the dist/ folder)
npm run devUsing Docker (recommended):
docker build --network=host -t audiobookshelf-webos-builder .Using the webOS TV SDK:
npm run buildBoth methods produce:
dist/— Static web files ready for deploymentbigbookshelf-webos.ipk— Installable package for webOS TVs
audiobookshelf-webos/
├── assets/ # Static assets (CSS, fonts, images)
├── components/
│ ├── webos/ # TV-specific components
│ │ ├── AudioPlayerTV.vue
│ │ └── BookshelfGrid.vue
│ └── ... # Shared components from Android app
├── layouts/
│ └── default.vue # TV-optimized layout
├── pages/ # Route pages
├── plugins/
│ └── webos/ # webOS native plugins
│ ├── AbsAudioPlayer.js
│ ├── AbsDatabase.js
│ ├── AbsDownloader.js
│ ├── AbsFileSystem.js
│ ├── AbsLogger.js
│ ├── TVRemoteHandler.js
│ ├── capacitor-stubs/ # Capacitor API stubs for web
│ ├── index.js
│ └── polyfills.js # ES5 polyfills for webOS 3.0
├── static/ # Static files served as-is
├── store/ # Vuex store modules
├── strings/ # i18n translation files
├── appinfo.json # webOS app manifest
├── nuxt.config.js # Nuxt configuration
├── tailwind.config.js # Tailwind CSS configuration
└── Dockerfile # Docker build environment
The app uses custom webOS plugins that replace Capacitor native APIs:
| Plugin | Purpose |
|---|---|
AbsAudioPlayer |
Audio playback via HTML5 Audio |
AbsDatabase |
Local storage for server configs and device data |
AbsDownloader |
Download management (stub — not supported on TV) |
AbsFileSystem |
File system access (stub — not supported on TV) |
AbsLogger |
Logging to localStorage |
TVRemoteHandler |
Remote control key handling and spatial navigation |
polyfills.js |
ES5 polyfills for webOS 3.0 compatibility |
The app targets webOS 3.0+ via:
- Browserslist:
Samsung >= 3,Chrome >= 38,Safari >= 6 - Babel transpilation: ES6+ → ES5 (arrow functions, async/await, template literals, etc.)
- Runtime polyfills: Map, URL, Promise, Array.from, crypto.getRandomValues, btoa
GitHub Actions automatically builds the IPK on push to main and creates releases on tag push.
# Tag a release
git tag -a v0.14.0 -m "Release v0.14.0"
git push --tagsThe workflow will:
- Build the Nuxt static site
- Package as IPK
- Create a GitHub Release with the IPK attached
App won't install:
- Ensure Developer Mode is enabled on your TV
- Check that your computer and TV are on the same network
- Verify the TV's IP address hasn't changed
App launches but shows a blank screen:
- Check your Audiobookshelf server is accessible from the TV
- Verify the server URL in the connection settings
- Check the TV's internet connection
Remote control not responding:
- The app uses D-pad navigation — try arrow keys
- Press Back to return to previous screens
- Media keys (play/pause/stop) are supported during playback
Contributions are welcome! Please follow the existing code style and test on a real TV or the webOS Simulator when possible.
- Fork the repository
- Create a feature branch
- Make your changes
- Test on the webOS Simulator or a real TV
- Submit a pull request
This project is licensed under the GNU General Public License v3.0 — the same license as the Audiobookshelf Android app.
- Audiobookshelf by advplyr
- Audiobookshelf Android app — the foundation for this project
- Nuxt.js — the web framework
- Tailwind CSS — the CSS framework
This is an unofficial client for Audiobookshelf. It is not affiliated with or endorsed by the Audiobookshelf project.