From b13556cad79a10d5ee286c4ff6c33d3342f18547 Mon Sep 17 00:00:00 2001
From: Ryan Duguid
Date: Fri, 30 Oct 2026 08:55:12 +1100
Subject: [PATCH 1/2] docs: add badge row, CodeQL, Scorecard, CITATION.cff and
llms.txt
---
.github/workflows/codeql.yml | 46 +++++++++++++++++++++++++++++++++
.github/workflows/scorecard.yml | 39 ++++++++++++++++++++++++++++
CITATION.cff | 24 +++++++++++++++++
README.md | 15 ++++++-----
llms.txt | 40 ++++++++++++++++++++++++++++
5 files changed, 157 insertions(+), 7 deletions(-)
create mode 100644 .github/workflows/codeql.yml
create mode 100644 .github/workflows/scorecard.yml
create mode 100644 CITATION.cff
create mode 100644 llms.txt
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
new file mode 100644
index 0000000000..9348c2cdf6
--- /dev/null
+++ b/.github/workflows/codeql.yml
@@ -0,0 +1,46 @@
+name: CodeQL
+
+on:
+ push:
+ branches: [main]
+ pull_request:
+ branches: [main]
+ schedule:
+ - cron: "23 3 * * 1"
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+jobs:
+ analyze:
+ name: Analyze ${{ matrix.language }}
+ runs-on: ubuntu-latest
+ timeout-minutes: 30
+ permissions:
+ contents: read
+ security-events: write # Upload CodeQL results for this job only.
+ strategy:
+ fail-fast: false
+ matrix:
+ language: [python, rust, actions]
+ steps:
+ - name: Check out source
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ with:
+ persist-credentials: false
+
+ - name: Initialise CodeQL
+ uses: github/codeql-action/init@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4
+ with:
+ languages: ${{ matrix.language }}
+ build-mode: none
+
+ - name: Perform CodeQL analysis
+ uses: github/codeql-action/analyze@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4
+ with:
+ category: "/language:${{ matrix.language }}"
diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml
new file mode 100644
index 0000000000..0778a65763
--- /dev/null
+++ b/.github/workflows/scorecard.yml
@@ -0,0 +1,39 @@
+name: Scorecard
+
+# No push trigger: the weekly run on main publishes the results, so rescanning
+# after every merge only repeated it.
+on:
+ branch_protection_rule:
+ schedule:
+ - cron: "35 6 * * 1"
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+jobs:
+ analysis:
+ name: Scorecard analysis
+ timeout-minutes: 15
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ security-events: write # Upload Scorecard results to code scanning.
+ id-token: write # Publish results for the public Scorecard badge.
+ steps:
+ - name: Check out source
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
+ with:
+ persist-credentials: false
+
+ - name: Run Scorecard
+ uses: ossf/scorecard-action@fa7117db83c52d787ae5a89f350999701505d78e # v2.5.0
+ with:
+ results_file: results.sarif
+ results_format: sarif
+ publish_results: true
+
+ - name: Upload results to code scanning
+ uses: github/codeql-action/upload-sarif@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4.39.0
+ with:
+ sarif_file: results.sarif
diff --git a/CITATION.cff b/CITATION.cff
new file mode 100644
index 0000000000..16c98123d9
--- /dev/null
+++ b/CITATION.cff
@@ -0,0 +1,24 @@
+cff-version: 1.2.0
+message: "If you use this work, cite it with this metadata and the release tag or commit you used."
+title: "PlutarchPages"
+type: software
+authors:
+ - name: "EquityBot"
+abstract: "A clean-room PDF application in pure Rust, aiming at Adobe Acrobat Pro parity. A fork of PdfCraft."
+repository-code: "https://github.com/EquityBot/PlutarchPages"
+license-url: "https://github.com/EquityBot/PlutarchPages/blob/main/README.md#license-and-credits"
+keywords:
+ - desktop-app
+ - pdf
+ - pdf-editor
+ - pdf-tools
+ - pdf-viewer
+ - pdfcraft
+ - redaction
+ - rust
+references:
+ - type: software
+ title: "PdfCraft"
+ authors:
+ - name: "ArtCraft Team and the PdfCraft contributors"
+ repository-code: "https://github.com/storytold/pdfcraft"
diff --git a/README.md b/README.md
index 87fd23ae0e..066ac0890f 100644
--- a/README.md
+++ b/README.md
@@ -7,19 +7,20 @@
+
+
+[](https://github.com/EquityBot/PlutarchPages/actions/workflows/ci.yml) [](https://github.com/EquityBot/PlutarchPages/actions/workflows/codeql.yml)
+[](https://scorecard.dev/viewer/?uri=github.com/EquityBot/PlutarchPages)
+[](https://www.rust-lang.org/) [](#license-and-credits) [](https://github.com/storytold/pdfcraft)
+
+
+
The PDF workbench; an open-source, clean-room reimplementation of Adobe Acrobat, rebuilt in pure Rust.
Read, organize, combine, split and secure PDFs in a fast, native app, written in Rust from the ground up.
macOS · Windows · Linux · FreeBSD · the web
-
-
-
-
-
-
-
> [!NOTE]
> **PlutarchPages is a fork of [PdfCraft](https://github.com/storytold/pdfcraft) by the ArtCraft team.** It adds
> the fixes and converters listed under [Fork changes](#fork-changes). It is not an ArtCraft product, and the
diff --git a/llms.txt b/llms.txt
new file mode 100644
index 0000000000..5a4fee141b
--- /dev/null
+++ b/llms.txt
@@ -0,0 +1,40 @@
+# PlutarchPages
+
+> A fork of PdfCraft: a clean-room PDF application in pure Rust for macOS, Windows, Linux, FreeBSD
+> and the web, aiming at Adobe Acrobat Pro parity. It is alpha: pages are still drawn by the `hayro`
+> crate, and editing existing text, OCR beyond Latin script and Office import and export are thin or missing.
+
+This fork publishes no builds of its own; build it from source with Rust 1.90 or later, for example
+`git clone https://github.com/EquityBot/PlutarchPages` and then
+`cargo run --release -p pdfcraft -- some.pdf`. The program, crates and binaries keep their `pdfcraft` names.
+
+## Start
+
+- [README](https://github.com/EquityBot/PlutarchPages#readme): features, fork changes, getting started and licence.
+- [Development](https://github.com/EquityBot/PlutarchPages/blob/main/docs/development.md): environment variables, logs and diagnostics.
+- [Roadmap summary](https://github.com/EquityBot/PlutarchPages/blob/main/ROADMAP.md): stage, parity numbers and progress log.
+
+## Docs
+
+- [Architecture](https://github.com/EquityBot/PlutarchPages/blob/main/docs/architecture.md): how the crates are built and layered today.
+- [Gaps](https://github.com/EquityBot/PlutarchPages/blob/main/docs/gaps.md): known shortfalls against Acrobat Pro, ranked.
+- [Parity with Acrobat Pro](https://github.com/EquityBot/PlutarchPages/blob/main/docs/target-app-parity.md): the overall assessment and how it is measured.
+- [Milestones](https://github.com/EquityBot/PlutarchPages/blob/main/docs/roadmap.md): milestones and current focus.
+- [MCP conventions](https://github.com/EquityBot/PlutarchPages/blob/main/docs/mcp.md): the opt-in `pdfcraft-cli mcp` server.
+- [Interface language](https://github.com/EquityBot/PlutarchPages/blob/main/docs/localization.md): choosing the interface language and what each catalogue covers.
+- [Editing images](https://github.com/EquityBot/PlutarchPages/blob/main/docs/editing-images.md): moving, resizing and deleting figures.
+- [Editing several objects](https://github.com/EquityBot/PlutarchPages/blob/main/docs/editing-multiple-objects.md): moving several objects together.
+- [File format parity](https://github.com/EquityBot/PlutarchPages/blob/main/docs/file-format-parity.md): formats read and written.
+- [PDF specification parity](https://github.com/EquityBot/PlutarchPages/blob/main/docs/pdf-spec-parity.md): ISO 32000-2 and subset standards coverage.
+- [UI parity](https://github.com/EquityBot/PlutarchPages/blob/main/docs/ui-parity.md): tools, panels and shortcuts against Acrobat Pro.
+- [Hardware and platform parity](https://github.com/EquityBot/PlutarchPages/blob/main/docs/hardware-parity.md): hardware features per platform.
+- [Localization parity](https://github.com/EquityBot/PlutarchPages/blob/main/docs/localization-parity.md): per-language interface status.
+- [Contributors](https://github.com/EquityBot/PlutarchPages/blob/main/docs/contributors.md): how the About window credits contributors.
+- [Releasing](https://github.com/EquityBot/PlutarchPages/blob/main/docs/releasing.md): the release workflow.
+- [Attribution](https://github.com/EquityBot/PlutarchPages/blob/main/ATTRIBUTION.md): every bundled asset with its author, source and licence.
+- [Agent and contributor rules](https://github.com/EquityBot/PlutarchPages/blob/main/AGENTS.md): asset, clean-room and safety rules.
+
+## Related
+
+- [EquityBot](https://github.com/EquityBot): other EquityBot tools.
+- [PdfCraft](https://github.com/storytold/pdfcraft): the upstream project.
From 2ba31f2218bac301ba5002e44d8c439a9124f264 Mon Sep 17 00:00:00 2001
From: Ryan Duguid
Date: Fri, 30 Oct 2026 09:21:55 +1100
Subject: [PATCH 2/2] ci: drop Scorecard, which does not support fork
repositories
---
.github/workflows/scorecard.yml | 39 ---------------------------------
README.md | 1 -
2 files changed, 40 deletions(-)
delete mode 100644 .github/workflows/scorecard.yml
diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml
deleted file mode 100644
index 0778a65763..0000000000
--- a/.github/workflows/scorecard.yml
+++ /dev/null
@@ -1,39 +0,0 @@
-name: Scorecard
-
-# No push trigger: the weekly run on main publishes the results, so rescanning
-# after every merge only repeated it.
-on:
- branch_protection_rule:
- schedule:
- - cron: "35 6 * * 1"
- workflow_dispatch:
-
-permissions:
- contents: read
-
-jobs:
- analysis:
- name: Scorecard analysis
- timeout-minutes: 15
- runs-on: ubuntu-latest
- permissions:
- contents: read
- security-events: write # Upload Scorecard results to code scanning.
- id-token: write # Publish results for the public Scorecard badge.
- steps:
- - name: Check out source
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
- with:
- persist-credentials: false
-
- - name: Run Scorecard
- uses: ossf/scorecard-action@fa7117db83c52d787ae5a89f350999701505d78e # v2.5.0
- with:
- results_file: results.sarif
- results_format: sarif
- publish_results: true
-
- - name: Upload results to code scanning
- uses: github/codeql-action/upload-sarif@6f2ac81f5cd81fe351a197ba0b00d91d03cd2aee # v4.39.0
- with:
- sarif_file: results.sarif
diff --git a/README.md b/README.md
index 066ac0890f..8b28e73e18 100644
--- a/README.md
+++ b/README.md
@@ -10,7 +10,6 @@
[](https://github.com/EquityBot/PlutarchPages/actions/workflows/ci.yml) [](https://github.com/EquityBot/PlutarchPages/actions/workflows/codeql.yml)
-[](https://scorecard.dev/viewer/?uri=github.com/EquityBot/PlutarchPages)
[](https://www.rust-lang.org/) [](#license-and-credits) [](https://github.com/storytold/pdfcraft)