Skip to content

Portfolio Desk

Project

Desk is a free office suite for the Linux desktop, made of three apps that share one document model: Desk Writer, for word processing and page layout, Desk Tables, for spreadsheets, and Desk Slides, for presentations. It is written in Rust with GTK 4 and Libadwaita, follows the GNOME Human Interface Guidelines and aims for feature parity and document compatibility with Apple's iWork '09 (Pages, Numbers and Keynote 9.3).

Why it exists

The Desk logo: a tray holding one document of each app, and the word Desk with letters drawn as a bar chart, a pie chart, graph paper and a spreadsheet.
The logo, with the three apps in the tray.

I used Linux in college. But life kept sending me Microsoft Office files and asking for things in Photoshop, so around 2008 I moved to the Mac. There I met iWork, which came with the computer, and before long I had dropped Microsoft Office. Then Apple rewrote iWork for 64 bits, and the new version shipped without many features that never came back.

Now Linux is my main system again, and I decided to build for it the iWork equivalent I wished I had. LibreOffice is an admirable project, but it has a lot I don't use, and it doesn't look at home in GNOME. Desk brings both together: the simplicity of iWork '09 and the look and feel of a real GNOME app.

What it does

The project started with Desk Writer, because the text engine is the hardest part and the other two apps depend on it. Today:

  • Opens Pages '09 documents: it reads their text, lays them out into pages as Pages does and lists what they hold that Desk cannot show yet.
  • Edits and saves: Desk Writer opens, edits and formats text, with undo and the clipboard, and saves it as OpenDocument (ODT), with documented extensions for what standard ODF cannot hold.
  • Formats like Pages: the format bar, the Inspector, styles and lists, tab stops and rulers, hyphenation, spelling, find and replace, sections, columns, headers and footers, footnotes, tables of contents and links.
  • Works with a screen reader: the UI tests drive Desk Writer through the accessibility tree, as a screen reader does.
  • Converts without an interface: desk-convert makes PDFs from the command line, with no GTK.
  • Speaks Portuguese: the interface is in English and Brazilian Portuguese.

Desk Tables and Desk Slides start once the object and table engines are ready. The file format libraries are kept apart from the interface, under the MPL-2.0 license, so that other programs can read and write the same formats.

How it was made

I am building Desk together with Claude, Anthropic's AI, with the same rigor expected of a team. Every feature of Pages, Numbers and Keynote '09 became a row of a parity matrix, 585 in all, and what Desk makes is compared with PDFs made by iWork 9.3 itself, in a virtual machine. The CI checks formatting, lints, tests, documentation, the licenses of dependencies and REUSE compliance.

The first decision was how to build the text engine. An experiment laid out the same justified, hyphenated paragraph around a circle three ways: with the Parley library and its own line breaker, with Parley and our line breaking, and with an engine of our own. Parley stayed, with Desk deciding where each line ends.

The same justified, hyphenated paragraph, wrapping around a blue circle in the middle of the column, laid out three times side by side: with Parley and its breaker, with Parley and Desk's breaking, and with an engine of our own.
The experiment that chose the text engine.

The first commit is from October 30, 2026. Since November 1, Desk Writer comes out every night as a nightly Flatpak, built from main, for testing. There is no stable version yet.

The apps are under the GPL-3.0-or-later license. Desk is not affiliated with Apple; iWork, Pages, Numbers and Keynote are trademarks of Apple Inc.

Details

Status

In development, starting with Desk Writer, which has a nightly test version as a Flatpak. No stable version yet.

Year

2026

Technologies

Rust, GTK 4, Libadwaita, OpenDocument (ODF)

Links

More projects

Previous