Integration for Collabora document service.
  • TypeScript 67.5%
  • JavaScript 30.8%
  • Shell 1.6%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
oliver.maklott b46429fbfa
All checks were successful
Publish / test (push) Successful in 23s
Publish / pack-and-publish (push) Successful in 5s
Migrate to new owner
2026-10-02 13:17:23 +02:00
.forgejo/workflows Migrate to new owner 2026-10-02 13:17:23 +02:00
.githooks Sub-repo fmt/lint pre-push rollout 2026-08-29 15:42:33 +02:00
client Collabora Office: AssetField pick and upload 2026-09-11 09:42:04 +02:00
templates Initial commit 2026-08-21 14:43:19 +02:00
worker Fix Collabora discovery by mounting proof keys as files 2026-08-26 21:44:03 +02:00
.env.example Migrate to new owner 2026-10-02 13:17:23 +02:00
.gitignore Initial commit 2026-08-21 14:43:19 +02:00
block_render.test.ts Initial commit 2026-08-21 14:43:19 +02:00
block_render.ts Initial commit 2026-08-21 14:43:19 +02:00
collabora.plugin.json Collabora Office: AssetField pick and upload 2026-09-11 09:42:04 +02:00
collabora.test.ts Initial commit 2026-08-21 14:43:19 +02:00
collabora.ts Fix Collabora Browse empty list (office filter) 2026-09-11 10:26:42 +02:00
collabora_block_editor.tsx Initial commit 2026-08-21 14:43:19 +02:00
collabora_block_preview_client.tsx Initial commit 2026-08-21 14:43:19 +02:00
collabora_editor_tool.test.ts Initial commit 2026-08-21 14:43:19 +02:00
collabora_editor_tool.tsx Collabora Office: AssetField pick and upload 2026-09-11 09:42:04 +02:00
collabora_embed.test.ts File-card title/icon open preview (no Files Manager link) 2026-08-31 23:44:28 +02:00
collabora_office_dialog.css Collabora Office: AssetField pick and upload 2026-09-11 09:42:04 +02:00
collabora_office_dialog.tsx Collabora Office: AssetField pick and upload 2026-09-11 09:42:04 +02:00
collabora_open_editor.tsx Fix CI anon office access test and config 401 messaging 2026-09-09 21:29:02 +02:00
compose.dev.yml Migrate to new owner 2026-10-02 13:17:23 +02:00
config.test.ts Initial commit 2026-08-21 14:43:19 +02:00
config.ts Initial commit 2026-08-21 14:43:19 +02:00
deploy.json Fix host data path resolve + Plugins/sidecar UX 2026-09-02 15:57:49 +02:00
disabled_reason.test.ts Collabora WOPI host + configure messaging 2026-08-26 19:59:27 +02:00
disabled_reason.ts Auto-setup Collabora proof keys with VALIDATE=true 2026-08-26 20:39:13 +02:00
doc_types.ts Initial commit 2026-08-21 14:43:19 +02:00
embed_asset_patterns.ts Initial commit 2026-08-21 14:43:19 +02:00
filename.ts Initial commit 2026-08-21 14:43:19 +02:00
launch_errors.test.ts Formated with deno fmt 2026-08-21 23:24:17 +02:00
launch_errors.ts Initial commit 2026-08-21 14:43:19 +02:00
limedoc.project.json Fix CI anon office access test and config 401 messaging 2026-09-09 21:29:02 +02:00
office_access.test.ts Fix CI anon office access test and config 401 messaging 2026-09-09 21:29:02 +02:00
office_access.ts Public Collabora view + MindElixir edit lock 2026-09-08 23:09:14 +02:00
office_blocks.test.ts Initial commit 2026-08-21 14:43:19 +02:00
office_blocks.ts Initial commit 2026-08-21 14:43:19 +02:00
office_capabilities.test.ts Fix Collabora Browse empty list (office filter) 2026-09-11 10:26:42 +02:00
office_capabilities.ts Fix Collabora Browse empty list (office filter) 2026-09-11 10:26:42 +02:00
office_directive.test.ts Fix issues, quality check 'how ::embed landed', revealed 2026-08-31 14:56:10 +02:00
office_directive.ts Collab editor tool for arbitrary blob/block embeds 2026-08-31 14:09:06 +02:00
office_preview.test.ts Fix office document icon (SVG-as-img) 2026-08-31 02:03:01 +02:00
office_preview.ts Hide render artefacts, download names, unify embed cards/actions 2026-08-31 21:30:29 +02:00
office_scope.test.ts Initial commit 2026-08-21 14:43:19 +02:00
office_scope.ts Initial commit 2026-08-21 14:43:19 +02:00
office_templates.test.ts Initial commit 2026-08-21 14:43:19 +02:00
public_origin.ts Initial commit 2026-08-21 14:43:19 +02:00
README.md Review Follow-up 2026-08-28 14:02:45 +02:00
register_provider.ts Auto-setup Collabora proof keys with VALIDATE=true 2026-08-26 20:39:13 +02:00

Collabora Online

Edit office documents via Collabora Online (WOPI).

Requirements

  • Docker (or Podman with DOCKER_CMD=podman)
  • That's it — everything else runs inside containers.

Quick start

# 1. Pull the dev image and set up .env
./ldcmd setup

# 2. Start the dev environment (app + Redis)
./ldcmd up

# 3. Open http://localhost:5173 in your browser

