Emacs package maintenance

Tracking byte-compile-warning fixes contributed upstream to widely-used Emacs packages.

Motivation

Many widely-used Emacs packages, especially those distributed through MELPA, are lightly maintained or dormant. As Emacs evolves, byte-compile warnings accumulate: functions and macros get marked obsolete, signatures change, and constructs that once compiled cleanly start emitting noise.

In my view, small and careful patches are a reasonable way to keep these packages compiling cleanly and to raise confidence in their continued support. This is community maintenance work, done with AI assistance. It is not a product and not affiliated with any company.

Problem

As Emacs releases progress, the byte-compiler flags newly-obsolete constructs and other issues. One example: if-let was marked obsolete in Emacs 31.1 in favour of if-let*.

Across a typical configuration of around 60 packages, there can be over a thousand such warning lines. Because maintainers may be inactive, these warnings tend to linger rather than get cleaned up.

Approach

For each package, the process is:

  1. Verify the warning is not already fixed on the upstream default branch.
  2. Make a minimal, behaviour-preserving fix that stays compatible with the package's older supported Emacs versions. Prefer rewrites that do not raise the minimum supported version.
  3. Add a CI workflow (GitHub Actions) that byte-compiles with warnings treated as errors and loads the package, run on the minimum supported Emacs and the latest stable, plus a development snapshot. Add Dependabot to keep the actions current.
  4. Submit a focused pull request: one fix per PR.

The longer-term plan is to run small local models continuously over a set of top packages, finding and fixing such warnings step by step. The aim is to gradually increase trust in the support status of MELPA packages.

Agents

The fixes are produced by agents that run a fixed, auditable process against a package. Each agent is specified so a person or another model can run it. Anyone can contribute an agent: add a spec under agents/ and an entry to _data/agents.yml via a pull request, and it can be picked up here.

Byte-compile warning fix

For one Emacs package, find a byte-compile warning, make a minimal version-compatible fix, ensure CI compiles with warnings as errors on the minimum and latest stable Emacs, and open one upstream pull request.

Specification Active

Maintenance health check

Read-only. Snapshot a package's health: last activity, CI presence and what it tests, declared vs effective minimum Emacs, and byte-compile cleanliness. Feeds the coverage table; opens no pull request.

Specification Draft

Dependency audit

Read-only. Resolve a package's transitive dependencies and flag supply-chain risk: unmaintained or archived deps, known advisories (GHSA/OSV/CVE), network/native surface, and whether deps are pinned.

Specification Draft

Lexical-binding migration

Add the lexical-binding cookie to files that lack it, but only where it preserves behaviour (no reliance on dynamic binding); silence surfaced warnings, add CI, and open one pull request.

Specification Draft

Package coverage

A maintenance-health snapshot of the packages gone through: whether a fix was sent, whether CI exists and what it actually tests, and when each was last checked. This is complementary to MELPA: a quick signal of how well a package's continued support is verified, not a package source and not a replacement for MELPA.

