projects.akshatkatiyar.com/projects/deckle
A free, open-source macOS menu bar app that lays a subtle paper-grain texture over your entire screen, making long reading and writing sessions feel more like paper than glass. Choose a built-in paper, tune it, or blend and preview your own before saving.
If Deckle makes your screen nicer, a star helps other people find it ⭐
A deckle is the wooden frame used in hand papermaking — it leaves behind the soft, feathered "deckle edge" that marks real handmade paper.
Not a calibrated blue-light filter — a matte texture overlay. The grain breaks up the perfectly uniform backlight glow that makes screens feel harsh, while every pixel of your work stays interactive because the overlay is fully click-through. Paper Mill reports estimated blue-channel reduction and contrast retention as design guidance, not a medical claim.
![]() |
![]() |
| Everything at a glance. Status, intensity, quick controls, and a scrollable paper library. |
Preview before you commit. Blend a paper on the real display, inspect its contrast, then create it. |
- 22 built-in paper textures in four families:
- Papers — Soft Wove, Rice Paper, Laid Cotton, Newsprint, Cold Press, Artist Canvas, Felt Side, Frost Glassine
- Warm & tinted — Foxed Amber, Bookcloth, Recycled Kraft, Plum Kozo, Rose Quartz, Sage Press, Nordic Sky
- Dark — Ink Stone, Midnight Slate, Espresso
- Spectral+ (v3) — Gesso Ground, Linen Veil, Parchment Grain, Slate Veil — oriented fibers and surface roughness with deeper tints that cut glare
- Searchable paper library — search names, descriptions, IDs, and material terms; filter by light, dark, or custom papers; use the edge fade and arrow to browse the compact carousel. Opening All Papers or searching resizes the menu immediately to fit its content
- Paper Mill with live screen preview — tune tint, wash, weave, and blotch against your actual desktop before creating or saving the paper
- Comfort guidance — see contrast retention, estimated brightness and blue-channel reduction, tint temperature, pattern load, and four starting recipes: Focus, Reading, Paper, and Night
- Paper portability — export custom papers as JSON, import them later, or install shared recipes from the community papers repo
- Intensity and grain controls — intensity from 5–45%, grain size from Fine to Grainy, and independent grain strength
- Global hotkey — ⌥⌘P toggles the texture from any app
- In-app updates — Deckle checks GitHub Releases daily and installs automatically from writable app locations; otherwise it explains the blocker and offers the release page
- Per-app rules — hide the paper in chosen apps ("Except…") or show it only in chosen apps ("Only…")
- Automation —
deckle://URL commands work from Shortcuts, Raycast, Alfred, cron, or Terminal - Capture privacy — optionally hide the texture from screenshots and screen recordings while it stays visible to you
- Snooze for 15 min, 30 min, 1 hour, or 2 hours, then resume automatically
- Multi-monitor support with per-display inclusion
- Launch at login
- Click-through and lightweight — the texture is one small tiled image; Deckle uses approximately 0% CPU at rest
- Menu-bar first — no Dock icon or app-switcher entry; Paper Mill and Community Papers open only when requested
Search switches directly to a full results grid; clearing it restores the status dashboard.
brew tap yellowfoxh4xor/tap
brew trust yellowfoxh4xor/tap # Homebrew 6+ asks once for third-party taps
brew install --cask deckleGrab the DMG from the latest release, open it, and drag Deckle into Applications. The app is signed with a Developer ID and notarized by Apple, so it launches without any Gatekeeper warning.
Requires Xcode command line tools, macOS 13+:
git clone https://github.com/<you>/deckle.git
cd deckle
make install # builds, copies Deckle.app to /Applications, and launchesOr make run to try it from dist/ without installing. Look for the paper-sheet icon in your menu bar.
- Deckle owns one borderless, transparent
NSWindowper display at.screenSaverlevel. Each window ignores mouse events, joins every Space, and tiles one small paper image through Core Animation, so memory does not grow with display resolution. - Built-in and newly created papers use the deterministic spectral+ (v3) renderer: a random-phase, Hermitian-symmetric frequency field is synthesized with Accelerate/vDSP, inverse transformed into seamless grain, then layered with woven fibers, oriented Gabor-modulated fiber bundles that darken (absorbing light like real paper fibers), and Perlin surface roughness for a deeper, matte feel. Older custom papers retain their stored spectral or legacy engine for byte-compatible output.
- The resulting 256×256-point tile contains both the tint wash and grain. The intensity control changes only the overlay window's
alphaValue; identical render inputs reuse bounded caches. - Paper Mill previews an unsaved draft through the same overlay windows used by saved papers. Preview state is transient, respects excluded displays, and is torn down when the editor closes or the draft is cancelled.
- Energy design: after setup, the retained-mode overlay renders nothing per frame. Update checks use
NSBackgroundActivityScheduler; ordinary overlay changes are coalesced, and Paper Mill draft pushes are debounced to avoid regenerating spectral fields for every slider event.
Anything that can open a URL can drive Deckle — Shortcuts' "Open URL" action, open in Terminal, Raycast, Alfred, cron:
deckle://on | off | toggle
deckle://snooze?minutes=30 deckle://resume
deckle://texture?name=Ink%20Stone
deckle://intensity?percent=25
deckle://grain?size=2&strength=1.2
Examples: a Shortcuts personal automation "At sunset → Open URL deckle://on" gives you circadian scheduling; "When Work Focus turns on → deckle://texture?name=Soft%20Wove" pairs papers with contexts.
swift run # run unbundled (dev)
make app # build dist/Deckle.app
make cleanNo dependencies; pure Swift + AppKit + SwiftUI.
- Battery auto-disable & Low Power Mode awareness
- Built-in sunset scheduling (today: use a Shortcuts automation with
deckle://on)
The easiest PR: share a paper recipe — 10 lines of JSON, no Swift needed. For code, see CONTRIBUTING.md and the good first issues. Questions and ideas → Discussions.



