lightcraft-web
Docker app from MikaPST's Repository
Overview
Readme
View on GitHub
LightCraft Web — Docker Image
A community-maintained Docker image for
LightCraft,
bringing its WebAssembly-based non-destructive photo editor to a self-hosted web interface.
Automated weekly builds and image publication to GitHub Container Registry (GHCR).
Why this repository?
The upstream LightCraft project provides a WebAssembly build that can be served as a static website. This repository automates building that web application from upstream source and packages the generated files into a lightweight NGINX-based Docker image.
The goals are to:
- Build the web app from the current
mainbranch of storytold/lightcraft. - Include the shared font assets from storytold/craft-fonts.
- Rebuild the image automatically each week and publish it to GHCR.
- Provide a simple image that can later be offered through Unraid Community Applications.
- Keep this packaging project separate from the upstream LightCraft source code.
This is an independent community packaging project. It is not an official LightCraft release and is not affiliated with or endorsed by the LightCraft or ArtCraft maintainers.
How it works
LightCraft's web application runs in the browser using WebAssembly and WebGL2. The container serves the compiled static web files through NGINX; it does not run a remote desktop or a server-side photo-processing service.
- Browser-based editor: use LightCraft through a modern browser with WebGL2 support.
- Local photo library: photos are imported through the browser and stored in browser-managed storage (OPFS / IndexedDB), not in a Docker volume.
- Local processing: image decoding, development and rendering run in the browser using the same Rust engine as the desktop application.
- Web Workers: rendering jobs can run in dedicated browser workers, with a main-thread fallback.
- Self-hosted delivery: the container hosts the application files. Each browser/device has its own browser storage and library.
Important: browser storage belongs to the browser profile on a particular device. It is not shared between users or browsers, and it is not a server-side backup. Use LightCraft's library backup and restore features and keep independent copies of original photos. Review the upstream documentation for current data-safety limitations before relying on the web app for important work.
Docker image
The published image is:
ghcr.io/mikapst/lightcraft-web:latest
Quick start with Docker Compose
A docker-compose.yml file is provided at the repository root:
services:
lightcraft-web:
image: ghcr.io/mikapst/lightcraft-web:latest
container_name: lightcraft-web
restart: unless-stopped
ports:
- "8080:8080"
Start LightCraft Web from the repository directory:
docker compose up -d
Then open:
http://YOUR_SERVER_IP:8080
Replace YOUR_SERVER_IP with the IP address or hostname of your server. On the same computer, use http://localhost:8080.
Run directly with Docker
docker run -d \
--name lightcraft-web \
--restart unless-stopped \
-p 8080:8080 \
ghcr.io/mikapst/lightcraft-web:latest
Useful commands
# View logs
docker compose logs -f
# Pull the latest image and recreate the container
docker compose pull
docker compose up -d
# Stop and remove the container
docker compose down
No .env file or persistent Docker volume is required for the default configuration. The host port is 8080; to use a different host port, change the left-hand side of the port mapping, for example 8081:8080.
Reverse proxy and browser requirements
The NGINX configuration:
- serves
.wasmfiles with theapplication/wasmMIME type; - serves the precompressed gzip assets generated by the upstream build when the browser supports gzip;
- uses
Cache-Control: no-cachebecause the upstream bundle uses stable filenames between builds.
The upstream documentation describes the COOP, COEP and CORP response headers as optional for the current web build. They are not required by this image's default NGINX configuration.
LightCraft requires an HTTP(S) origin; it cannot be opened directly from file://. localhost and 127.0.0.1 are treated as secure origins by browsers. If you expose the application outside your local network, use HTTPS through a reverse proxy such as Traefik and avoid exposing plain HTTP directly to the public Internet.
The web application uses WebGL2. Browser and GPU compatibility, available memory and the size/format of imported photos affect performance.
Automated builds
GitHub Actions builds the LightCraft web application and publishes the container image automatically.
| Trigger | Behaviour |
|---|---|
| Weekly schedule | Checks out the current upstream main branch, builds the WebAssembly app and publishes a new image when the build succeeds |
| Manual workflow dispatch | Allows a build to be started manually from the Actions tab |
| Changes to packaging files | Runs the workflow when docker-compose.yml, README.md or the workflow file changes on main |
Published tags
latest— the latest successful build.upstream-<commit>— identifies the exact LightCraft source commit used for the build.
The image is published for linux/amd64 and linux/arm64. The container serves static web assets through NGINX; the web files are architecture-independent.
A scheduled rebuild does not guarantee that upstream changes are compatible or stable. If a build fails, the previous published image remains available.
First-time GHCR setup: after the first successful publication, check the package's visibility in GitHub Packages. Set
lightcraft-webto Public if you want users to pull the image without authenticating to GHCR.
Build pipeline
The workflow:
- Checks out this repository.
- Checks out LightCraft and the shared
craft-fontsrepository. - Installs the Rust WebAssembly target and the exact
wasm-bindgen-cliversion required by the upstreamCargo.lock. - Runs
cargo xtask webwithCRAFT_FONTS_DIRpointing to the checked-out font repository. - Checks the generated files in
upstream/target/web-site. - Packages the generated static site into an NGINX image and publishes it to GHCR.
The upstream release build creates precompressed gzip and Brotli copies. This image configures NGINX's gzip_static support to serve the precompressed gzip files. The standard nginx:alpine image used here does not include a Brotli module, so the .br files are retained in the site but are not served as Brotli responses by this configuration.
The workflow generates the Dockerfile and NGINX configuration during the GitHub Actions run. Separate Dockerfile, nginx.conf and .dockerignore files are therefore not required in this packaging repository.
The repository is primarily intended as an automated image-build and publication pipeline; the normal way to consume it is to pull the published image.
Unraid Community Applications
This image is intended to be usable on Unraid.
An Unraid Community Applications template will be added after the image build and runtime configuration have been tested and validated.
In the meantime, LightCraft Web can be deployed on Unraid using the Docker Compose configuration above or by configuring the container manually with:
- Repository:
ghcr.io/mikapst/lightcraft-web:latest - Container port:
8080 - Host port:
8080by default
Remember that the photo library is stored in each user's browser storage, not in the Unraid appdata directory. Removing browser data or changing browser profiles can make that library unavailable. Use the application's backup and restore functionality.
Upstream project and attribution
- LightCraft source code: storytold/lightcraft
- LightCraft web build and hosting instructions: docs/web.md
- Shared font assets: storytold/craft-fonts
- Official releases: LightCraft releases
LightCraft is open source and is dual-licensed under the MIT License or Apache License 2.0, at the user's option, as specified by the upstream project. The craft-fonts assets have their own licensing and attribution requirements; consult that repository for the applicable notices.
The license of the upstream application and its assets does not automatically determine the license of the packaging files maintained in this repository. If you want to grant reuse rights for your own workflow, Compose file and documentation, select and include a separate LICENSE for this repository.
LightCraft names, artwork and logos remain subject to the upstream project's trademark and usage terms.
Disclaimer
This repository is maintained independently and is not affiliated with, sponsored by or endorsed by the LightCraft project or its maintainers.
LightCraft's web build is under active development. Review upstream release notes and data-safety documentation, keep independent backups of original photos and library data, and test updates before relying on the application for important work.
Requirements
No special privileges or database are required. The standard deployment does not require a persistent Docker volume for the web interface. LightCraft keeps its browser library and local application data in browser-managed storage, so browser storage availability and permissions apply. The container serves HTTP on port 8080; use HTTPS through a reverse proxy for remote access and browser features that require a secure context.
Categories
Related apps
Explore more like this
Explore allDetails
ghcr.io/mikapst/lightcraft-web:latestRuntime arguments
- Web UI
http://[IP]:[PORT:8080]/- Network
bridge- Shell
sh- Privileged
- false
Template configuration
Host port used to access the LightCraft Web interface. The container listens on port 8080.
- Target
- 8080
- Default
- 8082