Self-hosted picture library with AI tagging, semantic search, and a clean web UI
Project description
PixlVault
PixlVault is a local picture library server for organizing, filtering, and reviewing large image collections.
It provides:
- A browser-based interface
- Fast metadata and tag filtering
- Smart score sorting
- Character and set organization
- Local storage of your library data
PixlVault runs on your machine and serves the UI at a local web address.
Install PixlVault
Choose one installation method.
Option 1: Windows installer
Use this if you want the easiest setup on Windows.
- Go to the GitHub Releases page for this repository.
- Download the latest Windows installer
.exe. - Run the installer.
- Start PixlVault Server from the Start Menu shortcut.
- Open your browser to
http://localhost:9537.
Option 2: Install from PyPI
Use this if you already have Python and want a pip install.
Requirements:
- Python 3.10 or newer
Install:
pip install pixlvault
Run:
pixlvault-server
Then open:
http://localhost:9537
Option 3: Clone and run manually
Use this if you want to run from source.
Requirements:
- Python 3.10 or newer
- Node.js 20 or newer
- npm
Steps:
git clone <your-repo-url>
cd pixlvault
python -m venv .venv
# Windows:
.venv\Scripts\activate
# macOS/Linux:
# source .venv/bin/activate
pip install --upgrade pip
pip install -e .
cd frontend
npm ci
npm run build
cd ..
pixlvault-server
Then open:
http://localhost:9537
Installing plugins
PixlVault supports built-in plugins and user plugins.
- Built-in plugins are in
image-plugins/built-in/. - User plugins are in
image-plugins/user/. - Start from
image-plugins/user/plugin_template.py.
To add your own plugin:
- Copy
image-plugins/user/plugin_template.pyto a new.pyfile inimage-plugins/user/. - Rename the plugin class and plugin id.
- Implement the plugin
run()method. - Restart PixlVault Server.
plugin_template.py is ignored by plugin discovery and will not be loaded as a plugin.
First run and data location
On first run, PixlVault creates a user config directory and stores:
- Server config
- Database
- Imported media files
If you need to use a custom config path:
python -m pixlvault.app --server-config "C:\path\to\server-config.json"
Server configuration
On first run, PixlVault generates a server-config.json file in the user config directory:
- Linux / macOS:
~/.config/pixlvault/server-config.json - Windows:
%APPDATA%\pixlvault\server-config.json
You can also supply a custom path with --server-config <path>.
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. |
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. |
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://192.168.1.5:5173 → http://192.168.1.5: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.
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. |
Storage
| Key | Default | Description |
|---|---|---|
image_root |
<config_dir>/images |
Directory where imported media files are stored. |
watch_folders |
[] |
List of folder entries to watch for new images and automatically import them. Each entry is an object with the fields below. |
Each entry in watch_folders has the following fields:
| Field | Type | Default | Description |
|---|---|---|---|
folder |
string | — | Absolute path to the directory to monitor (recursively). |
delete_after_import |
boolean | false |
When true, source files are deleted from the watch folder after a successful import. |
Example:
"watch_folders": [
{ "folder": "/home/user/downloads/photos", "delete_after_import": false },
{ "folder": "/mnt/camera", "delete_after_import": true }
]
Processing
| Key | Default | Description |
|---|---|---|
default_device |
"cpu" |
Device used for AI processing ("cpu" or "cuda"). |
generate_thumbnails_on_startup |
true |
Generate missing thumbnails when the server starts. |
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/pixlvault/images",
"watch_folders": [
{ "folder": "/path/to/photos", "delete_after_import": false }
],
"default_device": "cpu",
"generate_thumbnails_on_startup": true
}
Updating PixlVault
PyPI install
pip install --upgrade pixlvault
Source install
Pull latest changes, rebuild frontend, and reinstall:
git pull
cd frontend
npm ci
npm run build
cd ..
pip install -e .
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.
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
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.
Project details
Release history Release notifications | RSS feed
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 pixlvault-0.8.4.tar.gz.
File metadata
- Download URL: pixlvault-0.8.4.tar.gz
- Upload date:
- Size: 3.2 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5532459f341576132ac14ba13dca9c79d9440a37f87b6cc521de1adaabba6734
|
|
| MD5 |
c736efe0789682f01462c17ed02c60f2
|
|
| BLAKE2b-256 |
c3c0924d501c0983e4e12e3a896033b2ed3da5b98db664cceb640177e55a732a
|
Provenance
The following attestation bundles were made for pixlvault-0.8.4.tar.gz:
Publisher:
publish-pypi.yml on Pixelurgy/pixlvault
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pixlvault-0.8.4.tar.gz -
Subject digest:
5532459f341576132ac14ba13dca9c79d9440a37f87b6cc521de1adaabba6734 - Sigstore transparency entry: 1056944401
- Sigstore integration time:
-
Permalink:
Pixelurgy/pixlvault@9e9db05f29e5908b8f41f20ec6a38a83a5b369bd -
Branch / Tag:
refs/tags/v0.8.4 - Owner: https://github.com/Pixelurgy
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@9e9db05f29e5908b8f41f20ec6a38a83a5b369bd -
Trigger Event:
push
-
Statement type:
File details
Details for the file pixlvault-0.8.4-py3-none-any.whl.
File metadata
- Download URL: pixlvault-0.8.4-py3-none-any.whl
- Upload date:
- Size: 3.1 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bfa1f48ded82f876c82a5dc132ad5999a656fc64bcbb9d1ba23eaca111269e88
|
|
| MD5 |
6e6d631d23ff394df1f9a4d5f8543581
|
|
| BLAKE2b-256 |
8d6289818f9e4edcd68a2c3c799f2b2e0da7a5af41c0b5ba7bcf45bb5345c784
|
Provenance
The following attestation bundles were made for pixlvault-0.8.4-py3-none-any.whl:
Publisher:
publish-pypi.yml on Pixelurgy/pixlvault
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pixlvault-0.8.4-py3-none-any.whl -
Subject digest:
bfa1f48ded82f876c82a5dc132ad5999a656fc64bcbb9d1ba23eaca111269e88 - Sigstore transparency entry: 1056944405
- Sigstore integration time:
-
Permalink:
Pixelurgy/pixlvault@9e9db05f29e5908b8f41f20ec6a38a83a5b369bd -
Branch / Tag:
refs/tags/v0.8.4 - Owner: https://github.com/Pixelurgy
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@9e9db05f29e5908b8f41f20ec6a38a83a5b369bd -
Trigger Event:
push
-
Statement type: