Desktop app for organizing local projects and running terminal processes in one place — terminals, agents, and commands with state, output, and analytics.
Electron · React · TypeScript
curl -fsSL https://termify.abraham.lat/install | bash- Projects & processes — Run and watch commands, agents, and scripts with persisted state and output history.
- Built-in terminals — Multiple terminals per project with xterm.js and native node-pty where supported.
- Analytics — Usage and process metrics in the app UI.
- MCP server — Optional Model Context Protocol integration for external tools (e.g. OpenCode).
| Tool | Notes |
|---|---|
| Node.js | 24.x (see engines in package.json) |
| pnpm | Package manager used by this repo |
Termify depends on native addons (better-sqlite3, node-pty, pidusage, and others). They compile during pnpm install. If install or build fails with errors about missing compilers or node-gyp:
- Windows: Install Visual Studio Build Tools with the “Desktop development with C++” workload (includes MSVC, Windows SDK, and CMake pieces
node-gypexpects). A full Visual Studio install with that workload also works. - macOS: Install Xcode Command Line Tools:
xcode-select --install - Linux: Typical build chain, e.g.
build-essential,python3, and oftenlibudev-dev/ similar depending on distro; see Electron/node-gyp docs if linking fails.
After installing build tools, run pnpm install again (or pnpm rebuild if needed).
# Use Node 24 (nvm, fnm, volta, asdf, etc.)
node -v # should print v24.x.x
pnpm install
pnpm startThis runs Electron Forge with Vite; the renderer uses hot reload while developing.
| Command | Purpose |
|---|---|
pnpm start |
Development mode (Electron Forge + Vite) |
pnpm build |
Package app for current platform (electron-forge package → out/ + .vite/) |
pnpm build:mcp |
Build standalone MCP entry (out/mcp/mcp-entry.js) for tools that run MCP via Node |
pnpm typecheck |
TypeScript check |
pnpm lint |
Lint (oxlint) |
pnpm format |
Format (oxfmt) |
pnpm format:check |
Verify formatting (CI uses this; no writes) |
pnpm dist:win / dist:mac / dist:linux |
Build MCP entry then create installers (electron-forge make) |
Database migrations are managed with Drizzle; schema changes use pnpm db:generate when you adjust the schema (see drizzle/).
Termify can expose an MCP server so external clients (e.g. OpenCode) can list projects, read output, and control processes. See MCP_SETUP.md for configuration. The in-app Settings → MCP Server tab shows status and copy-paste config snippets.
Automation lives in .github/workflows/. See Actions for run history and logs.
| Workflow | When it runs | What it does |
|---|---|---|
| CI | Every push and pull request | pnpm typecheck, pnpm lint, pnpm format:check on Ubuntu (Node 24, pnpm store cache) |
| Release | Push tag vx.y.z (must match package.json version) |
Windows: pnpm build:mcp then electron-forge publish (Squirrel Setup + update metadata) to Releases; release notes body updated from the GitHub API |
Tagging: Bump package.json version to x.y.z, then create git tag vx.y.z (e.g. "version": "1.4.0" → v1.4.0). Only v… tags trigger the release workflow; bare x.y.z tags are ignored.
