Skip to content

isaachorowitz/Sesshy-Menu

Repository files navigation

Sesshy

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.

Ziplyne · Isaac Horowitz


What it does

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.


Everything Sesshy detects

Remote Access

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)

Databases

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

Tunnels & Port Forwards

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

Cloud and Product CLIs

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

Newly Installed or Private CLIs

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-level tools array.
  • 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 install binary artifacts, including artifacts with explicit target names.
  • tldrPageList — newline-delimited pages/<platform>/<command>.md paths from tldr-style command indexes.
  • tldrGitHubTree — GitHub tree JSON for tldr-pages/tldr, converted from canonical English pages/<platform>/<command>.md paths.
  • figCompletionSpecTree — GitHub tree JSON for Fig/Amazon Q completion specs, converted from current src/*.ts / src/*.js paths and legacy specs/*.ts / specs/*.js paths.
  • fishCompletionTree — GitHub tree JSON for fish shell's share/completions directory, converted from top-level *.fish completion filenames into executable definitions.
  • zshCompletionTree — GitHub tree JSON for zsh-users/zsh-completions, converted from top-level _command completion filenames into executable definitions.
  • carapaceCompletionTree — GitHub tree JSON for carapace-sh/carapace-bin, converted from completers/<platform>/<command>_completer directories 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 plugin bins metadata into executable definitions.
  • vfoxPluginIndex — public vfox plugin index JSON, converted from plugin names and descriptions.
  • awesomeCLIAppsCSV — Awesome CLI Apps data/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 as rg, rga, batcat, btm, and git-delta.
  • clisDevAPI — CLIs.dev /api/clis JSON, converted from directory slugs, with conservative stripped -cli aliases where useful.
  • openCLIDirectoryHTML — Open CLI directory HTML, converted from its embedded directory payload into executable definitions.
  • openCLIHubToolsAPI — OpenCLI Hub /api/tools JSON, converted from its official/community AI-productivity CLI directory, with aliases for known current binaries such as gws, lark-cli, wecom-cli, and dingtalk.
  • doesItCLIDirectoryHTML — DoesItCLI desktop-app CLI directory HTML, converted from structured app cards and known desktop-app executable aliases such as code, sketchtool, gittower, bw, and op.
  • cliAnythingRegistry — CLI-Anything / CLI-Hub registry.json, converted from agent-native entry_point commands such as cli-anything-blender, cli-anything-gimp, and cli-anything-mailchimp, with original software names retained as aliases and explicit uppercase token variables such as MAILCHIMP_API_KEY imported 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 -cli aliases 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 as ScoopInstaller/Main, Extras, and Versions, converted from top-level bucket/*.json manifest names, with conservative stripped -cli aliases where useful.
  • wingetManifestTree — GitHub tree JSON for microsoft/winget-pkgs, converted from manifests/**/<PackageID>*.yaml manifest 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 channel current_repodata.json metadata, converted from packages and packages.conda package records. The built-in source uses conda-forge noarch, osx-arm64, and osx-64 current 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 RPC search JSON, 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 for alpinelinux/aports repository subtrees such as main, community, and testing, converted from top-level APKBUILD package paths into Alpine package definitions while skipping obvious language-library packages.
  • termuxPackageTree — GitHub tree JSON for termux/termux-packages package subtrees, converted from top-level build.sh package paths into Termux package definitions while skipping obvious language and library packages. Built-in sources cover packages and root-packages; the GUI-heavy x11-packages tree is left opt-in.
  • voidSrcpkgsTree — GitHub tree JSON for void-linux/void-packages srcpkgs subtree, converted from top-level template package paths into Void Linux package definitions while skipping obvious language and library packages.
  • freebsdPortsTree — GitHub tree JSON for freebsd/freebsd-ports category subtrees, converted from top-level port/Makefile paths into FreeBSD port definitions while skipping obvious language-library ports. Built-in sources cover sysutils, devel, net, security, shells, textproc, and databases.
  • openbsdPortsTree — GitHub tree JSON for openbsd/ports category subtrees, converted from top-level port/Makefile paths into OpenBSD port definitions while skipping obvious language-library ports. Built-in sources cover sysutils, devel, net, security, shells, textproc, and databases.
  • gentooEbuildTree — GitHub tree JSON for gentoo/gentoo category subtrees, converted from package/package-version.ebuild paths into Gentoo package definitions while skipping obvious language-library ebuilds. Built-in sources cover app-admin, app-shells, app-portage, dev-util, dev-vcs, net-misc, net-analyzer, sys-apps, and sys-process.
  • macPortsPortsTree — GitHub tree JSON for macports/macports-ports, converted from category/port/Portfile paths into MacPorts port-name definitions, with shared package suffix cleanup and common executable aliases.
  • pkgsrcTree — GitHub tree JSON for NetBSD/pkgsrc, converted from category/package/Makefile paths into pkgsrc package definitions, ignoring pkgsrc infrastructure directories.
  • nixpkgsByNameTree — GitHub tree JSON for the NixOS/nixpkgs pkgs/by-name subtree, converted from prefix/package/package.nix paths into Nixpkgs package definitions without relying on the truncated full-repository tree.
  • cliHuntToolsAPI — CLIHunt /v1/tools JSON, 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 as mvn, scala-cli, and spring.
  • aquaRegistry — the official Aqua registry YAML, converted from package names, repository names, descriptions, and explicit installed file names.
  • miseRegistryTree — GitHub tree JSON for jdx/mise, converted from direct registry/*.toml tool entries.
  • pkgxPantryTree — GitHub tree JSON for pkgxdev/pantry, converted from projects/**/package.yml package entries.
  • krewPluginIndexTree — GitHub tree JSON for kubernetes-sigs/krew-index, converted from plugins/*.yaml manifests into kubectl-* plugin executables.
  • npmRegistry — npm package metadata packuments, or CouchDB-style rows[].doc packument shards, converted from the latest version's bin field.
  • npmSearch — npm registry /v1/search JSON, 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-level packages array, converted from project.scripts dictionaries and legacy entry_points.console_scripts arrays.
  • rubygemsMetadata — generated RubyGems metadata shards with a top-level gems array, converted from gemspec executable lists.
  • cratesIOSearch — crates.io /api/v1/crates search/list JSON, converted from crate names for Rust CLIs commonly installed with cargo 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/search JSON, converted from package names for Dart and Flutter command-line tools commonly activated with dart pub global activate.
  • packagistSearch — Packagist /search.json results, converted from Composer package names into conservative unscoped executable definitions.
  • hexPackageSearch — Hex.pm /api/packages search 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.
  • kindcloud, generic, database, tunnel, or ssh.
  • contextFlags — optional flags whose values should be shown as the session target.
  • credentialPaths — optional local files or directories that indicate a stored login.

Supported terminals

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).


Per-session details

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

Requirements

  • macOS 14 Sonoma or later
  • Xcode 15+ (to build from source)

Build & Run

# 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.xcodeproj

Important: Run the built .app bundle — not swift run. The menubar icon only appears when launched as an .app.

Run tests

swift test

License

MIT — see LICENSE


Built by Ziplyne — Product development & engineering
Isaac Horowitz

About

Native macOS menubar app for seeing active terminal connections across all your terminal sessions.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages