Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
d7d8b54
fix: desktop editors with new msvc build routine
rikled Jun 11, 2026
fcee519
chore: update core
rikled Jun 11, 2026
f7bce41
fix: secret leak in dockerfile
rikled Jun 17, 2026
2e9f65d
feat: MSVC desktop build
rikled Jun 12, 2026
7ee33b0
feat: separate common from linux build, update submodules
rikled Jun 17, 2026
bd4136c
feat: powershell script for building windows part of desktopeditors
rikled Jun 17, 2026
691bfde
fix: use docker secret for Nextcloud user and password
rikled Jun 17, 2026
d4c51a6
chore: update submodule
rikled Jun 17, 2026
81a44f1
feat: github build workflow, first attempt for windows
rikled Jun 17, 2026
f257d6e
chore: add debug step
rikled Jun 17, 2026
3fcc16f
fix: remove flaky cache
rikled Jun 17, 2026
7c5523f
chore: enable 3dparty caching
rikled Jun 17, 2026
7010e54
fix: attempt to fix image export
rikled Jun 17, 2026
248439b
fix: dummy command for scratch image
rikled Jun 17, 2026
d072782
feat: windows build add steps for packaging
rikled Jun 17, 2026
928e6f1
fix/feat: add linux workflow, copy common in result in windows, remov…
rikled Jun 17, 2026
38c1ea4
fix: swap needs and build name
rikled Jun 17, 2026
e60e4ba
fix: add missing git short sha
rikled Jun 17, 2026
a0d3eb2
fix: use inno version already installed
rikled Jun 17, 2026
fa20e85
fix: force overwrite desktopeditor files with common
rikled Jun 18, 2026
2ce89b8
fix: wrong path of windows desktop builds
rikled Jun 18, 2026
0e21dac
fix: completely remove advinst for now
rikled Jun 18, 2026
d1aa0d4
feat: outsource windows build logic solely into build script
rikled Jun 18, 2026
6c1f843
fix: inno package build
rikled Jun 18, 2026
76b6f67
fix: linux package path, windows hyphen issue with inno
rikled Jun 18, 2026
3a6d79a
fix: another attempt to fix inno
rikled Jun 18, 2026
3c7697a
fix: include inofficial language packs into inno
rikled Jun 18, 2026
392a206
fix: let windows/linux build themes/fonts by themselves to speed up b…
rikled Jun 18, 2026
2495ccd
fix: allgen-builder was not completely removed
rikled Jun 18, 2026
94bcd0c
fix: permission issue
rikled Jun 18, 2026
c2e8899
fix: another attempt to fix permission issue
rikled Jun 18, 2026
a332dca
fix: also accept islu as language pack for inno
rikled Jun 18, 2026
551ebb0
fix: add missing vc++ runtime for allfontsgen/allthemesgen
rikled Jun 18, 2026
9453ddc
chore: sccache + debug output for workflow
rikled Jun 18, 2026
fffd072
fix: update sccache
rikled Jun 18, 2026
c0b3bdb
feat: ccache support for linux desktop build
rikled Jun 18, 2026
ac1d97b
feat: add ccache to core-wasm build
rikled Jun 18, 2026
0faa880
fix: add WIN32 flag to windows build
rikled Jun 18, 2026
9fde33d
fix: set win32 flag in djvufile, remove global win32 flag
rikled Jun 19, 2026
523ed6f
chore: update submodules
rikled Jun 19, 2026
bcef4e6
fix: attempt to fix buildx ccache
rikled Jun 19, 2026
7a7900a
chore:update submodules
rikled Jun 19, 2026
4e777cb
chore: update submodules
rikled Jun 19, 2026
bfab24d
chore: update submodules
rikled Jun 19, 2026
2d28598
chore: update submodules
rikled Jun 19, 2026
153e77b
fix: another attempt to fix caching
rikled Jun 19, 2026
9ad84f0
chore: update submodules
rikled Jun 19, 2026
030befa
chore: update submodules
rikled Jun 19, 2026
c780052
fix: add missing manifest file to converter
rikled Jun 19, 2026
5e336ef
fix: allfontsgen did not create web AllFonts.js
rikled Jun 19, 2026
6f74606
chore: windows build script cleanup
rikled Jun 19, 2026
5957229
chore: update submodules
rikled Jun 19, 2026
a0be36f
chore: update submodules
rikled Jun 19, 2026
9532193
chore: add readme files
rikled Jun 19, 2026
7963cda
chore: update main repo readme
rikled Jun 19, 2026
7c6c7c8
chore: smaller things in readmes
rikled Jun 19, 2026
841fb8f
chore: update submodules to main branches for merge
rikled Jun 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
408 changes: 408 additions & 0 deletions .github/workflows/build.yml

