Native macOS menubar app that shows all your active terminal and CLI sessions at a glance.
SSH sessions · Database connections · Port forwards · Cloud CLIs · any networked CLI in one click.
Sesshy sits in your macOS menubar and scans your running processes in real time. Click the icon to see every active remote session across all your terminal windows — SSH, databases, tunnels, cloud CLIs, and newly installed networked CLIs. It also keeps a lightweight CLI inventory so you can see installed tools and local login evidence even when the CLI is not currently running.
| Command | What Sesshy shows |
|---|---|
ssh user@host |
Host or user@host target, connected socket endpoint, terminal app, TTY, elapsed time, working directory |
ssh -i key.pem host |
Correctly skips key flag, resolves host as the target |
ssh -o ProxyCommand="..." host |
Handles quoted option values, resolves the final host |
ssh host tail -f /var/log/app.log |
Detects host even when a remote command follows |
scp src user@host:dest |
Detected as a remote session, target resolved from arguments |
sftp user@host |
Detected as a remote session |
mosh-client |
Detected as a remote session (Mosh underlying transport process) |
| Command | What Sesshy shows |
|---|---|
psql postgresql://user@host:5432/dbname |
Host (host), database name (dbname) |
psql postgresql://host/dbname |
Host, database name |
psql -h host -d dbname |
Host via -h / --host, database via -d / --dbname |
psql -h host dbname |
Host and positional database name |
| Command | What Sesshy shows |
|---|---|
kubectl port-forward deployment/api 8080:80 |
Resource (deployment/api), port mapping (8080:80) |
kubectl port-forward pod/mypod 5432:5432 -n staging |
Resource, port mapping, ignores namespace flag |
kubectl port-forward svc/myservice 3000:3000 |
Service name and port mapping |
Sesshy includes a built-in CLI registry for common authenticated developer tools, including AWS, Google Cloud, Azure, GitHub, Vercel, Supabase, Fly.io, Railway, Render, Heroku, DigitalOcean, Stripe, Cloudflare, Tailscale, Terraform, OpenTofu, Pulumi, Vault, 1Password, Doppler, Sentry, Shopify, Linear, Hugging Face, Databricks, Snowflake, Netlify, Firebase, and Expo EAS.
| Command | What Sesshy shows |
|---|---|
aws sso login --profile production |
AWS CLI, profile (production), remote endpoint |
gh auth login --hostname github.example.com |
GitHub CLI, hostname, remote endpoint |
vercel login --scope my-team |
Vercel CLI, scope, remote endpoint |
wrangler login |
Cloudflare Wrangler, command context, remote endpoint |
Sesshy no longer depends only on a hardcoded command list. Any non-shell process attached to a TTY with an outbound network connection is shown as a generic CLI session, so newly installed or private tools can appear automatically while they are active.
Sesshy also scans user-managed executable locations such as Homebrew, Homebrew keg-only formula bins under opt/*/bin and opt/*/sbin, MacPorts, pkgsrc, /usr/local/bin, /usr/local/sbin, ~/bin, ~/.bin, ~/.local/bin, ~/.local/sbin, Cargo, Bun, Deno, npm, pnpm including ~/Library/pnpm, Yarn, asdf, mise and rtx shims plus installed-version bins, Volta, proto shims/tools, vfox/version-fox shims/cache, Go, dotnet tools, Composer, rbenv, pyenv, nodenv, goenv, jenv, phpenv, plenv, luaenv, Mint, SwiftPM installs, swiftenv, conda, mamba, micromamba, classic and modern Nix profiles, pkgx versioned package prefixes under ~/.pkgx, Dart pub, Cabal/GHCup, Foundry, Rye, Pixi, Aqua, Krew, Poetry, Coursier, Juliaup, Elan, Nimble, Mix escripts, LuaRocks, tfenv/tgenv, Google Cloud SDK, JetBrains Toolbox scripts, Android SDK platform tools and command-line tools, Flutter SDK bins, RubyGems, Python user scripts, SDKMAN candidate bins, uv tools, pipx venvs, nvm Node versions, and fnm Node versions. It also reads conservative PATH additions from ~/.zprofile, ~/.zshrc, ~/.bash_profile, ~/.bashrc, ~/.profile, and fish config under ~/.config/fish/config.fish or XDG_CONFIG_HOME/fish/config.fish, plus npm/pnpm config files such as ~/.npmrc, ~/.config/npm/npmrc, and ~/.config/pnpm/rc or their XDG_CONFIG_HOME equivalents for custom prefix or global-bin-dir settings, Go persistent env files such as ~/Library/Application Support/go/env, ~/.config/go/env, or XDG_CONFIG_HOME/go/env for custom GOBIN or GOPATH installs, and visible or shell-exported package-manager root variables such as HOMEBREW_PREFIX, XDG_DATA_HOME, XDG_CONFIG_HOME, CARGO_HOME, BUN_INSTALL, DENO_INSTALL, PNPM_HOME, VOLTA_HOME, ASDF_DATA_DIR, MISE_DATA_DIR, PROTO_HOME, VFOX_HOME, ANDROID_HOME, ANDROID_SDK_ROOT, FLUTTER_ROOT, DART_HOME, CABAL_DIR, GHCUP_INSTALL_BASE_PREFIX, FOUNDRY_DIR, RYE_HOME, PIXI_HOME, JULIAUP_DEPOT_PATH, ELAN_HOME, NIMBLE_DIR, CLOUDSDK_ROOT_DIR, PYENV_ROOT, RBENV_ROOT, NODENV_ROOT, GOENV_ROOT, JENV_ROOT, PHPENV_ROOT, PLENV_ROOT, LUAENV_ROOT, SWIFTENV_ROOT, NVM_DIR, FNM_DIR, SDKMAN_DIR, UV_TOOL_DIR, UV_TOOL_BIN_DIR, KREW_ROOT, AQUA_ROOT_DIR, GOBIN, GOPATH, PIPX_BIN_DIR, POETRY_HOME, GEM_HOME, COMPOSER_HOME, PUB_CACHE, MIX_HOME, OPAMROOT, and RVM_PATH. That helps the menu bar app find custom ~/bin-style tools even when macOS launches it with a sparse GUI environment because exported root variables in common shell startup files are reread on refresh. Unregistered tools found there appear as Discovered inventory items, so a newly installed CLI can show up in the menu even before Sesshy knows its product name or credential format. Sesshy recomputes versioned package-manager bin paths, shell-configured paths, package-manager config paths, Go env paths, and environment- or shell-exported root paths on every refresh, so new custom Homebrew prefixes, Homebrew keg-only formula opt bins, XDG data roots for pnpm, mise, rtx, and Coursier, XDG config roots for fish, npm, pnpm, and Go, Android SDK roots, Flutter and Dart SDK roots, Python, RubyGems, SDKMAN, mise, rtx, proto, vfox/version-fox, pkgx, uv, pipx, Composer, Dart pub, Cabal/GHCup, Foundry, Rye, Pixi, Juliaup, Elan, Nimble, Google Cloud SDK, Mix escripts, nvm, fnm, OPAM, RVM, conda/mamba envs, custom pyenv/rbenv-family shims, and custom shell or environment-driven executable directories created after launch can be picked up without restarting the app. When the same executable is present in multiple managed paths, Sesshy shows a single inventory row for that CLI. For imported or unknown tools without explicit credentialPaths, Sesshy checks common credential-shaped paths such as ~/.config/<tool>/auth.json, credentials.json, token, access-token, and session.json, plus ecosystem login files including Docker, npm/Yarn/pnpm/Bun, Kubernetes, Helm, Git, RubyGems, PyPI/Twine, AWS, Google Cloud, Azure, GitHub/GitLab, Hugging Face, Terraform/OpenTofu, Pulumi, Vercel, Netlify, Supabase, Fly.io, Heroku, DigitalOcean, Railway, Render, Databricks, Snowflake, Stripe, Wrangler, cloudflared, ngrok, Sentry, Vault, Firebase, Expo/EAS, CircleCI, 1Password, Doppler, Codex, OpenAI, OpenCode, and Qwen Code config locations. Imported package IDs and titles such as Microsoft.AzureCLI, Google.CloudSDK, or GitHub.cli are also used as credential hints, so package catalogs can still mark a tool as Logged In even when the executable name is sparse or vendor-specific. It also treats provider token variables such as OPENAI_API_KEY, ANTHROPIC_API_KEY, GEMINI_API_KEY, HF_TOKEN, REPLICATE_API_TOKEN, GITHUB_TOKEN, VERCEL_TOKEN, and generic <TOOL>_API_KEY / <TOOL>_TOKEN names as login evidence when they are visible in the app environment or exported from common shell config files. When one exists, the item is marked Logged In with that evidence path. While the app is running, Sesshy watches executable directories, registry folders, shell and package-manager path config files, Go env files, environment-configured root paths, and common credential roots such as ~/.config, ~/.aws, ~/.docker, ~/.kube, ~/.terraform.d, ~/.pulumi, ~/.qwen, and ~/.local/share/opencode, then refreshes automatically when installs, configured executable paths, or login files change. After a change-triggered refresh, Sesshy rebuilds its watched path set so directories newly added through config files can trigger later refreshes too.
For better names, target extraction, and login evidence, add registry JSON at:
~/Library/Application Support/Sesshy/CLIRegistry.json
For larger catalogs or generated updates, drop any number of .json files into:
~/Library/Application Support/Sesshy/Registries/
Sesshy loads the single-file registry first, then merges directory files in filename order. Later files override earlier definitions for the same executable, which makes it practical to keep separate catalogs from OpenCLI, Fig-compatible specs, tldr-derived metadata, internal tools, or hand-maintained overrides.
The menu also includes Update Catalogs, which downloads remote registry feeds, validates them, and writes them into the same Registries/ directory. Broken downloads, malformed JSON, and unexpectedly empty converted feeds are reported without replacing the last valid catalog. Add extra feed URLs at:
~/Library/Application Support/Sesshy/CatalogSources.json
Sesshy checks for catalog updates automatically when the app starts if it has not attempted an update in the last 24 hours. Startup catalog updates run alongside the normal local refresh loop, so slow network catalog downloads do not block the menu from showing currently installed CLIs and active sessions. You can still run Update Catalogs manually at any time.
If CatalogSources.json is malformed, Sesshy falls back to built-in sources and reports the load issue in the update status.
Built-in catalog sources include Sesshy's community catalog, the Homebrew Formulae and Cask JSON APIs, the Fig/Amazon Q completion spec tree, the fish shell completion catalog, the zsh-completions catalog, the Carapace completion catalog, the official asdf plugin index, the official proto plugin registry, the public vfox plugin index, the Awesome CLI Apps CSV dataset, the Awesome TUIs community list, the Awesome Modern CLI replacement-tools list, the CLIs.dev agent-focused CLI directory, the Open CLI task-first directory, the OpenCLI Hub AI/productivity CLI directory, the getcli registry, Terminal Trove's regularly updated A-Z terminal tools list, trmn's paged terminal/TUI tool directory, GitHub repository search results for CLI/TUI/terminal/developer-tool/DevOps/Kubernetes/AI-agent topics, Repology package-project search results, the Scoop Main, Extras, and Versions buckets, Chocolatey package searches, conda-forge current repodata, Arch Linux package searches, AUR RPC searches, Alpine aports main/community/testing trees, Termux package and root-package trees, the Void Linux srcpkgs tree, high-signal FreeBSD and OpenBSD ports categories, high-signal Gentoo ebuild categories, the MacPorts ports tree, the pkgsrc tree, the Nixpkgs by-name tree, the CLIHunt AI-agent and developer-tool registry, the official SDKMAN candidate directory, the official Aqua registry, the live mise registry tree, the pkgx pantry tree, the Krew plugin index, tldr pages, a paged crates.io CLI search, and paged npm package searches for CLI, terminal/TUI, AI CLI, and agent terms. Homebrew, Fig, fish completions, zsh completions, Carapace completions, asdf, proto, vfox, Awesome CLI Apps, Awesome TUIs, Awesome Modern CLI, CLIs.dev, Open CLI, OpenCLI Hub, getcli, Terminal Trove, trmn, GitHub repository search, Repology project search, Scoop, WinGet, Chocolatey, conda-forge, Arch official packages, AUR packages, Alpine APKBUILD packages, Termux build scripts, Void srcpkg templates, FreeBSD/OpenBSD port Makefiles, Gentoo ebuild packages, MacPorts command-line ports, pkgsrc command-line packages, Nix-installed package CLIs, AI coding agents, JVM and polyglot SDKMAN command-line tools, Aqua-managed tools, mise shorthands, pkgx pantry packages, kubectl plugins, documented commands, Rust crates, and JavaScript package CLIs can appear without shipping a new app build. For paged APIs or generated shards, a source can use urls instead of url, or urlTemplate with pageRange; Sesshy downloads every URL and merges the results into one registry file for that source. Sesshy identifies itself with a User-Agent on catalog HTTP requests so sources that require a named client, such as Repology, can be updated reliably.
Example:
{
"sources": [
{
"name": "Homebrew Formulae",
"url": "https://formulae.brew.sh/api/formula.json",
"format": "homebrewFormulaIndex"
},
{
"name": "Homebrew Casks",
"url": "https://formulae.brew.sh/api/cask.json",
"format": "homebrewCaskIndex"
},
{
"name": "Fig Completion Specs",
"url": "https://api.github.com/repos/withfig/autocomplete/git/trees/master?recursive=1",
"format": "figCompletionSpecTree"
},
{
"name": "fish Completion Specs",
"url": "https://api.github.com/repos/fish-shell/fish-shell/git/trees/master:share/completions?recursive=1",
"format": "fishCompletionTree"
},
{
"name": "zsh Completion Specs",
"url": "https://api.github.com/repos/zsh-users/zsh-completions/git/trees/master:src?recursive=1",
"format": "zshCompletionTree"
},
{
"name": "Carapace Completion Specs",
"url": "https://api.github.com/repos/carapace-sh/carapace-bin/git/trees/master?recursive=1",
"format": "carapaceCompletionTree"
},
{
"name": "asdf Plugin Index",
"url": "https://raw.githubusercontent.com/asdf-vm/asdf-plugins/master/README.md",
"format": "asdfPluginIndex"
},
{
"name": "proto Plugin Registry",
"urls": [
"https://raw.githubusercontent.com/moonrepo/proto/master/registry/data/built-in.json",
"https://raw.githubusercontent.com/moonrepo/proto/master/registry/data/third-party.json"
],
"format": "protoPluginRegistry"
},
{
"name": "vfox Plugin Index",
"url": "https://raw.githubusercontent.com/version-fox/vfox-plugins/main/plugins/index.json",
"format": "vfoxPluginIndex"
},
{
"name": "Awesome CLI Apps",
"url": "https://raw.githubusercontent.com/toolleeo/awesome-cli-apps-in-a-csv/master/data/apps.csv",
"format": "awesomeCLIAppsCSV"
},
{
"name": "CLIs.dev",
"url": "https://clis.dev/api/clis",
"format": "clisDevAPI"
},
{
"name": "Open CLI",
"url": "https://opencli.co/",
"format": "openCLIDirectoryHTML"
},
{
"name": "OpenCLI Hub",
"url": "https://openclihub.com/api/tools",
"format": "openCLIHubToolsAPI"
},
{
"name": "DoesItCLI",
"url": "https://www.doesitcli.com/",
"format": "doesItCLIDirectoryHTML"
},
{
"name": "CLI-Anything Registry",
"url": "https://raw.githubusercontent.com/HKUDS/CLI-Anything/main/registry.json",
"format": "cliAnythingRegistry"
},
{
"name": "getcli Registry",
"url": "https://getcli.dev/registry",
"format": "getCLIRegistryHTML"
},
{
"name": "Terminal Trove A-Z",
"url": "https://terminaltrove.com/list/",
"format": "terminalTroveListHTML"
},
{
"name": "Awesome TUIs",
"url": "https://raw.githubusercontent.com/rothgar/awesome-tuis/main/README.md",
"format": "awesomeTUISMarkdown"
},
{
"name": "Awesome Modern CLI",
"url": "https://raw.githubusercontent.com/thegdsks/awesome-modern-cli/main/README.md",
"format": "awesomeModernCLIMarkdown"
},
{
"name": "trmn Terminal Tools",
"urlTemplate": "https://www.trmn.sh/tools?page={page}",
"pageRange": { "start": 1, "end": 9 },
"format": "trmnToolsDirectoryHTML"
},
{
"name": "GitHub CLI Repository Search",
"urls": [
"https://api.github.com/search/repositories?q=topic%3Acli+archived%3Afalse&sort=stars&order=desc&per_page=100&page=1",
"https://api.github.com/search/repositories?q=topic%3Acli+archived%3Afalse&sort=stars&order=desc&per_page=100&page=2",
"https://api.github.com/search/repositories?q=topic%3Acli+archived%3Afalse&sort=stars&order=desc&per_page=100&page=3",
"https://api.github.com/search/repositories?q=topic%3Acommand-line-tool+archived%3Afalse&sort=stars&order=desc&per_page=100&page=1",
"https://api.github.com/search/repositories?q=topic%3Acommand-line-tool+archived%3Afalse&sort=stars&order=desc&per_page=100&page=2",
"https://api.github.com/search/repositories?q=topic%3Acommand-line-tool+archived%3Afalse&sort=stars&order=desc&per_page=100&page=3",
"https://api.github.com/search/repositories?q=topic%3Atui+archived%3Afalse&sort=stars&order=desc&per_page=100&page=1",
"https://api.github.com/search/repositories?q=topic%3Atui+archived%3Afalse&sort=stars&order=desc&per_page=100&page=2",
"https://api.github.com/search/repositories?q=topic%3Atui+archived%3Afalse&sort=stars&order=desc&per_page=100&page=3",
"https://api.github.com/search/repositories?q=topic%3Aterminal+archived%3Afalse&sort=stars&order=desc&per_page=100&page=1",
"https://api.github.com/search/repositories?q=topic%3Aterminal+archived%3Afalse&sort=stars&order=desc&per_page=100&page=2",
"https://api.github.com/search/repositories?q=topic%3Aterminal+archived%3Afalse&sort=stars&order=desc&per_page=100&page=3",
"https://api.github.com/search/repositories?q=topic%3Acommand-line-interface+archived%3Afalse&sort=stars&order=desc&per_page=100&page=1",
"https://api.github.com/search/repositories?q=topic%3Acommand-line-interface+archived%3Afalse&sort=stars&order=desc&per_page=100&page=2",
"https://api.github.com/search/repositories?q=topic%3Acommand-line-interface+archived%3Afalse&sort=stars&order=desc&per_page=100&page=3",
"https://api.github.com/search/repositories?q=topic%3Acommand-line+archived%3Afalse&sort=stars&order=desc&per_page=100&page=1",
"https://api.github.com/search/repositories?q=topic%3Acommand-line+archived%3Afalse&sort=stars&order=desc&per_page=100&page=2",
"https://api.github.com/search/repositories?q=topic%3Acommand-line+archived%3Afalse&sort=stars&order=desc&per_page=100&page=3",
"https://api.github.com/search/repositories?q=topic%3Acli-app+archived%3Afalse&sort=stars&order=desc&per_page=100&page=1",
"https://api.github.com/search/repositories?q=topic%3Acli-app+archived%3Afalse&sort=stars&order=desc&per_page=100&page=2",
"https://api.github.com/search/repositories?q=topic%3Acli-app+archived%3Afalse&sort=stars&order=desc&per_page=100&page=3",
"https://api.github.com/search/repositories?q=topic%3Aterminal-app+archived%3Afalse&sort=stars&order=desc&per_page=100&page=1",
"https://api.github.com/search/repositories?q=topic%3Aterminal-app+archived%3Afalse&sort=stars&order=desc&per_page=100&page=2",
"https://api.github.com/search/repositories?q=topic%3Aterminal-app+archived%3Afalse&sort=stars&order=desc&per_page=100&page=3",
"https://api.github.com/search/repositories?q=topic%3Adeveloper-tools+archived%3Afalse&sort=stars&order=desc&per_page=100&page=1",
"https://api.github.com/search/repositories?q=topic%3Adeveloper-tools+archived%3Afalse&sort=stars&order=desc&per_page=100&page=2",
"https://api.github.com/search/repositories?q=topic%3Adeveloper-tools+archived%3Afalse&sort=stars&order=desc&per_page=100&page=3",
"https://api.github.com/search/repositories?q=topic%3Adevops+archived%3Afalse&sort=stars&order=desc&per_page=100&page=1",
"https://api.github.com/search/repositories?q=topic%3Adevops+archived%3Afalse&sort=stars&order=desc&per_page=100&page=2",
"https://api.github.com/search/repositories?q=topic%3Adevops+archived%3Afalse&sort=stars&order=desc&per_page=100&page=3",
"https://api.github.com/search/repositories?q=topic%3Akubernetes+archived%3Afalse&sort=stars&order=desc&per_page=100&page=1",
"https://api.github.com/search/repositories?q=topic%3Akubernetes+archived%3Afalse&sort=stars&order=desc&per_page=100&page=2",
"https://api.github.com/search/repositories?q=topic%3Akubernetes+archived%3Afalse&sort=stars&order=desc&per_page=100&page=3",
"https://api.github.com/search/repositories?q=topic%3Aai-agent+archived%3Afalse&sort=stars&order=desc&per_page=100&page=1",
"https://api.github.com/search/repositories?q=topic%3Aai-agent+archived%3Afalse&sort=stars&order=desc&per_page=100&page=2",
"https://api.github.com/search/repositories?q=topic%3Aai-agent+archived%3Afalse&sort=stars&order=desc&per_page=100&page=3",
"https://api.github.com/search/repositories?q=topic%3Acoding-agent+archived%3Afalse&sort=stars&order=desc&per_page=100&page=1",
"https://api.github.com/search/repositories?q=topic%3Acoding-agent+archived%3Afalse&sort=stars&order=desc&per_page=100&page=2",
"https://api.github.com/search/repositories?q=topic%3Acoding-agent+archived%3Afalse&sort=stars&order=desc&per_page=100&page=3"
],
"format": "githubRepositorySearch"
},
{
"name": "Repology CLI Project Search",
"url": "https://repology.org/api/v1/projects/?search=cli",
"format": "repologyProjectSearch"
},
{
"name": "Scoop Main Bucket",
"url": "https://api.github.com/repos/ScoopInstaller/Main/git/trees/master?recursive=1",
"format": "scoopBucketTree"
},
{
"name": "Scoop Extras Bucket",
"url": "https://api.github.com/repos/ScoopInstaller/Extras/git/trees/master?recursive=1",
"format": "scoopBucketTree"
},
{
"name": "Scoop Versions Bucket",
"url": "https://api.github.com/repos/ScoopInstaller/Versions/git/trees/master?recursive=1",
"format": "scoopBucketTree"
},
{
"name": "WinGet Package Manifests",
"url": "https://api.github.com/repos/microsoft/winget-pkgs/git/trees/master?recursive=1",
"format": "wingetManifestTree"
},
{
"name": "Chocolatey Package Search",
"urls": [
"https://community.chocolatey.org/api/v2/Search()?searchTerm=%27cli%27&targetFramework=%27%27&includePrerelease=false&%24skip=0&%24top=100",
"https://community.chocolatey.org/api/v2/Search()?searchTerm=%27command-line%27&targetFramework=%27%27&includePrerelease=false&%24skip=0&%24top=100",
"https://community.chocolatey.org/api/v2/Search()?searchTerm=%27terminal%27&targetFramework=%27%27&includePrerelease=false&%24skip=0&%24top=100",
"https://community.chocolatey.org/api/v2/Search()?searchTerm=%27cloud%27&targetFramework=%27%27&includePrerelease=false&%24skip=0&%24top=100",
"https://community.chocolatey.org/api/v2/Search()?searchTerm=%27kubernetes%27&targetFramework=%27%27&includePrerelease=false&%24skip=0&%24top=100",
"https://community.chocolatey.org/api/v2/Search()?searchTerm=%27agent%27&targetFramework=%27%27&includePrerelease=false&%24skip=0&%24top=100"
],
"format": "chocolateySearch"
},
{
"name": "conda-forge Current Repodata",
"urls": [
"https://conda.anaconda.org/conda-forge/noarch/current_repodata.json",
"https://conda.anaconda.org/conda-forge/osx-arm64/current_repodata.json",
"https://conda.anaconda.org/conda-forge/osx-64/current_repodata.json"
],
"format": "condaRepodata"
},
{
"name": "Arch Linux Package Search",
"urls": [
"https://archlinux.org/packages/search/json/?q=cli",
"https://archlinux.org/packages/search/json/?q=command-line",
"https://archlinux.org/packages/search/json/?q=terminal",
"https://archlinux.org/packages/search/json/?q=tui",
"https://archlinux.org/packages/search/json/?q=cloud",
"https://archlinux.org/packages/search/json/?q=kubernetes",
"https://archlinux.org/packages/search/json/?q=agent"
],
"format": "archPackageSearch"
},
{
"name": "AUR Package Search",
"urls": [
"https://aur.archlinux.org/rpc/v5/search/command-line?by=name-desc",
"https://aur.archlinux.org/rpc/v5/search/terminal?by=name-desc",
"https://aur.archlinux.org/rpc/v5/search/tui?by=name-desc",
"https://aur.archlinux.org/rpc/v5/search/cloud?by=name-desc",
"https://aur.archlinux.org/rpc/v5/search/kubernetes?by=name-desc",
"https://aur.archlinux.org/rpc/v5/search/agent?by=name-desc"
],
"format": "aurRPCSearch"
},
{
"name": "Alpine aports Main Tree",
"url": "https://api.github.com/repos/alpinelinux/aports/git/trees/master:main?recursive=1",
"format": "alpineAportsTree"
},
{
"name": "Alpine aports Community Tree",
"url": "https://api.github.com/repos/alpinelinux/aports/git/trees/master:community?recursive=1",
"format": "alpineAportsTree"
},
{
"name": "Alpine aports Testing Tree",
"url": "https://api.github.com/repos/alpinelinux/aports/git/trees/master:testing?recursive=1",
"format": "alpineAportsTree"
},
{
"name": "Termux Packages Tree",
"url": "https://api.github.com/repos/termux/termux-packages/git/trees/master:packages?recursive=1",
"format": "termuxPackageTree"
},
{
"name": "Termux Root Packages Tree",
"url": "https://api.github.com/repos/termux/termux-packages/git/trees/master:root-packages?recursive=1",
"format": "termuxPackageTree"
},
{
"name": "Void Linux srcpkgs Tree",
"url": "https://api.github.com/repos/void-linux/void-packages/git/trees/master:srcpkgs?recursive=1",
"format": "voidSrcpkgsTree"
},
{
"name": "FreeBSD Ports sysutils Tree",
"url": "https://api.github.com/repos/freebsd/freebsd-ports/git/trees/main:sysutils?recursive=1",
"format": "freebsdPortsTree"
},
{
"name": "FreeBSD Ports devel Tree",
"url": "https://api.github.com/repos/freebsd/freebsd-ports/git/trees/main:devel?recursive=1",
"format": "freebsdPortsTree"
},
{
"name": "FreeBSD Ports net Tree",
"url": "https://api.github.com/repos/freebsd/freebsd-ports/git/trees/main:net?recursive=1",
"format": "freebsdPortsTree"
},
{
"name": "FreeBSD Ports security Tree",
"url": "https://api.github.com/repos/freebsd/freebsd-ports/git/trees/main:security?recursive=1",
"format": "freebsdPortsTree"
},
{
"name": "FreeBSD Ports shells Tree",
"url": "https://api.github.com/repos/freebsd/freebsd-ports/git/trees/main:shells?recursive=1",
"format": "freebsdPortsTree"
},
{
"name": "FreeBSD Ports textproc Tree",
"url": "https://api.github.com/repos/freebsd/freebsd-ports/git/trees/main:textproc?recursive=1",
"format": "freebsdPortsTree"
},
{
"name": "FreeBSD Ports databases Tree",
"url": "https://api.github.com/repos/freebsd/freebsd-ports/git/trees/main:databases?recursive=1",
"format": "freebsdPortsTree"
},
{
"name": "OpenBSD Ports sysutils Tree",
"url": "https://api.github.com/repos/openbsd/ports/git/trees/master:sysutils?recursive=1",
"format": "openbsdPortsTree"
},
{
"name": "OpenBSD Ports devel Tree",
"url": "https://api.github.com/repos/openbsd/ports/git/trees/master:devel?recursive=1",
"format": "openbsdPortsTree"
},
{
"name": "OpenBSD Ports net Tree",
"url": "https://api.github.com/repos/openbsd/ports/git/trees/master:net?recursive=1",
"format": "openbsdPortsTree"
},
{
"name": "OpenBSD Ports security Tree",
"url": "https://api.github.com/repos/openbsd/ports/git/trees/master:security?recursive=1",
"format": "openbsdPortsTree"
},
{
"name": "OpenBSD Ports shells Tree",
"url": "https://api.github.com/repos/openbsd/ports/git/trees/master:shells?recursive=1",
"format": "openbsdPortsTree"
},
{
"name": "OpenBSD Ports textproc Tree",
"url": "https://api.github.com/repos/openbsd/ports/git/trees/master:textproc?recursive=1",
"format": "openbsdPortsTree"
},
{
"name": "OpenBSD Ports databases Tree",
"url": "https://api.github.com/repos/openbsd/ports/git/trees/master:databases?recursive=1",
"format": "openbsdPortsTree"
},
{
"name": "Gentoo app-admin Ebuild Tree",
"url": "https://api.github.com/repos/gentoo/gentoo/git/trees/master:app-admin?recursive=1",
"format": "gentooEbuildTree"
},
{
"name": "Gentoo app-shells Ebuild Tree",
"url": "https://api.github.com/repos/gentoo/gentoo/git/trees/master:app-shells?recursive=1",
"format": "gentooEbuildTree"
},
{
"name": "Gentoo app-portage Ebuild Tree",
"url": "https://api.github.com/repos/gentoo/gentoo/git/trees/master:app-portage?recursive=1",
"format": "gentooEbuildTree"
},
{
"name": "Gentoo dev-util Ebuild Tree",
"url": "https://api.github.com/repos/gentoo/gentoo/git/trees/master:dev-util?recursive=1",
"format": "gentooEbuildTree"
},
{
"name": "Gentoo dev-vcs Ebuild Tree",
"url": "https://api.github.com/repos/gentoo/gentoo/git/trees/master:dev-vcs?recursive=1",
"format": "gentooEbuildTree"
},
{
"name": "Gentoo net-misc Ebuild Tree",
"url": "https://api.github.com/repos/gentoo/gentoo/git/trees/master:net-misc?recursive=1",
"format": "gentooEbuildTree"
},
{
"name": "Gentoo net-analyzer Ebuild Tree",
"url": "https://api.github.com/repos/gentoo/gentoo/git/trees/master:net-analyzer?recursive=1",
"format": "gentooEbuildTree"
},
{
"name": "Gentoo sys-apps Ebuild Tree",
"url": "https://api.github.com/repos/gentoo/gentoo/git/trees/master:sys-apps?recursive=1",
"format": "gentooEbuildTree"
},
{
"name": "Gentoo sys-process Ebuild Tree",
"url": "https://api.github.com/repos/gentoo/gentoo/git/trees/master:sys-process?recursive=1",
"format": "gentooEbuildTree"
},
{
"name": "MacPorts Ports Tree",
"url": "https://api.github.com/repos/macports/macports-ports/git/trees/master?recursive=1",
"format": "macPortsPortsTree"
},
{
"name": "pkgsrc Tree",
"url": "https://api.github.com/repos/NetBSD/pkgsrc/git/trees/trunk?recursive=1",
"format": "pkgsrcTree"
},
{
"name": "Nixpkgs by-name Tree",
"url": "https://api.github.com/repos/NixOS/nixpkgs/git/trees/master:pkgs/by-name?recursive=1",
"format": "nixpkgsByNameTree"
},
{
"name": "CLIHunt Tools",
"url": "https://api.clihunt.dev/v1/tools?sort=stars&limit=200",
"format": "cliHuntToolsAPI"
},
{
"name": "SDKMAN Candidates",
"url": "https://sdkman.io/sdks/",
"format": "sdkmanCandidatesHTML"
},
{
"name": "Aqua Registry",
"url": "https://raw.githubusercontent.com/aquaproj/aqua-registry/main/registry.yaml",
"format": "aquaRegistry"
},
{
"name": "mise Registry",
"url": "https://api.github.com/repos/jdx/mise/git/trees/main?recursive=1",
"format": "miseRegistryTree"
},
{
"name": "pkgx Pantry",
"url": "https://api.github.com/repos/pkgxdev/pantry/git/trees/main?recursive=1",
"format": "pkgxPantryTree"
},
{
"name": "Krew Plugin Index",
"url": "https://api.github.com/repos/kubernetes-sigs/krew-index/git/trees/master?recursive=1",
"format": "krewPluginIndexTree"
},
{
"name": "tldr Pages",
"url": "https://api.github.com/repos/tldr-pages/tldr/git/trees/main?recursive=1",
"format": "tldrGitHubTree"
},
{
"name": "NPM CLI Packument Shard",
"url": "https://example.com/sesshy/npm-cli-packuments.json",
"format": "npmRegistry"
},
{
"name": "NPM CLI Search",
"urls": [
"https://registry.npmjs.org/-/v1/search?text=keywords:cli&size=250&from=0",
"https://registry.npmjs.org/-/v1/search?text=keywords:cli&size=250&from=250",
"https://registry.npmjs.org/-/v1/search?text=keywords:cli&size=250&from=500",
"https://registry.npmjs.org/-/v1/search?text=keywords:cli&size=250&from=750",
"https://registry.npmjs.org/-/v1/search?text=keywords:cli&size=250&from=1000",
"https://registry.npmjs.org/-/v1/search?text=keywords:command-line&size=250&from=0",
"https://registry.npmjs.org/-/v1/search?text=keywords:command-line&size=250&from=250",
"https://registry.npmjs.org/-/v1/search?text=keywords:terminal&size=250&from=0",
"https://registry.npmjs.org/-/v1/search?text=keywords:terminal&size=250&from=250",
"https://registry.npmjs.org/-/v1/search?text=keywords:tui&size=250&from=0",
"https://registry.npmjs.org/-/v1/search?text=keywords:tui&size=250&from=250",
"https://registry.npmjs.org/-/v1/search?text=agent%20cli&size=250&from=0",
"https://registry.npmjs.org/-/v1/search?text=agent%20cli&size=250&from=250",
"https://registry.npmjs.org/-/v1/search?text=ai%20cli&size=250&from=0",
"https://registry.npmjs.org/-/v1/search?text=ai%20cli&size=250&from=250",
"https://registry.npmjs.org/-/v1/search?text=ai%20agent&size=250&from=0",
"https://registry.npmjs.org/-/v1/search?text=ai%20agent&size=250&from=250",
"https://registry.npmjs.org/-/v1/search?text=coding%20agent&size=250&from=0",
"https://registry.npmjs.org/-/v1/search?text=coding%20agent&size=250&from=250",
"https://registry.npmjs.org/-/v1/search?text=terminal%20agent&size=250&from=0",
"https://registry.npmjs.org/-/v1/search?text=terminal%20agent&size=250&from=250",
"https://registry.npmjs.org/-/v1/search?text=claude%20cli&size=250&from=0",
"https://registry.npmjs.org/-/v1/search?text=gemini%20cli&size=250&from=0",
"https://registry.npmjs.org/-/v1/search?text=codex%20cli&size=250&from=0",
"https://registry.npmjs.org/-/v1/search?text=openai%20cli&size=250&from=0"
],
"format": "npmSearch"
},
{
"name": "PyPI CLI Metadata Shard",
"url": "https://example.com/sesshy/pypi-cli-metadata.json",
"format": "pypiMetadata"
},
{
"name": "RubyGems CLI Metadata Shard",
"url": "https://example.com/sesshy/rubygems-cli-metadata.json",
"format": "rubygemsMetadata"
},
{
"name": "Crates.io CLI Search",
"urls": [
"https://crates.io/api/v1/crates?q=cli&page=1&per_page=100",
"https://crates.io/api/v1/crates?q=cli&page=2&per_page=100",
"https://crates.io/api/v1/crates?q=cli&page=3&per_page=100",
"https://crates.io/api/v1/crates?q=cli&page=4&per_page=100",
"https://crates.io/api/v1/crates?q=cli&page=5&per_page=100",
"https://crates.io/api/v1/crates?q=terminal&page=1&per_page=100",
"https://crates.io/api/v1/crates?q=terminal&page=2&per_page=100",
"https://crates.io/api/v1/crates?q=tui&page=1&per_page=100",
"https://crates.io/api/v1/crates?q=tui&page=2&per_page=100",
"https://crates.io/api/v1/crates?q=shell&page=1&per_page=100",
"https://crates.io/api/v1/crates?q=shell&page=2&per_page=100",
"https://crates.io/api/v1/crates?q=agent&page=1&per_page=100",
"https://crates.io/api/v1/crates?q=ai&page=1&per_page=100",
"https://crates.io/api/v1/crates?q=cloud&page=1&per_page=100",
"https://crates.io/api/v1/crates?q=kubernetes&page=1&per_page=100",
"https://crates.io/api/v1/crates?q=devops&page=1&per_page=100",
"https://crates.io/api/v1/crates?q=automation&page=1&per_page=100"
],
"format": "cratesIOSearch"
},
{
"name": "pkg.go.dev Go CLI Search",
"urls": [
"https://pkg.go.dev/search?q=cli%20cmd&m=package",
"https://pkg.go.dev/search?q=command%20line%20cmd&m=package",
"https://pkg.go.dev/search?q=terminal%20cmd&m=package"
],
"format": "pkgGoDevSearchHTML"
},
{
"name": "pub.dev Dart CLI Search",
"urls": [
"https://pub.dev/api/search?q=cli",
"https://pub.dev/api/search?q=command-line",
"https://pub.dev/api/search?q=flutter%20cli"
],
"format": "pubDevSearch"
},
{
"name": "Packagist PHP CLI Search",
"urls": [
"https://packagist.org/search.json?tags=cli",
"https://packagist.org/search.json?q=command-line",
"https://packagist.org/search.json?q=console"
],
"format": "packagistSearch"
},
{
"name": "Hex.pm Elixir CLI Search",
"urls": [
"https://hex.pm/api/packages?search=cli",
"https://hex.pm/api/packages?search=mix%20task",
"https://hex.pm/api/packages?search=escript"
],
"format": "hexPackageSearch"
},
{
"name": "Internal CLI Catalog",
"url": "https://example.com/sesshy/internal-cli-registry.json",
"format": "sesshyRegistry"
}
]
}Supported catalog source formats:
sesshyRegistry— native Sesshy registry JSON with a top-leveltoolsarray.homebrewFormulaIndex— Homebrew/api/formula.json, converted into generic/cloud CLI definitions from formulae that expose executable names.homebrewCaskIndex— Homebrew/api/cask.json, converted from casks that installbinaryartifacts, including artifacts with explicittargetnames.tldrPageList— newline-delimitedpages/<platform>/<command>.mdpaths from tldr-style command indexes.tldrGitHubTree— GitHub tree JSON fortldr-pages/tldr, converted from canonical Englishpages/<platform>/<command>.mdpaths.figCompletionSpecTree— GitHub tree JSON for Fig/Amazon Q completion specs, converted from currentsrc/*.ts/src/*.jspaths and legacyspecs/*.ts/specs/*.jspaths.fishCompletionTree— GitHub tree JSON for fish shell'sshare/completionsdirectory, converted from top-level*.fishcompletion filenames into executable definitions.zshCompletionTree— GitHub tree JSON forzsh-users/zsh-completions, converted from top-level_commandcompletion filenames into executable definitions.carapaceCompletionTree— GitHub tree JSON forcarapace-sh/carapace-bin, converted fromcompleters/<platform>/<command>_completerdirectories into executable definitions.asdfPluginIndex— the official asdf plugin repository README table, converted from plugin short names and repository names.protoPluginRegistry— official proto registry JSON documents, converted from pluginbinsmetadata into executable definitions.vfoxPluginIndex— public vfox plugin index JSON, converted from plugin names and descriptions.awesomeCLIAppsCSV— Awesome CLI Appsdata/apps.csv, converted from conservative executable-shaped app names.awesomeTUISMarkdown— Awesome TUIs README markdown, converted from runnable app sections while skipping framework/library sections.awesomeModernCLIMarkdown— Awesome Modern CLI README markdown, converted from modern command-line replacement lists with aliases for known executable/package name differences such asrg,rga,batcat,btm, andgit-delta.clisDevAPI— CLIs.dev/api/clisJSON, converted from directory slugs, with conservative stripped-clialiases where useful.openCLIDirectoryHTML— Open CLI directory HTML, converted from its embedded directory payload into executable definitions.openCLIHubToolsAPI— OpenCLI Hub/api/toolsJSON, converted from its official/community AI-productivity CLI directory, with aliases for known current binaries such asgws,lark-cli,wecom-cli, anddingtalk.doesItCLIDirectoryHTML— DoesItCLI desktop-app CLI directory HTML, converted from structured app cards and known desktop-app executable aliases such ascode,sketchtool,gittower,bw, andop.cliAnythingRegistry— CLI-Anything / CLI-Hubregistry.json, converted from agent-nativeentry_pointcommands such ascli-anything-blender,cli-anything-gimp, andcli-anything-mailchimp, with original software names retained as aliases and explicit uppercase token variables such asMAILCHIMP_API_KEYimported as login evidence.getCLIRegistryHTML— getcli registry HTML, converted from rendered registry cards into executable definitions.terminalTroveListHTML— Terminal Trove A-Z list HTML, converted from rendered list items into executable definitions for terminal-first CLIs and TUIs.trmnToolsDirectoryHTML— trmn paged tools directory HTML, converted from terminal/TUI/CLI cards into executable definitions.githubRepositorySearch— GitHub Search API repository JSON, converted from executable-shaped CLI/TUI repository names, with conservative stripped-clialiases where useful.repologyProjectSearch— Repology project search JSON, converted from package project names and summaries into executable definitions while skipping Android app repositories and obvious language/library packages. Repology requires an identifying User-Agent, which Sesshy sends for all catalog HTTP requests.scoopBucketTree— GitHub tree JSON for Scoop bucket repositories such asScoopInstaller/Main,Extras, andVersions, converted from top-levelbucket/*.jsonmanifest names, with conservative stripped-clialiases where useful.wingetManifestTree— GitHub tree JSON formicrosoft/winget-pkgs, converted frommanifests/**/<PackageID>*.yamlmanifest names into executable definitions, with aliases for common packages such as Azure CLI, AWS CLI, GitHub CLI, Visual Studio Code, Node.js, PowerShell, and kubectl. The WinGet repository tree is large, so it is supported as an opt-in source rather than a built-in startup update.chocolateySearch— Chocolatey Community Repository NuGet v2 Atom search feeds, converted from latest package IDs, titles, descriptions, and tags. Sesshy uses targeted search URLs instead of a full repository scrape because Chocolatey's API caps broad queries and documents the full-feed path as unsupported for regular automated retrieval.condaRepodata— conda channelcurrent_repodata.jsonmetadata, converted frompackagesandpackages.condapackage records. The built-in source uses conda-forgenoarch,osx-arm64, andosx-64current repodata to cover common macOS conda/mamba CLI installs without downloading the much larger full repodata indexes.archPackageSearch— Arch Linux package search JSON, converted from executable-shaped package names and command-line descriptions, with packaging suffix cleanup and language-library filtering to avoid obvious non-CLI packages.aurRPCSearch— AUR RPCsearchJSON, converted from community package names and descriptions, with the same conservative suffix cleanup and library filtering used for Arch package search results.alpineAportsTree— GitHub tree JSON foralpinelinux/aportsrepository subtrees such asmain,community, andtesting, converted from top-levelAPKBUILDpackage paths into Alpine package definitions while skipping obvious language-library packages.termuxPackageTree— GitHub tree JSON fortermux/termux-packagespackage subtrees, converted from top-levelbuild.shpackage paths into Termux package definitions while skipping obvious language and library packages. Built-in sources coverpackagesandroot-packages; the GUI-heavyx11-packagestree is left opt-in.voidSrcpkgsTree— GitHub tree JSON forvoid-linux/void-packagessrcpkgssubtree, converted from top-leveltemplatepackage paths into Void Linux package definitions while skipping obvious language and library packages.freebsdPortsTree— GitHub tree JSON forfreebsd/freebsd-portscategory subtrees, converted from top-levelport/Makefilepaths into FreeBSD port definitions while skipping obvious language-library ports. Built-in sources coversysutils,devel,net,security,shells,textproc, anddatabases.openbsdPortsTree— GitHub tree JSON foropenbsd/portscategory subtrees, converted from top-levelport/Makefilepaths into OpenBSD port definitions while skipping obvious language-library ports. Built-in sources coversysutils,devel,net,security,shells,textproc, anddatabases.gentooEbuildTree— GitHub tree JSON forgentoo/gentoocategory subtrees, converted frompackage/package-version.ebuildpaths into Gentoo package definitions while skipping obvious language-library ebuilds. Built-in sources coverapp-admin,app-shells,app-portage,dev-util,dev-vcs,net-misc,net-analyzer,sys-apps, andsys-process.macPortsPortsTree— GitHub tree JSON formacports/macports-ports, converted fromcategory/port/Portfilepaths into MacPorts port-name definitions, with shared package suffix cleanup and common executable aliases.pkgsrcTree— GitHub tree JSON forNetBSD/pkgsrc, converted fromcategory/package/Makefilepaths into pkgsrc package definitions, ignoring pkgsrc infrastructure directories.nixpkgsByNameTree— GitHub tree JSON for theNixOS/nixpkgspkgs/by-namesubtree, converted fromprefix/package/package.nixpaths into Nixpkgs package definitions without relying on the truncated full-repository tree.cliHuntToolsAPI— CLIHunt/v1/toolsJSON, converted from active CLI/agent registry entries and install commands into executable definitions.sdkmanCandidatesHTML— SDKMAN/sdks/candidate directory HTML, converted from installable SDK candidate cards into executable definitions, with aliases for common installed commands such asmvn,scala-cli, andspring.aquaRegistry— the official Aqua registry YAML, converted from package names, repository names, descriptions, and explicit installed file names.miseRegistryTree— GitHub tree JSON forjdx/mise, converted from directregistry/*.tomltool entries.pkgxPantryTree— GitHub tree JSON forpkgxdev/pantry, converted fromprojects/**/package.ymlpackage entries.krewPluginIndexTree— GitHub tree JSON forkubernetes-sigs/krew-index, converted fromplugins/*.yamlmanifests intokubectl-*plugin executables.npmRegistry— npm package metadata packuments, or CouchDB-stylerows[].docpackument shards, converted from the latest version'sbinfield.npmSearch— npm registry/v1/searchJSON, converted from conservative unscoped package names for CLI, command-line, terminal/TUI, AI CLI, and agent package searches.pypiMetadata— generated PyPI metadata shards with a top-levelpackagesarray, converted fromproject.scriptsdictionaries and legacyentry_points.console_scriptsarrays.rubygemsMetadata— generated RubyGems metadata shards with a top-levelgemsarray, converted from gemspec executable lists.cratesIOSearch— crates.io/api/v1/cratessearch/list JSON, converted from crate names for Rust CLIs commonly installed withcargo install, including CLI, terminal/TUI, shell, agent, AI, cloud, Kubernetes, DevOps, and automation searches.pkgGoDevSearchHTML— pkg.go.dev search result HTML, converted from/cmd/...package paths into Go command definitions.pubDevSearch— pub.dev/api/searchJSON, converted from package names for Dart and Flutter command-line tools commonly activated withdart pub global activate.packagistSearch— Packagist/search.jsonresults, converted from Composer package names into conservative unscoped executable definitions.hexPackageSearch— Hex.pm/api/packagessearch JSON, converted from package names for Elixir CLIs, Mix tasks, and escripts.
If a registry file is malformed, Sesshy keeps loading the valid catalogs and shows a warning in the menu with the affected file name.
Example:
{
"tools": [
{
"executables": ["acmectl"],
"title": "Acme Cloud CLI",
"kind": "cloud",
"contextFlags": ["--team", "--workspace"],
"credentialPaths": ["~/.acmecloud/session.json"]
}
]
}See Examples/CLIRegistry.json, Examples/Registries/10-extra-cloud-tools.json, and Examples/CatalogSources.json.
Registry fields:
executables— one or more binary names to match.title— display name in the menu.kind—cloud,generic,database,tunnel, orssh.contextFlags— optional flags whose values should be shown as the session target.credentialPaths— optional local files or directories that indicate a stored login.
Sesshy walks the process tree to identify which terminal app each session belongs to:
| Terminal | Detected as |
|---|---|
| Apple Terminal | Terminal |
| iTerm2 | iTerm2 |
| Ghostty | Ghostty |
| Warp | Warp |
| Kitty | Kitty |
| Alacritty | Alacritty |
| WezTerm | WezTerm |
| Hyper | Hyper |
Any unrecognized terminal falls back to the TTY identifier (e.g. ttys003).
For every detected session, Sesshy displays:
- Title — connection type (SSH, Postgres, Port Forward, AWS CLI, generic CLI)
- Target — the hostname,
user@host, Kubernetes resource, or database host - Subtitle — database name, port mapping, or remote socket endpoint
- Terminal — which terminal app the session is running in
- TTY — the tty identifier
- Duration — how long the session has been alive (
5s,12m,2h 4m,1d 3h) - Working directory — the cwd at the time of the session
- Inventory state — installed, discovered, or locally logged in for known CLIs
- Inventory detail — install path or local login evidence path
- macOS 14 Sonoma or later
- Xcode 15+ (to build from source)
# Clone
git clone https://github.com/isaachorowitz/Sesshy-Menu.git
cd Sesshy-Menu
# Build release
swift build -c release
# Or open in Xcode
open SessionMenu.xcodeprojImportant: Run the built
.appbundle — notswift run. The menubar icon only appears when launched as an.app.
swift testMIT — see LICENSE
Built by Ziplyne — Product development & engineering
Isaac Horowitz