Peek - Stash Browser

I don’t see the button you’re talking about. :sweat_smile:I have entered incognito mode in the browser, but it still does not appear.

Even so, the system stays on ‘loading’ and does nothing else. Yes, it picks up the routes fine.

I am using the latest version.
v0.29.1
Build hash:869cbd49

Bah okay. The button isn’t appearing because the Stash hasn’t loaded. Fail. I’m about to push a new version in the next hour or so that has some retry logic baked in because I think I know what the issue is and you’re right, it’s just a race condition where your IP assignment hasn’t taken place yet when it tries to fetch it the first time.

Release v1.3.2

Performance Improvements :rocket:

This release includes performance optimizations that significantly improve application responsiveness, especially for large libraries.

  • Cache per-user statistics in database to eliminate expensive aggregations on every page load
  • In-memory cache for filtered entity lists (tags, studios, performers, galleries)
  • Conditionally skip expensive filtering for tag dropdowns when not needed
  • Pagination-aware filtering - only filter records needed for current page
  • Database indexes on foreign keys and frequently queried columns

Cache System Enhancements :counterclockwise_arrows_button:

  • Retry Logic: Server startup now retries cache initialization up to 5 times with exponential backoff (fixes DHCP/network timing
    issues)
  • Consistent Loading UX: All library pages now show informative loading banners instead of raw error messages during cache
    initialization
  • Manual Refresh: Added “Refresh Cache” button in Server Settings for manual cache reloading without container restart
  • Better Diagnostics: Enhanced server startup logging with detailed error information for troubleshooting

Bug Fixes :bug:

  • Fixed user content restrictions and empty entity filtering cascade logic
  • Fixed GitHub Actions to properly mark beta/alpha/rc releases as prereleases

Code Quality Improvements :broom:

  • ESLint Clean: Resolved all errors and warnings in codebase
  • Type Safety: Comprehensive TypeScript type system overhaul across server code
  • Code Organization: Split massive library controller (1000+ lines) into separate per-entity files
  • Documentation: Added TODO comments identifying useEffect refactoring opportunities

Features :sparkles:

  • Drag to Rate: Star rating component now supports drag interaction for faster rating changes
  • GitHub Sponsors: Added funding configuration for project support

Developer Experience :hammer_and_wrench:

  • Better code maintainability with separated controller files
  • Cleaner linting output for faster development iteration
  • Improved type safety catches more errors at compile time

It finally worked with the latest version! Thank you very much! :star_struck:

Everything indicates that the network is not available as soon as the container starts up. On the third attempt, it connected and recovered all the data.

