- Go
- GolangCI - A meta-linter which runs several linters in parallel
- To install, follow the local installation instructions
- nodejs - nodejs runtime
- corepack/pnpm - nodejs package manager (included with nodejs)
- Download and install Go for Windows
- Download and extract MinGW64 (scroll down and select x86_64-posix-seh, don't use the autoinstaller, it doesn't work)
- Search for "Advanced System Settings" and open the System Properties dialog.
- Click the
Environment Variablesbutton - Under System Variables find
Path. Edit and addC:\MinGW\bin(replace with the correct path to where you extracted MingW64).
- Click the
NOTE: The make command in Windows will be mingw32-make with MinGW. For example, make pre-ui will be mingw32-make pre-ui.
- If you don't have it already, install the Homebrew package manager.
- Install dependencies:
brew install go git gcc make node ffmpeg
- Install dependencies:
sudo pacman -S go git gcc make nodejs ffmpeg --needed
- Install dependencies:
sudo apt-get install golang git gcc nodejs ffmpeg -y
- Install dependencies
doas pkg_add gmake go git node cmake ffmpeg - Follow the instructions below to build a release, but replace the final step
make build-releasewithgmake flags-release stash, to avoid the PIE buildmode.
NOTE: The make command in OpenBSD will be gmake. For example, make pre-ui will be gmake pre-ui.
make pre-ui- Installs the UI dependencies. This only needs to be run once after cloning the repository, or if the dependencies are updated.make generate- Generates Go and UI GraphQL files. Requiresmake pre-uito have been run.make generate-stash-box-client- Generate Go files for the Stash-box client code.make ui- Builds the UI. Requiresmake pre-uito have been run.make stash- Builds thestashbinary (make sure to build the UI as well... see below)make stash-macapp- Builds theStash.appmacOS app (only works when on macOS, for cross-compilation see below)make phasher- Builds thephasherbinarymake build- Builds both thestashandphasherbinaries, alias formake stash phashermake build-release- Builds release versions (debug information removed) of both thestashandphasherbinaries, alias formake flags-release flags-pie buildmake docker-build- Locally builds and tags a complete 'stash/build' docker imagemake docker-cuda-build- Locally builds and tags a complete 'stash/cuda-build' docker imagemake validate- Runs all of the tests and checks required to submit a PRmake lint- Runsgolangci-linton the backendmake it- Runs all unit and integration testsmake fmt- Formats the Go source codemake fmt-ui- Formats the UI source codemake validate-ui- Runs tests and checks for the UI onlymake fmt-ui-quick- (experimental) Formats only changed UI source codemake validate-ui-quick- (experimental) Runs tests and checks of changed UI codemake server-start- Runs a development stash server in the.localdirectorymake server-clean- Removes the.localdirectory and all of its contentsmake ui-start- Runs the UI in development mode. Requires a running Stash server to connect to - the server URL can be changed from the default ofhttp://localhost:9999using the environment variableVITE_APP_PLATFORM_URL, but keep in mind that authentication cannot be used since the session authorization cookie cannot be sent cross-origin. The UI runs on port3000or the next available port.
When building, you can optionally prepend flags-* targets to the target list in your make command to use different build flags:
flags-release(e.g.make flags-release stash) - Remove debug information from the binary.flags-pie(e.g.make flags-pie build) - Build a PIE (Position Independent Executable) binary. This provides increased security, but it is unsupported on some systems (notably 32-bit ARM and OpenBSD).flags-static(e.g.make flags-static phasher) - Build a statically linked binary (the default is a dynamically linked binary).flags-static-pie(e.g.make flags-static-pie stash) - Build a statically linked PIE binary (usingflags-staticandflags-pieseparately will not work).flags-static-windows(e.g.make flags-static-windows build) - Identical toflags-static-pie, but does not enable thenetgobuild tag, which is not needed for static builds on Windows.
- Run
make pre-uito install UI dependencies - Run
make generateto create generated files - In one terminal, run
make server-startto run the server code - In a separate terminal, run
make ui-startto run the UI in development mode - Open the UI in a browser:
http://localhost:3000/
⚠️ Note: Running the UI in development mode does not support sending authentication credentials due to issues with cross-origin requests. Ensure credentials are unset on the server when running the UI in development mode.
Changes to the UI code can be seen by reloading the browser page.
Changes to the backend code require a server restart (CTRL-C in the server terminal, followed by make server-start again) to be seen.
On first launch:
- On the "Stash Setup Wizard" screen, choose a directory with some files to test with
- Press "Next" to use the default locations for the database and generated content
- Press the "Confirm" and "Finish" buttons to get into the UI
- On the side menu, navigate to "Tasks -> Library -> Scan" and press the "Scan" button
- You're all set! Set any other configurations you'd like and test your code changes.
To start fresh with new configuration:
- Stop the server (
CTRL-Cin the server terminal) - Run
make server-cleanto clear all config, database, and generated files (under.local) - Run
make server-startto restart the server - Follow the "On first launch" steps above
Simply run make or make release, or equivalently:
- Run
make pre-uito install UI dependencies - Run
make generateto create generated files - Run
make uito build the frontend - Run
make build-releaseto build a release executable for your current platform
This project uses a modification of the CI-GoReleaser Docker container for cross-compilation, defined in docker/compiler/Dockerfile.
To cross-compile the app yourself:
- Run
make pre-ui,make generateandmake uioutside the container, to generate files and build the UI. - Pull the latest compiler image from GHCR:
docker pull ghcr.io/stashapp/compiler - Run
docker run --rm --mount type=bind,source="$(pwd)",target=/stash -w /stash -it ghcr.io/stashapp/compiler /bin/bashto open a shell inside the container. - From inside the container, run
make build-cc-allto build for all platforms, or runmake build-cc-{platform}to build for a specific platform (have a look at theMakefilefor the list of targets). - You will find the compiled binaries in
dist/.
NOTE: Since the container is run as UID 0 (root), the resulting binaries (and the dist/ folder itself, if it had to be created) will be owned by root.
Stash can be profiled using the --cpuprofile <output profile filename> command line flag.
The resulting file can then be used with pprof as follows:
go tool pprof <path to binary> <path to profile filename>
With graphviz installed and in the path, a call graph can be generated with:
go tool pprof -svg <path to binary> <path to profile filename> > <output svg file>