Large diffs are not rendered by default.

38 changes: 36 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ The suite empowers you to create, edit, save, and export text documents, spreads

## Localization 🌐

Constantly improving localization of the editors to make the suite accessible to all users, all over the world.
Constantly improving localization of the editors to make the suite accessible to all users, all over the world.

* Interface available in 46 languages
* RTL support
Expand All @@ -47,8 +47,42 @@ Desktop Editors contain the following components:
* [web-apps](https://github.com/Euro-Office/web-apps) - the frontend for [Document Server][1] which is a part of Desktop Editors that allows the user to create, edit, save and export text, spreadsheet and presentation documents using the common interface of a document editor.
* [dictionaries](https://github.com/Euro-Office/dictionaries) - the dictionaries of various languages used for spellchecking in Desktop Editors.

## Build it yourself 🛠️

You can build Desktop Editors from source on **Windows** and **Linux**. This is a
super-repository, so the first step is always to check out the submodules:

```sh
git clone https://github.com/Euro-Office/DesktopEditors.git
cd DesktopEditors
git submodule update --init --recursive
```

Then head to the build docs:

* **[build/](./build/README.md)** — start here for the overall build model (the
shared CMake definition, the common editors payload, vcpkg, and caching).
* **[build/windows/](./build/windows/README.md)** — the Windows build (`build.ps1`, MSVC + CMake).
* **[build/linux/](./build/linux/README.md)** — the Linux build (Docker / `docker buildx bake`).

## Get involved 🤝

Contributions are welcome! Whether it's a bug report, a feature idea, a
translation, or a pull request, here's how to take part:

* **Found a bug or have an idea?** Open an [issue](https://github.com/Euro-Office/DesktopEditors/issues)
and describe what you ran into or what you'd like to see.
* **Want to contribute code?** Fork the relevant [component](#components-) repo,
make your change, and open a pull request. For build changes, see the
[build docs](./build/README.md) above.
* **Want to help translate?** Localization improvements are always appreciated —
see
the editors' interface translations.

Please keep contributions compatible with the project's AGPL v3 license.

## License 📄

Desktop Editors is licensed under the GNU Affero Public License, version 3.0, ensuring its transparency and commitment to the open-source community.

[1]: https://github.com/Euro-Office/DocumentServer
[1]: https://github.com/Euro-Office/DocumentServer
1 change: 1 addition & 0 deletions VERSION
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
9.3.1
60 changes: 22 additions & 38 deletions build/.docker/desktop-composer.bake.Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -4,53 +4,37 @@
# docker-bake.hcl file in this monorepo.
# ==============================================================================

FROM desktop-builder AS desktop-composer
FROM scratch AS desktop-common
ARG BUILD_ROOT

COPY --from=sdkjs-desktop ${BUILD_ROOT} /desktopeditors/editors/
COPY --from=web-apps ${BUILD_ROOT} /desktopeditors/editors/
COPY --from=sdkjs-desktop ${BUILD_ROOT} /editors/
COPY --from=web-apps ${BUILD_ROOT} /editors/

COPY --from=desktop-js /app/loginpage/deploy/index.html /desktopeditors/index.html
COPY --from=desktop-js /app/loginpage/deploy/noconnect.html /desktopeditors/editors/webext/noconnect.html
COPY --from=desktop-js /app/loginpage/deploy/index.html /index.html
COPY --from=desktop-js /app/loginpage/deploy/noconnect.html /editors/webext/noconnect.html

COPY web-apps/apps/api/documents/index.html.desktop /desktopeditors/editors/web-apps/apps/api/documents/index.html
COPY web-apps/apps/api/documents/index.html.desktop /editors/web-apps/apps/api/documents/index.html

COPY desktop-apps/common/converter/* /desktopeditors/converter/
COPY desktop-apps/common/converter/* /converter/
# Support only Nextcloud for now
COPY desktop-apps/common/loginpage/providers/nextcloud /desktopeditors/providers/nextcloud
COPY desktop-apps/common/templates /desktopeditors/converter/templates
COPY desktop-apps/common/loginpage/providers/nextcloud /providers/nextcloud
COPY desktop-apps/common/templates /converter/templates

COPY desktop-sdk/ChromiumBasedEditors/resources/ /desktopeditors/editors/sdkjs/common/Images/
RUN mkdir /desktopeditors/editors/sdkjs-plugins
COPY desktop-sdk/ChromiumBasedEditors/resources/ /editors/sdkjs/common/Images/

COPY build/configs/core/DoctRenderer.config.desktop /desktopeditors/converter/DoctRenderer.config
COPY build/configs/core/DoctRenderer.config.desktop /converter/DoctRenderer.config

COPY document-templates/new /desktopeditors/converter/empty
COPY document-templates/new /converter/empty

COPY dictionaries/ /desktopeditors/dictionaries
COPY dictionaries/ /dictionaries


COPY core-fonts/opensans /desktopeditors/fonts
COPY core-fonts/asana /desktopeditors/fonts/asana
COPY core-fonts/caladea /desktopeditors/fonts/caladea
COPY core-fonts/crosextra /desktopeditors/fonts/crosextra
COPY core-fonts/openoffice /desktopeditors/fonts/openoffice
COPY core-fonts/ASC.ttf /desktopeditors/fonts/ASC.ttf

RUN /desktopeditors/converter/allfontsgen \
--use-system=1 \
--input=/desktopeditors/fonts \
--input=/core-fonts \
--allfonts=/desktopeditors/converter/AllFonts.js \
--selection=/desktopeditors/converter/font_selection.bin

RUN /desktopeditors/converter/allthemesgen \
--converter-dir=/desktopeditors/converter \
--src=/desktopeditors/editors/sdkjs/slide/themes \
--allfonts=/desktopeditors/converter/AllFonts.js \
--output=/desktopeditors/editors/sdkjs/common/Images

RUN echo 'LD_LIBRARY_PATH=$PWD:$PWD/converter:$LD_LIBRARY_PATH LD_PRELOAD=libcef.so ./DesktopEditors' > /desktopeditors/start_desktop.sh && \
chmod +x /desktopeditors/start_desktop.sh
COPY core-fonts/opensans /fonts
COPY core-fonts/asana /fonts/asana
COPY core-fonts/caladea /fonts/caladea
COPY core-fonts/crosextra /fonts/crosextra
COPY core-fonts/openoffice /fonts/openoffice
COPY core-fonts/ASC.ttf /fonts/ASC.ttf

FROM scratch AS desktop-export
COPY --from=desktop-composer /desktopeditors /
# Create sdkjs-plugins dir in scratch image
WORKDIR /editors/sdkjs-plugins
2 changes: 1 addition & 1 deletion build/.docker/packages.bake.Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ FROM ubuntu:24.04 AS package
rm -rf /var/lib/apt/lists/*

#Build files
COPY --from=desktop-export / ${OUT_DIR}/
COPY --from=desktop-linux /desktopeditors ${OUT_DIR}/

# Upstream packaging repo
COPY desktop-apps/package/ /desktop-editors-package/
Expand Down
119 changes: 105 additions & 14 deletions build/README.md
Original file line number Diff line number Diff line change
@@ -1,25 +1,116 @@
# Desktop Editors
# Building Euro-Office DesktopEditors

Docker image where we are experimenting with building the OnlyOffice Desktop Editors.
This directory holds everything needed to build **Euro-Office DesktopEditors**
(a fork of ONLYOFFICE DesktopEditors) from source, on Linux and Windows.

## Building the Image
If you just want to build, go straight to your platform:

First, clone the repositories for the core-fonts, sdkjs, web-apps, and server components:
- **[Linux](./linux/README.md)** — a Docker-based build (`docker buildx bake`)
- **[Windows](./windows/README.md)** — a PowerShell-driven MSVC build (`build.ps1`)

```sh
git clone --recurse-submodules https://github.com/Euro-Office/DesktopEditors.git
```
The rest of this page explains the model both platforms share. Read it once and
the platform guides will make a lot more sense.

## Prerequisites (all platforms)

This is a *super-repository*: almost none of the source lives here directly. The
real code is in submodules — `core`, `core-fonts`, `desktop-apps`, `desktop-sdk`,
`dictionaries`, `document-templates`, `sdkjs`, `sdkjs-forms`, `web-apps`. You
**must** check them out before building:

If the repo was cloned without --recurse-submodules, initialize and download the submodules with:
```sh
git clone https://github.com/Euro-Office/DesktopEditors.git
cd DesktopEditors
git submodule update --init --recursive
```

Then, you can build the full image by running:
Every command in these guides assumes you are running from the **repository
root** (the directory that contains this `build/` folder), not from inside
`build/` itself.

```sh
cd DesktopEditors/build
docker buildx bake
```
## The big picture: three jobs, two platforms, one definition

A full release is produced by three jobs in the **"Build (Windows/Linux)"** CI
workflow:

| Job | Runs on | Produces |
| --------------- | ---------------- | ------------------------------------------------------------------------------ |
| `build-common` | Linux / Docker | the JS + WASM **editors web payload** ("common"), published as `common-files` |
| `build-linux` | Linux / Docker | the desktop app + Linux packages |
| `build-windows` | Windows / MSVC | the desktop app + ZIP and Inno installer (optionally an MSI) |

The single most important thing to understand:

> **Both `build-linux` and `build-windows` consume the output of `build-common`.**

`build-common` compiles the web editors (HTML/JS) and the core WASM once, on
Linux, because that part is platform-independent. The two desktop builds then
overlay that payload onto the native application they compile. So when you build
the desktop app, you don't rebuild the editors — you **supply** them. How you
supply them differs per platform and is covered in each guide.

## Build *definition* vs. build *orchestration*

The build is split into two layers, and keeping them straight is the key to
understanding why there are two very different-looking build systems here:

- **The build definition** — *what* to compile and how to link it — lives in
**`desktop-apps/win-linux/CMakeLists.txt`**. This is a single, shared,
cross-platform CMake project. It is the same on Linux and Windows.

- **The orchestration** — provision a toolchain, fetch dependencies, invoke
CMake, run post-build steps, package — is **per-platform**:
- Linux: a Dockerfile driven by `docker-bake.hcl` (see [linux/](./linux/README.md))
- Windows: `windows/build.ps1` (see [windows/](./windows/README.md))

Both orchestrators do essentially the same sequence — configure CMake with the
vcpkg toolchain and a compiler cache, build, install, overlay the common payload,
generate fonts and theme thumbnails, package — just with platform-appropriate
tooling.

### Why not just use Docker for both?

The native Windows toolchain (MSVC, Qt, CEF, the v8 engine, the Windows SDK)
cannot be hermetically containerized on the standard hosted runners the way the
Linux toolchain can, and a Linux container obviously can't emit Windows binaries.
So the Linux build is a clean, reproducible Docker build, while the Windows build
is a script that provisions and runs against the host. The asymmetry is
deliberate, not an oversight.

## Shared concepts

These apply to both platforms; the platform guides won't repeat them.

### Dependencies via vcpkg (manifest mode)

Native third-party libraries are resolved by **vcpkg in manifest mode**. The
manifest and its version pins live in **`core/vcpkg.json`** (`VCPKG_MANIFEST_DIR`
points CMake at `core`). The exact dependency versions are pinned through the
manifest's `builtin-baseline`, so a fresh checkout of vcpkg still resolves the
same versions. If a bleeding-edge vcpkg HEAD ever misbehaves, check out the
baseline commit referenced in `core/vcpkg.json`.

### Compiler caching + the Ninja generator

Both builds use a compiler cache to avoid recompiling unchanged translation
units — **ccache** on Linux, **sccache** on Windows — wired in through
`CMAKE_C_COMPILER_LAUNCHER` / `CMAKE_CXX_COMPILER_LAUNCHER`. Because of that,
**both builds use the Ninja generator**: MSBuild ignores the compiler-launcher
variables, Ninja honours them. The cache is optional locally (the build just runs
slower without it) but strongly recommended in CI.

### Versioning and branding

These come from the workflow's top-level environment and can be overridden
locally:

| Variable | Meaning | Default |
| --------------------------------- | ---------------------------------------- | ---------------------- |
| `PRODUCT_VERSION` | marketing version | `9.3.1` |
| `BUILD_NUMBER` | build identifier | `dev.1` |
| `COMPANY_NAME` / `PRODUCT_NAME` | shown in the app's About page | `Euro-Office` / `DesktopEditors` |

## Where to go next

After it finishes the desktop editors will be in build/deploy/desktop
- Building on **[Linux](./linux/README.md)**
- Building on **[Windows](./windows/README.md)**
60 changes: 14 additions & 46 deletions build/docker-bake.hcl
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
# docker-bake.hcl

variable "GIT_COMMIT" {
default = ""
}

variable "REGISTRY" {
default = "euro-office"
default = "ghcr.io/euro-office"
}

variable "TAG" {
Expand Down Expand Up @@ -58,7 +62,7 @@ variable "PRODUCT_NAME" {
# ──────────────────────────────────────────────

group "default" {
targets = ["desktop-export"]
targets = ["desktop-common"]
}

group "deps" {
Expand Down Expand Up @@ -137,62 +141,26 @@ target "web-apps" {
cache-to = ["type=local,dest=/tmp/${REGISTRY}/web-apps,mode=max"]
}

# ──────────────────────────────────────────────
# BUILD TARGET
# ──────────────────────────────────────────────

target "desktop-builder" {
inherits = ["_common"]
context = ".."
dockerfile = "./desktop-apps/.docker/desktop-apps.bake.Dockerfile"
target = "desktop-builder"
tags = ["${REGISTRY}/desktop-builder:${TAG}"]
contexts = {
core-base = "target:core-base"
desktop-js = "target:desktop-js"
sdkjs-desktop = "target:sdkjs-desktop"
web-apps = "target:web-apps"
}
cache-from = ["type=local,src=/tmp/${REGISTRY}/desktop-builder"]
cache-to = ["type=local,dest=/tmp/${REGISTRY}/desktop-builder,mode=max"]
}

# ──────────────────────────────────────────────
# EXPORT TARGET
# ──────────────────────────────────────────────

target "desktop-export" {

### Compose files that are common to all operating systems
target "desktop-common" {
inherits = ["_common"]
context = ".."
dockerfile = "./build/.docker/desktop-composer.bake.Dockerfile"
target = "desktop-export" # points to the FROM scratch stage
tags = ["${REGISTRY}/desktop-export:${TAG}"]
target = "desktop-common" # points to the FROM scratch stage
tags = ["${REGISTRY}/desktop-common:${GIT_COMMIT}"]
contexts = {
core-base = "target:core-base" # ← needed because Dockerfile references them
desktop-js = "target:desktop-js" # even in stages before desktop-export
desktop-js = "target:desktop-js" # even in stages before desktop-common
sdkjs-desktop = "target:sdkjs-desktop"
web-apps = "target:web-apps"
desktop-builder = "target:desktop-builder"
}

# Export the filesystem directly to a local directory instead of an image
output = ["type=local,dest=./deploy/desktop"]

cache-from = ["type=local,src=/tmp/${REGISTRY}/desktop-builder"] # reuses builder cache
}

target "packages" {
inherits = ["_common"]
context = ".."
dockerfile = "./build/.docker/packages.bake.Dockerfile"
target = "packages" # points to the FROM scratch stage
tags = ["${REGISTRY}/packages:${TAG}"]
contexts = {
desktop-export = "target:desktop-export"
}

# Export the filesystem directly to a local directory instead of an image
output = ["type=local,dest=./deploy/packages"]
output = ["type=docker"]

cache-from = ["type=local,src=/tmp/${REGISTRY}/packages"] # reuses builder cache
cache-from = ["type=local,src=/tmp/${REGISTRY}/desktop-common"] # reuses builder cache
}
Loading
Loading