Skip to content

Releases: Nov0cx/Thor

Thor 2026.08.8

Choose a tag to compare

@github-actions github-actions released this 18 Aug 22:08

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 against SHA256SUMS first.
  • SHA256SUMS holds the checksum of each archive.

Full Changelog: v2026.08.7...v2026.08.8

Thor 2026.08.7

Choose a tag to compare

@github-actions github-actions released this 17 Aug 16:56

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 against SHA256SUMS first.
  • SHA256SUMS holds the checksum of each archive.

Full Changelog: v2026.08.6...v2026.08.7

Thor 2026.08.6

Choose a tag to compare

@github-actions github-actions released this 15 Aug 16:44

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 against SHA256SUMS first.
  • SHA256SUMS holds the checksum of each archive.

Full Changelog: v2026.08.5...v2026.08.6

Thor 2026.08.5

Choose a tag to compare

@github-actions github-actions released this 15 Aug 14:09

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 against SHA256SUMS first.
  • SHA256SUMS holds the checksum of each archive.

Full Changelog: v2026.08.4...v2026.08.5

Thor 2026.08.4

Choose a tag to compare

@github-actions github-actions released this 14 Aug 18:40

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 against SHA256SUMS first.
  • SHA256SUMS holds the checksum of each archive.

Full Changelog: v2026.08.3...v2026.08.4

Thor 2026.08.3

Choose a tag to compare

@github-actions github-actions released this 14 Aug 15:31

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 against SHA256SUMS first.
  • SHA256SUMS holds the checksum of each archive.

Full Changelog: v2026.08.2...v2026.08.3

Thor 2026.08.2

Choose a tag to compare

@github-actions github-actions released this 13 Aug 22:56

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 against SHA256SUMS first.
  • SHA256SUMS holds the checksum of each archive.

Full Changelog: v2026.08.1...v2026.08.2

Thor 2026.08.1

Choose a tag to compare

@github-actions github-actions released this 13 Aug 21:52

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.
  • SHA256SUMS holds the checksum of each archive.

Full Changelog: v2026.08.0...v2026.08.1

Thor-2026.08.0

Choose a tag to compare

@Nov0cx Nov0cx released this 13 Aug 21:33

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_save setting formats an Odin file before an explicit save (off by default; never runs on autosave).
  • .thor/odin-formatter.json sets 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_intelligence setting turns it off per feature.
  • Console panel with one live shell per tab. The shell stays alive between commands, so cd and 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_in chooses 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.json and 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_updates turns 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 and sessions/ 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; --version and --help print 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.json are on PATH and 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 File and a recent-workspaces list. The explorer, tab bar and console panel stay hidden until a workspace opens.
  • File: Close Workspace returns 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 + c copies the selection, or the whole scrollback with nothing selected; ctrl + v pastes 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.json names the servers, and a workspace .thor/lsp.json overlays it by server id.
  • 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-server and zls are 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, not pyright — 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 PATH and 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 .clangd file 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_backends setting, and takes effect immediately, unlike editing lsp.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 .odin files.
  • 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_type setting 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 existing format_on_save.
  • format_on_save now 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/delete move and edit the caret, a click places it, and ctrl + v pastes 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 + c matches case, W / alt + w matches whole words, and .* / alt + r reads 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 Dockerfile and Makefile, 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" /...
Read more