jkunzandClaude Opus 5.5 3e7e7ffc76 fix: the version comes from the pin; what screenshots may hold
The webdesktop takes the app's version from upstream.json's tag, so
workspace.app.json no longer repeats it. AGENTS.md says what screenshots/
may hold: our own captures of the running app, never upstream's images;
captures showing ArtCraft's marks wait for Phil's go (AGL-478).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-20 16:51:08 +00:00

@workspace.global/lightcraft

LightCraft, photo library and raw development (a clean-room Adobe Lightroom) written in Rust, as a frame app for the workspace.global webdesktop. The repository holds no LightCraft code. The build downloads LightCraft's released WebAssembly build (pinned by sha256 in upstream.json) and unpacks it unchanged into the git-ignored dist_app/app/, next to a shim page from @workspace.global/craftkit that connects it to the webdesktop's window, and the app's workspace.app.json manifest.

Issue Reporting and Security

For reporting bugs, issues, or security vulnerabilities, please visit community.foss.global/. This is the central community hub for all issue reporting. Developers who sign and comply with our contribution agreement and go through identification can also get a code.foss.global/ account to submit Pull Requests directly.

Issues in LightCraft itself belong upstream: github.com/storytold/lightcraft.

Status

LightCraft is alpha software that changes quickly; this package pins release v0.8.0. In the webdesktop:

  • Open: File › Open shows the workspace's Open dialog in place of the browser's file picker. A file opened from Files goes in as a dropped file, which LightCraft imports into the library, as it does with any drop.
  • Save: downloads LightCraft starts become workspace saves: a file with the open document's name replaces it; Save As, exports and new documents go through the workspace's Save dialog. LightCraft has no bridge, so the host hears of no unsaved changes.
  • Window: the title shows the open file's name; a press inside LightCraft raises its window; the shim shows a loading notice until LightCraft has started.
  • Theme: LightCraft starts in the workspace's theme and follows it live. Its own setting (View ▸ Appearance, appearanceMode in the library's ui.json in the origin's private file system) goes back to auto at every start, so a theme picked in LightCraft lasts only while its window is open. On a first start, before there is a ui.json, the shim sets it with the view.appearance command.
  • On its own (opened outside the webdesktop), LightCraft opens and saves through the browser as usual.

Notes for this app:

  • Needs allow-modals in the iframe sandbox for its confirmations (restore, reset); without it they are answered "no".
  • Ships pre-compressed .br and .gz copies of its large files, and file names without a content hash (they revalidate).
  • Keeps the photo library in the origin's OPFS; renders photos on the CPU in Web Workers.
  • A future wasm-threads build will need COOP/COEP; this release does not.

What is served

dist_app/ is served at /apps/lightcraft/:

Path What it is
index.html, shim.js The shim page: the manifest's entry
workspace.app.json The manifest (IWgAppManifest, kind: 'frame')
app/ LightCraft's web build, unpacked unmodified from the pinned release asset

The shim loads app/index.html in an iframe on the same origin. LightCraft needs no SharedArrayBuffer, so no cross-origin isolation headers; it needs WebGL2 (WebGPU where the browser has it), .wasm served as application/wasm, and a 404 (not a fallback page) for a missing file.

Build and test

pnpm install
pnpm run build   # shim into dist_app/, then downloads and unpacks the pinned release (66.7 MB, once)
pnpm test        # no network

pnpm run upstream repeats only the download and unpack step; the download is cached in .nogit/upstream/ and checked against the size and sha256 in upstream.json before it is used. pnpm run check checks the manifest and pin.

Use from the webdesktop

import { manifest, appDir } from '@workspace.global/lightcraft';
// serve appDir at /apps/${manifest.id}/ and register manifest in frameApps

Licenses

The wrapper code is MIT. LightCraft is dual-licensed MIT OR Apache-2.0; its license files ship inside dist_app/app/. The ArtCraft name, wordmark and logos in LightCraft are trademarks of the ArtCraft Team and are not covered by those licenses: they may be used only unmodified, so this package ships the official build untouched. LightCraft is an independent project, not affiliated with the maker of the product it reimplements.

S
Description
LightCraft for the workspace.global webdesktop: the unmodified LightCraft web build behind a frame-app shim, with its workspace.app.json manifest.
Readme
132 KiB
0 Stars 0 Watchers 0 Forks
Languages
TypeScript 85.1%
HTML 14.9%