The workspace.global webdesktop on @workspace.global/catalog: the desktop with the core apps and the lock screen, layout and preferences kept in the browser, Settings driving theme and accent, and a typedserver site that serves the thirteen Craft frame apps at /apps/<id>/ with a Brotli cache. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@workspace.global/webdesktop
The workspace.global webdesktop: a desktop in the browser, with windows, a dock, a launcher and a lock screen, built from @workspace.global/catalog. It runs the catalog's core apps and hosts separately built apps, such as the WebAssembly Craft apps, in sandboxed windows.
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.
Status
A working prototype. These parts are not connected yet and show the catalog's demo content:
- Sign-in: the lock screen unlocks on any password or the passkey button. It is not an authentication boundary until it goes through idp.global via
@workspace.global/app. - Member, workspaces, notifications, recent items: demo data until they come from
@workspace.global/app. - Core apps (Files, Mail, Notes, Calendar, Terminal, Browser, Photos, Settings, Calculator): the catalog's apps with their demo content. Settings already drives the theme, accent, desktop icons, do not disturb and lock.
The window arrangement, View preferences and chosen workspace are saved in the browser's localStorage.
Run
pnpm install
pnpm run build
PORT=3000 pnpm start # http://localhost:3000
pnpm run watch # rebuilds the bundle and restarts the server on changes
pnpm test # build, then the server tests
The server is @api.global/typedserver's UtilityWebsiteServer: it serves dist_serve/ with /healthz, /livez and /readyz, and allows framing by its own origin only (X-Frame-Options: SAMEORIGIN).
Sibling dependencies
@workspace.global/catalog and the frame-app wrappers are not published yet, so they come from the sibling checkouts:
- the catalog as an injected dependency (
file:../catalogwithdependenciesMeta.injected). The copy resolves its own dependencies from this project, so the bundle holds one@design.estate/dees-element. After changing the catalog, rebuild it and runpnpm installhere again to refresh the copy. - the wrappers as
link:dependencies. They are only used by the server, and each must be built (pnpm run buildin the wrapper downloads and verifies its upstream release).
Once they are released, replace these with version ranges; until then a container image can't be built from this repository alone.
Frame apps
Frame apps are separately built bundles, each in its own wrapper repository next to this one. Installed today are storytold's thirteen Craft apps, each the unmodified WebAssembly web build of its upstream release behind the shared craftkit shim: WordCraft, GridCraft, DeckCraft, PdfCraft, PhotoCraft, LightCraft, VectorCraft, DesignCraft, FigCraft, FilmCraft, EffectCraft, SoundCraft and CADCraft. None of them needs SharedArrayBuffer.
The dock keeps to the core apps; frame apps are in the launcher and join the dock while they run. A wrapper package exports its manifest (IWgAppManifest with kind: 'frame') and its appDir. The webdesktop installs a wrapper by:
- adding it as a dependency (
"@workspace.global/pdfcraft": "link:../pdfcraft") and tots/plugins.ts; - listing it in
frameAppPackagesints/index.ts.
The server then:
- lists the installed apps at
/apps/index.json, which the browser app reads at start, so nothing ints_webchanges per app; - serves each app's
appDirat/apps/<id>/. Only files insideappDirare served; dotfiles,..and unknown apps get 404..wasmis served asapplication/wasm. - compresses compressible files (
.wasm,.js,.html, …) once with Brotli (gzip as fallback) into.nogit/frameapp-cache/, and warms that cache in the background at start. PdfCraft's 38 MB module goes out as 11 MB. - caches hashed file names for a year (
immutable) and revalidates everything else with its ETag.
The window runs a frame app in a sandboxed iframe and talks to it with the catalog's frame messages (theme, title, focus); see the catalog's readme. Apps that need WebAssembly threads (SharedArrayBuffer) need cross-origin isolation: crossOriginOpenerPolicy and crossOriginEmbedderPolicy in the server's securityHeaders. None of the installed apps needs it yet.
License and Legal Information
This repository contains open-source code that is licensed under the MIT License. A copy of the MIT License can be found in the license file within this repository.
Please note: The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
Trademarks
This project is owned and maintained by Task Venture Capital GmbH. The names and logos associated with Task Venture Capital GmbH and any related products or services are trademarks of Task Venture Capital GmbH and are not included within the scope of the MIT license granted herein. Use of these trademarks must comply with Task Venture Capital GmbH's Trademark Guidelines, and any usage must be approved in writing by Task Venture Capital GmbH.
Company Information
Task Venture Capital GmbH Registered at District court Bremen HRB 35230 HB, Germany
For any legal inquiries or if you require further information, please contact us via email at hello@task.vc.
By using this repository, you acknowledge that you have read this section, agree to comply with its terms, and understand that the licensing of the code does not imply endorsement by Task Venture Capital GmbH of any derivative works.