Two ways to get Thor:
- Download a release — grab the archive for your platform from the
Releases page and unpack it
anywhere.
thor(orthor.exe) is ready to run;assets/,plugins/andsettings/beside it are loaded at startup, so keep the whole folder together. What you change in Settings lands in auser/directory beside them, which no update replaces. - Build from source — see Building from Source. Needed if no release matches your platform, or you want a development build.
A release is not code-signed, so both desktops stop it once:
- Windows — SmartScreen says "Windows protected your PC". Choose More info, then Run anyway. It asks only for the file you downloaded.
- macOS — the download is in quarantine:
xattr -dr com.apple.quarantine thor-*-macos-arm64.
Compare the archive against the SHA256SUMS the release publishes if you want
to know it arrived whole. An update Thor installs itself is checked against that
file already, and starts with no warning.
Thor asks GitHub for a newer release shortly after it starts, at most once a day. When it finds one it offers to install it; Help > Check for Updates asks at any time and ignores the daily limit.
Answering no is remembered: that version is never offered again. The update
does not go away, though — a button appears in the title bar showing the new
version, and clicking it brings the offer back whenever you want it. Turn the
background check off entirely with check_for_updates in
Configuration, or from Settings > Updates.
Installing downloads the archive for your platform, checks it against the
SHA256SUMS the release publishes, replaces the files beside the binary and
restarts into the same folder. Two things are left alone: user/, which holds
everything you changed in Settings, and sessions/, which holds your open tabs
and layout. An install made before those two directories were split gets its
settings/ carried over into user/ on the first update.
Thor updates itself only when it is a release build unpacked from an archive.
A build from source, or one in a directory it cannot write (/opt,
C:\Program Files), reports the new version and opens the
Releases page instead. It also needs
curl and tar, which Windows 10 1803 and later, macOS and most Linux
distributions already ship.
If an update is interrupted part-way, the next start puts the old files back —
they are kept beside the new ones with an .old suffix until then. In the one
case it cannot repair, the binary itself is missing and thor.exe.old (or
thor.old) is beside it: rename it back.
thor # reopen the last session's folder, or the welcome page if there is none
thor . # open the folder Thor was called from
thor src/ # open that folder
thor main.odin # open the file, with its folder as the workspace
thor a.odin b.odin # open both as tabs, with b.odin active
thor src/ main.odin # open the folder as the workspace and the file as a tabSeveral files open as several tabs, in the order given, and the last one is
active. The first folder becomes the workspace; a second folder argument is
ignored, because one window holds one workspace. Use File > Open Folder...
with open_folder_in set to new to get a second folder in its own window.
A bare thor with no past session opens a welcome page instead: a tip of the
day, Open Folder, Open File and a list of recently opened workspaces. `File
Close Workspace` returns to it from an open workspace, and a later bare launch comes back to the welcome page too.
The tip card carries one tip a day, with the chord it is about read from your
own keybindings. The arrows on it step through the rest, and tips.json holds
them (see Configuration).
With a folder open there is no welcome page, so the same card floats in the
corner of the editor on the first start of each day. ✕ closes it for now, the
line under it turns tips off for good, and so does the tip_of_the_day setting.
Inside the editor, File > Open Folder... switches the workspace and
File > Open File... opens a file from anywhere; dropping a folder or files on
the window does the same. Each folder keeps its own session (open tabs,
layout), restored when you come back to it.
Opening a second folder while one is already open asks whether to replace the
current window's workspace or launch a new window — configurable via the
open_folder_in setting (see Configuration).
A folder that is already open in another window is never opened twice; that
window is brought to the front instead. On Linux and macOS this needs a desktop
helper — xdotool or wmctrl on X11, osascript on macOS — and the status bar
says so when none is available (Wayland has no equivalent).
- Title bar — drag it to move the window, double-click it to maximize the window or to restore it; the buttons on its right minimize, maximize and close.
- Explorer (
ctrl + bto toggle) — the file tree for the open folder. - Editor — tabs across the top;
ctrl + tabfor fuzzy file search,ctrl + wto close a tab. - Console (
ctrl + tto toggle) — a real shell, one per tab; + on its tab strip lists the shells found on the machine. - Command palette (
ctrl + .) — fuzzy-search and run any action Thor exposes; every keybinding below is also a command here.
Rest the cursor on a control to see what it does: the title bar buttons, a tab,
a status bar segment and an explorer row all explain themselves, with the chord
they are bound to under the text. The tooltips setting turns this off.
For Odin, hover a symbol with ctrl held to see its declaration, alt + enter
(or ctrl + click) to jump to its definition, and ctrl + shift + u for the
code actions available at the caret.
Every other language gets the same features from a language server.
Settings > Language Servers (or Help > Language Servers) lists the ones
Thor knows: whether each is installed, what state it is in, and a button that
installs a missing one in the console. clangd, rust-analyzer, gopls,
basedpyright, typescript-language-server, lua-language-server and zls
are on out of the box; another two dozen — slangd, ruff, jdtls,
intelephense, taplo and more — are one switch away. Thor starts a server the
first time you open a file it claims. See Configuration for
the server table and how to add one of your own. A language server also scopes
ctrl + shift + u to the current selection instead of only the caret, and can
apply its own edits directly in the editor.
Help > Tutorial opens an interactive walkthrough of the shortcuts above, inside the editor itself. Help > Documentation opens this manual in Thor's Markdown preview, and Help > Documentation in Browser opens it outside the editor.
- Keybindings — the full shortcut reference.
- Configuration — themes, fonts, per-project settings.
- Plugins — how syntax highlighting and workspace plugins work.