Releases: rainesdrew/stet-releases
Releases · rainesdrew/stet-releases
Release list
Stet 0.5.0
Fixed
- The feedback hub's "Join the Discord" button now uses a permanent invite
link. The previous invite expired on a Discord timer, which would have
stranded the button for anyone on an older build after 2026-07-24. - Accepting every change on a file now clears its pending indicator. Accept
wrote the editor's serialized content (which drops the file's final newline)
to the home branch, while the captured proposal kept the file's exact disk
bytes (with the newline) — so a one-byte trailing-newline diff survived and
the blue "still has changes to review" dot never cleared even after you'd
reviewed everything. Accept now matches the accepted content's trailing
newline to the captured proposal, so the two come out byte-identical.
Security
- Markdown previews (change pills, inline proposal previews, and the
version-history diff) are now sanitized before rendering. Proposal text is
AI-authored and reviewed by a human — the exact content Stet must treat as
inert — but it was being parsed straight intoinnerHTML, so a branch whose
markdown carried<script>,<img onerror=…>, or ajavascript:link would
execute inside the desktop app's webview (which has IPC to the Rust backend).
All markdown-to-HTML now routes through a single DOMPurify-backed
renderSafeMarkdownhelper, and the Tauri webview gets a restrictive
Content-Security-Policy in production builds (with a separate permissive dev
policy so Vite HMR keeps working) as a second layer.
Internal
- Split CI to keep the 10x-billed macOS runner off the common PR path.
Frontend Vitest runs on Linux for every PR; the Rustcargo testruns on
macOS but only when a PR touchessrc-tauri/**(it can't run on Linux — the
crate has macOS/Linux-divergent native deps); and the full suite runs on
macOS once post-merge onmain. Since most pushes are frontend-only, the
typical PR now costs a cheap Linux run instead of a macOS one. - Added a markdown round-trip test harness (
src/lib/roundTrip.ts) and a
golden corpus (src/lib/roundTrip.test.ts) that opens and saves a document
through the real editor config and asserts it comes back unchanged and never
grows across repeated save cycles — the guard against silent document
corruption. The editor's schema/serialization config and thepreprocess/
postprocesspasses moved to a sharedsrc/lib/markdownSerialize.tsso the
test exercises the exact config the live editor uses, not a lookalike.
Fixed
- A new file's pill no longer touches the document at all when the document
has content: no hover preview, no click jump. The doc IS the change, so
there is nothing to reveal; earlier gates tried to detect "already landed"
from text or provenance and each missed real cases (links and tables defeat
text matching), letting a duplicate preview shove the layout around. The
one exception is an empty document (a pending new-file proposal whose disk
copy is reverted): there the pill still pins the whole-file preview, since
it is the only way to read what is proposed.
Changed
- A brand-new auto-accepted file now shows a green "new" badge on its tree
row, matching the blue "new" badge pending new files get, instead of a
green count that read as "one edit". Edits to existing files keep the
green count.
Fixed
- The seen-on-scroll dwell works again, for real this time: in the packaged
app's webview, an IntersectionObserver rooted at the editor's scroll
container never reports these marks as visible at all (verified live in
the release webview), so "seen" could never fire in any packaged build.
The observer now measures against the window viewport, which the editor
fills. - A prior fix observed synthetic
sentinel elements whose geometry was frozen at creation time and computed
from a viewport height that can be zero for freshly mounted editors, which
silently killed the dwell for every change: green pills and tree counts
never cleared no matter how long the content stayed on screen. The observer
is back on the live margin marks, and marks taller than the viewport (a
whole-new file's wash) now count as visible when they cover at least half
the window, so simply having a new document open still earns "seen" after
the usual dwell.
Fixed
- Hovering a landed new file's pill no longer inserts a duplicate full-content
preview above the title and jumps the document. The "already landed"
check compared the change's raw markdown (including YAML frontmatter)
against the rendered document, which never contains frontmatter, so it
failed for every real file and the supposedly suppressed preview rendered
anyway. The comparison now strips the frontmatter block first.
Fixed
- The change-mark bar (the colored line in the left margin of changed text)
now hugs the text column instead of pinning to the window's left edge, so
it no longer disappears underneath the left sidebar when that's open. It
sits a fixed gap left of the prose at every sidebar state and window size. - Corner icons finally align: the floating panel toggles and the icons inside
the sidebar headers (hamburger, version-history clock) now share one
centerline instead of sitting a few pixels apart. The earlier passes
normalized icon boxes but missed that the toggles and the headers are
positioned by two different systems; the geometry is now derived from one
shared constant and documented in the code. - The sticky breadcrumb no longer slides halfway under the sidebar header
while scrolling. The sticky offsets were measured from ResizeObserver's
contentRect, which excludes padding and the hairline border, so the
breadcrumb pinned about 15px too high. Offsets now use border-box heights.
Changed
- Every way a file opens other than clicking it once in the left file tree
now opens (or focuses, if it's already open) a new tab instead of
replacing whatever you were looking at: the tray dashboard's "Open in
Stet ›", clicking a pending proposal from the dashboard, tray notification
click-through, Finder/open/drag handoff, and New Document. Opening a
workspace itself from the dashboard (its group row, with no specific file)
now switches the sidebar over without closing your open tabs, the same
way it does when you follow a tab into another workspace. The file tree's
single click is still the one path that replaces the current tab; its
double-click keeps opening a new tab, now also focusing an existing one
instead of duplicating it. The shared decision logic is
openInNewOrFocusinsrc/lib/tabs.ts. - Moved the tray dashboard's "Open in Stet ›" hover action from the Controls
lens's workspace list to the Review lens's workspace group rows. Hovering a
workspace's group header in Review now swaps its pending count for
"Open in Stet ›" and opens that workspace (without navigating to a specific
file); the Controls lens's workspace rows no longer show this action and
keep just their effective-summary label and drill-in chevron. - Controls list rows for a folder that's "Not watched" now render the folder
name itself faint too, not just the edge label, so unwatched folders read
as visually inert at a glance. - Controls now has a visible exit affordance: a small back arrow ("‹") at
the leading edge of the breadcrumb row, in both the sidebar and the tray
dashboard's Controls lens. It pops one drill level (or exits Controls
entirely at the top step) through the same path Escape already used, so
the two can't drift. The dashboard's Controls lens previously did nothing
at its top step on Escape; both Escape and the new arrow now return to the
Review lens there. - Removed the "Show all previews" eye icon from the Edits header. Showing
every auto-accepted change's preview at once is now the job of the
"Unseen" bubble at the top of the right nav, the same floating-pill
pattern already used for pending change-request bubbles. Click the bubble,
or its popover's eye button, to show or hide all auto-change previews. - The Edits header's remaining controls (Annotate, version-history clock)
are aligned cleanly now that the odd-sized eye icon is gone from the
cluster. - The sidebar's
Files | Controlsswitcher is gone. Folder controls now open
from the hamburger menu ("Folder controls…") or a folder's right-click menu
("Folder settings…"), same as opening the drill-in itself, just without a
switcher living in the sidebar full time. The sticky header for a workspace
tab is now just the menu button, and the subtitle line under it (workspace
name plus a "waiting in review" count) is gone too — the file tree's own
per-file dots and counts already show what needs a look. - Opening a folder no longer silently turns it into a Stet workspace.
Browsing is free; initializing is chosen. A folder that isn't already a
workspace now asks first: "Start watching" sets up history and review
(the broad-folder safety check still applies), while "Just browse" opens
a read-only view that creates nothing on disk. Folders that are already
workspaces open instantly, exactly as before. If the last-opened folder
is no longer a workspace, startup lands in browse mode quietly instead
of re-initializing it or interrupting with a dialog.
Added
- Files with auto-accepted changes you haven't looked at yet now show a green
count on their row in the file tree, even when the workspace (or one of its
folders) is set to auto-accept and nothing shows up in the pending-review
queue. A collapsed folder with unseen changes somewhere inside it shows a
small green dot. Opening the file and marking its changes seen (or letting
them dwell-clear) drops the indicator, the same way the "Unseen" bubble in
the right nav already does. A pending-review indicator still wins over the
green count when both apply. - The right nav (Edits sidebar) is now drag-resizable from its left edge,
the sa...
Stet 0.4.0
Added
- Send to AI. Every AI note (✦) now has a Send button. One click hands the current document to your own AI agent so it can resolve the note. Stet never calls an AI API itself. It runs a shell command you configure and steps back. The agent's edits come back as normal review pills.
- Configure AI Send Command. A new File menu item lets you set the command Stet runs. The default is
claude "resolve the comments in {filepath}". Supports{filepath},{filename}, and{dir}tokens. - Active watcher (opt-in). Turn this on and Stet fires your Send command automatically the moment you confirm a new AI note. Off by default, so nothing shells out without your say-so.
- Menu bar tray icon. Stet now lives in the menu bar and keeps watching your workspaces even when the main window is closed. When an agent or any other tool edits a watched file, you get a quiet macOS notification. Closing the main window hides it to the tray instead of quitting.
- Watched-changes dashboard. Click the tray icon to open a window showing every workspace Stet watches, what is pending review across all of them, and a feed of recent external changes. Add a workspace, mute notifications, or stop watching from there.
Fixed
- Change pills now anchor next to the changed text. An edit near the end of a document used to pin its pill to the top of the page. It now sits beside the change it describes.
Internal
- Unit tests for the file-watch primitive (WriteLedger self-write suppression, relevant-file filtering, git-state detection) and for the Send command template plus active-watcher config round-trips.
Stet 0.3.1
Added
- Native macOS menu bar. File / Edit / View / Window / Help with Open Folder, Open Recent (last 10), Open the Demo Workspace, and Open in AI Agent (Claude Code, Cursor, VS Code/Cline) — all available without clicking into the editor header.
- Local proposal intake. Coding agents running on your machine (Claude Code etc.) can now edit files directly — Stet's filesystem watcher captures every external write as a reviewable proposal on a rolling
local/proposalsbranch. No more agent edits silently bypassing the review flow. - HTML annotate mode. Stet now opens
.htmlfiles alongside markdown, with the same diff and proposal pipeline. - Feedback hub. The floating feedback bubble now opens a three-option hub: send feedback (screenshot + text, as before), join the Stet community on Discord, or book a 15-min call with Drew. Discord replaces the opaque single form with a place where testers can see each other's reports.
- Discord integration on the feedback receiver. Every submitted entry is also posted to the Stet Discord channel as a rich embed with the screenshot attached, so feedback lands somewhere visible immediately.
Changed
- Agents see your latest edits. The editor now writes to disk on every change, so when a coding agent reads a file, it gets your in-progress content instead of a stale on-disk snapshot.
- CLAUDE.md offer banner refreshed — narrower layout, clearer copy, and updated guidance for local vs remote agents.
- Demo workspace docs updated to reflect the new local-intake flow.
Fixed
- AI note (✦) resolutions now produce a proposal pill correctly, including across multi-hunk changes. Hunk merging tolerates overlapping ranges, and
stripMarkdownno longer mangles certain inline-code patterns. - The inline preview for a pure-insertion change no longer renders the surrounding context line as if it were part of the new content.
- The rolling
local/proposalsbranch now diffs against the home-branch tip instead of merge-base — without this fix, already-accepted local proposals leaked back into later proposals and broke AI-note resolution classification.
Internal
- Vitest setup (jsdom + Testing Library) with initial frontend unit tests for Toolbar, diff, and recentWorkspaces;
npm testruns both Vitest andcargo test. - Rust unit tests for
fs_opsandproposal_intake;tempfileadded as a Cargo dev-dependency. - E2E harness scaffolding under
e2e/.
Stet 0.3.0
Added
- File menu in the editor header. Open a folder, jump back to a recent workspace (last 10), open the Stet Demo, or launch an AI coding agent — Claude Code, Cursor, or VS Code/Cline — directly in the current folder. Before this, once a workspace was open there was no in-app way back to the demo or to another folder. macOS only for now.
- CLAUDE.md onboarding offer. Opening a workspace now offers to add (or append) a Stet-aware
CLAUDE.mdso coding agents commit to feature branches and their edits surface as reviewable proposals — without it, agent commits can land silently onmainand never show up for review. Shown at most once per workspace; appended sections are fenced with<!-- stet:start -->markers so you can find and edit them later.
Changed
- Branch UI redesigned. The rectangular branch cards are replaced by avatar-and-count bubbles in a vertical column to the left of the Edits sidebar. The resting state shows just who and how many; hovering a bubble opens a popover with the branch name, per-change jump dots, and eye / accept-all / reject-all actions. The bubbles no longer overlap the floating change pills, and popovers open into the document area instead of clipping off-screen.
- The always-visible top format toolbar strip has been removed — it collided with the new branch-bubble popovers. Formatting controls now live in the floating toolbar that pops up above your text selection.
Fixed
- Agent edits are attributed correctly. External auto-commits from a coding agent are now signed as that agent — recognized from the branch naming convention (
claude/,cursor/,cline/,agent/,ai/) — so agent proposals render with the correct agent styling instead of being mistaken for human edits. - Scrolling the wheel over the Edits sidebar now scrolls the document, with proper scroll-chaining when a branch's open change list needs to scroll first.
- Pure-insertion changes (a hunk that only adds lines, with no removed text) now show a change pill and can be hovered, pinned, and previewed like any other change. Previously they rendered nothing at all.
Stet 0.2.0
Added
- Floating toolbar that follows text selection. Same full set of buttons as the top strip, popped up just above whatever text you select. Top strip kept for the no-selection case.
- Switch-workspace button in the Files sidebar header (folder icon next to ↻). Opens a folder picker, points Stet at the chosen directory, and resets the editor + sidebar state so the new workspace loads cleanly. The new path is remembered for next launch.
- "Or talk to Drew — book a 15-min call" link in the feedback panel. Opens Drew's Google Calendar booking page in the default browser. For testers who'd rather talk than type.
- Crash diagnostics: Rust panics are now appended to
~/Library/Logs/Stet/panic.logwith timestamp, location, payload, and full backtrace. Stet is shipped as a packaged app with no visible stderr, so without this hook a panic exits silently — now there's a file testers can send when something hard-crashes.
Changed
- Demo workspace now unpacks into
~/Downloads/Stet Demo/(was~/Documents/Stet Demo/) so it's obvious where to delete it from when done. - Feedback widget collapsed from two tabs into a single panel. Screenshot of the Stet window is captured automatically on open; a "Remove screenshot" link removes it (or you can re-capture). One Send button submits text and screenshot together.
- Feedback now stores locally in
~/Downloads/Stet feedback/instead of<workspace>/_feedback/. The workspace folder stays clean — no extra files in the tester's file tree or git history. - Feedback screenshot capture now hides the widget before taking the screenshot, so neither the floating chat bubble nor the feedback panel itself appears in the captured image. Re-capturing from inside the panel temporarily hides the panel for the same reason.
- A full-screen white flash fires the instant you click the feedback bubble — instant click feedback, no perceived lag. The actual screenshot capture happens behind the fading flash so the white overlay stays out of the captured image.
- Feedback receiver now commits each submission to
rainesdrew/ideas_and_feedbackon GitHub (pathinbox/) so entries are durable instead of vanishing with Render's ephemeral filesystem. Local-disk write kept as a short-lived fallback. Requires aGITHUB_TOKENenv var on the Render service — seefeedback-receiver/README.mdfor PAT setup.
Fixed
- Markdown editor no longer renders YAML frontmatter as body text — leading
---blocks are stripped on load and re-prepended on save so files like_feedback/*.mdshow cleanly. - AI Note (✦) button now actually opens its modal. The toolbar's
backdrop-filterwas creating a containing block that trapped the modal'sposition: fixed, rendering it as a thin gray strip at the top of the screen. The modal is now portaled todocument.bodyso it sits over the whole window as intended.
Stet 0.1.0 (friends beta)
First signed + notarized build of Stet for friends.
Download: Stet.zip below.
Install: unzip, drag Stet.app to Applications, double-click. macOS will say "downloaded from the Internet — Open?" — that's the normal dialog. Click Open.
Source code lives in a private repo (github.com/rainesdrew/stet_desktop). This repo exists only to host public download artifacts.