Bump to 0.6.0; add a Linux riscv64 release build (#945)

- Cargo.toml: [workspace.package] and the internal path-dependency requirements move to 0.6.0
  (they pinned 0.5.0, which `cargo update -w` can't match); Cargo.lock refreshed.
- release.yml: new `linux-riscv64` job, ported from GridCraft. Cross-compiles on ubuntu-24.04
  against ports.ubuntu.com riscv64 libs (the linux job's -dev packages, :riscv64), builds the
  tar.gz and the CLI-only tar.gz, smoke-tests pdfcraft-cli under QEMU, and is in the draft
  release job's needs, so SHA256SUMS covers it.
- packaging/linux/package.sh: CROSS_ARCH / CROSS_TARGET / CROSS_COMPILE / EMULATOR support.
- README and docs/releasing.md list the riscv64 tarballs (glibc 2.39+).
- contributors.json refreshed.

Co-authored-by: Claude Opus 5.5 <[email protected]>
This commit is contained in:
Brandon ThomasandClaude Opus 5.5 authored and GitHub committed 2026-10-10 20:50:57 -04:00
1 parent b8ddf71e30
commit 53a5880386
7 files changed
+548 -178

No files matched your search

+86 -1
View File
@@ -247,6 +247,91 @@ jobs:
path: dist/release/*
if-no-files-found: error
linux-riscv64:
name: Linux riscv64
needs: version
# Cross-compiled on x86_64 (no hosted RISC-V runners) against the runner's own Ubuntu release
# from ports.ubuntu.com, so the binaries need that release's glibc (24.04: 2.39). 22.04's
# riscv64 ports lag its amd64 updates, which breaks the multiarch install. tar.gz only (the
# app tree and the CLI-only archive); the CLI is smoke-tested under QEMU.
runs-on: ubuntu-24.04
# No `environment: release`: this job signs nothing, so it gets no release secrets.
env:
PDFCRAFT_VERSION: ${{ needs.version.outputs.version }}
PDFCRAFT_BUILD_DATE: ${{ needs.version.outputs.date }}
steps:
- uses: actions/checkout@v4
# The craft-fonts build input (Japanese fonts): every release embeds it. Bump deliberately.
- name: Check out craft-fonts
uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
with:
repository: storytold/craft-fonts
ref: 8dcdacd5153e64560d109541a47d806f26f048c0
path: craft-fonts
- uses: dtolnay/rust-toolchain@stable
with:
targets: riscv64gc-unknown-linux-gnu
- uses: Swatinem/rust-cache@v2
with:
key: release-linux-riscv64
- name: Apply version override
if: inputs.version != ''
run: cargo xtask version set "$PDFCRAFT_VERSION"
- name: Install cross-compilation dependencies
run: |
. /etc/os-release
sudo dpkg --add-architecture riscv64
# Pin the existing (archive.ubuntu.com) sources to amd64; riscv64 comes from ports.
if [ -f /etc/apt/sources.list.d/ubuntu.sources ]; then
sudo sed -i '/^Types: deb/a Architectures: amd64' /etc/apt/sources.list.d/ubuntu.sources
fi
if [ -f /etc/apt/sources.list ]; then
sudo sed -i 's/^deb /deb [arch=amd64] /g' /etc/apt/sources.list
sudo sed -i 's/^deb-src /deb-src [arch=amd64] /g' /etc/apt/sources.list
fi
for suite in "$VERSION_CODENAME" "$VERSION_CODENAME-updates" "$VERSION_CODENAME-security"; do
echo "deb [arch=riscv64] http://ports.ubuntu.com/ubuntu-ports $suite main universe restricted multiverse"
done | sudo tee /etc/apt/sources.list.d/riscv64.list
sudo apt-get update
# The same -dev packages as the linux job, for riscv64; the C toolchain also builds
# aws-lc-sys and ring (signing, TLS).
sudo apt-get install -y --no-install-recommends \
gcc-riscv64-linux-gnu g++-riscv64-linux-gnu binutils-riscv64-linux-gnu libc6-dev-riscv64-cross \
libc6-dev:riscv64 qemu-user \
libxkbcommon-dev:riscv64 libwayland-dev:riscv64 libx11-dev:riscv64 libxrandr-dev:riscv64 \
libxi-dev:riscv64 libgl1-mesa-dev:riscv64
- name: Build and package (tar.gz, CLI tar.gz)
env:
CRAFT_FONTS_DIR: ${{ github.workspace }}/craft-fonts
CRAFT_FONTS_REQUIRED: "1"
CARGO_TARGET_RISCV64GC_UNKNOWN_LINUX_GNU_LINKER: riscv64-linux-gnu-gcc
CC_riscv64gc_unknown_linux_gnu: riscv64-linux-gnu-gcc
CXX_riscv64gc_unknown_linux_gnu: riscv64-linux-gnu-g++
AR_riscv64gc_unknown_linux_gnu: riscv64-linux-gnu-ar
PKG_CONFIG_SYSROOT_DIR: /
PKG_CONFIG_PATH: /usr/lib/riscv64-linux-gnu/pkgconfig:/usr/share/pkgconfig
PKG_CONFIG_ALLOW_CROSS: "1"
CROSS_ARCH: riscv64
CROSS_TARGET: riscv64gc-unknown-linux-gnu
CROSS_COMPILE: riscv64-linux-gnu-
EMULATOR: qemu-riscv64
QEMU_LD_PREFIX: /usr/riscv64-linux-gnu
run: packaging/linux/package.sh --formats "tar cli"
- name: Check the packages
run: |
tar -tzf "dist/release/pdfcraft-$PDFCRAFT_VERSION-linux-riscv64.tar.gz" | grep -E '/bin/pdfcraft$'
# The OCR models (#103), where the installed app looks: <bin>/../share/pdfcraft/models.
tar -tzf "dist/release/pdfcraft-$PDFCRAFT_VERSION-linux-riscv64.tar.gz" | grep -E '/share/pdfcraft/models/.+\.rten$'
cli="dist/release/pdfcraft-cli-$PDFCRAFT_VERSION-linux-riscv64.tar.gz"
tar -tzf "$cli" | grep -E '/pdfcraft-cli$'
tar -tzf "$cli" | grep -E '/LICENSE-APACHE$'
file target/riscv64gc-unknown-linux-gnu/release/pdfcraft | grep -F 'RISC-V'
- uses: actions/upload-artifact@v4
with:
name: release-linux-riscv64
path: dist/release/*.tar.gz
if-no-files-found: error
flatpak:
name: Flatpak ${{ matrix.arch }}
needs: [version, linux]
@@ -379,7 +464,7 @@ jobs:
release:
name: Draft GitHub Release
# Needs the signing jobs, which only run on `release`: a branch dry run never drafts a release.
needs: [version, macos, windows, linux, flatpak, freebsd, web]
needs: [version, macos, windows, linux, linux-riscv64, flatpak, freebsd, web]
runs-on: ubuntu-latest
environment: release
permissions:
Generated
+33 -33
View File
@@ -3543,7 +3543,7 @@ dependencies = [
[[package]]
name = "pdfcraft"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"eframe",
"egui",
@@ -3561,7 +3561,7 @@ dependencies = [
[[package]]
name = "pdfcraft-a11y"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"pdfcraft-content",
"pdfcraft-cos",
@@ -3572,7 +3572,7 @@ dependencies = [
[[package]]
name = "pdfcraft-annot"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"hayro-syntax",
"pdfcraft-cos",
@@ -3583,7 +3583,7 @@ dependencies = [
[[package]]
name = "pdfcraft-automation"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"base64 0.22.1",
"image",
@@ -3600,7 +3600,7 @@ dependencies = [
[[package]]
name = "pdfcraft-cli"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"base64 0.22.1",
"pdfcraft-automation",
@@ -3614,18 +3614,18 @@ dependencies = [
[[package]]
name = "pdfcraft-compare"
version = "0.5.0"
version = "0.6.0"
[[package]]
name = "pdfcraft-content"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"pdfcraft-cos",
]
[[package]]
name = "pdfcraft-cos"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"hayro-syntax",
"pdfcraft-crypt",
@@ -3637,7 +3637,7 @@ dependencies = [
[[package]]
name = "pdfcraft-create"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"encoding_rs",
"hayro-syntax",
@@ -3652,7 +3652,7 @@ dependencies = [
[[package]]
name = "pdfcraft-crypt"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"aes",
"md-5",
@@ -3664,7 +3664,7 @@ dependencies = [
[[package]]
name = "pdfcraft-edit"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"hayro-syntax",
"pdfcraft-annot",
@@ -3678,7 +3678,7 @@ dependencies = [
[[package]]
name = "pdfcraft-engine"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"chrono",
"icu_properties",
@@ -3713,14 +3713,14 @@ dependencies = [
[[package]]
name = "pdfcraft-export"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"flate2",
]
[[package]]
name = "pdfcraft-filters"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"flate2",
"proptest",
@@ -3730,7 +3730,7 @@ dependencies = [
[[package]]
name = "pdfcraft-fonts"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"harfrust",
"pdfcraft-cos",
@@ -3739,7 +3739,7 @@ dependencies = [
[[package]]
name = "pdfcraft-forms"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"hayro-syntax",
"pdfcraft-content",
@@ -3751,18 +3751,18 @@ dependencies = [
[[package]]
name = "pdfcraft-geom"
version = "0.5.0"
version = "0.6.0"
[[package]]
name = "pdfcraft-js"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"boa_engine",
]
[[package]]
name = "pdfcraft-measure"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"pdfcraft-annot",
"pdfcraft-content",
@@ -3774,14 +3774,14 @@ dependencies = [
[[package]]
name = "pdfcraft-model"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"pdfcraft-cos",
]
[[package]]
name = "pdfcraft-ocr"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"ocrs",
"pdfcraft-fonts",
@@ -3791,7 +3791,7 @@ dependencies = [
[[package]]
name = "pdfcraft-optimize"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"image",
"pdfcraft-annot",
@@ -3804,7 +3804,7 @@ dependencies = [
[[package]]
name = "pdfcraft-organize"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"hayro-syntax",
"pdfcraft-content",
@@ -3814,14 +3814,14 @@ dependencies = [
[[package]]
name = "pdfcraft-platform"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"zbus",
]
[[package]]
name = "pdfcraft-preflight"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"pdfcraft-cos",
"pdfcraft-model",
@@ -3829,7 +3829,7 @@ dependencies = [
[[package]]
name = "pdfcraft-print"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"pdfcraft-content",
"pdfcraft-cos",
@@ -3839,7 +3839,7 @@ dependencies = [
[[package]]
name = "pdfcraft-redact"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"pdfcraft-annot",
"pdfcraft-content",
@@ -3853,7 +3853,7 @@ dependencies = [
[[package]]
name = "pdfcraft-render"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"bytemuck",
"flate2",
@@ -3871,7 +3871,7 @@ dependencies = [
[[package]]
name = "pdfcraft-sign"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"aes",
"aws-lc-rs",
@@ -3905,7 +3905,7 @@ dependencies = [
[[package]]
name = "pdfcraft-ui-egui"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"arboard",
"base64 0.22.1",
@@ -3944,7 +3944,7 @@ dependencies = [
[[package]]
name = "pdfcraft-web"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"eframe",
"egui",
@@ -3956,7 +3956,7 @@ dependencies = [
[[package]]
name = "pdfcraft-xfa"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"base64 0.22.1",
"image",
@@ -3970,7 +3970,7 @@ dependencies = [
[[package]]
name = "pdfcraft-xfdf"
version = "0.5.0"
version = "0.6.0"
dependencies = [
"pdfcraft-annot",
"pdfcraft-cos",
+31 -31
View File
@@ -5,7 +5,7 @@ exclude = ["vendor"]
default-members = ["crates/*", "apps/pdfcraft", "apps/pdfcraft-cli", "xtask"]
[workspace.package]
version = "0.5.0"
version = "0.6.0"
edition = "2024"
license = "MIT OR Apache-2.0"
rust-version = "1.90"
@@ -13,36 +13,36 @@ repository = "https://github.com/storytold/pdfcraft"
[workspace.dependencies]
# internal
pdfcraft-geom = { path = "crates/geom", version = "0.5.0" }
pdfcraft-filters = { path = "crates/filters", version = "0.5.0" }
pdfcraft-cos = { path = "crates/cos", version = "0.5.0" }
pdfcraft-crypt = { path = "crates/crypt", version = "0.5.0" }
pdfcraft-organize = { path = "crates/organize", version = "0.5.0" }
pdfcraft-measure = { path = "crates/measure", version = "0.5.0" }
pdfcraft-annot = { path = "crates/annot", version = "0.5.0" }
pdfcraft-fonts = { path = "crates/fonts", version = "0.5.0" }
pdfcraft-model = { path = "crates/model", version = "0.5.0" }
pdfcraft-content = { path = "crates/content", version = "0.5.0" }
pdfcraft-redact = { path = "crates/redact", version = "0.5.0" }
pdfcraft-print = { path = "crates/print", version = "0.5.0" }
pdfcraft-xfdf = { path = "crates/xfdf", version = "0.5.0" }
pdfcraft-sign = { path = "crates/sign", version = "0.5.0" }
pdfcraft-optimize = { path = "crates/optimize", version = "0.5.0" }
pdfcraft-a11y = { path = "crates/a11y", version = "0.5.0" }
pdfcraft-ocr = { path = "crates/ocr", version = "0.5.0" }
pdfcraft-js = { path = "crates/js", version = "0.5.0" }
pdfcraft-compare = { path = "crates/compare", version = "0.5.0" }
pdfcraft-preflight = { path = "crates/preflight", version = "0.5.0" }
pdfcraft-export = { path = "crates/export", version = "0.5.0" }
pdfcraft-edit = { path = "crates/edit", version = "0.5.0" }
pdfcraft-create = { path = "crates/create", version = "0.5.0" }
pdfcraft-forms = { path = "crates/forms", version = "0.5.0" }
pdfcraft-xfa = { path = "crates/xfa", version = "0.5.0" }
pdfcraft-render = { path = "crates/render", version = "0.5.0" }
pdfcraft-engine = { path = "crates/engine", version = "0.5.0" }
pdfcraft-platform = { path = "crates/platform", version = "0.5.0" }
pdfcraft-ui-egui = { path = "crates/ui-egui", version = "0.5.0" }
pdfcraft-automation = { path = "crates/automation", version = "0.5.0", default-features = false }
pdfcraft-geom = { path = "crates/geom", version = "0.6.0" }
pdfcraft-filters = { path = "crates/filters", version = "0.6.0" }
pdfcraft-cos = { path = "crates/cos", version = "0.6.0" }
pdfcraft-crypt = { path = "crates/crypt", version = "0.6.0" }
pdfcraft-organize = { path = "crates/organize", version = "0.6.0" }
pdfcraft-measure = { path = "crates/measure", version = "0.6.0" }
pdfcraft-annot = { path = "crates/annot", version = "0.6.0" }
pdfcraft-fonts = { path = "crates/fonts", version = "0.6.0" }
pdfcraft-model = { path = "crates/model", version = "0.6.0" }
pdfcraft-content = { path = "crates/content", version = "0.6.0" }
pdfcraft-redact = { path = "crates/redact", version = "0.6.0" }
pdfcraft-print = { path = "crates/print", version = "0.6.0" }
pdfcraft-xfdf = { path = "crates/xfdf", version = "0.6.0" }
pdfcraft-sign = { path = "crates/sign", version = "0.6.0" }
pdfcraft-optimize = { path = "crates/optimize", version = "0.6.0" }
pdfcraft-a11y = { path = "crates/a11y", version = "0.6.0" }
pdfcraft-ocr = { path = "crates/ocr", version = "0.6.0" }
pdfcraft-js = { path = "crates/js", version = "0.6.0" }
pdfcraft-compare = { path = "crates/compare", version = "0.6.0" }
pdfcraft-preflight = { path = "crates/preflight", version = "0.6.0" }
pdfcraft-export = { path = "crates/export", version = "0.6.0" }
pdfcraft-edit = { path = "crates/edit", version = "0.6.0" }
pdfcraft-create = { path = "crates/create", version = "0.6.0" }
pdfcraft-forms = { path = "crates/forms", version = "0.6.0" }
pdfcraft-xfa = { path = "crates/xfa", version = "0.6.0" }
pdfcraft-render = { path = "crates/render", version = "0.6.0" }
pdfcraft-engine = { path = "crates/engine", version = "0.6.0" }
pdfcraft-platform = { path = "crates/platform", version = "0.6.0" }
pdfcraft-ui-egui = { path = "crates/ui-egui", version = "0.6.0" }
pdfcraft-automation = { path = "crates/automation", version = "0.6.0", default-features = false }
# pdf
hayro = "0.7.1"
+3 -1
View File
@@ -455,7 +455,9 @@ Use the MSI for your architecture. Per-user installation overrides are not suppo
| Tarball | `pdfcraft-<ver>-linux-x86_64.tar.gz` | `pdfcraft-<ver>-linux-aarch64.tar.gz` | Unpack anywhere |
| Command-line tool | `pdfcraft-cli-<ver>-linux-x86_64.tar.gz` | `pdfcraft-cli-<ver>-linux-aarch64.tar.gz` | `pdfcraft-cli` alone (and its opt-in MCP server), for servers, CI and agents |
Every Linux build needs glibc 2.35 or newer (Ubuntu 22.04+, Debian 12+, Fedora 36+, RHEL 10).
RISC-V (riscv64) builds come as tarballs only: `pdfcraft-<ver>-linux-riscv64.tar.gz` and `pdfcraft-cli-<ver>-linux-riscv64.tar.gz`. They are cross-compiled and need glibc 2.39 or newer (Ubuntu 24.04+, Debian 13+).
Every other Linux build needs glibc 2.35 or newer (Ubuntu 22.04+, Debian 12+, Fedora 36+, RHEL 10).
### FreeBSD
+374 -105
View File
@@ -2,23 +2,23 @@
"schema": 1,
"repo": "storytold/pdfcraft",
"branch": "main",
"head": "49c6e2ec5437a355da4e9dadd9cc2db3476b5cf8",
"head_date": "2026-10-10T00:56:13Z",
"commits": 493,
"head": "b8ddf71e30959dc8a5ca4b66c40b8fcaea68cf76",
"head_date": "2026-10-10T21:42:20Z",
"commits": 627,
"unattributed_commits": 0,
"contributors": [
{
"login": "echelon",
"people_entry": true,
"github_name": null,
"prs": 77,
"commits": 258,
"lines_added": 221771,
"lines_deleted": 11405,
"prs": 78,
"commits": 261,
"lines_added": 224353,
"lines_deleted": 11715,
"binary_added": 81,
"binary_deleted": 25,
"first_commit": "2026-09-30T09:17:08Z",
"last_commit": "2026-10-09T22:42:23Z"
"last_commit": "2026-10-10T18:23:28Z"
},
{
"login": "storybored379",
@@ -37,14 +37,14 @@
"login": "justinjohn0306",
"people_entry": false,
"github_name": null,
"prs": 3,
"commits": 2,
"lines_added": 2936,
"lines_deleted": 159,
"prs": 4,
"commits": 3,
"lines_added": 3012,
"lines_deleted": 161,
"binary_added": 1,
"binary_deleted": 0,
"first_commit": "2026-10-05T11:48:23Z",
"last_commit": "2026-10-08T03:02:40Z"
"last_commit": "2026-10-10T19:39:15Z"
},
{
"login": "midasdf",
@@ -89,14 +89,14 @@
"login": "jcl-bit",
"people_entry": true,
"github_name": null,
"prs": 15,
"commits": 15,
"lines_added": 11099,
"lines_deleted": 348,
"prs": 16,
"commits": 16,
"lines_added": 11248,
"lines_deleted": 365,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-08T01:12:32Z",
"last_commit": "2026-10-09T23:09:23Z"
"last_commit": "2026-10-10T10:14:36Z"
},
{
"login": "rutkk",
@@ -115,14 +115,14 @@
"login": "ShauryaSwarup",
"people_entry": false,
"github_name": null,
"prs": 1,
"commits": 1,
"lines_added": 4,
"prs": 2,
"commits": 2,
"lines_added": 59,
"lines_deleted": 1,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-08T01:12:50Z",
"last_commit": "2026-10-08T01:12:50Z"
"last_commit": "2026-10-10T10:04:44Z"
},
{
"login": "cmoro-deusto",
@@ -232,14 +232,14 @@
"login": "DWAA1660",
"people_entry": false,
"github_name": null,
"prs": 4,
"commits": 4,
"lines_added": 1003,
"lines_deleted": 55,
"prs": 12,
"commits": 12,
"lines_added": 2199,
"lines_deleted": 187,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-08T01:37:28Z",
"last_commit": "2026-10-08T16:49:25Z"
"last_commit": "2026-10-10T21:39:39Z"
},
{
"login": "pauliusiv123-rgb",
@@ -336,14 +336,14 @@
"login": "Mawfyy",
"people_entry": false,
"github_name": null,
"prs": 4,
"commits": 4,
"lines_added": 327,
"lines_deleted": 28,
"prs": 5,
"commits": 5,
"lines_added": 458,
"lines_deleted": 31,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-08T03:14:45Z",
"last_commit": "2026-10-08T20:46:22Z"
"last_commit": "2026-10-10T01:26:23Z"
},
{
"login": "ysrdevs",
@@ -362,14 +362,14 @@
"login": "CQMHV",
"people_entry": false,
"github_name": null,
"prs": 3,
"commits": 3,
"lines_added": 661,
"lines_deleted": 75,
"prs": 4,
"commits": 4,
"lines_added": 745,
"lines_deleted": 86,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-08T03:45:02Z",
"last_commit": "2026-10-08T17:40:30Z"
"last_commit": "2026-10-10T19:46:22Z"
},
{
"login": "neavo",
@@ -453,14 +453,14 @@
"login": "cyfung1031",
"people_entry": true,
"github_name": null,
"prs": 21,
"commits": 21,
"lines_added": 66562,
"lines_deleted": 205,
"prs": 63,
"commits": 63,
"lines_added": 71877,
"lines_deleted": 726,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-08T13:00:21Z",
"last_commit": "2026-10-09T18:12:43Z"
"last_commit": "2026-10-10T21:17:13Z"
},
{
"login": "XusBadia",
@@ -505,14 +505,14 @@
"login": "EpsilonLLC",
"people_entry": false,
"github_name": null,
"prs": 1,
"commits": 1,
"lines_added": 326,
"lines_deleted": 30,
"prs": 2,
"commits": 2,
"lines_added": 676,
"lines_deleted": 103,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-08T17:02:52Z",
"last_commit": "2026-10-08T17:02:52Z"
"last_commit": "2026-10-10T20:25:24Z"
},
{
"login": "sanyamsingh001",
@@ -544,14 +544,14 @@
"login": "mlkonrad",
"people_entry": true,
"github_name": null,
"prs": 2,
"commits": 2,
"lines_added": 3129,
"lines_deleted": 206,
"prs": 6,
"commits": 6,
"lines_added": 3847,
"lines_deleted": 268,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-08T19:37:10Z",
"last_commit": "2026-10-08T22:46:34Z"
"last_commit": "2026-10-10T20:41:27Z"
},
{
"login": "Fazmin",
@@ -596,14 +596,14 @@
"login": "MarekSpodBiedry",
"people_entry": false,
"github_name": null,
"prs": 4,
"commits": 4,
"lines_added": 773,
"lines_deleted": 113,
"prs": 15,
"commits": 15,
"lines_added": 1317,
"lines_deleted": 135,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-08T21:29:59Z",
"last_commit": "2026-10-09T13:14:55Z"
"last_commit": "2026-10-10T19:50:20Z"
},
{
"login": "MaksPV",
@@ -778,14 +778,14 @@
"login": "LloydNicholson",
"people_entry": false,
"github_name": null,
"prs": 4,
"commits": 4,
"lines_added": 646,
"lines_deleted": 66,
"prs": 8,
"commits": 8,
"lines_added": 1204,
"lines_deleted": 119,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-09T16:19:10Z",
"last_commit": "2026-10-09T18:44:11Z"
"last_commit": "2026-10-10T21:42:20Z"
},
{
"login": "martinjohuber",
@@ -804,14 +804,14 @@
"login": "bartalos86",
"people_entry": false,
"github_name": null,
"prs": 6,
"commits": 6,
"lines_added": 3873,
"lines_deleted": 176,
"prs": 11,
"commits": 11,
"lines_added": 5353,
"lines_deleted": 323,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-09T16:28:06Z",
"last_commit": "2026-10-09T22:45:54Z"
"last_commit": "2026-10-10T12:32:09Z"
},
{
"login": "dmatviichuk",
@@ -895,14 +895,14 @@
"login": "tanish2k09",
"people_entry": false,
"github_name": null,
"prs": 2,
"commits": 2,
"lines_added": 698,
"lines_deleted": 3,
"prs": 3,
"commits": 3,
"lines_added": 1078,
"lines_deleted": 36,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-09T18:44:37Z",
"last_commit": "2026-10-09T18:46:42Z"
"last_commit": "2026-10-10T01:26:54Z"
},
{
"login": "thorstenhirsch",
@@ -934,27 +934,27 @@
"login": "haranishi",
"people_entry": false,
"github_name": null,
"prs": 1,
"commits": 1,
"lines_added": 158,
"lines_deleted": 2,
"prs": 4,
"commits": 4,
"lines_added": 875,
"lines_deleted": 25,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-09T22:45:11Z",
"last_commit": "2026-10-09T22:45:11Z"
"last_commit": "2026-10-10T19:54:26Z"
},
{
"login": "Tevinhead",
"people_entry": false,
"github_name": null,
"prs": 1,
"commits": 1,
"lines_added": 312,
"lines_deleted": 21,
"prs": 5,
"commits": 5,
"lines_added": 5102,
"lines_deleted": 310,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-09T22:52:13Z",
"last_commit": "2026-10-09T22:52:13Z"
"last_commit": "2026-10-10T21:38:34Z"
},
{
"login": "rschuerer",
@@ -1012,14 +1012,274 @@
"login": "edurbs",
"people_entry": false,
"github_name": null,
"prs": 1,
"commits": 1,
"lines_added": 2114,
"lines_deleted": 5,
"prs": 3,
"commits": 3,
"lines_added": 2517,
"lines_deleted": 41,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-10T00:56:13Z",
"last_commit": "2026-10-10T00:56:13Z"
"last_commit": "2026-10-10T02:39:36Z"
},
{
"login": "mmmaarian03-crypto",
"people_entry": false,
"github_name": null,
"prs": 2,
"commits": 2,
"lines_added": 173,
"lines_deleted": 40,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-10T10:04:32Z",
"last_commit": "2026-10-10T10:19:07Z"
},
{
"login": "Hathor875",
"people_entry": true,
"github_name": "Krzysztof Cieślik",
"prs": 3,
"commits": 3,
"lines_added": 92,
"lines_deleted": 6,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-10T10:12:10Z",
"last_commit": "2026-10-10T19:11:19Z"
},
{
"login": "oussama-dalhi",
"people_entry": false,
"github_name": null,
"prs": 1,
"commits": 1,
"lines_added": 20,
"lines_deleted": 1,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-10T10:12:57Z",
"last_commit": "2026-10-10T10:12:57Z"
},
{
"login": "Toddpe",
"people_entry": false,
"github_name": null,
"prs": 2,
"commits": 2,
"lines_added": 392,
"lines_deleted": 207,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-10T10:15:06Z",
"last_commit": "2026-10-10T10:32:06Z"
},
{
"login": "benimaru327",
"people_entry": false,
"github_name": null,
"prs": 1,
"commits": 1,
"lines_added": 429,
"lines_deleted": 0,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-10T10:23:11Z",
"last_commit": "2026-10-10T10:23:11Z"
},
{
"login": "abdelhaqelamraoui",
"people_entry": false,
"github_name": null,
"prs": 1,
"commits": 1,
"lines_added": 2661,
"lines_deleted": 42,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-10T10:36:54Z",
"last_commit": "2026-10-10T10:36:54Z"
},
{
"login": "silverhadch",
"people_entry": false,
"github_name": null,
"prs": 2,
"commits": 2,
"lines_added": 650,
"lines_deleted": 62,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-10T12:19:45Z",
"last_commit": "2026-10-10T20:28:29Z"
},
{
"login": "muraa-p",
"people_entry": false,
"github_name": null,
"prs": 7,
"commits": 7,
"lines_added": 225,
"lines_deleted": 24,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-10T19:06:02Z",
"last_commit": "2026-10-10T19:31:35Z"
},
{
"login": "ch0kemeister",
"people_entry": false,
"github_name": null,
"prs": 3,
"commits": 3,
"lines_added": 147,
"lines_deleted": 32,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-10T19:07:38Z",
"last_commit": "2026-10-10T19:50:55Z"
},
{
"login": "Ni-zav",
"people_entry": false,
"github_name": null,
"prs": 1,
"commits": 1,
"lines_added": 41,
"lines_deleted": 1,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-10T19:29:47Z",
"last_commit": "2026-10-10T19:29:47Z"
},
{
"login": "snipeTR",
"people_entry": false,
"github_name": null,
"prs": 5,
"commits": 5,
"lines_added": 495,
"lines_deleted": 66,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-10T19:32:07Z",
"last_commit": "2026-10-10T21:10:39Z"
},
{
"login": "gyurix",
"people_entry": false,
"github_name": null,
"prs": 1,
"commits": 1,
"lines_added": 188,
"lines_deleted": 5,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-10T19:47:33Z",
"last_commit": "2026-10-10T19:47:33Z"
},
{
"login": "CyberFox-81",
"people_entry": false,
"github_name": null,
"prs": 1,
"commits": 1,
"lines_added": 211,
"lines_deleted": 6,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-10T19:50:06Z",
"last_commit": "2026-10-10T19:50:06Z"
},
{
"login": "A-viral-dev",
"people_entry": false,
"github_name": null,
"prs": 1,
"commits": 1,
"lines_added": 7,
"lines_deleted": 8,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-10T19:50:42Z",
"last_commit": "2026-10-10T19:50:42Z"
},
{
"login": "taylorandrew07-lab",
"people_entry": false,
"github_name": null,
"prs": 5,
"commits": 5,
"lines_added": 6295,
"lines_deleted": 389,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-10T20:20:50Z",
"last_commit": "2026-10-10T21:01:08Z"
},
{
"login": "80aa08",
"people_entry": false,
"github_name": null,
"prs": 1,
"commits": 1,
"lines_added": 2227,
"lines_deleted": 3,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-10T21:03:47Z",
"last_commit": "2026-10-10T21:03:47Z"
},
{
"login": "jay-tau",
"people_entry": true,
"github_name": "Joel Tony",
"prs": 1,
"commits": 1,
"lines_added": 65,
"lines_deleted": 9,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-10T21:04:14Z",
"last_commit": "2026-10-10T21:04:14Z"
},
{
"login": "mitul72",
"people_entry": false,
"github_name": null,
"prs": 1,
"commits": 1,
"lines_added": 293,
"lines_deleted": 15,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-10T21:13:52Z",
"last_commit": "2026-10-10T21:13:52Z"
},
{
"login": "joeabouserhal",
"people_entry": false,
"github_name": null,
"prs": 1,
"commits": 1,
"lines_added": 127,
"lines_deleted": 12,
"binary_added": 1,
"binary_deleted": 0,
"first_commit": "2026-10-10T21:21:30Z",
"last_commit": "2026-10-10T21:21:30Z"
},
{
"login": "dsskaggs-ai",
"people_entry": false,
"github_name": null,
"prs": 1,
"commits": 1,
"lines_added": 41,
"lines_deleted": 3,
"binary_added": 0,
"binary_deleted": 0,
"first_commit": "2026-10-10T21:39:55Z",
"last_commit": "2026-10-10T21:39:55Z"
}
],
"models": [
@@ -1028,45 +1288,54 @@
"company": "Anthropic",
"model": "Claude Opus",
"version": "5.5",
"commits": 392,
"lines_added": 299122,
"lines_deleted": 16822
"commits": 452,
"lines_added": 320722,
"lines_deleted": 18683
},
{
"id": "openai/codex",
"company": "OpenAI",
"model": "Codex",
"version": "",
"commits": 43,
"lines_added": 20596,
"lines_deleted": 2467
"commits": 52,
"lines_added": 28322,
"lines_deleted": 3099
},
{
"id": "anthropic/claude-fable/5.1",
"company": "Anthropic",
"model": "Claude Fable",
"version": "5.1",
"commits": 9,
"lines_added": 1028,
"lines_deleted": 112
"commits": 13,
"lines_added": 1525,
"lines_deleted": 217
},
{
"id": "anthropic/claude-opus/5",
"company": "Anthropic",
"model": "Claude Opus",
"version": "5",
"commits": 9,
"lines_added": 3783,
"lines_deleted": 197
"commits": 10,
"lines_added": 4163,
"lines_deleted": 230
},
{
"id": "anthropic/claude-sonnet/5.5",
"company": "Anthropic",
"model": "Claude Sonnet",
"version": "5.5",
"commits": 4,
"lines_added": 2839,
"lines_deleted": 135
"commits": 7,
"lines_added": 3556,
"lines_deleted": 158
},
{
"id": "anthropic/claude-haiku/5.5",
"company": "Anthropic",
"model": "Claude Haiku",
"version": "5.5",
"commits": 6,
"lines_added": 1813,
"lines_deleted": 179
},
{
"id": "anthropic/claude",
@@ -1082,9 +1351,9 @@
"company": "Anthropic",
"model": "Claude Opus",
"version": "4.8",
"commits": 1,
"lines_added": 1632,
"lines_deleted": 3
"commits": 2,
"lines_added": 1708,
"lines_deleted": 5
},
{
"id": "anthropic/claude-sonnet/5",
+1
View File
@@ -50,6 +50,7 @@ published (`gh workflow run release.yml --ref <branch>`).
| Windows 11 on ARM64 | `pdfcraft-<v>-windows-arm64.msi`, `pdfcraft-<v>-windows-arm64-portable.zip` | `windows-latest` (cross-compiled) |
| Linux x86_64 | `pdfcraft-<v>-linux-x86_64.{AppImage,AppImage.zsync,deb,rpm,tar.gz}`, `pdfcraft-cli-<v>-linux-x86_64.tar.gz` | `ubuntu-22.04` |
| Linux aarch64 | `pdfcraft-<v>-linux-aarch64.{AppImage,AppImage.zsync,deb,rpm,tar.gz}`, `pdfcraft-cli-<v>-linux-aarch64.tar.gz` | `ubuntu-22.04-arm` |
| Linux riscv64 | `pdfcraft-<v>-linux-riscv64.tar.gz`, `pdfcraft-cli-<v>-linux-riscv64.tar.gz` (glibc 2.39+) | `ubuntu-24.04` (cross-compiled; CLI smoke-tested under QEMU) |
| Flatpak x86_64 | `pdfcraft-<v>-linux-x86_64.flatpak` | `ubuntu-24.04` (repackages the Linux tarball) |
| Flatpak aarch64 | `pdfcraft-<v>-linux-aarch64.flatpak` | `ubuntu-24.04-arm` (repackages the Linux tarball) |
| FreeBSD 14 x86_64 | `pdfcraft-<v>-freebsd-x86_64.tar.gz` | FreeBSD VM on `ubuntu-latest` |
+20 -7
View File
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
# Build and package PdfCraft for Linux (<arch> is x86_64 or aarch64):
# Build and package PdfCraft for Linux (<arch> is x86_64 or aarch64, or riscv64 when cross-compiling):
#
# $DIST/pdfcraft-<version>-linux-<arch>.AppImage any distro with glibc >= the build host's
# $DIST/pdfcraft-<version>-linux-<arch>.AppImage.zsync delta updates (needs zsyncmake)
@@ -8,6 +8,10 @@
# $DIST/pdfcraft-<version>-linux-<arch>.tar.gz plain FHS-style tree (bin/, share/)
# $DIST/pdfcraft-cli-<version>-linux-<arch>.tar.gz the headless CLI alone (servers, CI, agents)
#
# Cross-compiling (CI: riscv64, tar only): set CROSS_ARCH (riscv64), CROSS_TARGET (the Rust target),
# CROSS_COMPILE (binutils prefix, for strip) and optionally EMULATOR (e.g. qemu-riscv64) to
# smoke-test the CLI.
#
# Usage: packaging/linux/package.sh [--skip-build] [--formats "appimage deb rpm tar cli"]
#
# Needs: cargo, curl and the network (the OCR models: cargo xtask models); nfpm for deb/rpm (https://nfpm.goreleaser.com); appimagetool for the AppImage
@@ -26,13 +30,14 @@ while [ $# -gt 0 ]; do
case "$1" in
--skip-build) SKIP_BUILD=1; shift ;;
--formats) FORMATS="$2"; shift 2 ;;
-h | --help) sed -n '2,16p' "$0"; exit 0 ;;
-h | --help) sed -n '2,20p' "$0"; exit 0 ;;
*) echo "unknown argument: $1" >&2; exit 2 ;;
esac
done
ARCH="$(uname -m)"
ARCH="${CROSS_ARCH:-$(uname -m)}"
case "$ARCH" in
riscv64) DEB_ARCH=riscv64 ;;
x86_64) DEB_ARCH=amd64 ;;
aarch64 | arm64) ARCH=aarch64; DEB_ARCH=arm64 ;;
*) echo "unsupported architecture $ARCH" >&2; exit 2 ;;
@@ -43,9 +48,13 @@ BASENAME="pdfcraft-$VERSION-linux-$ARCH"
echo "==> PdfCraft $VERSION for Linux $ARCH ($FORMATS)"
if [ "$SKIP_BUILD" = 0 ]; then
(cd "$ROOT" && cargo build --release --locked -p pdfcraft -p pdfcraft-cli)
if [ -n "${CROSS_TARGET:-}" ]; then
(cd "$ROOT" && cargo build --release --locked -p pdfcraft -p pdfcraft-cli --target "$CROSS_TARGET")
else
(cd "$ROOT" && cargo build --release --locked -p pdfcraft -p pdfcraft-cli)
fi
fi
BIN="$CARGO_TARGET_DIR/release"
BIN="$CARGO_TARGET_DIR/${CROSS_TARGET:+$CROSS_TARGET/}release"
WORK="$CARGO_TARGET_DIR/linux-package"
STAGE="$WORK/root"
rm -rf "$WORK"
@@ -53,7 +62,7 @@ rm -rf "$WORK"
# ---- stage an FHS tree (shared by every format) -------------------------------------------------
install -Dm755 "$BIN/pdfcraft" "$STAGE/usr/bin/pdfcraft"
install -Dm755 "$BIN/pdfcraft-cli" "$STAGE/usr/bin/pdfcraft-cli"
strip "$STAGE/usr/bin/pdfcraft" "$STAGE/usr/bin/pdfcraft-cli" 2>/dev/null || true
"${CROSS_COMPILE:-}strip" "$STAGE/usr/bin/pdfcraft" "$STAGE/usr/bin/pdfcraft-cli" 2>/dev/null || true
install -Dm644 "$HERE/$APP_ID.desktop" "$STAGE/usr/share/applications/$APP_ID.desktop"
install -Dm644 "$HERE/$APP_ID.mime.xml" "$STAGE/usr/share/mime/packages/$APP_ID.xml"
mkdir -p "$STAGE/usr/share/metainfo"
@@ -151,6 +160,10 @@ if has appimage; then
fi
fi
"$STAGE/usr/bin/pdfcraft-cli" --version
if [ -z "${CROSS_TARGET:-}" ]; then
"$STAGE/usr/bin/pdfcraft-cli" --version
elif [ -n "${EMULATOR:-}" ]; then
"$EMULATOR" "$STAGE/usr/bin/pdfcraft-cli" --version
fi
echo "==> done"
ls -lh "$DIST"