A small, automated patch set on top of Skim, the macOS PDF reader. Not a fork: each upstream release is fetched from Skim's SVN, the patches in patches/ are applied, and the result is built and published unmodified otherwise. In the tradition of patch-set distributions like ungoogled-chromium and Betterbird, this exists to carry a few features upstream has declined — nothing more.
Unaffiliated with the Skim project. Please do not report bugs in these builds to the Skim maintainers; file them here instead. This repository is maintained largely by automation (an AI agent watches upstream releases, rebuilds, and files issues when human attention is needed), with a human owner reviewing anything the automation flags.
Skim+ never changes default behavior. Every patch only exposes an option — a hidden preference or a menu item — and with nothing set, a Skim+ build behaves bit-for-bit like stock Skim. There is no danger in switching builds. (Someone can do a skim++ if they want to introduce new default behaviors.)
| Patch | What it does | Upstream status |
|---|---|---|
0001-inverted-dark-mode-background-pref.patch |
Hidden pref SKInvertedDarkModeBackgroundGray (sRGB 0.0–1.0): the page-background level used by "invert colors in dark mode". 0 = true black for OLED/mini-LED reading. Unset = upstream's 45/255 gray. |
Declined: #1774, #1722, #1776 |
0002-tooltip-timing-prefs.patch |
Hidden prefs for tooltip timing: SKToolTipDelay (seconds; negative disables tooltips) and SKToolTipAutoHideTime. Unset = upstream behavior. |
Declined: #1757, #1312, #1325 |
0003-invert-dark-mode-menu-toggle.patch |
View-menu item (with checkmark) toggling "Invert Colors in Dark Mode" live — bindable to a keyboard shortcut via System Settings. | Declined: #1659 |
0004-honest-dark-background-colors.patch |
The dark background colors mean what they say: the stored color is what renders on screen, even under the invert filter (pre-compensated at the render chokepoint). Backgrounds update live; out-of-gamut colors render as the nearest achievable. | Declined: #1774 |
0005-advanced-preferences-pane.patch |
An Advanced preferences pane surfacing the options above — background level slider, tooltip timing, WYSIWYG dark background wells with Stock buttons, sequential page numbering. | The pane itself is Skim+'s own idea |
Tip: with the patch applied, setting Skim's dark background color to pure white renders it black too (the background passes through the same invert filter), giving one seamless black field:
# quit Skim first
swift -e 'import AppKit
let d = UserDefaults(suiteName: "net.sourceforge.skim-app.skim")!
let c = try NSKeyedArchiver.archivedData(withRootObject: NSColor.white, requiringSecureCoding: false)
d.set(c, forKey: "SKDarkBackgroundColor"); d.set(c, forKey: "SKDarkFullScreenBackgroundColor")'Grab the latest zip from Releases, unzip, drag Skim.app to Applications. Builds are Developer ID-signed and notarized by Apple, so they open like any other download. Prefer not to run a stranger's binary at all? Build it yourself:
brew install subversion # upstream lives in SVN
scripts/fetch-upstream.sh 1.7.15 # export upstream source into ./upstream
scripts/build.sh # apply patches, build, verify, zipRequires full Xcode (not just Command Line Tools). The scripts encode the two non-obvious build traps (absolute SYMROOT; DEVELOPER_DIR when CLT is selected).
A weekly workflow reads Skim's Sparkle appcast. When upstream ships a version this repo hasn't built, the macOS runner fetches the new tag, applies the patches, verifies the patched constant landed in the binary, and publishes a release. If a patch stops applying, the workflow opens an issue instead.
Did upstream decline your feature as out of scope? PRs adding it here as a patch are welcome, under the rule above: your patch must only expose an option (hidden preference, menu item, or a control in the Advanced pane) — with nothing set, behavior stays bit-for-bit stock. Small, self-contained patches in code regions upstream rarely touches have the best odds; each accepted patch has to survive rebasing onto every future Skim release. Link the upstream ticket in your PR so the trail from "declined" to "available" stays walkable.
Skim is BSD-licensed; the patches and scripts here are under the same BSD license as upstream.