Skip to content

Releases: rainesdrew/stet-releases

Stet 0.5.0

Choose a tag to compare

@rainesdrew rainesdrew released this 07 Jul 03:02
1c992f8

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 into innerHTML, so a branch whose
    markdown carried <script>, <img onerror=…>, or a javascript: 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
    renderSafeMarkdown helper, 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 Rust cargo test runs on
    macOS but only when a PR touches src-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 on main. 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 the preprocess/
    postprocess passes moved to a shared src/lib/markdownSerialize.ts so 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
    openInNewOrFocus in src/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 | Controls switcher 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...
Read more

Stet 0.4.0

Choose a tag to compare

@rainesdrew rainesdrew released this 12 Jun 11:22
1c992f8

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

Choose a tag to compare

@rainesdrew rainesdrew released this 29 May 20:50
1c992f8

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/proposals branch. No more agent edits silently bypassing the review flow.
  • HTML annotate mode. Stet now opens .html files 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 stripMarkdown no 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/proposals branch 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 test runs both Vitest and cargo test.
  • Rust unit tests for fs_ops and proposal_intake; tempfile added as a Cargo dev-dependency.
  • E2E harness scaffolding under e2e/.

Stet 0.3.0

Choose a tag to compare

@rainesdrew rainesdrew released this 20 May 13:39
1c992f8

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.md so coding agents commit to feature branches and their edits surface as reviewable proposals — without it, agent commits can land silently on main and 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

Choose a tag to compare

@rainesdrew rainesdrew released this 19 May 03:35
1c992f8

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.log with 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_feedback on GitHub (path inbox/) so entries are durable instead of vanishing with Render's ephemeral filesystem. Local-disk write kept as a short-lived fallback. Requires a GITHUB_TOKEN env var on the Render service — see feedback-receiver/README.md for 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/*.md show cleanly.
  • AI Note (✦) button now actually opens its modal. The toolbar's backdrop-filter was creating a containing block that trapped the modal's position: fixed, rendering it as a thin gray strip at the top of the screen. The modal is now portaled to document.body so it sits over the whole window as intended.

Stet 0.1.0 (friends beta)

Choose a tag to compare

@rainesdrew rainesdrew released this 19 May 02:04
1c992f8

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.