Releases: Nov0cx/Thor
Release list
Thor 2026.08.8
Unpack the archive of your platform and start thor. The binary reads
assets/, plugins/, settings/ and docs/ beside itself, so keep
the folder together.
- Linux needs HarfBuzz and the X11/Wayland and OpenGL libraries of the
system (libharfbuzz,libx11,libxrandr,libxinerama,
libxcursor,libxi,mesa,wayland,libxkbcommon). - macOS keeps its libraries in the archive, but the download is in
quarantine:xattr -dr com.apple.quarantine thor-*-macos-arm64. - Windows builds are not signed, so SmartScreen stops the first start
with "Windows protected your PC": choose More info, then Run
anyway. Compare the download againstSHA256SUMSfirst. SHA256SUMSholds the checksum of each archive.
Full Changelog: v2026.08.7...v2026.08.8
Thor 2026.08.7
Unpack the archive of your platform and start thor. The binary reads
assets/, plugins/, settings/ and docs/ beside itself, so keep
the folder together.
- Linux needs HarfBuzz and the X11/Wayland and OpenGL libraries of the
system (libharfbuzz,libx11,libxrandr,libxinerama,
libxcursor,libxi,mesa,wayland,libxkbcommon). - macOS keeps its libraries in the archive, but the download is in
quarantine:xattr -dr com.apple.quarantine thor-*-macos-arm64. - Windows builds are not signed, so SmartScreen stops the first start
with "Windows protected your PC": choose More info, then Run
anyway. Compare the download againstSHA256SUMSfirst. SHA256SUMSholds the checksum of each archive.
Full Changelog: v2026.08.6...v2026.08.7
Thor 2026.08.6
Unpack the archive of your platform and start thor. The binary reads
assets/, plugins/, settings/ and docs/ beside itself, so keep
the folder together.
- Linux needs HarfBuzz and the X11/Wayland and OpenGL libraries of the
system (libharfbuzz,libx11,libxrandr,libxinerama,
libxcursor,libxi,mesa,wayland,libxkbcommon). - macOS keeps its libraries in the archive, but the download is in
quarantine:xattr -dr com.apple.quarantine thor-*-macos-arm64. - Windows builds are not signed, so SmartScreen stops the first start
with "Windows protected your PC": choose More info, then Run
anyway. Compare the download againstSHA256SUMSfirst. SHA256SUMSholds the checksum of each archive.
Full Changelog: v2026.08.5...v2026.08.6
Thor 2026.08.5
Unpack the archive of your platform and start thor. The binary reads
assets/, plugins/, settings/ and docs/ beside itself, so keep
the folder together.
- Linux needs HarfBuzz and the X11/Wayland and OpenGL libraries of the
system (libharfbuzz,libx11,libxrandr,libxinerama,
libxcursor,libxi,mesa,wayland,libxkbcommon). - macOS keeps its libraries in the archive, but the download is in
quarantine:xattr -dr com.apple.quarantine thor-*-macos-arm64. - Windows builds are not signed, so SmartScreen stops the first start
with "Windows protected your PC": choose More info, then Run
anyway. Compare the download againstSHA256SUMSfirst. SHA256SUMSholds the checksum of each archive.
Full Changelog: v2026.08.4...v2026.08.5
Thor 2026.08.4
Unpack the archive of your platform and start thor. The binary reads
assets/, plugins/, settings/ and docs/ beside itself, so keep
the folder together.
- Linux needs HarfBuzz and the X11/Wayland and OpenGL libraries of the
system (libharfbuzz,libx11,libxrandr,libxinerama,
libxcursor,libxi,mesa,wayland,libxkbcommon). - macOS keeps its libraries in the archive, but the download is in
quarantine:xattr -dr com.apple.quarantine thor-*-macos-arm64. - Windows builds are not signed, so SmartScreen stops the first start
with "Windows protected your PC": choose More info, then Run
anyway. Compare the download againstSHA256SUMSfirst. SHA256SUMSholds the checksum of each archive.
Full Changelog: v2026.08.3...v2026.08.4
Thor 2026.08.3
Unpack the archive of your platform and start thor. The binary reads
assets/, plugins/, settings/ and docs/ beside itself, so keep
the folder together.
- Linux needs HarfBuzz and the X11/Wayland and OpenGL libraries of the
system (libharfbuzz,libx11,libxrandr,libxinerama,
libxcursor,libxi,mesa,wayland,libxkbcommon). - macOS keeps its libraries in the archive, but the download is in
quarantine:xattr -dr com.apple.quarantine thor-*-macos-arm64. - Windows builds are not signed, so SmartScreen stops the first start
with "Windows protected your PC": choose More info, then Run
anyway. Compare the download againstSHA256SUMSfirst. SHA256SUMSholds the checksum of each archive.
Full Changelog: v2026.08.2...v2026.08.3
Thor 2026.08.2
Unpack the archive of your platform and start thor. The binary reads
assets/, plugins/, settings/ and docs/ beside itself, so keep
the folder together.
- Linux needs HarfBuzz and the X11/Wayland and OpenGL libraries of the
system (libharfbuzz,libx11,libxrandr,libxinerama,
libxcursor,libxi,mesa,wayland,libxkbcommon). - macOS keeps its libraries in the archive, but the download is in
quarantine:xattr -dr com.apple.quarantine thor-*-macos-arm64. - Windows builds are not signed, so SmartScreen stops the first start
with "Windows protected your PC": choose More info, then Run
anyway. Compare the download againstSHA256SUMSfirst. SHA256SUMSholds the checksum of each archive.
Full Changelog: v2026.08.1...v2026.08.2
Thor 2026.08.1
Unpack the archive of your platform and start thor. The binary reads
assets/, plugins/, settings/ and docs/ beside itself, so keep
the folder together.
- Linux needs HarfBuzz and the X11/Wayland and OpenGL libraries of the
system (libharfbuzz,libx11,libxrandr,libxinerama,
libxcursor,libxi,mesa,wayland,libxkbcommon). - macOS keeps its libraries in the archive, but the download is in
quarantine:xattr -dr com.apple.quarantine thor-*-macos-arm64. SHA256SUMSholds the checksum of each archive.
Full Changelog: v2026.08.0...v2026.08.1
Thor-2026.08.0
2026.08.0
This is the first release of Thor. Read the README.md for more information.
ctrl + alt + l/ "Edit: Format Document" formats the active Odin file with a native in-editor formatter — no external tool required.format_on_savesetting formats an Odin file before an explicit save (off by default; never runs on autosave)..thor/odin-formatter.jsonsets per-workspace formatter options: brace style, tabs vs. spaces, alignment, import sorting, and more.- Editing: multiple cursors, editor split, find and replace, undo and redo, auto-indent, bracket and quote pairs, line comment toggle, autosave.
- Tree-sitter syntax highlighting for 45 languages, each one a plugin.
- Odin language intelligence, served in the editor with no language server: hover, go to definition, completion, signature help, code actions, find all references, rename symbol, document and workspace symbols, and compiler diagnostics. The
language_intelligencesetting turns it off per feature. - Console panel with one live shell per tab. The shell stays alive between commands, so
cdand environment variables persist.+lists the shells found on the machine: pwsh, Windows PowerShell, cmd, the MSVC developer prompt, Git Bash, MSYS2, Cygwin, WSL, nu, and the POSIX shells. - Command palette (
ctrl + .) runs every action, and quick open (ctrl + tab) finds a file by name. - Explorer panel with the file tree of the workspace, keyboard driven and watched for changes on disk.
- Each folder keeps its own session: open tabs and layout come back with it.
open_folder_inchooses whether a second folder replaces this window or opens a new one. - Lua plugins for languages, commands, panels and key bindings. Each plugin is sandboxed and asks for its permissions before it loads; a workspace can carry its own plugins in
.thor/plugins. - Settings view for themes, fonts, icon packs and plugin permissions, over
settings/settings.json,settings/keybinds.jsonand a workspace.thor/. - Named shell commands in
.thor/tasks.json, started from the titlebar or the command palette. - Rendered Markdown preview (
f4). - Help menu opens the manual in the editor or the browser, and an interactive tutorial.
- Thor asks GitHub for a newer release shortly after start, at most once a day.
check_for_updatesturns the background check off, and Help > Check for Updates asks at any time. - An update installs itself: the archive for the platform is checked against the release
SHA256SUMS, the files beside the binary are replaced, and Thor restarts into the same folder.settings/files that were edited andsessions/are kept as they are. - Dismissing an update is remembered for that version. The title bar keeps a button with the new version that brings the offer back.
- A build from source, or one in a directory Thor cannot write, reports the new version and opens the Releases page instead of installing.
thor [path]opens a folder or a file;--versionand--helpprint and exit.- Settings view redesigned: a category sidebar replaces the single scrollable list, with a search box and a General/Workspace scope switch that writes to
settings/or the workspace.thor/explicitly. - Settings has a close button, a keyboard-hint footer, and a button that empties the search box.
- The Settings window keeps one size, so a scope or category switch no longer resizes it under the cursor.
- "LSP Setup" top-bar menu: checks which servers from
settings/lsp.jsonare onPATHand adds a workspace task that installs a missing one. - Settings rows light up under the cursor, number steppers are spaced apart, and a keybinding shows its chord as a key cap.
- Clicking the Thor logo at the top left of the titlebar opens Settings.
- A welcome page opens when no folder or file is given and no past session is found:
Open Folder,Open Fileand a recent-workspaces list. The explorer, tab bar and console panel stay hidden until a workspace opens. File: Close Workspacereturns to the welcome page from an open workspace, from the File menu or the command palette.- Console panel: click and drag to select scrollback text.
ctrl + shift + ccopies the selection, or the whole scrollback with nothing selected;ctrl + vpastes into the input line. The right-click menu gained "Copy" next to "Copy All". - Language servers answer for every language other than Odin: hover, go to definition, find all references, document symbols, workspace symbols, signature help, completion, diagnostics, semantic colors, rename and code actions.
settings/lsp.jsonnames the servers, and a workspace.thor/lsp.jsonoverlays it by serverid. - A language server's errors and warnings are drawn in the editor as the Odin compiler's are, against the unsaved buffer.
clangd,rust-analyzer,gopls,basedpyright,typescript-language-server,lua-language-serverandzlsare configured out of the box. A server starts the first time a file it claims is opened, and a server that is not installed is skipped.- Workspace symbols (
ctrl + q) send the typed text to the language server as you type, instead of only filtering a fixed list. - Opening a different folder restarts its language servers against the new
settings/lsp.json/.thor/lsp.json, instead of leaving the previous folder's servers running. - Workspace symbols (
ctrl + q) on a language-server-backed file shows "Type to search workspace symbols…" instead of a blank list until you type, for servers that only answer a typed query. - A language server's progress messages ("Indexing…", with a percentage when the server reports one) show in the statusline.
- A language server can apply its own edits (
workspace/applyEdit) directly in the editor, as one undoable change. - Code actions (
ctrl + shift + u) on a language-server-backed file are scoped to the current selection, not only the caret. - Python's default language server is
basedpyright, notpyright— plain pyright never offered an "add missing import" code action. - Fixed a language server's code actions silently failing to apply to an unsaved buffer when the server spelled the file's drive letter in a different case than Thor opened it under.
- The "LSP Setup" top-bar menu is now one menu per server — "clangd Setup", "rust-analyzer Setup", "gopls Setup", "basedpyright Setup", "typescript-language-server Setup", "lua-language-server Setup" and "zls Setup" — each still checking its own server against
PATHand adding a workspace task when it is missing. - "clangd Setup" gained "Configure compile_commands.json…": detects CMake, Bazel (bzlmod) or Make and adds a workspace task to generate the compilation database clangd needs, writing a
.clangdfile for a CMake project so clangd finds its build directory. - Settings' Language category gained a "Language Servers" group: every configured server, plus the built-in Odin support, gets its own on/off switch, and each enabled one gets a foldable "Features" group of per-kind toggles. Backed by the new
language_backendssetting, and takes effect immediately, unlike editinglsp.json. - Dragging a splitter next to an open 3D model view no longer stutters.
- Opening a large image, or reloading an open image tab after an external edit, no longer freezes the editor while it decodes.
- Fixed an image or 3D model tab's loading spinner spinning forever instead of clearing once it finished loading.
- The editor placeholder under a loading image tab now reads "Loading image..." instead of jumping straight to "Image".
- Quick open (
ctrl + tab) and the command palette's file list are now instant on a large workspace, warmed in the background instead of walked on every open. ctrl + alt + l/ "Edit: Format Document" now formats any file whose configured language server advertises formatting support (clangd, gopls, rust-analyzer, basedpyright, etc.), not only.odinfiles.- New
ctrl + alt + shift + l/ "Edit: Format Selection" formats the selected lines through the language server; with nothing selected it formats the whole document. - New
format_on_typesetting reformats a line as you type a trigger character the language server asks for, such as}or a newline. Off by default, next to the existingformat_on_save. format_on_savenow also formats non-Odin files served by a formatting-capable language server, not only Odin.- Settings > Language > a server's Features group gained "Format Selection" and "Format On Type" toggles next to "Format Document".
- The completion popup takes the mouse: a click accepts a candidate, hovering one highlights it, and the wheel over the popup walks the list instead of scrolling the text.
- The console prompt is a full input line:
left/right/home/end/deletemove and edit the caret, a click places it, andctrl + vpastes at the caret. - Links in the Markdown preview are clickable. A URL opens in the browser; a path relative to the document opens as a tab, so the manual's own pages link to each other.
- Find and replace gained three toggles:
Aa/alt + cmatches case,W/alt + wmatches whole words, and.*/alt + rreads the query as a regular expression. Each stays set until Thor restarts. - Replace All is one undo step, and with
.*on it rewrites matches of different lengths in one sweep. A pattern that does not compile reads "Invalid pattern" where the match count sits. - The explorer has a scrollbar; drag the thumb to move through a long file tree.
- The status bar reports the indentation the file actually uses, tabs included, instead of always claiming spaces.
- The status bar names any language a plugin registers, including extensionless ones such as
DockerfileandMakefile, instead of falling back to "Plain Text". - Undo and Redo sit at the top of the Edit menu and the editor's right-click menu, greyed out when there is nothing to move, and answer to "Edit: Undo" /...