Package Outcome CI Emacs tested Warnings as errors Last checked
autothemer jasonm23/autothemer#31 Merged Extended ert tests on Emacs 26.1-28.2, 30.1, snapshot No 2026-05-31
smartparens Fuco1/smartparens#1242 Added byte-compile (warnings as errors) on Emacs 27.1-30.1 and snapshot Yes 2026-05-31
rustic emacs-rustic/rustic#128 Added byte-compile + load on Emacs 28.2, 30.1, snapshot No 2026-05-31
dune ocaml/dune#14798 Added byte-compile + load on Emacs 29.1, 30.1, snapshot Yes 2026-05-31
annalist noctuid/annalist.el#6 Merged Added byte-compile on Emacs 30.1, snapshot; load on 24.4 Partial 2026-05-31
goto-chg Skipped Existing upstream workflow Unknown 2026-05-31
treemacs-nerd-icons Skipped None - - 2026-05-31
f Skipped Existing upstream workflow Unknown 2026-05-31
s Skipped Existing upstream workflow Unknown 2026-05-31
magit Skipped Existing emacscollective shared compile workflow (warnings as errors) + tests Yes 2026-05-31
forge Skipped Existing emacscollective shared compile workflow (warnings as errors) Yes 2026-05-31
ghub Skipped Existing emacscollective shared compile workflow (warnings as errors) Yes 2026-05-31
closql Skipped Existing emacscollective shared compile workflow Yes 2026-05-31
with-editor Skipped Existing emacscollective shared compile workflow (warnings as errors) Yes 2026-05-31
llama Skipped Existing emacscollective shared compile workflow (warnings as errors) Yes 2026-05-31
cond-let Skipped Existing emacscollective shared compile workflow (warnings as errors) Yes 2026-05-31
emacsql Skipped Existing emacscollective shared compile workflow (warnings as errors) Yes 2026-05-31
posframe tumashu/posframe#158 Added byte-compile on Emacs 26.1, 30.1, snapshot Yes 2026-05-31
general noctuid/general.el#571 Added byte-compile (warnings as errors) on Emacs 28.2, 29.4, 30.1, snapshot Yes 2026-05-31
org-roam org-roam/org-roam#2621 Existing upstream test.yml Unknown 2026-05-31
diff-hl Skipped Existing upstream workflow Unknown 2026-05-31
dockerfile-mode Skipped Existing upstream workflow Unknown 2026-05-31
markdown-mode Skipped Existing make test on Emacs 28.2, 29.4, 30.2, snapshot Unknown 2026-05-31
pfuture Skipped None - - 2026-05-31
cfrs Skipped None - - 2026-05-31
xterm-color atomontage/xterm-color#51 Merged Added byte-compile + load on Emacs 25.1, 30.1, snapshot Yes 2026-05-31
merlin ocaml/merlin#2076 Existing upstream emacs-lint workflow Unknown 2026-05-31
yaml zkry/yaml.el#66 Extended byte-compile on Emacs 25.1, 30.1, snapshot; ert on 27.2 Yes 2026-05-31
treepy volrath/treepy.el#19 Merged Added byte-compile + tests on Emacs 27.1, 30.1, snapshot Yes 2026-05-31
evil-surround emacs-evil/evil-surround#220 Added byte-compile (library) + load on Emacs 27.2, 30.1, snapshot Yes 2026-05-31
evil-commentary linktohack/evil-commentary#31 Added byte-compile (warnings as errors) on Emacs 30.1, snapshot; plain on 27.1 Partial 2026-05-31
imenu-list bmag/imenu-list#90 Added byte-compile (warnings as errors) on Emacs 30.1, snapshot; plain on 24.3 Partial 2026-05-31
rust-mode rust-lang/rust-mode#589 Added byte-compile on Emacs 26.1, 30.1, snapshot Yes 2026-05-31
caml ocaml/caml-mode#21 Added byte-compile on Emacs 24.4, 30.1, snapshot Yes 2026-05-31
sage-shell-mode sagemath/sage-shell-mode#87 Added byte-compile (warnings as errors) on Emacs 24.4, 30.1, snapshot Yes 2026-05-31
winum deb0ch/emacs-winum#37 Added byte-compile (warnings as errors) on Emacs 30.1, snapshot; plain on 24.5 Partial 2026-05-31
deferred kiwanami/emacs-deferred#60 Added byte-compile (warnings as errors) on Emacs 30.1, snapshot; plain on 24.4 Partial 2026-05-31
ht Skipped Existing Cask/make on Emacs 25.3-28.2, snapshot Unknown 2026-05-31
dash Skipped Existing byte-compile on Emacs 24.1-30.2, snapshot Yes 2026-05-31
swift-mode Skipped Existing upstream run-test workflow Unknown 2026-05-31
nerd-icons Skipped None - - 2026-05-31
tuareg Skipped Existing upstream workflow Unknown 2026-05-31
doom-modeline Skipped Existing upstream workflow Unknown 2026-05-31

Fixes log

annalist

Package
annalist
Upstream
noctuid/annalist.el
Warning
Docstrings with unescaped single quotes (10 definitions).
Fix
Escaped the docstring quotes. Residual (Emacs 24.4 only): unused vars from the external org-babel-map-src-blocks macro and an optional evil function.
CI added
Repo had no CI. Added byte-compile (warnings as errors) on Emacs 30.1, snapshot; plain compile/load on 24.4 (external-macro residuals) + dependabot.
PR
noctuid/annalist.el#6 (merged)
Status
Merged

autothemer

Package
autothemer
Upstream
jasonm23/autothemer
Warning
Docstrings with unescaped single quotes (two functions).
Fix
Escaped the opening quote of quoted-list examples in two docstrings. Docstring-only and behaviour-preserving.
CI added
Existing CI ran only ert tests; added Emacs 30.1 to the matrix, bumped checkout to v5, and added dependabot. A warnings-as-errors job was not added because the package has many pre-existing out-of-scope warnings.
PR
jasonm23/autothemer#31 (merged)
Status
Merged

treepy

Package
treepy
Upstream
volrath/treepy.el
Warning
Assignment/reference to free variables in tests, plus a docstring with unescaped single quotes.
Fix
Declared the top-level test fixtures numered-tree and custom-zipper with defvar instead of setq, and de-quoted a docstring. Also corrected Package-Requires from 25.1 to 27.1, since treepy.el uses with-suppressed-warnings (Emacs 27.1).
CI added
GitHub Actions across Emacs 27.1, 30.1, and snapshot; byte-compile (warnings as errors) and run tests; dependabot for actions.
PR
volrath/treepy.el#19 (merged)
Status
Merged

xterm-color

Package
xterm-color
Upstream
atomontage/xterm-color
Warning
if-let obsolete as of Emacs 31.1 (use if-let*).
Fix
Rewrote the 4 call sites with plain let + if. This is backward compatible and does not bump the minimum version for the fix itself. Also corrected Package-Requires from 24.4 to 25.1, since the package uses defvar-local (introduced in Emacs 25.1).
CI added
GitHub Actions across Emacs 25.1, 30.1, and snapshot. Byte-compile (warnings as errors) and load. Dependabot for actions.
PR
atomontage/xterm-color#51 (merged)
Status
Merged

How it works

Each fix is scoped to a single warning class in a single package. The change is checked against the package's stated minimum Emacs version, and CI exercises both that minimum and a recent build so regressions show up before a PR is opened. The byte-compile step treats warnings as errors, so a clean run is the success condition.