- Rust 93.6%
- Python 5%
- Shell 1.4%
Nathan, 2026-10-27: on the iMac U never installed; each build went in through a fresh .deb and Mint's install dialog. The updater ran `pkexec dpkg -i` in the background, which never got through. U now downloads the .deb (size-checked as before) and hands it to xdg-open, the same package installer dialog a double click opens; the toast says "THE INSTALLER IS OPEN: INSTALL PACKAGE, THEN START SHADE AGAIN" and the notice clears. The AppImage and the .dmg paths are unchanged. 132 tests pass. This build still has the old path, so pre41 goes onto the iMac by hand once; from pre41 on, U does the download and opens the dialog. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NpNLwm6uNcJoBXuFviboWL |
||
|---|---|---|
| .forgejo/workflows | ||
| crates | ||
| docs | ||
| packaging | ||
| tools | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| CLAUDE.md | ||
| LICENSE | ||
| README.md | ||
| RELEASING.md | ||
Shade
A drawing application that reproduces Autodesk SketchBook Pro 8.7, written in Rust. It opens the layered TIFFs SketchBook wrote, draws with a Wacom pen, and runs with nothing else installed.
Download: the current build is v0.0.1-pre41 (2026-10-26, everything through M06 plus the fixes from the iMac's first Reports, the Brush Library's set strip and scrollbar, .skbrushes installs, the Zoom / Rotate / Move puck on the right-click ring, and the ten brush modes, and the iMac's doubled pen taps fixed; runs on Linux Mint 20 and up): shade_0.0.1-1_amd64.deb, Shade-x86_64.AppImage and Shade-0.0.1.dmg. Older builds are on the Releases page. On Linux Mint, double click the .deb. On macOS, open the .dmg and drag Shade to Applications; the build is not yet notarized, so the first open says Apple could not verify it: System Settings → Privacy & Security → Open Anyway, once. Builds the updater installs afterwards open without that.
Platforms
- Linux Mint on a Late-2009 iMac is the floor and the first install: 2-core Core 2 Duo, no AVX, 4 GB, X11. Every performance budget is measured there.
- macOS is the second target (decided 2026-10-24). The same code builds on both:
winitandsoftbufferopen the window,tiny-skiadraws the canvas, and only pen input has a platform backend (octotableton X11 and Wayland, NSEvent tablet fields on macOS). The.dmgis built on a Mac; the Fortress runner builds Linux only. - Other Linux distributions run the AppImage.
Status
2026-10-24. Milestone M00 Repo and Release is in progress: 21 of 23 Issues done. Shade is installed on the iMac (G04, 2026-10-25: v0.0.1-pre12 on Linux Mint 22.3, first frame 351 ms). The repository, CI on the Forgejo runner, CLAUDE.md and the docs hook exist (G01). Packaging exists (G02): every push to main builds the .deb and the AppImage on the runner behind the ldd gate, and tools/mac-bundle.sh builds the universal .app and .dmg on a Mac. The release pipeline works (G03, verified with a throwaway tag; see RELEASING.md). The window opens with the chosen cover on a start screen, Ctrl+comma opens the cover picker (G05), and Ctrl+Shift+B sends a problem report that becomes a Forgejo issue and a Noosphere Issue note (G06). M03 is done: every drawing is a layer stack, edited from the list on L and the keyboard (add, delete, duplicate, move, opacity, blend mode, merge, flatten, rename, group, fold, drag), each step undoable; the list's head has the active layer's blend drop-down and opacity slider (2026-10-25). M04 is 7 of 9: Ctrl+S writes the layered .tif back (the old file kept as .bak.tif), Ctrl+Shift+S a new one, the title and a quit guard follow the file, all 21 family files round-trip byte-exact, and a Shade file edited in SketchBook 8.7 comes back whole; the two open Issues wait for the iMac and for Mavis. M05 is done: right-click (or the pen's barrel button) opens the 8-tile marking menu, the brush and colour pucks float and drag, the lagoon sits in the corner with six rings, Tab shows the top bar, every glyph is Shade's own, and brushes are files (brush.toml + stamp.png) read from ~/.config/shade/brushes. M01 is nearly done: a .tif dropped on the window (or named on the command line) opens with its layers, the composite matching SketchBook's within its rounding, L lists the layers with eye toggles, and strokes land on the top layer. M02 has begun: the pen (mouse everywhere, Wacom pressure and tilt over XInput2 on Linux) and three brushes that draw, Pencil, Ink Pen and Airbrush with SketchBook's own numbers, keys 1 2 3, [ ] for size, E to erase; the canvas pans (space-drag, wheel) and zooms (Ctrl+wheel, =, -, 0 fits, Ctrl+1 is 100%); Ctrl+S saves a PNG to ~/Pictures/Shade, a dropped PNG or JPEG opens, Ctrl+Z undoes 20 strokes. Shade checks the Releases page at launch and every 30 minutes, keeps a notice up when a newer build is out, and installs it on U (G07; on Mint, U downloads the .deb and opens it in the package installer, then Shade is started again; the AppImage in place, the .app from the .dmg). Pre-release v0.0.1-pre6 is the first with the updater and the last manual install on the iMac; v0.0.1-pre41 (2026-10-26) is the current build, M06 plus the fixes from the iMac's Reports #14 to #18 and Shade's word from the iMac (sliders, the blend drop-down, pen scrolling, size and dpi, then the Brush Library's set strip and a scrollbar the pen can drag, and .skbrushes sets dropped on the window installing as packages, and the brushes painting by their codes: markers multiply, glows screen, pastels show a paper grain, smudge and Smear drag the paint under them, colorless brushes and Blur soften in place, Sharpen pushes edges apart, synthetic paint picks up what it crosses; every one of the 160 renders a stroke unlike every other, and all 160 are measured against 8.7 on the Mac Studio, 134 of the 147 measurable within tolerance once each package's density, carry, spread and gap lines are fitted, the dab profile read off 8.7 and turning tips broadside, the rest listed on I2.5); v0.0.1 follows the iMac timing.
Brushes are files
A brush is a folder with a brush.toml and, when it has one, a stamp.png. Shade ships three under /usr/share/shade/brushes/ (the repo's packaging/brushes/); yours go in ~/.config/shade/brushes/<name>/. F5 reads them again, the brush puck's palette and the lagoon's Brushes ring list them.
Brush sets from the web install themselves: download a .skbrushes file (sketchbook.com/extras has free ones; some come inside a .zip, which works as it is) and drop it on the window, or give its path to Ctrl+O or the Files ring's Import. Each of its sets becomes a folder under ~/.config/shade/brushes/set-<name>/, one package per brush with its tip as stamp.png, and the Brush Library opens on it. The library's left strip lists the sets; a tap brings that set to the top, the bar on the right drags under the pen.
name = "Chalk" # what the palette shows
kind = "marker" # pencil, pen, airbrush or marker: picks the glyph
radius_min = 4 # px at pressure 0
radius_max = 12 # px at pressure 1
flow_min = 0.3 # a dab's alpha at pressure 0
flow_max = 0.9
opacity_min = 1 # the whole stroke's alpha
opacity_max = 1
hardness = 0.4 # 1 is a hard edge
spacing = 1.2 # dabs land every spacing × radius × 0.2 px
# stamp.png beside this file: grey (dark is ink) or alpha, up to 256 px, replaces the round tip
density = 0.7 # Shade's own: a coverage ceiling below 1, a dab scale above, fitted against 8.7 by tools/stroke-sheet
carry = 0.9 # Shade's own, smudges: what the carried paint keeps per radius, fitted the same way
spread = 0.5 # Shade's own: the tip narrowed across the stroke, for a drawn stamp wider than 8.7's
gap = 1.4 # Shade's own: the dab gap scaled, for a sparse brush whose period 8.7 sets by no number in the file
fixed = true # Shade's own: the stamp lies on the canvas and caps the coverage, for a pattern 8.7 runs unbroken (HR, Hatching 2)
A bad value is skipped with its line named in the log and the Report.
Roadmap
Each line is a Milestone; the full spec of each is under docs/milestones/. Build order, decided 2026-10-24: M00, M02, M01, M03, M04, M05, M06.
| Milestone | What ships | State | |
|---|---|---|---|
| M00 | Repo and release | Public repo, .deb, AppImage, .dmg, a blank-canvas window installed on the iMac, the cover picker, a Report a problem button that files a Forgejo issue, an updater |
in progress, 21 of 23; G04 done 2026-10-25 (pre9 on the iMac, first frame 351 ms); the v0.0.1 tag and the Linux install check remain |
| M02 | The living surface | Wacom pressure into a low-latency paint loop, 3 brushes, pan, zoom, PNG save: the first version to draw with | in progress, 12 of 13; G01 done 2026-10-25 (Wacom Intuos S over XInput2 on the iMac, pressure first try); the iMac's latency numbers (I4.3) remain |
| M01 | Open his drawings | Read SketchBook's layered TIFF: composite, layers, names, opacity, blend modes, visibility | in progress, 8 of 9: his files open with their layers, strokes land on the top layer, L lists the layers; the iMac's opening times (I3.3) remain |
| M03 | Layers and blend | The layer stack his to edit: active layer, add, delete, duplicate, move, opacity, the 20 modes, merge, flatten, rename, group | done 2026-10-24: active layer, add, delete, duplicate, move, opacity, the 20 modes, merge, flatten, rename, groups, thumbnails, drag |
| M04 | Save him back | The writer for the layered TIFF, Ctrl+S with a .bak and a quit guard, the family round trip through SketchBook |
7 of 9 Issues done 2026-10-24: the writer, Ctrl+S with .bak.tif, title and quit guard, 21 files round-trip byte-exact, a trip through SketchBook 8.7 and back; I2.3 waits for the iMac, I3.3 for Mavis |
| M05 | The Lagoon | The circle puck menu, colour and brush-size pucks, the top bar | done 2026-10-24: marking menu, pucks, lagoon, glyphs, top bar, brushes as packages; 12 of 12 Issues |
| M06 | Note for note | Every 8.7 tool, all 160 stock brushes, the 4 SketchBook-only blend modes, custom brushes and palettes imported | in progress 2026-10-26: G01 the ledger (6 of 7, the iMac's Report left), G02 the 160 brushes done 2026-10-26 (the stroke sheet measured against 8.7 by machine and accepted by Nathan, 134 of 147 measurable within tolerance), G03 stroke helpers, G04 selection, fill, transform, canvas tools, import, text and adjustments, G05 guides, G06 colour, his data and themes, and G07 FlipBook (frames as .tif files, timeline, onion skin, playback, PNG and GIF export) done; 38 of 39 Issues |
Budgets, asserted on the 2009 iMac: pen-down to pixel under 16 ms, 60 fps while stroking a 4096×4096 canvas with 20 layers, under 300 MB resident, cold start under 1 s.
Documents
The design lives in the Noosphere database and is mirrored here by tools/sync-docs.py. Edit the note, then run the script; edits made in docs/ are overwritten, and the pre-commit hook refuses a stale mirror.
- docs/Shade.md: vision, requirements, roadmap.
- docs/Shade-Ledger.md: what SketchBook 8.7 is made of, read from the installed copy: the file format, tag 50784, all 20 blend-mode codes, the 160 stock brushes.
- docs/milestones/: M00 to M06, with M00's Goals and Issues.
Building
cargo build --release # Linux or macOS; the release .deb uses tools/linux-build.sh (glibc 2.31 floor)
cargo test --workspace
Linux needs libxkbcommon-dev libwayland-dev libx11-dev libxcb1-dev libxi-dev. Never set target-cpu: the floor machine has no AVX. CI runs cargo check and cargo test on every push; a v* tag builds the .deb and AppImage and attaches them to the Release.
Licence
MIT. SketchBook Pro's behaviour is reproduced from use and from reading its data files; none of its icons, textures, brush stamps or code is included.
The text tool ships DejaVu Sans (packaging/fonts/, Bitstream Vera licence in LICENSE-DejaVu); font = "/path.ttf" in the settings names your own, font = "system" asks the desktop for its font.
Icon
packaging/logos/ holds eight leather sketchbooks with a pencil and an S stroke, Shade Logo1.png to Shade Logo8.png (Nathan, 2026-10-24): black, red, orange, yellow, green, blue, navy, purple. Logo1, the black one, is the default app icon (packaging/shade.png, 256 px; shade-512.png for the AppImage). All 8 ship in the package, and a Cover picker in preferences lets the user choose theirs; the choice becomes the menu icon and the start screen.