v0.2.0
Added
- Open in Editor at Current Heading — ⌥⌘E or right-click an outline row to
jump to that heading's source line in your editor of choice. Auto-detects
Cursor, VS Code, Zed, Sublime, TextMate, MacVim, and Helix; override with
defaults write com.markee.preview editor "<name>". - Soft Modern UI/UX redesign:
- Integrated window chrome (no system titlebar divider, custom 44pt gradient bar).
- Spring-animated outline drawer (⌘⌥\ to toggle).
- Live active-heading highlight in the outline, driven by an
IntersectionObserver in the WebView. - New
theme.csswith--surface/--accenttoken palette,
soft-modern typography, custom task-list checkboxes, faded<hr>, and a
lede-paragraph treatment after H1. - Dark + light themes follow
prefers-color-scheme.
- Article max-width widened from 740px → 1000px.
MITlicense,THIRD-PARTY-NOTICES.md,SECURITY.md,CONTRIBUTING.md,
CHANGELOG.md, and adocs/demo.mdshowcase document.- GitHub Actions CI workflow that builds and tests on every push and PR.
Security
BundleSchemeHandlerpath-traversal hardening — requests like
markee-app://app/../../Info.plistno longer escape the bundle's
Resources/web/directory.DocSchemeHandlersymlink-escape fix — symlinks inside the document
directory pointing at files outside (e.g.~/.ssh/id_rsa) are now rejected.
Resolution moved fromstandardizedFileURLtoresolvingSymlinksInPath()
with a trailing-slash boundary so sibling directories with the root as a
prefix (/notes_secretvs root/notes) cannot match.- External-link allowlist — only
http,https, andmailtoschemes are
handed toNSWorkspace.shared.open;javascript:,file://, custom
app-handler schemes are blocked. - EditorLauncher input validation — user-supplied editor names from
UserDefaultsare validated against^[A-Za-z0-9._+-]+$before being
interpolated into thezsh -ilc 'command -v <name>'fallback, closing a
self-targeted shell-injection vector. - All
HTTPURLResponse(...)!andtask.request.url!force-unwraps in the
scheme handlers replaced withguard letearly-outs.
Changed
Makefileapptarget now depends on aResources/web/vendor/.fetched
sentinel — a fresh clone runningmake appautomatically fetches vendored
libraries instead of silently building a broken bundle.LICENSEandTHIRD-PARTY-NOTICES.mdare now copied into
Markee.app/Contents/Resources/at build time so the obligations travel
with the binary.- Bundle version bumped to
0.2.0(CFBundleShortVersionString) /2
(CFBundleVersion).
Fixed
fixtures/sample.mdreferences to the old "Macdown" name updated to
"Markee" + smoke-test stragglers removed.
First launch: Markee is ad-hoc codesigned, not yet notarized. Right-click Markee.app → Open → Open the first time, or run xattr -dr com.apple.quarantine Markee.app.