A tiny CLI to bookmark project folders under short names and open them instantly in your favorite editor.
thyra is designed for developers who hop between multiple projects and want a faster, keyboard-only way to jump straight into a folder—no file explorer, no hassle.
- Quick Mapping: Save any folder under a short, memorable alias. Supports directory existence verification and home folder (
~) path resolution automatically. - Intelligent Batch Import: Bulk import subdirectories from a parent folder.
- Dry-run simulation with
--dry-run. - Automatic slug generation for folder names.
- Smart collision resolution (appends suffixes if aliases conflict).
- Idempotency protection (skips already-registered folder paths automatically).
- Dry-run simulation with
- Instant Project Launcher: Open your mapped folder inside any editor instantly with standard or custom config overrides on the fly.
- Fuzzy Search & Suggestion Engine: Typo? No problem. If an alias isn't found,
thyrasuggests closest matches using substring and Levenshtein distance calculations. - Priority Resolution Hierarchy: Dynamically resolves which editor to use: command flags override project configurations, which override
EDITORenvironment variables, which fall back tocode(VS Code). - Workspace Navigation: Instantly spawn a new Terminal window directly inside your mapped project folder using
cdon macOS. - Global Cleanses: Cleanly remove individual mappings or flush your entire storage with confirmation-guarded actions.
- Interactive Version Upgrader: Automatic version checks that are throttled to run only once every 24 hours. Intelligently detects your package manager (
npm,pnpm,yarn,bun), your installation context (global vs local), and updatesthyrawith a single prompt. - Automatic Migration: Upgrades old string-based configurations to modern structured schemas seamlessly upon load.
Install thyra globally via NPM:
npm install -g thyrathyra command will be available system-wide.
# Map projects with custom editor options
thyra config blog ~/projects/personal-blog
thyra config api /var/www/company/api webstorm
# Batch import projects from a workspace
thyra import ~/projects
# Open mapped folder instantly in default editor (VS Code) or custom
thyra open blog
# View all saved project bookmarks
thyra list
# Check version and update if available
thyra versionMap a directory path to a short alias.
thyra config <name> <folder_path> [editor]<name>: The short, unique alias you want to assign to this directory.<folder_path>: The absolute or relative path to the folder. Resolves~to your home directory automatically.[editor](Optional): Set a custom editor command (e.g.vim,subl,webstorm) specifically for this project.
thyra config frontend ~/code/react-app
thyra config api ~/projects/node-api webstormRecursively scans a target directory for immediate subfolders and registers them as project mappings.
thyra import <directory> [--dry-run]--dry-run: Runs a full simulation of the scan. Prints details of what would be imported, skipped, or resolved, without changing any configurations.
- Idempotency Check:
thyraautomatically skips folders whose exact paths are already mapped. - Slugification: Folder names are clean-slugified (e.g.
My Cool Project!->my-cool-project). - Collision Detection: If an alias collision is detected with an existing project or with another folder in the current import session, a numeric suffix is appended automatically (e.g.
api->api-2,api-3).
# Simulate a batch import
thyra import ~/projects --dry-run
# Run actual import
thyra import ~/projectsOpens a mapped project in your configured editor.
thyra open <name> [-e | --editor <editor>]-e, --editor <editor>: Override the default or configured editor on-the-fly for this session.
- Fuzzy Search: If you type a typo like
thyra open bllog, the system calculates the Levenshtein distance and will ask:Did you mean: blog ? - Shell Arg Escaping: Escapes paths safely for execution across Windows and POSIX environments.
# Opens blog in default editor
thyra open blog
# Opens blog in vim
thyra open blog -e vim
# Opens blog in WebStorm
thyra open blog --editor webstormSpawns a new terminal session positioned inside your project's saved directory path.
thyra cd <name>- Supported on macOS (Darwin), utilizing
open -a Terminal <path>.
thyra cd blogUpdates the path, editor, or both for an existing project mapping.
thyra update <name> [--path <folder_path>] [--editor <editor>]Note: Positional shorthand is supported:
thyra update <name> <folder_path>--path <folder_path>: Update the stored path. Folder must exist.--editor <editor>: Update the custom editor command.
# Update path using shorthand
thyra update blog ~/projects/personal-blog-v2
# Update path using explicit flag
thyra update blog --path ~/projects/personal-blog-v2
# Update editor only
thyra update blog --editor vim
# Update both at once
thyra update blog --path ~/projects/personal-blog-v2 --editor vimRemoves a saved project mapping, or wipes the entire registry.
thyra remove <name>
# OR
thyra remove --all [--force]--all: Clears the entire configuration registry.--force: Skips the interactive deletion confirmation prompt.
# Remove a single mapping
thyra remove api
# Clean registry with a safety confirmation prompt
thyra remove --all
# ⚠️ You are about to delete ALL projects.
# This action cannot be undone.
# Type 'yes' to confirm:
# Force-wipe registry without confirmation
thyra remove --all --forceRenders a structured, clean terminal table showing all saved folders.
thyra listName Path Editor
-
blog /Users/you/projects/personal-blog -
api /var/www/company/api webstorm
Displays current CLI version and runs background update checks.
thyra version
# OR
thyra --version
# OR
thyra -v- 24-Hour Throttling: Checks for new versions only once every 24 hours to keep CLI boots fast.
- Auto-Upgrade Engine: If a new version is available on NPM and your terminal is in interactive mode (TTY),
thyraasks:A new version of thyra is available (<latest>). Would you like to update now? (y/n) - Smart Agent Detection: If you confirm,
thyraautomatically detects the package manager used to install it (npm,pnpm,yarn, orbun) and runs the appropriate update script globally or locally based on your environment.
When you execute thyra open <alias>, the CLI resolves which editor to launch based on this order of precedence:
All configurations are stored in an organized schema in your home folder.
| Platform | Configuration Registry | Version Cache Info |
|---|---|---|
| macOS / Linux | ~/.config/thyra/thyra.json |
~/.config/thyra/thyra.version.json |
| Windows | %APPDATA%\thyra\thyra.json |
%APPDATA%\thyra\thyra.version.json |
{
"blog": {
"id": "c138d844-3d0d-44eb-bd59-7ffc5f403df2",
"name": "personal-blog",
"alias": "blog",
"path": "/Users/you/projects/personal-blog",
"createdAt": "2026-09-17T14:30:00.000Z",
"editor": "vim"
},
"api": {
"id": "e674b210-91bc-4cc5-99be-75bd71a067ff",
"name": "api",
"alias": "api",
"path": "/var/www/company/api",
"createdAt": "2026-09-17T14:32:00.000Z"
}
}You can configure global overrides via terminal environment variables:
| Variable | Function | Example |
|---|---|---|
EDITOR |
Defines the global fallback editor to open paths | export EDITOR="subl" |
NO_UPDATE_NOTIFIER |
Disables version check completely when set to 1 |
export NO_UPDATE_NOTIFIER=1 |
CI |
Disables interactive prompts in pipeline environments | export CI=true |
Ensure that your package manager's global binary directory is listed on your system PATH.
- For NPM:
$HOME/.npm-global/binor the NVM folder. - For Yarn:
$(yarn global bin) - For Bun:
$HOME/.bun/bin
When configuring mappings, wrap folder paths with spaces in quotes:
thyra config client "/Users/you/Work/Client A/Design Folder"Check if the editor binary command itself is accessible in your system terminal. For example, verify if typing code . or webstorm . works independently. If it does, ensure that exact binary name is passed as the editor mapping.
If you ever wish to uninstall:
npm uninstall -g thyraYour configuration files under ~/.config/thyra/ will be kept safe so you can reinstall anytime without losing mappings. Remove the folder manually if you want a fully clean slate.

