This release is a pre-release and may not be stable for production use.
PixlStash
PixlStash is a local picture library server for organizing, filtering, and reviewing large image collections.
It provides:
- A desktop application or a headless server with a browser-based interface
- Automatic tagging and image descriptions with selectable AI engines (including JoyCaption)
- Re-tag or regenerate descriptions for any selection directly from the context menu
- Instant grid loading — thumbnails appear immediately, metadata fills in asynchronously
- Fast metadata and tag filtering
- Smart score sorting
- Character and set organization
- Local storage of your library data
- API for integrating with other tools
- Simple keyboard shortcuts for scoring, selection, tagging, deletion and navigation.
- Integration with ComfyUI for running workflows on selected images within PixlStash.
- Plugin system for defining new filter operations that can be performed on a set of images.
- Sharing of pictures, picture sets, characters and projects.
- Persistent view URLs — bookmark or refresh any view and land exactly where you left off.
- Undo and Redo with keyboard shortcuts and history
- Deduplication helper
- Tag review helper
- A model overview for keeping track of your generative AI models
- Swappable image library
- Scriptable backup
PixlStash runs on your machine and serves the UI at a local (or Internet-facing) web address.
How is this different from Immich?
Immich is a very good home photo server. If that's what you need, use it! PixlStash does a different job.
PixlStash is a tool for working with images rather than just storing them, though it works as a home server too. It adds a tag review queue so auto-tags are verified, segmentation and selectable taggers, a choice of GPU or CPU backends, and two-way ComfyUI integration: control ComfyUI from PixlStash, or call its nodes from your own workflows. Generated images return tagged, with People, Picture Set, and Project associations attached.
Install or try PixlStash
PixlStash is available as a native desktop app for Windows, macOS (Apple Silicon), and Linux (no Python or browser tab required), as a Docker image, or as a pip package that runs anywhere Python does (including Intel Macs). The desktop app ships a ready-to-run CPU runtime, so it works offline out of the box, and auto-detects your hardware to offer optional GPU acceleration (NVIDIA CUDA, or experimental AMD ROCm), which it installs on demand straight from PyPI / PyTorch.
Detailed installation instructions on pixlstash.dev.
First run and data location
On first run, PixlStash creates a user config directory and stores:
- Server config
- Database
- Imported media files
The desktop app uses this same platform user data directory, so a desktop install shares its library with a pip or Docker install on the same machine. If you add GPU acceleration, the desktop app stores the downloaded GPU wheels under the app's own user-data directory.
Model downloads: On first startup, PixlStash automatically downloads the AI models required for tagging, captioning, and quality scoring. This includes several hundred MB of model weights. Downloads are stored in the platform user data directory:
OS Path Linux ~/.local/share/pixlstash/downloaded_models/macOS ~/Library/Application Support/pixlstash/downloaded_models/Windows %LOCALAPPDATA%\pixlstash\downloaded_models\An internet connection is required the first time the server starts. Subsequent starts use the cached models.
Moving them somewhere else: open Model folders on the model shelf and use Move on PixlStash's own folder. Every file in it is copied, verified and removed from the old location, and the new location is remembered — so nothing is downloaded again. Set
PIXLSTASH_BUILTIN_MODEL_DIRinstead if you want the folder somewhere else without moving what is already in it (a mounted model volume, typically).
If you need to use a custom config path:
python -m pixlstash.app --server-config "C:\path\to\server-config.json"
Multiple libraries
PixlStash can register several independent image libraries and keep one open at a time. Pictures, tags, scores, snapshots, guest sessions, and guest scores stay with their library; your owner account and preferences stay with the installation. Switch from Settings → Libraries. API tokens and share links are pinned to the library where they were created: they become inactive while a different library is open and work again when you switch back.
The library command line
Adding and removing libraries is a command-line operation in this release, because it points PixlStash at folders on your machine. Settings → Libraries shows the exact command for your installation, with a copy button.
Run these on the machine hosting PixlStash, as the OS user that owns hub.db,
with the same environment active that the server runs in (activate the venv,
or use the same interpreter). That is the one assumption the short form makes;
if the commands are not found, see Which form to type
below.
pixlstash-cli libraries list
pixlstash-cli libraries create /path/to/new-library --name "New library"
pixlstash-cli libraries attach /path/to/existing-library --name "Existing library"
pixlstash-cli libraries rename "Existing library" "Better name"
pixlstash-cli libraries relocate "Existing library" /new/path
pixlstash-cli libraries detach "Existing library"
pixlstash-cli libraries backup "Existing library" /path/to/backups/
pixlstash-cli libraries backup "Existing library" /path/to/backups/monday.tar.zst
pixlstash-cli libraries restore /path/to/backups/monday.tar.zst /path/to/new-library
| Command | What it does |
|---|---|
list |
Shows every registered library and marks the active one. |
create |
Creates the folder, starts an empty library in it, and registers it. |
attach |
Registers a library folder that already exists on disk. |
rename |
Changes the display name. Nothing on disk moves. |
relocate |
Points an existing registration at a new path, keeping its identity and share links. |
detach |
Forgets a library. No files are removed and nothing inside the folder changes. |
backup |
Writes the library and the hub to a single archive. |
restore |
Unpacks an archive into a new folder and makes it the library that opens. |
Notes worth knowing before you need them:
detachrefuses the active library. Switch to another one first.- Reattaching the same folder revives its original registration, including its share links, because a library carries a fingerprint of its own identity.
- A backup is a zstd-compressed tar, named
.tar.zst— not.tar.gz.--no-compresswrites a plain.tarinstead. Given a folder,backupinvents a dated name with the right ending; given a filename, it adds the right ending if you left it off.restorerecognises an archive by its contents, so a renamed file still works. - A backup contains
hub.db, and therefore your login and token secrets. PixlStash writes it owner-readable and refuses to overwrite an existing file. - A backup covers the library folder. Pictures kept in reference folders live outside it and are not included, so back those up separately.
- Backing up finishes any outstanding one-time snapshot cleanup first, so the archive never carries credentials from before your upgrade.
restoreneeds PixlStash stopped, and names a folder that is empty or does not exist yet — it never writes over a library. Because the archive holds the hub, restoring also brings back the password and API tokens that library was using, so your current ones are replaced.restoredoes not delete your current setup. It movesserver-config.jsonandhub.dbinto a datedpre-restore-*folder beside themselves and prints the launch command for each, sopixlstash-server --server-config <pre-restore-*>/server-config.jsonreopens what you had. Your old library folder is never touched.
Which form to type
The commands above assume pixlstash-cli is on your PATH, which is true once
the environment PixlStash is installed into is active.
- Source checkout, or an environment you have not activated:
python -m pixlstash.cli libraries list - Docker Compose, for a running service (paths are inside the container):
docker compose exec pixlstash pixlstash-cli libraries list - Desktop app (AppImage, deb, .dmg, installer): the app is its own CLI, so
/path/to/PixlStash.AppImage cli libraries listworks whether or not the app is running. Turn on Settings › Backend › Desktop › Shell command to get apixlstashcommand in~/.local/binand typepixlstash libraries listinstead. Either form targets the desktop app's own hub; there is no need to pass--hub. Settings › Libraries always shows the exact command for your install. - A different hub than the default: put global options before
libraries, e.g.pixlstash-cli --hub /path/to/hub.db libraries list. Without--hubthe CLI uses the standard config location, which is what you want almost always.
Required one-shot preparation when upgrading
If an older installation already has its owner and tokens inside vault.db,
normal startup deliberately will not guess from the config file or from
finding an existing vault; it needs that exact legacy vault authorized once.
- Desktop app: setup performs this step only after you explicitly approve importing the detected legacy owner and tokens.
pixlstash-server/python -m pixlstash.app, in an interactive terminal: startup detects the unprepared legacy vault itself and asks, with a plain explanation and a[y/N]prompt — defaulting to no, since this is irreversible — before doing anything. Saying yes does the same thing the CLI command below does, in the same startup, so no separate step or restart is needed. After this runs, the vault is no longer readable as an owner/token store by versions of PixlStash older than the hub — the prompt says so before you answer.- Non-interactive launches (a service, a container, redirected stdin) log that the legacy vault needs preparing instead of asking, and the CLI command below remains the way to authorize the migration ahead of time.
Pip installation:
pixlstash-cli --hub /path/to/config-dir/hub.db libraries prepare-legacy-identity /path/to/library
Source checkout:
python -m pixlstash.cli --hub /path/to/config-dir/hub.db libraries prepare-legacy-identity /path/to/library
Docker Compose, before bringing the upgraded service up (adjust the two container paths if you configured custom mounts):
docker compose run --rm --entrypoint pixlstash-cli pixlstash \
--hub /home/pixlstash/.config/pixlstash/hub.db \
libraries prepare-legacy-identity \
/home/pixlstash/.config/pixlstash/images
After the command succeeds, start PixlStash normally. Startup verifies the approved path and identity digest, copies the owner/tokens into the hub, stamps the library, and only then removes portable owner, token, and guest-session data from the live vault and its historical snapshots. New snapshots and every restore scratch database receive the same sanitation, so identity remains hub-only. If verification fails, the hub does not mark the migration complete; correct the reported problem and retry.
Server configuration
On first run, PixlStash generates a server-config.json file in the user config directory:
- Linux / macOS:
~/.config/pixlstash/server-config.json - Windows:
%LOCALAPPDATA%\pixlstash\server-config.json
You can also supply a custom path with --server-config <path>.
On first run in an interactive terminal, PixlStash now launches a short setup wizard for:
image_root(storage path)portrequire_ssl(HTTP/HTTPS)
Before the server starts, bootstrap also offers to set (or replace) the initial username/password.
You can rerun the wizard at any time with:
python -m pixlstash.app --bootstrap
When rerunning the wizard, pressing Enter keeps existing values as defaults.
Edit the file and restart the server to apply changes.
Network and port
| Key | Default | Description |
|---|---|---|
host |
"localhost" |
Address the server binds to. Change to "0.0.0.0" to expose the server on the local network or internet. |
port |
9537 |
TCP port the server listens on. |
cors_origins |
[] |
Extra origins allowed to make credentialed cross-origin requests. localhost, 127.0.0.1, and the server's own LAN IP are always permitted on any port. |
require_local_for_write |
true |
When true, full login (username/password and ALL-scope tokens) is only permitted from local network addresses (RFC 1918 / loopback). READ-only share tokens are always accepted from any IP. Set to false to allow full login from any IP. |
trusted_proxies |
[] |
List of proxy IP addresses whose X-Forwarded-For header should be trusted for real-client-IP detection. See Sharing and remote access below. |
At startup the server detects its own LAN IP and automatically allows it on any port. This means the Vite dev server works over LAN (http://<lan-ip>:5173 → http://<lan-ip>:9537) without any extra configuration, as long as network access is enabled via host.
Use cors_origins only if you need to allow origins on a different machine entirely.
Sharing and remote access
PixlStash supports read-only share tokens that let you give guests access to a specific picture, picture set, character, or project without exposing your full account. To safely share over the internet while keeping your login protected:
- Expose the server — set
"host": "0.0.0.0"and open/forward the port. - Enable HTTPS — set
"require_ssl": true(strongly recommended whenever the server is internet-facing; see SSL / HTTPS below). - Keep
require_local_for_write: true(the default) — this ensures that full login is only possible from your local network or VPN. Share tokens (READ-only) continue to work from any IP. - Create a share token — in the PixlStash settings UI, create a READ-only token scoped to the resource you want to share. Copy the generated URL and send it to your guests.
If you run a reverse proxy (nginx, Caddy, Cloudflare Tunnel…)
When a proxy sits in front of PixlStash, require_local_for_write sees the
proxy's IP instead of the real client IP. You must tell PixlStash which proxy
addresses to trust so it reads the real IP from the X-Forwarded-For header:
| Scenario | trusted_proxies value |
|---|---|
| nginx/Caddy on the same machine | ["127.0.0.1"] |
| Cloudflare Tunnel (cloudflared on same machine) | ["127.0.0.1"] |
| Proxy on a different LAN machine | ["192.168.1.x"] (the proxy's LAN IP) |
Example:
{
"host": "0.0.0.0",
"require_ssl": true,
"require_local_for_write": true,
"trusted_proxies": ["127.0.0.1"]
}
Warning: Only add addresses you control to
trusted_proxies. Trusting an untrusted address allows that host to spoof any client IP, bypassing the local network restriction entirely.
SSL / HTTPS
| Key | Default | Description |
|---|---|---|
require_ssl |
false |
Enable HTTPS. When true, the server will use the key and certificate below. |
ssl_keyfile |
<config_dir>/ssl/key.pem |
Path to the SSL private key file. |
ssl_certfile |
<config_dir>/ssl/cert.pem |
Path to the SSL certificate file. |
cookie_samesite |
"Lax" |
SameSite attribute for session cookies ("Lax", "Strict", or "None"). |
cookie_secure |
false |
Set the Secure flag on session cookies. Enable when serving over HTTPS. |
When require_ssl is enabled and no certificate files exist at the configured
paths, PixlStash generates a self-signed certificate automatically. Browsers
will show a security warning for self-signed certs. To get a trusted certificate
without warnings, choose one of the options below.
Option A — Replace the auto-generated certificate with a real one
If you already have a certificate (e.g. from certbot or your DNS provider), drop the files into the config directory and restart:
| OS | Default cert directory |
|---|---|
| Linux / macOS | ~/.config/pixlstash/ssl/ |
| Windows | %LOCALAPPDATA%\pixlstash\ssl\ |
Place your private key as key.pem and the full certificate chain as cert.pem,
or point ssl_keyfile / ssl_certfile at any paths you prefer.
To obtain a cert with certbot (requires port 80 reachable and a real domain):
certbot certonly --standalone -d pixlstash.example.com --email you@example.com
Then in server-config.json:
{
"require_ssl": true,
"cookie_secure": true,
"ssl_keyfile": "/etc/letsencrypt/live/pixlstash.example.com/privkey.pem",
"ssl_certfile": "/etc/letsencrypt/live/pixlstash.example.com/fullchain.pem"
}
Certbot installs a systemd timer / cron job that renews automatically. The
--standalone renewal briefly needs port 80; use a
pre/post hook
to stop and restart PixlStash around the renewal if it is bound to port 80.
Option B — Caddy as a reverse proxy (automatic Let's Encrypt)
Caddy provisions and renews a trusted TLS certificate automatically whenever it proxies a request for a real domain. No manual cert management required.
- Install Caddy:
sudo apt install caddy(or see caddyserver.com) - Create
/etc/caddy/Caddyfile:pixlstash.example.com { reverse_proxy localhost:9537 } sudo systemctl reload caddy
PixlStash itself can stay on plain HTTP (require_ssl: false); Caddy terminates
TLS externally. Set "trusted_proxies": ["127.0.0.1"] in server-config.json
so that require_local_for_write correctly identifies the real client IP (see
Sharing and remote access).
Option C — Cloudflare Tunnel (no open port, no domain purchase required)
Cloudflare Tunnel
routes traffic to PixlStash through Cloudflare's edge without opening any inbound
firewall ports. Cloudflare provides a free *.trycloudflare.com subdomain with a
valid TLS certificate, or you can use your own domain.
# Install cloudflared, then:
cloudflared tunnel --url http://localhost:9537
Cloudflare terminates TLS; PixlStash runs plain HTTP internally. As with Caddy,
set "trusted_proxies": ["127.0.0.1"] so local-write restrictions work correctly.
Storage
| Key | Default | Description |
|---|---|---|
image_root |
<config_dir>/images |
Directory where imported media files are stored. |
Automatic import folders are stored in the database and managed via the
Import Folders UI/API, not in server-config.json.
Processing
| Key | Default | Description |
|---|---|---|
default_device |
"cpu" |
Device used for AI processing ("cpu" or "cuda"). |
insightface_model_pack |
"buffalo_l" |
InsightFace model pack used by the face detection / recognition pipeline. One of "buffalo_l" or "auraface". |
generate_thumbnails_on_startup |
true |
Generate missing thumbnails when the server starts. |
Face model pack and licensing
insightface_model_pack selects which InsightFace model pack powers face
detection and face recognition. The licensing decision is yours;
PixlStash simply makes the choice available.
buffalo_l(default): the standard InsightFace pack. Its recognition weights are trained on the WebFace600K dataset, which is licensed for non-commercial research use only. This is the right choice for personal and research use, and it downloads automatically on first use.auraface: thefal/AuraFace-v1pack, whose weights are Apache-2.0 licensed and therefore suitable if you need to use face features in a commercial setting. It uses the same SCRFD-10G face detector asbuffalo_l, so switching only changes the recognition embedding. When selected, PixlStash downloads the pack from a pinned HuggingFace revision into~/.insightface/models/auraface/on first use. If the automatic download fails (for example, no network access), you can place the pack's.onnxfiles in that directory manually and restart.
Changing this setting on an existing library does not delete your faces or your manual character assignments. PixlStash detects faces whose embeddings came from a different pack and refreshes those embeddings in place, in the background, keeping each face's identity intact. New imports are always processed first, so a refresh sweep never starves brand-new pictures.
To remove stale database records for missing source files at startup, run:
python -m pixlstash.app --cleanup-missing-pictures
Logging
| Key | Default | Description |
|---|---|---|
log_level |
"info" |
Log verbosity ("debug", "info", "warning", "error"). |
log_file |
<config_dir>/server.log |
Path to the log file. |
Example config
{
"host": "localhost",
"port": 9537,
"log_level": "info",
"require_ssl": false,
"image_root": "/home/user/.config/pixlstash/images",
"default_device": "cpu",
"insightface_model_pack": "buffalo_l",
"generate_thumbnails_on_startup": true
}
Upgrade PixlStash
Detailed installation instructions on pixlstash.dev.
Installing plugins
PixlStash supports built-in plugins and user-created plugins.
With the CLI (recommended)
pixlstash-cli plugins available # what is published
pixlstash-cli plugins available caption # ...matching a word
pixlstash-cli plugins install hello_world_stamp # from the plugins repository
pixlstash-cli plugins install ./my_captioner.zip # a zip of a plugin folder
pixlstash-cli plugins install ./my_captioner/ # an extracted folder
pixlstash-cli plugins install ./my_filter.py # a single module
pixlstash-cli plugins test ./my_captioner.py # does it load and render?
pixlstash-cli plugins list
pixlstash-cli plugins remove my_captioner
plugins available lists what
PixlStash-plugins publishes,
with each plugin's name, title, one-line summary and (where declared) author and
licence; * marks one you already have. Add a word to search, and it matches
any of those fields, so anything you can see in the listing you can search for.
It downloads the same archive install does and reads it without importing
anything, so it needs no token and runs no published code.
The destination differs by kind (captioning plugin or image filter) and by
shape, so install works it out from the source instead of asking you to type
it: it reads the source without importing it, decides which base class it
derives from, and names the installed file after the plugin's own name. It
refuses a source that is not a plugin, one whose name collides with a built-in,
and a zip whose entries would be unpacked outside the folder it is unpacked
into.
--dry-run prints the plan and stops, --yes skips the confirmation, --force
replaces an existing plugin of the same name, and --strict turns the warnings
into refusals. --ref picks a branch, tag or commit in the plugins repository
and is ignored for local sources; it cannot point the download at a different
repository. A plugin's requirements.txt is never installed unless you pass
--with-deps. Plugin code runs unsandboxed, in the server process, with your
permissions — install what you would run yourself.
Captioning plugins load at server start, so restart PixlStash after installing one; image filters are re-scanned every time the Filters menu is listed.
plugins test is for the person writing a captioning plugin, and it is the
one verb that imports the plugin instead of reading it: it loads the file the
way the server does, registers what it defines, and checks that the parameter
schema is one the settings screen can render — so a typo costs a command rather
than a restart. --image PATH runs it over one picture as well, and stops
instead of running when the plugin reports its model is not present — though a
plugin that downloads inside init() still will, since by then it is the
plugin's code deciding.
It is a development aid, not a security scanner. It does not tell you whether a plugin is safe to install — it runs the plugin, unsandboxed, with your permissions, which is exactly what the server would do. Only test a plugin you would have installed anyway.
User plugin directory
If you prefer to copy files by hand, they go in the platform-specific user data
directory. PixlStash logs the exact path on startup, and
pixlstash-cli plugins list prints it.
| OS | Image filters | Captioning plugins |
|---|---|---|
| Linux | ~/.local/share/pixlstash/image-plugins/user/ |
~/.local/share/pixlstash/tagger-plugins/user/ |
| macOS | ~/Library/Application Support/pixlstash/image-plugins/user/ |
~/Library/Application Support/pixlstash/tagger-plugins/user/ |
| Windows | %LOCALAPPDATA%\pixlstash\pixlstash\image-plugins\user\ |
%LOCALAPPDATA%\pixlstash\pixlstash\tagger-plugins\user\ |
The doubled pixlstash\pixlstash on Windows is not a typo: platformdirs puts
the app under a vendor folder, and PixlStash passes no separate vendor name.
This table used to show it singly, which is why copying a plugin there by hand
appeared to do nothing.
An image filter is always a single .py file. A captioning plugin may be a
single .py file or a folder containing __init__.py.
Writing a plugin
Use the template from pixlstash/image_plugins/built-in/plugin_template.py in the source repository as a starting point:
- Create a new
.pyfile in your user plugin directory. - Subclass
ImagePlugin, set a uniquenameandplugin_id, and implementrun(). - Restart PixlStash Server — plugins are loaded at startup.
plugin_template.py is ignored by plugin discovery and will not be loaded as a plugin.
Plugin licensing
PixlStash backend core is GPL-3.0, but the plugin authoring API files
pixlstash/image_plugins/base.py and
pixlstash/image_plugins/built-in/plugin_template.py are MIT-licensed.
This means user plugins that only rely on that plugin API/template may use any license chosen by the plugin author.
If a plugin copies substantial GPL backend code or depends directly on other GPL-only backend internals, different obligations may apply.
Troubleshooting
- If the page does not load, confirm the server process is running.
- If port
9537is in use, set a different port in your server config file. - If frontend assets are missing, rebuild frontend with
npm run buildand restart the server. - Mobile browsers: the UI is designed for desktop. Mobile may work for basic browsing but is not a supported layout in 1.0.0.
Docker Images
PixlStash maintains separate Dockerfiles:
Dockerfile: CPU imageDockerfile.gpu: GPU image (NVIDIA CUDA)
Build locally:
# CPU
docker build -f Dockerfile -t pixlstash:cpu .
# GPU
docker build -f Dockerfile.gpu -t pixlstash:gpu .
Run locally:
# CPU
docker run --rm -p 9537:9537 -v pixlstash_data:/home/pixlstash pixlstash:cpu
# GPU
docker run --rm --gpus all -p 9537:9537 -v pixlstash_data:/home/pixlstash pixlstash:gpu
First-run setup in Docker
Claiming the owner account (choosing the first username/password) is normally restricted to loopback connections, and a Docker container never sees your traffic as loopback — so the in-browser first-run setup is blocked with a 403. Provision the owner account via environment variables on the first run instead:
docker run --rm -p 9537:9537 \
-e PIXLSTASH_INITIAL_USERNAME=owner \
-e PIXLSTASH_INITIAL_PASSWORD=change-me-now \
-v pixlstash_data:/home/pixlstash pixlstash:cpu
The account is claimed at startup and you can log in with those credentials
right away. Afterwards, restart the container without the two variables:
they are only used to claim a still-unclaimed account (a restart with stale
values never changes an existing password — it just logs that they were
ignored), but credentials should not linger in the container environment.
docker-compose.yml ships the same two variables commented out.
Alternative: log in over loopback from inside the container, e.g.
docker exec -it <container> curl -X POST http://127.0.0.1:9537/api/v1/login -H 'Content-Type: application/json' -d '{"username":"owner","password":"change-me-now"}'.
GitHub Actions uses the same split in .github/workflows/docker-publish.yml:
- CPU publish job builds from
Dockerfile - GPU publish job builds from
Dockerfile.gpu
GPU startup fails (CUDAExecutionProvider unavailable)
If startup reports that ONNX CUDAExecutionProvider is unavailable, you likely have CPU-only ONNX Runtime installed.
Fix your environment:
pip uninstall -y onnxruntime
pip install onnxruntime-gpu
It some cases you may have to uninstall onnxruntime-gpu and reinstall it.
Verify providers:
python -c "import onnxruntime as ort; print(ort.get_available_providers())"
Expected output should include CUDAExecutionProvider.
If you prefer CPU mode, set "default_device": "cpu" in server-config.json.
Import Folders and Reference Folders in Docker
Because Docker containers have an isolated filesystem, folders on your host machine must be explicitly bind-mounted into the container before PixlStash can read them.
Key restrictions:
- No folder browser. The path browser is unavailable in Docker. You must type the host path manually in the folder editor.
- Volume mount required before the folder becomes active. When you add a new Import or Reference folder, PixlStash saves it with a
pending_mountstatus. The folder will not scan or import until you restart the container with the corresponding-vmount in yourdocker runcommand. - Container restart needed for each new folder. Adding a folder in the UI does not automatically mount it. You must stop and recreate the container with the new
-vflag, then open PixlStash again.
Workflow:
- Open the sidebar Folders tab and add a new Import or Reference folder.
- Enter the host path (the path on your machine) and note the suggested container path (e.g.
/data/import/pictures-001or/data/ref/pictures-001). - The editor shows a ready-to-copy
docker runrestart command that includes all current mounts. Copy and run it to recreate the container with the new mount. - After the container restarts, the folder status changes from
pending_mountto active and scanning begins.
Example — adding a reference folder to an existing GPU container:
docker rm -f pixlstash-gpu 2>/dev/null || true
docker run -d \
--runtime nvidia \
-e HOME=/home/pixlstash \
-e PIXLSTASH_HOST=0.0.0.0 \
-p 9537:9537 \
-v ~/Pictures/pixlstash:/home/pixlstash \
-v '/home/you/Photos:/data/ref/pictures-001' \
--name pixlstash-gpu \
ghcr.io/pikselkroken/pixlstash:latest-gpu
Replace /home/you/Photos with your actual host path and adjust the container path index if you have multiple folders.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pixlstash-1.10.0rc1.tar.gz.
File metadata
- Download URL: pixlstash-1.10.0rc1.tar.gz
- Upload date:
- Size: 10.2 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e4cf32afb5078c3188d1ecdc840f5125a4882806bd23065192b2717b89fc5985
|
|
| MD5 |
8fbd7d8f4651ecfb663a5e6ae2b4a935
|
|
| BLAKE2b-256 |
4710e94864f6b67a1dd1b8d70128a8add3519a922c51b3f50942c870a13ea93c
|
Provenance
The following attestation bundles were made for pixlstash-1.10.0rc1.tar.gz:
Publisher:
publish-pypi.yml on Pikselkroken/pixlstash
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pixlstash-1.10.0rc1.tar.gz -
Subject digest:
e4cf32afb5078c3188d1ecdc840f5125a4882806bd23065192b2717b89fc5985 - Sigstore transparency entry: 2507691697
- Sigstore integration time:
-
Permalink:
Pikselkroken/pixlstash@28f74e9881c4b84f833667f081b41c9eec605cf6 -
Branch / Tag:
refs/tags/v1.10.0rc1 - Owner: https://github.com/Pikselkroken
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@28f74e9881c4b84f833667f081b41c9eec605cf6 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pixlstash-1.10.0rc1-py3-none-any.whl.
File metadata
- Download URL: pixlstash-1.10.0rc1-py3-none-any.whl
- Upload date:
- Size: 9.3 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
59b23c0697d97601d14f65aca5eb037925cb1811140d898d1c3d76f0beec6ae4
|
|
| MD5 |
6aa24286f706fe2792f1d1d889af6630
|
|
| BLAKE2b-256 |
7cea47569bed9d177204fc5e1240302bb1c723bfd84d4785a19ad9a79c9ec90c
|
Provenance
The following attestation bundles were made for pixlstash-1.10.0rc1-py3-none-any.whl:
Publisher:
publish-pypi.yml on Pikselkroken/pixlstash
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pixlstash-1.10.0rc1-py3-none-any.whl -
Subject digest:
59b23c0697d97601d14f65aca5eb037925cb1811140d898d1c3d76f0beec6ae4 - Sigstore transparency entry: 2507691757
- Sigstore integration time:
-
Permalink:
Pikselkroken/pixlstash@28f74e9881c4b84f833667f081b41c9eec605cf6 -
Branch / Tag:
refs/tags/v1.10.0rc1 - Owner: https://github.com/Pikselkroken
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@28f74e9881c4b84f833667f081b41c9eec605cf6 -
Trigger Event:
push
-
Statement type: