Peek - Stash Browser

:placard: Summary Modern web browser for Stash with real-time HLS transcoding, playlists, multi-user support, and adaptive quality streaming
:link: Repository https://github.com/carrotwaxr/peek-stash-browser
:book: Documentation https://carrotwaxr.github.io/peek-stash-browser/

Features

Video Playback

  • Real-time HLS transcoding with adaptive quality selection (Direct, 1080p, 720p, 480p, 360p)
  • Full VOD controls with seeking, quality switching, and playback speed
  • Direct play support for compatible formats

Library Browsing

  • Modern, responsive interface with grid and list views
  • Advanced filtering by performers, studios, tags, resolution, duration, and more
  • Search with real-time results
  • Configurable homepage carousels (high-rated scenes, recently added, favorite performers, etc.)

Playlists & Navigation

  • Create and manage custom playlists with drag-and-drop reordering
  • Auto-generated temporary playlists from search results
  • Shuffle and repeat modes
  • TV Mode with full keyboard/remote control support

Multi-User Support

  • JWT-based authentication with admin and user roles
  • Separate watch history and O-counter tracking per user
  • User management and permissions

Easy Setup

  • 5-step setup wizard with auto-discovery of Stash libraries
  • Multi-platform path mapping (handles Windows, Linux, Docker paths)
  • Single Docker container deployment

Read-Only Access

  • Does not modify your Stash files or database
  • Only updates O-counter and play history via Stash’s GraphQL API

Installation

Peek runs as a single Docker container and works with any Stash installation (Docker, native Windows/Linux, unRAID, etc.).

Requirements:

  • Docker installed
  • Network access to your Stash GraphQL endpoint
  • Access to your Stash media files (Docker volume mounts or network shares)

Quick Start:

docker pull carrotwaxr/peek-stash-browser:latest

docker run -d \
  --name peek-stash-browser \
  -p 6969:80 \
  -v /path/to/your/media:/app/media:ro \
  -v peek-data:/app/data \
  -e STASH_URL="http://your-stash-server:9999/graphql" \
  -e STASH_API_KEY="your_stash_api_key" \
  -e JWT_SECRET="$(openssl rand -base64 32)" \
  carrotwaxr/peek-stash-browser:latest

Access at http://localhost:6969 and complete the setup wizard.

unRAID Installation:

Detailed installation guides for unRAID, Windows, Linux, and macOS are available in the Installation - Peek Stash Browser.

Current Limitations

  • No support for Groups/Movies or Images/Galleries yet
  • Hardware transcoding not yet implemented (CPU-only via FFmpeg)

Planned Features

  • Images/Galleries support
  • Groups/Movies support
  • Hardware-accelerated transcoding
  • Advanced watch analytics and recommendations

Screenshots

Browsing (Desktop / TV)












Browsing (Mobile


)





Settings / Themes






2 Likes

For anyone interested in the multiple users feature, how would you like to see that work in regards to your Stash’s play and o history? The interesting bit about this is of course Stash only has a single user and so if Peek has multiple, and each syncs with Stash, your play counts, duration, and o counts will go way up and essentially represent the “aggregate” activity of all your Peek users. So, to support as many use cases as possible, here’s what I’m thinking:

Introduce additional User settings (that an admins sets per user) that determines the view and sync of said data points. Peek will already track a copy of this information in its own database and always display the per-user stats on their Watch History page, but these settings could determine whether or not a given user’s watch history /o history was synced back to / pushed to Stash, and whether or not the O Count and Play Count they see when browsing Scenes in the library is their own (everything starts at 0 for a new user), or if it shows the Stash value (plus their own I suppose if they don’t sync to Stash, otherwise they wouldn’t get a “Like” or O button)

It’s also worth mentioning that I’ll be adding Inclusion and Exclusion filters that can be set for each user (only show certain tags, etc VS don’t show these tags, etc) and adding a download scene / playlist functionality that can be enabled per user as well.

Curious what people would like to be able to do!

so this is an alternative frontend for the web ui?

Yep! Many people over the years have been using various solutions to get their content to play through Emby, Jellyfin, Plex, or Kodi, and I myself was frustrated with these solutions so I thought I’d introduce a version that was natively targeted to integrate with Stash. Stash is amazing but it’s mostly amazing at organizing and storing metadata for your library. Once I got rolling, I realized how quickly I was able to get complete feature parity with those media browsers, so I’ve moved on to additional Stash-specific features :grin:

For filtering the content for users, I would use groups and galleries. The problem with using tags is that if you re-sync the scene with StashDB, whatever tags you manually add get erased. This does not happen to the group values. So the stash admin can assign scenes to the desired groups, for example, “Group A”, and then the peek admin can set which users can access the content of “Group A”.

Regarding personal history, I don’t mind if the stash admin gets the data from each user, but each peek user should not receive any data from the stash admin. So for the following fields, I think the user should start blank and have their own values:

  • Play history
  • O- count
  • Rating
  • Favorite
  • Playlists

Thanks for the feedback! And excellent to know about using Groups, great callout. I don’t use Groups too much (or didn’t before I started working on this app) so I’ll play around with that

Peek v1.1.3 Released! :tada:

Major feature release with huge performance improvements and tons of new features:

:fire: Highlights

:high_voltage: 97% Faster Performance

  • In-memory caching system makes sorting/filtering lightning fast
  • First load: 10-15s, subsequent: <500ms (was 15-20s every time)

