Repository navigation
Strata 2.0.0
Downloads
| Platform | File |
|---|---|
| macOS 11+, any Mac (Apple silicon + Intel) | Strata-2.0.0-universal.dmg |
| macOS, Apple silicon only (smaller) | Strata-2.0.0-arm64.dmg |
| Windows 10/11, x64 (portable) | Strata-2.0.0-windows-x64.zip |
Already using Strata? It offers this update by itself (or choose Help ▸ Check for Updates…).
macOS builds are signed and notarized. The Windows exe isn't code-signed yet: if SmartScreen appears, choose More info ▸ Run anyway.
Every file has a .sha256; the .app.zip files and latest.json are for the built-in updater.
What's changed
This release adds Obsidian-compatible notes (with runnable code blocks
and optional Git sync), Review Changes, language servers, clickable file
locations and Send to Terminal in the terminal, optional AI helpers, plugins,
and markers for hidden and direction-changing characters. Everything that
runs other programs or reaches the network is off, or asks, until you turn it
on; see Security below.
Added
- Notes: Obsidian-compatible notes on plain Markdown files. Open your notes
folder (an Obsidian vault or any folder of Markdown files) and
[[wikilinks]]work as in Obsidian, with headings, block references,
aliases and embeds, and ordinary Markdown links to notes too. Links are
underlined in the editor (dashed for a note that doesn't exist yet), and
⌘-click (Ctrl+click) or Notes: Follow Link opens them, offering to
create a missing note where Obsidian would put it. Strata reads the vault's
.obsidiansettings but never writes them, and notes use the network
only through Git sync, which you turn on per vault. See the new Notes page
in the manual. - Notes: typing
[[completes note names, aliases, headings and block ids,
and writes the link the way the vault's Obsidian settings ask. - Notes: a backlinks panel under each note lists the notes linking to it,
with the line that holds each link, and the note's tags. It's kept up to
date as Obsidian, a sync tool or Git changes files, and counts notes open
in tabs as they are, saved or not;notes_backlinkschooses when it
shows.#tagsand frontmatter tags are tinted, and Notes: Find Tag…
lists every tag with its notes. - Notes: Notes: Open Daily Note, Notes: New Note… and Notes: New
Note from Template… follow Obsidian's Daily notes and Templates settings,
filling in{{date}},{{time}}and{{title}}. - Notes: Notes: Rename Note… (also Rename… in the side bar) offers to
update every link to the note, showing each changed line first. Notes:
Undo Rename puts the links and the name back, all or nothing, and never
overwrites a file written meanwhile. - Notes: sync conflict copies (Syncthing, Dropbox, Nextcloud and ownCloud)
get a notice above the note with Compare, Open Copy and Move Copy
to Trash…; Notes: Compare with Conflict Copy does the same from the
keyboard. - Notes: the Markdown preview shows wikilinks you can click, tags,
frontmatter as a block of properties, and embedded images, notes, sections
and blocks (one level deep, images only from the vault). - Notes: runbooks you can click through. In the Markdown preview, fenced
bash,sh,zsh,fish,pwsh,powershell,cmd,python,node
(js) andrubyblocks have a ▶ Run button. Shell blocks go to the
current terminal tab the way Send to Terminal sends text; language blocks
start their REPL in a terminal tab of their own. Notes: Run Code Block
does the same for the block at the cursor, and Notes: Run Code Block and
Capture Output runs it in a separate process and puts what it prints in
anoutputblock under the code, as one edit Undo takes back (stopped
aftercode_block_timeout_seconds, 60 by default). Nothing runs when a
file opens or the preview draws. Before a file's first block runs, Strata
shows exactly what will run and where, and asks; Don't ask again for
this file is remembered in Strata's settings folder, never in the file,
and a different file at the same path, or a change made outside Strata,
asks again. Files outside the open folders ask every time, and a block
with invisible or text-reordering characters never runs. See Notes ▸ Running code blocks in the manual. - Notes: optional Git sync, off until you turn it on for a vault with
Notes: Enable Git Sync for This Vault… (which says first that the
repository's hooks, filters and credential helpers will run). Notes: Sync
Notes saves the vault's notes, commits what changed in the vault
(respecting.gitignore, with a message fromnotes_sync_message),
rebases onto the remote and pushes, never forced; an optional timer does the
same every few minutes and skips a vault with unsaved notes. Strata never
asks for a password: Git uses your credential helper or SSH agent. When a
note changed on both sides, nothing is pulled or pushed and your files stay
as they were; the notes in conflict are listed with Compare with
origin/main and Keep My Versions and Sync. No upstream, offline, a
refused sign-in or a replaced remote history change nothing and say so in
the status bar, which also shows the last sync. Turning sync on is tied to
that repository: a different one later at the same path is asked about
again before anything runs. Before Strata ever undoes a rebase Git
started, it backs up every file it touched (on disk and staged) to
sync-backupsin its settings folder, kept 30 days (Notes: Show Sync
Backups); a sync interrupted by quitting is only undone when you say so.
See Notes ▸ Git sync in the manual. - Optional AI helpers with a model you choose (Tools ▸ AI and the command
palette): Summarize Changes (the whole review or one file), Explain
Change, Flag Risks, Draft Commit Message and Explain
Selection. Providers: any OpenAI-compatible server (Ollama and LM Studio
on your computer or network, OpenRouter, OpenAI…), the Anthropic API, or
theclaudeandcodexcommand-line tools with your own login. Answers
stream into a panel as Markdown, can be cancelled, copied or opened in a new
tab, and never hold up the editor. See the new AI Helpers page in the
manual. - AI helpers are off until you turn them on in Settings ▸ AI Helpers
(ai_enabled). Local providers are used without asking. Before the first
request to any other provider, Strata shows exactly what it will send and
to which host, and asks (Allow Once, Always for This Provider,
Cancel); AI: Forget Allowed Providers asks again. Test
Connection checks a provider without sending any of your text. - AI helpers send only what they're about. Files that look like secrets
(.env, keys, anything in folders like.sshorsecrets), files Git
ignores, binary files and symbolic links are never sent, and a size limit
(ai_max_prompt_kb) says what was left out. API keys live in the macOS
Keychain or Windows Credential Manager, are only sent to the address they
were saved for, and never touchsettings.jsonor the log. - Plugins: extensions that are separate programs, in any language, which
Strata starts and talks to with JSON-RPC over their standard input and
output (the framing language servers use). A plugin can add commands to
the command palette and Tools ▸ Plugins, keys (never one Strata already
uses), status bar items (for every window, or for the file in front of
each), a Markdown panel and pick lists; read and edit open files (one
Undo takes back each edit); and read and write files in the side bar
folders. A plugin that crashes is restarted, and left stopped
after three crashes in five minutes; one that floods Strata with messages
or stops answering can't hold up the editor. Plugin settings go in
pluginsin settings.json. See the new Plugins page in the manual, with
the full API reference; two small examples are inexamples/plugins. - Plugins are installed from a folder or a zip (Tools ▸ Plugins ▸ Install
from Folder… / Install from Zip…) into Strata's settings folder;
there's no online directory. Zips with paths that would leave the package,
links, or sizes over the limits are refused. Plugins: Manage Plugins…
lists them, turns them on and off, starts and stops them, shows what they
may do and their log, and removes them. - A plugin asks before it first runs: Strata lists the permissions it wants
in plain words and remembers your answer for that exact package (by its
SHA-256), so any change to it asks again; it then runs from a read-only
copy of exactly that package, checked again right before it starts, with
the environment variables that load code from elsewhere (PYTHONPATH,
NODE_OPTIONS,DYLD_*…) removed. Every request a plugin makes is
checked against what you allowed, and its file access stays inside the
open folders, never following links or reaching hard-linked files. Text
from plugins shows hidden and direction-changing characters as markers.
Strata can't sandbox a plugin's own program, and the question says so:
running other programs and using the network are shown as things Strata
can't limit, and an interpreter's own libraries aren't part of the check. - Review Changes, for checking what a coding agent changed and keeping or
undoing each change (no AI involved). The Changes tab of the side bar
lists every file that differs from the last commit, or from a snapshot taken
with Start Review, with its status (modified, new, deleted, renamed) and
lines added and removed, and updates while the agent works. Clicking a file
opens its changes side by side with Keep and Revert for each change
or the whole file; reverting is an ordinary edit, so Undo brings the change
back and nothing is written until you save. Tick files off as reviewed; the
status bar counts the rest. F8 and Shift+F8 step through the changes across
files, and the Review commands are in Tools ▸ Review Changes and the command
palette. See the new Review Changes page in the manual. - Language servers. When a language's server is installed (rust-analyzer,
typescript-language-server, pyright, gopls or clangd), Strata starts it in
the background and shows its problems as wavy underlines with a dot in the
gutter, puts its suggestions first in the completion list, and shows type
and documentation when the mouse pointer rests on a name. The status bar
shows the server for the current file and its error and warning counts; a
server that stops is restarted after a pause. Strata never downloads or
installs servers. See Languages and Syntaxes ▸ Language servers in the
manual. - Language server commands, in Tools ▸ Language Server and the command
palette: LSP: Rename Symbol… (across files, one Undo step per file),
LSP: Format Document, LSP: Show Hover Info, LSP: Show Parameter
Hints, LSP: Show Problems…, LSP: Next Problem / Previous
Problem (⌘K ⌘N / ⌘K ⌘P; Ctrl+K Ctrl+N / Ctrl+K Ctrl+P elsewhere) and
LSP: Restart Language Servers. - Language servers start only in project folders you trust. The first time,
Strata asks (Start, Always for This Folder, Not Now);
lsp_trust_allskips the question.lsp_serversin settings.json changes
the built-in servers or adds others, andlsp_enabledturns the feature
off. - Terminal: ⌘-click (Ctrl+click on Windows and Linux) a file location in the
output to open the file at that line and column. Hold the key and point to
see the location underlined. Works withpath:line:col,path(line,col)
(MSVC, C#, TypeScript), Rust errors and panics, Python tracebacks and Node
stack traces, including locations that wrap onto the next row. Relative
paths are found in the shell's current folder, then the side bar folders;
only files that exist are links. - Send to Terminal (Tools menu; ⌃↩ on macOS, Ctrl+Alt+Enter elsewhere)
sends the selection, or the current line, to the terminal and presses
Enter, starting a terminal if none is running. Multi-line text goes as one
bracketed paste when the shell or REPL supports it. - Invisible and direction-changing characters (such as U+202E RIGHT-TO-LEFT
OVERRIDE, zero-width spaces and soft hyphens) are shown as small labeled
boxes in the editor, Compare and Review Changes, so a file can't make code
read differently from what it is ("Trojan Source"). Each box is one
character for the caret, selection and copying, and the file is never
changed; rest the pointer on it to see what it is. The status bar counts
them, and Find: Find Hidden Characters steps through them.
show_hidden_characters(View ▸ Editor Extras ▸ Hidden Characters) turns
the boxes off. The Markdown preview, help, language server hovers and
completions, tab titles, the side bar, the palette, Find in Files results,
the status bar and AI answers show them as named markers too, and a
completion holding one is marked with ⚠.
Changed
- Go to Definition and Go to Reference ask the file's language server first,
across the whole project, and fall back to Strata's own symbol search when
there's no server or it has no answer. - The completion list stays inside the window; long details are cut with "…".
- Undo Replace in Files is all or nothing: if any rewritten file changed
since the replace, nothing is restored and those files are listed. It never
overwrites a file written while it runs (by a sync tool, say): what it
couldn't put back stays in a marked folder next to the file. Files are
restored in place (keeping permissions, owner, extended attributes and hard
links), also through links inside the replaced folders. An undo interrupted
by a crash is listed in the Changes tab with Put Back. Its record is
sealed with a private key only this installation has (an undo is refused
if the key file isn't private) and is flushed to disk at every step; Put Back only acts on its own sealed records, never outside the
folder it was in, and only after checking the file is the one it set aside.
Fixed
- Compare: Japanese, Chinese and Korean text loads the same fonts as the
editor, so Compare tabs no longer show boxes in place of those characters.
Security
- Nothing new runs or connects by itself. Language servers start only in
folders you trust; code blocks run only when you ask, after Strata shows
exactly what will run; Git sync is off until you turn it on for a vault;
plugins ask before their first run; AI helpers are off until you turn them
on and ask before sending text off your computer or network. - Hidden and direction-changing characters can't disguise text: they're
shown as markers on every surface, and a code block holding one (or
another control character) never runs. - Code blocks: "Don't ask again" is tied to the file's real path, its
identity on disk and a SHA-256 of its bytes, so a replaced or changed file
asks again. A captured block runs in its own process group (a job object
on Windows, started suspended so nothing gets out first), and what it
started is stopped when it ends or times out. - Git sync: runs only in the repository it was turned on for (its Git
folder, remote and first commit, checked before any Git runs), never
forces a push, never prompts for credentials, allows only SSH, HTTPS and
local remotes, and redacts tokens from error text. It undoes only a rebase
it started itself (a record sealed with this installation's key), only
after backing up every file the rebase touched, and fails closed. A Git
that runs too long is stopped with its hooks. The read-only Git used for
the gutter, Compare and Review Changes no longer inheritsGIT_DIRand
similar variables. - Plugins: consent is for an exact package (SHA-256); each start runs a
read-only copy of it that's checked again just before starting. Plugins
start without environment variables that load code from elsewhere, every
request is checked against the permissions you gave, file access stays in
the open folders and refuses links and hard-linked files, and zips with
unsafe paths, links or oversized contents are refused. On Windows,
language servers and plugins start suspended and run only once they're in
a job object. - The temporary file used when creating the private undo key has a random
name, so two threads can't remove each other's file.
Full changelog: v1.0.2...v2.0.0