Repository navigation
Releases: arcanii/Sentinel-IDE
Release list
v0.1.15 — Find and Replace
Find and Replace.
Find
Ctrl+F opens a bar under the tab strip. It shows how many matches there are and which one you are on, F3 / Shift+F3 step through them, and the search wraps at both ends. Match case and Whole word are there when you need them; by default it ignores case.
Ctrl+H adds a replace row in place, with Replace and Replace All. A Replace All is a single undo — one Ctrl+Z puts every occurrence back, not one per match.
Escape closes the bar and returns you to the editor.
One limit worth stating: case-insensitive matching covers ASCII and Latin-1, so CAFÉ finds café, but Greek, Turkish dotless-i and ß/SS are matched exactly rather than folded.
The trust indicator no longer overstates itself
The status-bar chip read ✓ Signed while you edited a signed file. A signature describes the file on disk, so the moment you changed the buffer the chip was vouching for text that nothing had checked. It now reads ✎ Edited since signing until you save, and goes back to green on its own if the file still verifies.
Also
Replacing text can no longer introduce a stray carriage return into the buffer — it was not reachable through the interface, but it was the one place in the editor where a replacement was not normalised, and on a signed file that would have been a byte change with no keypress.
Installs per-user, no admin required. Existing installs update in place via ≡ ▸ Check for Updates…, the About box, or the background check.
v0.1.14 — hardened sealed-project opening
Hardens opening a sealed project you were sent by someone else.
Sealed projects exist so you can hand an encrypted project to someone with a password. That means the file itself is written by whoever sealed it — and encryption proves it was not altered in transit, not that its author meant you well. This release treats it that way.
What changed
- A file could write outside the folder you unsealed into. A path containing a colon (
ab:c) slipped past the safety check and, on NTFS, wrote a hidden alternate data stream — content that would never appear when you browsed the unsealed project. Now refused. - A rejected archive used to leave files behind. If a container was refused partway through, everything extracted before that point stayed on disk, and the cleanup only removed empty folders. The whole index is now checked before anything is written, so a refused file leaves nothing.
- Two ways to hang or exhaust the machine are closed. A small file could claim an enormous archive and make the unsealer commit gigabytes before failing; a file could declare thousands of unlock slots, each costing a full key-derivation on a wrong password. Both are refused up front, and both now say why rather than reporting a generic bad-header error.
Files this IDE produces are unaffected — none of these limits is reachable by a normal sealed project.
Under the hood
The container header, unlock-slot table and archive index are now read in Sentinel rather than C++. This is the first port that parses genuinely hostile input rather than files the IDE wrote itself, which is the point of the exercise. The encryption is untouched and still runs through Windows CNG.
Unchanged
Sealing, unsealing, passwords and the sealed-file format itself. Existing sealed projects open exactly as before.
Installs per-user, no admin required. Existing installs update in place via ≡ ▸ Check for Updates…, the About box, or the background check.
v0.1.13 — the appcast reader moves to Sentinel, closing two defects
Fixes two defects in how the update feed is read, and moves that reader into Sentinel.
The fixes
The code that decides whether an update is available had two problems, both found by an audit rather than by anything going wrong:
- A version number with too many digits wrapped around. A feed advertising a very large version could rank below the version you are running, suppressing a real update — or, the same arithmetic failing the other way, make an older release look newer.
- The version string was never checked. Whatever appeared in the feed was shown in the update prompt, written to the log, and — if you chose Skip this version — saved into your settings. A feed containing prose instead of a version was accepted as one.
Neither could be triggered by the published feed, which is generated and validated. They mattered because this is the only thing the IDE reads off the network.
Both are now impossible rather than fixed: a version that does not parse is not returned at all, so there is nothing to display or store, and it can never be treated as newer. The same applies in reverse — if the running version cannot be parsed, no update is offered rather than all of them.
Under the hood
That reader is now written in Sentinel, like every other file reader in the IDE. It was the last one still in C++, and the only one fed by the network.
Unchanged
How updates are found, offered and installed. Check for Updates… still asks before installing, still tells you when you are already current, and unsaved work is still saved automatically before an update restarts the app.
Installs per-user, no admin required. Existing installs update in place via ≡ ▸ Check for Updates…, the About box, or the background check.
v0.1.12 — Enter obeys focus in the update prompt
Fixes a keyboard bug in the update prompt that 0.1.11 introduced.
The fix
In 0.1.11, if you tabbed to Install now in the update prompt and pressed Enter, you got Later — an affirmative keypress quietly doing the opposite, with nothing to tell you. Mouse clicks and Space were unaffected.
It came from a guard added for a real problem: an update prompt left on screen could be accepted by a stray Enter, downloading and installing without anyone looking at it. That guard stays — but Enter now activates whatever button actually has focus, so deliberate keyboard use works and an unfocused dialog still cannot be accepted by accident.
Also
- The update check now gives up after 8 seconds instead of however long the network takes. An unreachable feed previously took over 20 seconds to report failure.
- Clicking Check for Updates… while an accepted update is already installing no longer opens a dialog on an application that is about to restart.
Unchanged
Everything else, including how updates are found, offered and installed. Unsaved work is still saved automatically before an update restarts the app.
Installs per-user, no admin required. Existing installs update in place via ≡ ▸ Check for Updates…, the About box, or the background check.
v0.1.11 — Check for Updates asks before it installs
Checking for updates asks before it installs again.
The fix
≡ ▸ Check for Updates… used to download the update, install it and close the app, with nothing in between. It reads like a question, so it now behaves like one: if an update exists you get Install now / Later / Skip this version, the same prompt the automatic hourly check already showed.
It also tells you when nothing happened, which it previously did not:
- up to date → it says so, and names the version you are running
- the check failed (no network, feed unreachable) → it says so, and points at the log
Previously both of those were silence, which is indistinguishable from a menu item that does nothing.
Asking explicitly now overrides a previous "Skip this version". Skipping a release used to leave the manual check permanently unable to offer it. The automatic check still respects your choice to skip.
Also
An unrecognised command-line switch is ignored and logged rather than being mistaken for a file to open — see 0.1.10's notes, where this is described in full.
Unchanged
Updates found by the automatic check behave exactly as before, and unsaved work is still saved automatically before an update restarts the app.
Installs per-user, no admin required. Existing installs update in place via ≡ ▸ Check for Updates…, the About box, or the background check.
v0.1.10 — the RichEdit editor path is gone
The old editor is gone. 0.1.9 made the Direct2D editor the default; this release removes the RichEdit one entirely.
What this means for you
If you were still using the old editor — via Settings ▸ Use the Direct2D editor unticked, or by launching with --richedit — that is no longer possible. The checkbox and both flags are removed, and a leftover d2d=0 in your settings is ignored and cleaned up. There is one editor now.
That is deliberate rather than casual: since 0.1.9 the two editors did the same things, including dragging text within a file, which was the last thing the old one did that the new one did not.
Also in this release
- An unrecognised command-line switch no longer eats your path.
Sentinel-IDE.exe C:\project --richeditused to open an empty window with no message — the flag was mistaken for the path. Any unknown switch is now ignored and logged instead. This bug was older than the flag: a typo like--buidldid the same thing. - If the editor cannot start, it says so. A failed window class now exits with an explanation and the log's location rather than showing an empty pane. A transient Direct2D device failure keeps retrying, and after a second explains itself on screen — your text is still in memory and the file on disk is as you last saved it.
Unchanged
The Output pane, the Problems list, clickable file:line:col links, signing, sealing and the build toolchain are all untouched.
Installs per-user, no admin required. Existing installs update in place via ≡ ▸ Check for Updates…, the About box, or the background check.
v0.1.9 — the Direct2D editor by default, with text drag-and-drop
The Direct2D editor is now the default, and it no longer gives anything up against the old one.
0.1.8 offered it as an opt-in. This release makes it what you get, and closes the one feature it was missing.
What changed
- New editor by default. No word wrap with real horizontal scrolling, syntax colouring, error-line tints after a failed build, and a system caret that Narrator, Magnifier's follow the text cursor and IME candidate lists can track. Only the lines on screen are laid out, so a 20,000-line file costs about what a 200-line one does.
- Dragging text within a file works. Drag a selection to move it, Ctrl-drag to copy, and text dropped from other applications is accepted. This was the one thing the old editor did that the new one did not — the reason 0.1.8 shipped it as a preview rather than as the default.
If you prefer the old editor
Untick Settings ▸ Use the Direct2D editor and restart, or launch with --richedit. Both still work, and an explicit opt-out outranks the new default — if you unticked the box in 0.1.8, this release leaves you on the old editor.
Unchanged
Dropping a file on the editor still opens it, with the usual unsaved-changes prompt. The Output pane, the Problems list, the file:line:col jump, signing, sealing and the build toolchain are untouched.
Installs per-user, no admin required. Existing installs update in place via ≡ ▸ Check for Updates…, the About box, or the background check.
v0.1.8 — the Direct2D editor as an opt-in preview
The Direct2D editor, as an opt-in preview. RichEdit is still the default, so this release is behaviourally a no-op unless you tick the box — which is the point of baking it as an opt-in first.
Turning it on
Settings ▸ "Use the Direct2D editor (preview)", then restart. The editor class is chosen once at startup, so the checkbox says so rather than pretending to take effect live. --richedit on the command line always overrides it if something goes wrong.
What the new editor does
- No word wrap, with real horizontal scrolling — code should not reflow. Long lines scroll; they do not wrap.
- Syntax colouring driven by the same lexer the RichEdit path now uses, so the two cannot drift apart.
- Error-line tints after a failed build, painted as decoration rather than as text formatting.
- A real system caret, so Narrator, Magnifier's "follow the text cursor" and IME candidate lists can track where you are. The previous painted-only caret was invisible to all three — an accessibility regression against RichEdit that this fixes.
- Only the lines on screen are laid out and lexed, so a 20,000-line file costs about what a 200-line one does.
Known limitations of the preview
- Dragging text within the editor is not supported yet. RichEdit supports it; the new control does not. Dropping a file onto the editor still opens it.
- Undo history is capped at 200 steps.
Not affected
The Output pane, the Problems list, the file:line:col jump, signing, sealing and the build toolchain are untouched by this release.
Installs per-user, no admin required. Existing installs update in place via ≡ ▸ Check for Updates…, the About box, or the background check.
Sentinel-IDE 0.1.7 (build 164) — automatic update checks
Patch release. Automatic update checking now works.
Updates find you again
0.1.5 repaired the manual ≡ ▸ Check for Updates… path, but the automatic check stayed broken: WinSparkle's own periodic check raises its own prompt, and that prompt leads to the install path that silently does nothing. So unless you went looking, you were never told an update existed.
Sentinel-IDE now runs that check itself. Shortly after launch it quietly reads the release feed, and if there is something newer it offers it — and accepting installs it properly.
The offer has three answers:
- Install now — downloads, verifies, installs.
- Later — ask again next time you start the IDE.
- Skip this version — never offer this particular version again.
Nothing about how updates are secured has changed. The app only decides whether to offer; the download, the Ed25519 signature check against the key built into the binary, and the install are all still handled by WinSparkle exactly as before. A tampered feed can at most provoke an offer that then fails verification.
Details that matter in practice
- The offer will never appear on top of another dialog. If you are in the middle of a save prompt or Settings, it waits until you are done.
- Later is the default button, and the offer ignores Enter for a moment after it appears — an unexpected dialog must not be able to install itself because you happened to be typing.
- WinSparkle's own automatic check is switched off, so you will never see two update prompts, one of which does nothing.
Getting this one
If you are on 0.1.6 or earlier, use ≡ ▸ Check for Updates… once. Your current build cannot find this update on its own — that is the bug being fixed. From 0.1.7 onward it will.
If you are on 0.1.4 or earlier, install manually from below; updaters in those builds cannot install anything at all.
Install: download Sentinel-IDE-0.1.7.164-setup.exe below and run it (per-user, no admin required).
Sentinel-IDE 0.1.6 (build 160)
Patch release. A small editor fix, on top of 0.1.5's auto-update repair.
Undoing back to where you started no longer counts as a change
The modified marker was a one-way switch: once you typed anything, the dot stayed on the tab, Save stayed lit, and closing the file asked whether you wanted to save — even if you had undone every edit and the text was byte-for-byte what you opened.
The editor now remembers the text as of the last load and the last save, and compares against it. Undo back to either point and the file is genuinely clean again: no dot, no prompt.
This costs nothing — the editor already re-read the whole buffer on every keystroke to re-colour it.
Unchanged
Everything else behaves as in 0.1.5. The unsaved-changes guard still prompts whenever the buffer really does differ from disk — that was verified explicitly as part of this change, since it is the thing standing between you and lost work.
Reminder about updates
≡ ▸ Check for Updates… downloads and installs correctly, as of 0.1.5. WinSparkle's automatic background check is still broken upstream — if it offers you an update on its own, clicking Install will do nothing. Use the menu item.
If you are on v0.1.4 or earlier, you must install manually once; the updater in those builds cannot install anything.
Install: download Sentinel-IDE-0.1.6.160-setup.exe below and run it (per-user, no admin required).