- Go 56.8%
- TypeScript 40.3%
- SCSS 2.3%
- Makefile 0.2%
- Dockerfile 0.1%
* Add rename and an operations menu to saved filters Consolidate the per-filter actions in both the toolbar and the sidebar saved filter lists into a single overflow menu, and add a rename operation. Renaming edits the name in place in the list rather than in a modal. A modal is portalled to the document body, which the toolbar's saved filter dropdown reads as a click outside itself, so the dropdown would close behind it and the user would have to reopen it to carry on. Enter confirms, escape or blur abandons. Keeping that dropdown open takes some care, since it is asked to close by three separate mechanisms. Choosing an operation forwards a nested menu's select up through SelectableContext, and the operations menu is portalled to the document body so it also reads as a click outside; the dropdown is therefore controlled, and ignores a close while an operation is being started. It uses a callback from the menu rather than inspecting the event, because useRootClose evaluates containment in the capture phase, before React has run its handlers, so by the time the close arrives the clicked item may already be unmounted. Escape is the third: react- overlays' Dropdown listens for it on keydown and useRootClose on keyup, so the name input stops both and abandons the rename on keyup, while it is still mounted to do so. The filter is re-saved under its existing ID with the new name. Its stored find_filter, object_filter and ui_options are passed through untouched rather than round-tripped through ListFilterModel: a criterion type the current UI doesn't recognise becomes an UnsupportedCriterion, which neither reads itself in nor writes itself back, and saving replaces object_filter wholesale - so a round-trip would silently delete such a criterion. Legacy criteria like career_length and movies are affected. Names are trimmed, and a rename onto an existing name is rejected before saving rather than surfacing a raw uniqueness constraint error. As in SaveFilterDialog the comparison is case-insensitive, even though the unique index is not, to avoid a confusing "foo"/"Foo" pair. A rejected rename leaves the name in the editor rather than discarding it. The menu also allows an existing saved filter to be made the default for the view. The toolbar menu's own Set as default button has been removed, since having two controls with the same label in the one menu is confusing and it did something different - it set the default from the current filter rather than from a saved one. That remains available from the sidebar, which is present on every view that has the toolbar. OperationDropdown gains optional icon, id, title, size, toggle class and onClick props so that the per-filter menu can reuse it instead of duplicating it. All are defaulted, leaving existing callers unaffected. Two components that were being declared during a render are no longer: the dropdown's menu, and the toolbar's filter rows. Each was a new component type on every render, remounting its subtree and discarding an in-progress rename. * Document the saved filter operations menu Also mention that saved filters are available in the filter sidebar, not just in the toolbar bookmark menu, and that the current filter is set as the default from the sidebar. |
||
|---|---|---|
| .github | ||
| .idea | ||
| cmd | ||
| docker | ||
| docs | ||
| graphql | ||
| internal | ||
| pkg | ||
| scripts | ||
| ui | ||
| .dockerignore | ||
| .gitattributes | ||
| .gitignore | ||
| .golangci.yml | ||
| .gqlgenc.yml | ||
| .mockery.yml | ||
| go.mod | ||
| go.sum | ||
| gqlgen.yml | ||
| LICENSE | ||
| Makefile | ||
| README.md | ||
| tools.go | ||
Stash
Stash is a self-hosted webapp written in Go which organizes and serves your diverse content collection, catering to both your SFW and NSFW needs.
- Stash gathers information about videos in your collection from the internet, and is extensible through the use of community-built plugins for a large number of content producers and sites.
- Stash supports a wide variety of both video and image formats.
- You can tag videos and find them later.
- Stash provides statistics about performers, tags, studios and more.
You can watch a SFW demo video to see it in action.
For further information see Support & Resources section.
Installing Stash
Tip
Step-by-step instructions are available at docs.stashapp.cc/installation.
Important
Windows Users
As of version 0.27.0, Stash no longer supports Windows 7, 8, Server 2008 and Server 2012.
At least Windows 10 or Server 2016 is required.macOS Users
As of version 0.29.0, Stash requires macOS 11 Big Sur or later.
As of version 0.32.0, Stash requires macOS 12 Monterey or later.
Older versions can still be run through Docker.
Download links for other platforms and architectures are available on the Releases page.
First Run
Windows/macOS Users: Security Prompt
On Windows or macOS, running the app might present a security prompt since the application binary isn't yet signed.
- On Windows, bypass this by clicking "more info" and then the "run anyway" button.
- On macOS, Control+Click the app, click "Open", and then "Open" again.
ffmpeg
Stash requires FFmpeg. If you don't have it installed, Stash will prompt you to download a copy during setup. It is recommended that Linux users install ffmpeg from their distro's package manager.
Usage
Quickstart Guide
Stash is a web-based application. Once the application is running, the interface is available (by default) from http://localhost:9999.
On first run, Stash will prompt you for some configuration options and media directories to index, called "Scanning" in Stash. After scanning, your media will be available for browsing, curating, editing, and tagging.
Stash can pull metadata (performers, tags, descriptions, studios, and more) directly from many sites through the use of scrapers, which integrate directly into Stash. Identifying an entire collection will typically require a mix of multiple sources:
- The stashapp team maintains StashDB, a crowd-sourced repository of scene, studio, and performer information. Connecting it to Stash will allow you to automatically identify much of a typical media collection. It runs on our stash-box software and is primarily focused on mainstream digital scenes and studios. Instructions, invite codes, and more can be found in this guide to Accessing StashDB.
- Several community-managed stash-box databases can also be connected to Stash in a similar manner. Each one serves a slightly different niche and follows their own methodology. A rundown of each stash-box, their differences, and the information you need to sign up can be found in the Metadata Sources section of the documentation.
- Many community-maintained scrapers can also be downloaded, installed, and updated from within Stash, allowing you to pull data from a wide range of other websites and databases. They can be found by navigating to
Settings → Metadata Providers → Available Scrapers → Community (stable). These can be trickier to use than a stash-box because every scraper works a little differently. For more information, please visit the CommunityScrapers repository. - All of the above methods of scraping data into Stash are also covered in more detail in our Guide to Scraping.
StashDB is the canonical instance of our open source metadata API, stash-box.
Support & Resources
Need help or want to get involved? Start with the documentation, then reach out to the community if you need further assistance.
Documentation
- Official documentation - official guides guides and troubleshooting.
- In-app manual press Shift + ? in the app or view the manual online.
- FAQ - common questions and answers.
- Community wiki - guides, how-to’s and tips.
Community & Discussion
- Community forum - community support, feature requests and discussions.
- Discord - real-time chat and community support.
- GitHub discussions - community support and feature discussions.
- Lemmy community - board-style community space.
Community Scrapers & Plugins
Architecture
You can find an overview of Stash's architecture in the ARCHITECTURE.md document.
Contributing
We welcome contributions and help from all humans who want to improve the project.
Before contributing, please read the Contributing document to understand our guidelines and processes for contributing to the project.
You can learn about setting up a local development environment in the Development document.
Translation
The widget below shows the current translation status of Stash across all supported languages. If you want to help us translate Stash, you can make an account at Codeberg Translate to contribute to new or existing languages. Thanks!
