lightcraft-web

lightcraft-web

Docker app from MikaPST's Repository

Overview

LightCraft Web is a community-maintained Docker image that provides LightCraft, a non-destructive photo editor, through a browser-based WebAssembly application. It is designed for photo development and image editing, including RAW photo workflows. The web application runs on the user's device and uses browser storage for its local-first library; photographs are not stored in a Docker volume by this container. The container only serves the static web application through NGINX.

LightCraft application icon

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).

Build and publish LightCraft Web GHCR image tag


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 main branch 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 .wasm files with the application/wasm MIME type;
  • serves the precompressed gzip assets generated by the upstream build when the browser supports gzip;
  • uses Cache-Control: no-cache because 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-web to Public if you want users to pull the image without authenticating to GHCR.

Build pipeline

The workflow:

  1. Checks out this repository.
  2. Checks out LightCraft and the shared craft-fonts repository.
  3. Installs the Rust WebAssembly target and the exact wasm-bindgen-cli version required by the upstream Cargo.lock.
  4. Runs cargo xtask web with CRAFT_FONTS_DIR pointing to the checked-out font repository.
  5. Checks the generated files in upstream/target/web-site.
  6. 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: 8080 by 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 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.

Related apps

Explore more like this

Explore all

Details

Repository
ghcr.io/mikapst/lightcraft-web:latest
Last Updated2026-11-04
First Seen2026-11-04

Runtime arguments

Web UI
http://[IP]:[PORT:8080]/
Network
bridge
Shell
sh
Privileged
false

Template configuration

HTTP PortPorttcp

Host port used to access the LightCraft Web interface. The container listens on port 8080.

Target
8080
Default
8082