📱 StashFlow

Your Stash library, everywhere.

A mobile-first Flutter client for your Stash server. Designed for seamless browsing, effortless discovery, and high-quality playback on the go.

📸 Screenshots

Scenes feed Scene details playback

✨ Key Features

  • 🎬 Seamless Playback: Integrated video player with support for multiple streaming strategies and startup diagnostics.
  • 👤 Rich Browsing: Explore Scenes, Performers, Studios, and Tags with native-feel pagination and fast search.
  • 🎲 Discovery Tools: Floating "Random" actions to find hidden gems in your library across all categories.
  • 🔍 Advanced Filtering: Powerful menu-based sorting and filtering to find exactly what you're looking for.
  • 🛠️ Native Customization: Configure your server connection, UI preferences (Grid/List layouts), and streaming quality in one place.

🚀 Getting Started

  1. Download: Grab the latest APK from the Releases page.
  2. Connect: Open the app ➔ Settings ➔ Enter your Server URL and API Key.
  3. Browse: Your library will automatically sync and be ready for action.

⚙️ Runtime Settings

Tailor your experience in the app settings:

  • server_base_url & server_api_key
  • prefer_scene_streams (Toggle stream strategies)
  • scene_grid_layout (Switch between single/double column)

🤓 For Developers

Tech Stack

  • Flutter & GoRouter
  • Riverpod (State Management)
  • GraphQL (graphql_flutter + codegen)
  • SharedPreferences

Project Structure

  • lib/core shared infrastructure
  • lib/features/* feature modules (domain/data/presentation)
  • graphql/ schema and GraphQL documents

Development

# Get dependencies
flutter pub get

# Regenerate code (GraphQL & Notifiers)
dart run build_runner build --delete-conflicting-outputs

# Run app
flutter run

Build

flutter build apk

📚 Internal Docs

For architecture, known issues, and onboarding, see:

Libraries

core/data/graphql/graphql_client
core/data/graphql/media_headers_provider
core/data/graphql/schema.graphql
core/data/graphql/url_resolver
core/data/preferences/shared_preferences_provider
core/presentation/theme/app_theme
core/presentation/theme/theme_mode_provider
core/presentation/widgets/error_state_view
core/presentation/widgets/list_page_scaffold
core/presentation/widgets/marquee_text
core/presentation/widgets/media_strip
core/presentation/widgets/section_header
core/utils/app_log_store
core/utils/media_handler
core/utils/pagination
core/utils/pip_mode
features/galleries/presentation/pages/galleries_page
features/groups/data/repositories/graphql_group_repository
features/groups/domain/entities/group
features/groups/domain/repositories/group_repository
features/groups/presentation/pages/group_details_page
features/groups/presentation/pages/groups_page
features/groups/presentation/providers/group_details_provider
features/groups/presentation/providers/group_list_provider
features/navigation/presentation/router
features/navigation/presentation/shell_page
features/navigation/presentation/widgets/mini_player
features/performers/data/graphql/performers.graphql
features/performers/data/repositories/graphql_performer_repository
features/performers/domain/entities/performer
features/performers/domain/repositories/performer_repository
features/performers/presentation/pages/performer_details_page
features/performers/presentation/pages/performer_media_grid_page
features/performers/presentation/pages/performers_page
features/performers/presentation/providers/performer_details_provider
features/performers/presentation/providers/performer_list_provider
features/performers/presentation/providers/performer_media_provider
features/performers/presentation/widgets/performer_card
features/scenes/data/graphql/scenes.graphql
features/scenes/data/repositories/graphql_scene_repository
features/scenes/data/repositories/stream_resolver
features/scenes/domain/entities/scene
features/scenes/domain/entities/scene_filter
features/scenes/domain/entities/scene_title_utils
features/scenes/domain/repositories/scene_repository
features/scenes/presentation/pages/scene_details_page
features/scenes/presentation/pages/scenes_page
features/scenes/presentation/providers/playback_queue_provider
features/scenes/presentation/providers/scene_details_provider
features/scenes/presentation/providers/scene_list_provider
features/scenes/presentation/providers/video_player_provider
features/scenes/presentation/widgets/native_video_controls
features/scenes/presentation/widgets/scene_card
features/scenes/presentation/widgets/scene_filter_panel
features/scenes/presentation/widgets/scene_video_player
features/scenes/presentation/widgets/tiktok_scenes_view
features/setup/data/graphql/version.graphql
features/setup/domain/entities/server_config
features/setup/presentation/debug_log_viewer_page
features/setup/presentation/providers/connection_provider
features/setup/presentation/settings_page
features/studios/data/graphql/studios.graphql
features/studios/data/repositories/graphql_studio_repository
features/studios/domain/entities/studio
features/studios/domain/repositories/studio_repository
features/studios/presentation/pages/studio_details_page
features/studios/presentation/pages/studio_media_grid_page
features/studios/presentation/pages/studios_page
features/studios/presentation/providers/studio_details_provider
features/studios/presentation/providers/studio_list_provider
features/studios/presentation/providers/studio_media_provider
features/tags/data/graphql/tags.graphql
features/tags/data/repositories/graphql_tag_repository
features/tags/domain/entities/tag
features/tags/domain/repositories/tag_repository
features/tags/presentation/pages/tag_details_page
features/tags/presentation/pages/tag_media_grid_page
features/tags/presentation/pages/tags_page
features/tags/presentation/providers/tag_details_provider
features/tags/presentation/providers/tag_list_provider
features/tags/presentation/providers/tag_media_provider
main