:star: Per-User Ratings & Favorites

  • Rate and favorite Scenes, Performers, Studios, and Tags
  • Filter by favorites and rating ranges
  • Sort by rating
  • All per-user, no conflicts between users

:clapper_board: Continue Watching

  • New carousel on Home page shows recently watched scenes
  • Resume from where you left off
  • Configurable in Carousel Settings

:bar_chart: Server Statistics Dashboard

  • Real-time monitoring of CPU, memory, cache, and transcoding
  • See active FFmpeg sessions
  • Auto-refreshes every 10 seconds

:skull: Better Loading UX

  • Skeleton cards prevent layout shift
  • No more tiny spinners
  • Smooth loading experience

:movie_camera: Video Player Improvements

  • Dynamic aspect ratios (4:3, 16:9, 9:16 all work correctly now)
  • Faster transcoding cleanup (90s instead of 30 minutes)
  • Modular architecture refactor

:inbox_tray: Stash Sync Improvements

:locked: Public Media Proxy

  • Share images without exposing Stash API keys
  • No authentication required on media endpoints

Plus: Watch history enhancements, entity detail page fixes, dozens of bug fixes, mobile optimizations, and more!

:package: Upgrading

unRAID: Click “Force Update” in Docker tab

Docker:
docker stop peek-stash-browser && docker rm peek-stash-browser
docker pull carrotwaxr/peek-stash-browser:latest

Then run your usual docker run command

Your data persists automatically (peek-data volume).

Full changelog: Release v1.1.0 · carrotwaxr/peek-stash-browser · GitHub
v1.1.1-v1.1.3 were hotfixes to address the Sync from Stash operation failing in Production

Questions? Report issues: GitHub · Where software is built

Looks pretty nice! Got it workign easily enough, but havign issues playing files

most don’t play

edit: ive narrowed it down to the fact that i have 3 different paths to libraries, only one of them work. ideas?

they all report when i add them though, ive tried adding them all to the same mount point in docker and different ones

Directory exists and is readable (571 items)

Docker on Windows btw

Hmm great, I’m really glad you got it installed! Do you mind sharing an example of what your config/paths look like? You can DM me if you want, and replace names of paths or whatever, just trying to get an idea of your configuration so I can simulate it locally. And to clarify, are you able to see everything else work properly, it just doesn’t actually play some of your files? Anything errors in the Docker’s logs?

Version 1.2.0 Released!

  • Fixes a number of UI bugs
  • Several UI improvements
  • Adds Image Galleries support
  • Recommended Scenes

Full Changelog:

I ended up just moving all my files to the drive that was working. was a needed change anyway.

One thing i do a lot, is add markers, if i could add markers in peek and have them sync to stash, i think i coudl replace stash frontend with Peek.

Also, i would love a tiktok / reel style viewing for mobile! LIke the StashTV pluign

1 Like

Thanks for the feedback! I think Markers will be soon, and I wondered about generating them from Peek but it sounds like that is wanted and makes sense to me. The Reel style viewing, would that just be for markers? I need to check out this other app.

OH and I did try to figure out your path issue and the only thing I came up with was maybe it was a case sensitivity issue. Oh well, glad you re-org’d and got it working nicer

If you can, generate them in stash and fetch them in peek would be preffered.

I mostly use StashTV for markers yea. mobile accessible…

Planned Features for v1.3.0 - Hopefully released by tomorrow

  • Adds support and UI for Groups/Movies/Collections
  • The ability to filter the content that certain users see
  • Better video player controls, more mobile-friendly and modern
  • Improved themes plus the ability for users to define their own custom themes

Bugfixes

  • Fix previews not playing when scrolling on mobile
1 Like

I would prefer that markers be managed only by the admin in Stash. This way, he is the only one able to create, modify, and delete content and its inherited metadata. Having the markers available on the Peek player would be great so we can skim through the sections.

The addition of a tab like StashTV would be awesome as well. I don’t use it for markers but for short-form content such as clips, loops, etc. You could basically select a playlist, and it would play its content as if you were on the TikTok/Reels app.

Regarding the filtering of content for users, maybe the Peek admin can create different “libraries” and then assign each scene to one or more libraries. He could then mark on the user profiles which libraries are available to them.

I’d prefer it to be a thing in Peek so i don’t have to open stash again. but it should create the markers in stash for management.

Admin only though ,yeah, or special role

Version 1.3.0 Released!

Based on 67 commits since v1.2.0, here’s the summarized changelog:


:artist_palette: New Features

  • YouTube-Style Video Player Controls

  • Custom Theme System

    • Complete custom theme editor in Settings
    • Theme preview with live color swatches
  • User Content Restrictions

    • Admin-controlled content filtering by entity type (groups, tags, studios, galleries)
    • Include/Exclude mode for each entity type
    • Restrict items with no entities option
    • Applied across all library endpoints (scenes, performers, studios, tags, galleries)
    • Dedicated UI in User Management for admins
  • Groups Support

    • Groups list page with filtering and sorting
    • Group detail pages with DVD cover display
    • Groups filter in scene search
    • Group ratings and favorites

:bug: Bug Fixes

Video Player

  • Improved Video Player controls

Mobile Experience

  • Fixed preview autoplay on mobile scroll
1 Like

Can you make it so that: performers, studios, tags, groups, and galleries with no available content for the user simply don’t show?