jkunzandClaude Opus 5.5 9b83bea703 feat: webdesktop app and server
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>
2026-10-17 17:57:57 +00:00
2026-10-17 17:57:57 +00:00
2026-10-17 17:57:57 +00:00
2026-10-17 17:57:57 +00:00
2026-10-17 17:57:57 +00:00
2026-10-17 17:57:57 +00:00
2026-10-17 17:57:57 +00:00
2026-10-17 17:57:57 +00:00
2026-10-17 17:57:57 +00:00
2026-10-17 17:57:57 +00:00
2026-10-17 17:57:57 +00:00
2026-10-17 17:57:57 +00:00
2026-10-17 17:57:57 +00:00
2026-10-17 17:57:57 +00:00
2026-10-17 17:57:57 +00:00
2026-10-17 17:57:57 +00:00

@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:../catalog with dependenciesMeta.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 run pnpm install here again to refresh the copy.
  • the wrappers as link: dependencies. They are only used by the server, and each must be built (pnpm run build in 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:

  1. adding it as a dependency ("@workspace.global/pdfcraft": "link:../pdfcraft") and to ts/plugins.ts;
  2. listing it in frameAppPackages in ts/index.ts.

The server then:

  • lists the installed apps at /apps/index.json, which the browser app reads at start, so nothing in ts_web changes per app;
  • serves each app's appDir at /apps/<id>/. Only files inside appDir are served; dotfiles, .. and unknown apps get 404. .wasm is served as application/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.

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.

S
Description
The workspace.global webdesktop: a desktop in the browser, built from @workspace.global/catalog.
Readme
105 KiB
Languages
TypeScript 95.9%
HTML 2.7%
JavaScript 1.4%