The dashboard learned to be written in.
EdgeControl has always been something to glance at. This release makes it
something to type into: notes with their own store on disk, an editor that
works without a keyboard in front of it, a key that captures a line from any
app, and a door to Apple Reminders. It also carries eight merged contributions
and the test suite and CI the project should have had already.
If you are coming from 2.3.1, this includes the work prepared as 2.4.0, which
was never published.
Notes
The Sticky Note widget arrived as a contribution. It has become the reason to
keep the app open rather than glance at it.
Notes are files now. They used to live as base64 RTF inside the layout
document, which meant a note died with the widget showing it, nothing could
read one without loading the dashboard, and every keystroke rewrote the file
holding every page, placement and setting. They live in
Application Support/EdgeControl/Notes/ now — one real RTF per note, openable
in TextEdit, with a plain-text mirror Spotlight indexes and the last twenty
versions of each kept beside it. Backing up that folder backs up your notes.
Existing notes migrate on first launch, including ones written before the
editor was rich text.
The editor. Markup converts as you type: - for a bullet, - [ ] for a
to-do, # for a heading, --- for a rule, `code` for a chip, and three
backticks for a block. A slash at the start of a line offers the same things as
a menu; selecting text raises a formatting bar. Both exist because the panel is
usually reached without a keyboard, and a menu bar the kiosk window never shows
is no answer for somebody standing at the screen.
Markdown in and out. Paste Markdown and it becomes a note. ⌘⇧C copies a
note — or a selection — back out. Export Notes in General writes every note
as Markdown with its images alongside, so the exported folder stands on its
own.
Images paste in and live next to the note rather than inside it. RTF
carries no images, and the alternative was a package format, which would have
ended "open the folder and there are your notes".
⌃⌥Space captures a line from any app straight into the Inbox note. Not
⌘⇧N — that would have taken Finder's New Folder away everywhere on your
machine. There is a switch in General, because a global key belongs to the
whole system and yours may already be spoken for.
⌘⇧R sends a to-do to Apple Reminders — the caret's line, or every
unfinished one a selection touches, skipping what is already waiting there.
Fill the panel. A note in a small cell is a note you cannot write in. The
corner button gives it the whole display; Esc brings the dashboard back. Any
widget can do this from the Cmd-hover controls.
A widget can be pointed at any note that exists, or keep a few within reach as
tabs. A new Note desktop widget shows a note's unfinished to-dos without
opening the app.
Merged contributions
Eight pull requests from @jondkinney, reviewed
and merged with follow-ups:
- Sticky Note and Reminders widgets — the first is the basis of
everything above; the second is backed by the real EventKit database, with
list picking, due times and ordering. - Edit mode — widgets may overlap while you arrange them, drops displace
what they cover, Esc cancels the session and ⌘Z steps through it. Dragging no
longer rebuilds every widget on the page per tick. - Widget layout audit — compact and size-aware layouts across sixteen
widgets, and one-row placements for the glanceable ones. - Settings and window behaviour — a Guide tab, deep links from a widget to
its own settings, file panels as sheets, and the settings window kept off the
kiosk display. - Swift 6 — the project builds clean under strict concurrency.
- Memory is counted the way Activity Monitor counts it.
Fixed
Most of these were found by writing tests rather than by hitting them:
- A CPU counter wrapping after roughly 497 days would trap and take the app
down. A short read from the SMC would do the same. - A weather response whose arrays disagreed in length crashed instead of
showing a shorter forecast. - A plugin's HTML path was checked for containment in one place out of three.
- Top Processes reordered itself between samples when usages tied.
- Disk and network rates were divided by an assumed interval rather than the
measured one — wrong by up to a tenth, given the timer's own tolerance. - Storage percentages were computed through a fudge factor.
- A layout document with a missing top-level key refused to decode.
- Esc and ⌘Z inside a note were taken by the edit session rather than the text.
- A year written in prose — "1998. That was the year" — became item 1998 of a
numbered list. - The weather widget chose its layout from its row count, and a row is not a
unit of length: four rows is about 460pt on a 14.5" panel and half that on a
monitor divided into twelve. It measures the cell it was given now.
Under it
- 498 tests — 387 Swift Testing and 111 XCTest — across the pure core:
readings, layout geometry, the note store and its migration, Markdown in both
directions, plugin manifests, CI providers. - CI on every push and pull request, from the same script that runs
locally, so the two cannot drift: formatting, a clean build, a warning budget
that gates at zero, the tests, and coverage. - swift-format with a configuration at the repo root.
- The generated Xcode project is no longer committed — it is generated from
project.yml.
Full detail in CHANGELOG.md.
Install
Requires macOS 14 or later. Signed and notarised.