[2025-11-05T17:43:56.863Z] [ERROR] TROUBLESHOOTING: Network connectivity issue detected
[2025-11-05T17:43:56.863Z] [ERROR]   → Verify STASH_URL is correct and accessible from Peek container
[2025-11-05T17:43:56.863Z] [ERROR]   → Check if Stash server is running
[2025-11-05T17:43:56.863Z] [ERROR]   → Test connectivity: curl -v <STASH_URL>/graphql
[2025-11-05T17:43:56.863Z] [ERROR] ============================================================
[2025-11-05T17:43:56.863Z] [ERROR] ✗ Failed to initialize Stash cache (attempt 2/5)
[2025-11-05T17:43:56.863Z] [ERROR] ============================================================
[2025-11-05T17:43:56.863Z] [ERROR] Error details: {"name":"Error","message":"Scene fetch failed: fetch failed","stack":"Error: Scene fetch failed: fetch failed\n    at file:///app/backend/services/StashCacheManager.js:105:23\n    at process.processTicksAndRejections (node:internal/process/task_queues:105:5)\n    at async StashCacheManager.refreshCache (file:///app/backend/services/StashCacheManager.js:102:34)\n    at async StashCacheManager.initialize (file:///app/backend/services/StashCacheManager.js:37:9)\n    at async initializeCacheWithRetry (file:///app/backend/initializers/cache.js:99:13)\n    at async initializeCache (file:///app/backend/initializers/cache.js:153:5)"}
[2025-11-05T17:43:56.863Z] [WARN] Retrying in 10 seconds... (3 attempts remaining)
[2025-11-05T17:44:06.866Z] [INFO] ============================================================
[2025-11-05T17:44:06.866Z] [INFO] Initializing Stash cache (attempt 3/5)...
[2025-11-05T17:44:06.866Z] [INFO] ============================================================
[2025-11-05T17:44:06.866Z] [INFO] Initializing Stash cache...
[2025-11-05T17:44:06.866Z] [INFO] Starting cache refresh - fetching entities from Stash
[2025-11-05T17:44:06.866Z] [INFO] Fetching scenes (compact)...
[2025-11-05T17:44:09.720Z] [INFO] Scenes fetched in 2854ms (2861 scenes)
[2025-11-05T17:44:09.720Z] [INFO] Fetching performers...
[2025-11-05T17:44:11.150Z] [INFO] Performers fetched in 1430ms (2534 performers)
[2025-11-05T17:44:11.150Z] [INFO] Fetching studios...
[2025-11-05T17:44:11.602Z] [INFO] Studios fetched in 452ms (285 studios)
[2025-11-05T17:44:11.602Z] [INFO] Fetching tags...
[2025-11-05T17:44:11.941Z] [INFO] Tags fetched in 339ms (584 tags)
[2025-11-05T17:44:11.941Z] [INFO] Fetching galleries...
[2025-11-05T17:44:11.960Z] [INFO] Galleries fetched in 18ms (0 galleries)
[2025-11-05T17:44:11.960Z] [INFO] Fetching groups...
[2025-11-05T17:44:12.106Z] [INFO] Groups fetched in 146ms (242 groups)
[2025-11-05T17:44:12.249Z] [INFO] Invalidated all cache {"deletedCount":0}
[2025-11-05T17:44:12.254Z] [INFO] Invalidated all filtered entity caches due to Stash cache refresh
[2025-11-05T17:44:12.255Z] [INFO] ✓ Cache refreshed successfully {"duration":"5388ms","counts":{"scenes":2861,"performers":2534,"studios":285,"tags":584,"galleries":0,"groups":242},"totalEntities":6506}
[2025-11-05T17:44:12.255Z] [INFO] StashCacheManager initialized successfully
[2025-11-05T17:44:12.255Z] [INFO] ============================================================
[2025-11-05T17:44:12.255Z] [INFO] ✓ Stash cache initialized successfully
[2025-11-05T17:44:12.255Z] [INFO] ============================================================
[2025-11-05T17:44:12.255Z] [INFO] ============================================================
[2025-11-05T17:44:12.255Z] [INFO] Peek Server Ready
[2025-11-05T17:44:12.255Z] [INFO] ============================================================

1 Like

Great, thank you for helping me make the app better! I hope you enjoy, and be sure to let me know if you discover any other issues

1 Like

I can work up a more robust filtering mechanism, but in the meantime, does 1.3.2 properly filter out the 0 content items you were seeing? I made some improvements to that logic

Sadly, it did not. I also created a new instance in case the changes needed a fresh peek database, but I got the same result. Maybe there’s something wrong with my configuration? Here is the docker-compose.yml file I’m using:

#source: https://carrotwaxr.github.io/peek-stash-browser/getting-started/installation/#option-1-unraid-community-applications
services:
  peek-stash-browser:
    image: carrotwaxr/peek-stash-browser:latest
    container_name: peek-stash-browser
    restart: unless-stopped
    ports:
      - 1056:80
    volumes:
      - /nas/media/stash:/app/media:ro
      - /nas/media/downloads/qbittorrent/completed/stash:/app/media/downloads:ro
      - ./data:/app/data
      - ./tmp:/app/tmp
    environment:
      - STASH_URL=https://"_"/graphql
      - STASH_API_KEY="_"
      #- STASH_INTERNAL_PATH=/media # What Stash calls it
      #- STASH_MEDIA_PATH=/app/media # What Peek calls it
    networks:
      - docker-default
      - docker-vpn
networks:
  docker-default:
    external: true
  docker-vpn:
    external: true

Some general feedback:

  • The player also has some weird behaviors. When a scene is in portrait mode, it defaults to “fit to width” instead of “fit to height” on desktop. And while this is more of a personal preference, I find the page layout for a playing scene too large for desktop. I would prefer the player box to be smaller and to have the “related” or “next in queue” videos on the right instead of at the bottom, like most video sites.

  • Also, when I go to the next video, the “rating” stat doesn’t reload; it still shows the values of the previous scene.

  • When I open a Collection, it doesn’t show any scenes

  • The “Tag” filter is missing from Collections, Performers, and Studios.

  • It would be great if we could set a default preset for each page.

  • On the Performers and Collection detail pages, the poster is too big; it doesn’t even fit on the desktop screen, and you can’t see the entire image without scrolling.

I really appreciate the feedback. I don’t think there’s any issue with your configuration. I’ll just have to come up with some better test scenarios and, better yet, get some automated test coverage around the filtering and restrictions. Unit tests will likely reveal a host of bugs.

Thanks for the detailed feedback on the rest. Video player issues are coming next, including many of those you listed. Stay tuned!

1 Like