# 4. Edit plugin sources — HMR applies automatically
# 5. Run tests
./ldcmd test

# 6. Check types and import boundaries
./ldcmd check

Directory layout

collabora.plugin.json   # Plugin manifest
collabora.ts            # Server entry (defineLimedocPlugin)
collabora_editor_tool.tsx  # Browser client (builds to client/*.js)
client/              # Pre-built browser bundles (committed)
limedoc.project.json # Store metadata (package download URLs)
compose.dev.yml      # Dev compose (uses the published limedoc-dev image)
ldcmd                # Bridge script — the only thing you run on your host
.env.example         # Env var template — copy to .env and fill in OIDC values

ldcmd commands

Command What it does
./ldcmd setup Pull limedoc-dev image, copy .env.example → .env
./ldcmd up Start dev environment
./ldcmd down Stop dev environment
./ldcmd logs [service] Follow container logs
./ldcmd sh [service] Open shell in container (default: app-dev)
./ldcmd test Run plugin tests
./ldcmd fmt Format sources
./ldcmd lint Lint sources
./ldcmd check Type-check + import boundary check
./ldcmd pack Build zip + sha256 (CI also publishes sig.json)
./ldcmd publish Pack and upload (needs .forgejo.env / PACKAGE_TOKEN)
./ldcmd plugin install <id> Install a plugin dependency into the running env
./ldcmd plugin ls List installed plugins

Building client bundles

# Inside the container (run after editing .tsx files)
./ldcmd sh
deno task plugin:build -- /limedoc/plugins/collabora.plugin

Or directly:

./ldcmd check  # runs build as part of the check

Production sidecar (host)

Pack Store / packs:install unpacks this plugin into the app only. The Docker sidecar is not started by Limedoc (no Docker socket in the app). On the deploy host:

ldcmd sidecar up collabora
# or: ldcmd up

Compose SoT: deploy.json + worker/docker-compose.yml (joins DOCKER_NETWORK_NAME).

Distroless + proof-key + HTTPS

collabora/code:latest is distroless (no shell / no coolconfig). ldcmd sidecar configure / the setup wizard host-generate proof_key under COLLABORA_COOLWSD_HOST_PATH and set COLLABORA_VALIDATE_PROOF_KEY=true when keygen succeeds. Compose file-mounts proof_key and proof_key.pub into /etc/coolwsd/ (do not bind-mount the whole directory — that hides coolwsd.xml). After first keygen, recreate Collabora then the app. Verify /hosting/discovery contains proof-key.

Behind a TLS reverse proxy keep COLLABORA_SSL_TERMINATION=true (default) so the browser uses wss://. Set false only for plain-HTTP local bring-up.

Packing and publishing

# Build the installable zip + sha256 sidecar (local)
./ldcmd pack

# Publish (needs .forgejo.env with PACKAGE_TOKEN, PACKAGE_OWNER)
./ldcmd publish

CI (Forgejo Actions, .forgejo/workflows/publish.yml) on push to main publishes zip + sha256 + sig.json to Packages and Releases. Pack CI signs the content hash with OpenBao Transit (Forgejo Actions OIDC). Actions secret PACKAGE_TOKEN only — PACKAGE_OWNER is in the workflow env.

Developing with plugin dependencies

Your plugin may depend on another plugin at runtime. Three ways to include it:

1. Install via ldcmd (easiest, needs the app running)

./ldcmd up
./ldcmd plugin install media   # fetches from PACKAGE_STORE_URL in .env

Set PACKAGE_STORE_URL in .env to point at the Forgejo package registry:

PACKAGE_STORE_URL=https://git.belowtoxic.cloud/api/packages/limedoc-plugins

2. Local bind-mount (no running app needed)

Download the pack zip, unzip it next to this directory, then add a volume to compose.dev.yml:

app-dev:
    volumes:
        - .:/limedoc/plugins/collabora.plugin
        # Add the dependency:
        - ../other-plugin.plugin:/limedoc/plugins/other.plugin

Then ./ldcmd up — the app loads all *.plugin directories in plugins/.

3. Multi-repo development (two plugins at once)

Check out the other plugin repo next to this one:

cd ..
git clone git@git.belowtoxic.cloud:limedoc-plugins/other.git other.plugin

Then add it as a bind-mount in compose.dev.yml as shown above. Both plugins are mounted into the same app instance. No special ldcmd support required — the app discovers every *.plugin directory at startup.

Startup order: The app loads plugins alphabetically. If your plugin requires another, the dependency must be present on disk for the load plan to resolve. The compose depends_on in the sidecar template ensures the worker sidecar is healthy before the app starts, but for plugin-to-plugin dependencies no extra compose configuration is needed.

CI / CD

Push to main → Forgejo Actions runs .forgejo/workflows/publish.yml:

  1. Tests pass inside the limedoc-dev container
  2. Client bundles built; boundary check passes
  3. plugin:pack produces collabora-{version}.zip + .sha256
  4. OpenBao signs the content hash → collabora-{version}.sig.json
  5. Zip, sha256, and sig.json uploaded to the generic package registry (store)
  6. Same artifacts attached to a Forgejo Release v{version} (operators)

The app installs plugins from the generic package registry at PACKAGE_STORE_URL.

Using Podman instead of Docker

# In .env (or export before running):
DOCKER_CMD=podman
./ldcmd up

ldcmd detects podman compose automatically.