Compare commits

...
18 Commits
Author SHA1 Message Date
LukeGus 1f5a19f54d chore: add security center to the plugin list 2026-11-05 18:25:44 -06:00
LukeGus fd3eeea3b9 docs: add log search to the plugin table 2026-11-05 18:20:15 -06:00
LukeGus 87d57770ca docs: add IP-KVM to plugin list 2026-11-05 18:19:15 -06:00
LukeGus d451628122 chore: add object storage plugin to readme 2026-11-05 18:15:39 -06:00
LukeGus b2d15281dd chore: add storage health to the plugin list 2026-11-05 17:49:17 -06:00
LukeGus 081c8b6021 docs: add out-of-band plugin to readme 2026-11-05 17:38:02 -06:00
LukeGus c28cda7822 fix: keep bottom line on tile grids that have content below 2026-11-05 16:47:37 -06:00
LukeGus 528092846c docs: add Notes to the plugin table 2026-11-05 16:36:34 -06:00
LukeGus 13ca4369c5 docs: add the Git plugin to the plugin table 2026-11-05 16:36:20 -06:00
LukeGus 741c211f7b fix: remove duplicate Network Devices row 2026-11-05 15:03:53 -06:00
LukeGus 7e308fe57c docs: add Ansible to the plugin table 2026-11-05 15:02:27 -06:00
LukeGus 358664648b chore: add network devices to plugin table 2026-11-05 15:02:12 -06:00
LukeGus 3824203639 docs: add UPS Manager to the plugin table 2026-11-05 15:01:49 -06:00
LukeGus 49b6dd6aa2 docs: add virtual machines to plugin table 2026-11-05 14:24:51 -06:00
LukeGus db5d4f4157 docs: add process manager to plugin table 2026-11-05 13:57:39 -06:00
LukeGus d0ef505951 chore: add web servers plugin to readme 2026-11-05 13:51:20 -06:00
LukeGus c09d09f2ce fix: test 2026-11-05 12:52:04 -06:00
LukeGus 041e10eb5c chore: add uptime to the plugin table 2026-11-05 00:41:49 -06:00
4 changed files with 49 additions and 4 deletions

No files matched your search

+16
View File
@@ -62,6 +62,7 @@ Plugins add everything else. The official ones ship with Termix, and admins can
| [ACME Certificates](https://github.com/Termix-SSH/Plugin-ACME-SSL) | Gets the Termix HTTPS certificate from Let's Encrypt or any ACME provider and renews it for you. | | [ACME Certificates](https://github.com/Termix-SSH/Plugin-ACME-SSL) | Gets the Termix HTTPS certificate from Let's Encrypt or any ACME provider and renews it for you. |
| [AI Assistant](https://github.com/Termix-SSH/Plugin-AI) | An AI assistant that reads your setup and proposes changes for you to approve. | | [AI Assistant](https://github.com/Termix-SSH/Plugin-AI) | An AI assistant that reads your setup and proposes changes for you to approve. |
| [Alerts](https://github.com/Termix-SSH/Plugin-Alerts) | One inbox for every alert in Termix, with delivery to webhooks, ntfy, Discord and email. | | [Alerts](https://github.com/Termix-SSH/Plugin-Alerts) | One inbox for every alert in Termix, with delivery to webhooks, ntfy, Discord and email. |
| [Ansible](https://github.com/Termix-SSH/Plugin-Ansible) | Run Ansible playbooks and ad-hoc commands from a control host, with an inventory made from your Termix hosts. |
| [Audit Tools](https://github.com/Termix-SSH/Plugin-Audit-Tools) | Send the audit log to your SIEM and export it as CSV or NDJSON. | | [Audit Tools](https://github.com/Termix-SSH/Plugin-Audit-Tools) | Send the audit log to your SIEM and export it as CSV or NDJSON. |
| [Automations](https://github.com/Termix-SSH/Plugin-Automations) | Run steps on your hosts on a schedule or when something happens. | | [Automations](https://github.com/Termix-SSH/Plugin-Automations) | Run steps on your hosts on a schedule or when something happens. |
| [Backups](https://github.com/Termix-SSH/Plugin-Backups) | Back up folders, databases and Docker data on your hosts with restic, then browse, download and restore. | | [Backups](https://github.com/Termix-SSH/Plugin-Backups) | Back up folders, databases and Docker data on your hosts with restic, then browse, download and restore. |
@@ -72,28 +73,38 @@ Plugins add everything else. The official ones ship with Termix, and admins can
| [Credential Tools](https://github.com/Termix-SSH/Plugin-Credential-Tools) | Generate SSH keys, check them and copy a public key to a host. | | [Credential Tools](https://github.com/Termix-SSH/Plugin-Credential-Tools) | Generate SSH keys, check them and copy a public key to a host. |
| [Cron](https://github.com/Termix-SSH/Plugin-Cron) | See, add and run cron jobs on your hosts, with a schedule preview and the system cron files. | | [Cron](https://github.com/Termix-SSH/Plugin-Cron) | See, add and run cron jobs on your hosts, with a schedule preview and the system cron files. |
| [Databases](https://github.com/Termix-SSH/Plugin-Databases) | Browse and edit MySQL, MariaDB, PostgreSQL and SQLite databases on your hosts from one tab. | | [Databases](https://github.com/Termix-SSH/Plugin-Databases) | Browse and edit MySQL, MariaDB, PostgreSQL and SQLite databases on your hosts from one tab. |
| [DNS](https://github.com/Termix-SSH/Plugin-DNS) | Manage DNS records and domains across Cloudflare, Route 53, Namecheap and other providers. |
| [Docker](https://github.com/Termix-SSH/Plugin-Docker) | Manage Docker and Podman containers on your hosts over SSH, with logs, stats and a console. | | [Docker](https://github.com/Termix-SSH/Plugin-Docker) | Manage Docker and Podman containers on your hosts over SSH, with logs, stats and a console. |
| [File Manager](https://github.com/Termix-SSH/Plugin-File-Manager) | Browse, edit and move files over SFTP, including straight from one server to another. | | [File Manager](https://github.com/Termix-SSH/Plugin-File-Manager) | Browse, edit and move files over SFTP, including straight from one server to another. |
| [Firewall](https://github.com/Termix-SSH/Plugin-Firewall) | Manage UFW, firewalld, nftables and iptables rules on your hosts over SSH, with lockout protection. | | [Firewall](https://github.com/Termix-SSH/Plugin-Firewall) | Manage UFW, firewalld, nftables and iptables rules on your hosts over SSH, with lockout protection. |
| [Fleets](https://github.com/Termix-SSH/Plugin-Fleets) | Group hosts into fleets and run commands, package actions and file transfers on all of them at once. | | [Fleets](https://github.com/Termix-SSH/Plugin-Fleets) | Group hosts into fleets and run commands, package actions and file transfers on all of them at once. |
| [Git](https://github.com/Termix-SSH/Plugin-Git) | See, pull, commit and push git repos on your hosts, and keep them up to date with auto pull. |
| [Homepage](https://github.com/Termix-SSH/Plugin-Homepage) | A drag and drop widget page for your servers and services, plus service links for the dashboard. | | [Homepage](https://github.com/Termix-SSH/Plugin-Homepage) | A drag and drop widget page for your servers and services, plus service links for the dashboard. |
| [Host Metrics](https://github.com/Termix-SSH/Plugin-Host-Metrics) | Live CPU, memory, disk, network and GPU stats, plus tools to manage your hosts. | | [Host Metrics](https://github.com/Termix-SSH/Plugin-Host-Metrics) | Live CPU, memory, disk, network and GPU stats, plus tools to manage your hosts. |
| [Host Status](https://github.com/Termix-SSH/Plugin-Host-Status) | Shows if each host is online with a dot in the host list, checked by connecting to its port. | | [Host Status](https://github.com/Termix-SSH/Plugin-Host-Status) | Shows if each host is online with a dot in the host list, checked by connecting to its port. |
| [Hosts Config](https://github.com/Termix-SSH/Plugin-Hosts-Config) | Keep hosts, folders and sharing in a YAML or JSON file. Termix loads them as read only hosts and reloads when the file changes. | | [Hosts Config](https://github.com/Termix-SSH/Plugin-Hosts-Config) | Keep hosts, folders and sharing in a YAML or JSON file. Termix loads them as read only hosts and reloads when the file changes. |
| [Import and Export](https://github.com/Termix-SSH/Plugin-Import-Export) | Import hosts from a JSON file or an SSH config file and export them to share or back up. | | [Import and Export](https://github.com/Termix-SSH/Plugin-Import-Export) | Import hosts from a JSON file or an SSH config file and export them to share or back up. |
| [IP-KVM](https://github.com/Termix-SSH/Plugin-IP-KVM) | See and control machines through PiKVM, NanoKVM and JetKVM devices. |
| [Kubernetes](https://github.com/Termix-SSH/Plugin-Kubernetes) | Manage Kubernetes clusters from your hosts over SSH, with logs, metrics, YAML and a shell. | | [Kubernetes](https://github.com/Termix-SSH/Plugin-Kubernetes) | Manage Kubernetes clusters from your hosts over SSH, with logs, metrics, YAML and a shell. |
| [LDAP](https://github.com/Termix-SSH/Plugin-LDAP) | Sign in with your LDAP or Active Directory username and password. | | [LDAP](https://github.com/Termix-SSH/Plugin-LDAP) | Sign in with your LDAP or Active Directory username and password. |
| [Log Search](https://github.com/Termix-SSH/Plugin-Log-Search) | Search logs from the journal, log files and Docker containers across many hosts at once. |
| [Login Security](https://github.com/Termix-SSH/Plugin-Login-Security) | Sign people out when idle, limit session length, turn off remember me and require a second factor at login. | | [Login Security](https://github.com/Termix-SSH/Plugin-Login-Security) | Sign people out when idle, limit session length, turn off remember me and require a second factor at login. |
| [Network Devices](https://github.com/Termix-SSH/Plugin-Network-Devices) | See and manage routers, switches and access points over SNMP and router APIs. |
| [Network Topology](https://github.com/Termix-SSH/Plugin-Network-Topology) | Draws your hosts and the links between them as a live, interactive graph. | | [Network Topology](https://github.com/Termix-SSH/Plugin-Network-Topology) | Draws your hosts and the links between them as a live, interactive graph. |
| [Notes](https://github.com/Termix-SSH/Plugin-Notes) | Write markdown notes for each host, folder or yourself, with commands you can copy or send to the terminal. |
| [Object Storage](https://github.com/Termix-SSH/Plugin-Object-Storage) | Browse and manage S3-compatible object storage buckets and files. |
| [Operations Center](https://github.com/Termix-SSH/Plugin-Operations-Center) | Run, roll out, approve and track every plugin action across your hosts, with a page per host and tables across all of them. | | [Operations Center](https://github.com/Termix-SSH/Plugin-Operations-Center) | Run, roll out, approve and track every plugin action across your hosts, with a page per host and tables across all of them. |
| [OPKSSH](https://github.com/Termix-SSH/Plugin-OPKSSH) | Connect to hosts with short-lived OpenPubkey SSH certificates after signing in with your identity provider. | | [OPKSSH](https://github.com/Termix-SSH/Plugin-OPKSSH) | Connect to hosts with short-lived OpenPubkey SSH certificates after signing in with your identity provider. |
| [Out-of-band](https://github.com/Termix-SSH/Plugin-Out-Of-Band) | Power, sensors, event logs and consoles for server BMCs over Redfish, IPMI and Intel AMT. |
| [Packages](https://github.com/Termix-SSH/Plugin-Package-Manager) | See and install updates on your hosts, search, install and remove packages, and read the package history. | | [Packages](https://github.com/Termix-SSH/Plugin-Package-Manager) | See and install updates on your hosts, search, install and remove packages, and read the package history. |
| [Passkeys](https://github.com/Termix-SSH/Plugin-WebAuthn) | Sign in with a passkey or security key instead of a password. | | [Passkeys](https://github.com/Termix-SSH/Plugin-WebAuthn) | Sign in with a passkey or security key instead of a password. |
| [Process Manager](https://github.com/Termix-SSH/Plugin-Process-Manager) | See and control running processes, pm2 and supervisor apps on your hosts, read their logs and get alerts when they fail. |
| [Proxmox](https://github.com/Termix-SSH/Plugin-Proxmox) | Import Proxmox VE guests as hosts, keep them in sync and watch node stats. | | [Proxmox](https://github.com/Termix-SSH/Plugin-Proxmox) | Import Proxmox VE guests as hosts, keep them in sync and watch node stats. |
| [Remote Desktop](https://github.com/Termix-SSH/Plugin-Remote-Desktop) | RDP, VNC and Telnet sessions in your browser, with clipboard, file transfer, sharing and recording. | | [Remote Desktop](https://github.com/Termix-SSH/Plugin-Remote-Desktop) | RDP, VNC and Telnet sessions in your browser, with clipboard, file transfer, sharing and recording. |
| [Reverse Proxy](https://github.com/Termix-SSH/Plugin-Reverse-Proxy) | Reverse proxy for TCP, UDP, HTTP and HTTPS with free certificates and Termix login, managed per host. | | [Reverse Proxy](https://github.com/Termix-SSH/Plugin-Reverse-Proxy) | Reverse proxy for TCP, UDP, HTTP and HTTPS with free certificates and Termix login, managed per host. |
| [Samba Shares](https://github.com/Termix-SSH/Plugin-Samba) | Create and manage Samba (SMB) file shares, users and permissions on your hosts from one tab. | | [Samba Shares](https://github.com/Termix-SSH/Plugin-Samba) | Create and manage Samba (SMB) file shares, users and permissions on your hosts from one tab. |
| [Secret Sources](https://github.com/Termix-SSH/Plugin-Secret-Sources) | Pull host passwords and keys from 1Password when you connect instead of storing them in Termix. | | [Secret Sources](https://github.com/Termix-SSH/Plugin-Secret-Sources) | Pull host passwords and keys from 1Password when you connect instead of storing them in Termix. |
| [Security Center](https://github.com/Termix-SSH/Plugin-Security-Center) | Audit SSH keys, rotate them and scan hosts for known vulnerabilities over SSH. |
| [Serial](https://github.com/Termix-SSH/Plugin-Serial) | Open a serial console to a router, switch or other device plugged into your computer. | | [Serial](https://github.com/Termix-SSH/Plugin-Serial) | Open a serial console to a router, switch or other device plugged into your computer. |
| [Services](https://github.com/Termix-SSH/Plugin-Service-Manager) | Manage services, timers and logs on your hosts over SSH. | | [Services](https://github.com/Termix-SSH/Plugin-Service-Manager) | Manage services, timers and logs on your hosts over SSH. |
| [Session Recording](https://github.com/Termix-SSH/Plugin-Session-Recording) | Record terminal and remote desktop sessions and play them back or download them later. | | [Session Recording](https://github.com/Termix-SSH/Plugin-Session-Recording) | Record terminal and remote desktop sessions and play them back or download them later. |
@@ -104,17 +115,22 @@ Plugins add everything else. The official ones ship with Termix, and admins can
| [SSH Certificate Signer](https://github.com/Termix-SSH/Plugin-Vault) | Connect to hosts with short-lived SSH certificates signed by HashiCorp Vault or OpenBao. | | [SSH Certificate Signer](https://github.com/Termix-SSH/Plugin-Vault) | Connect to hosts with short-lived SSH certificates signed by HashiCorp Vault or OpenBao. |
| [SSH Terminal](https://github.com/Termix-SSH/Plugin-SSH-Terminal) | SSH terminal sessions with tabs, split screen, history, macros and a local terminal in the desktop app. | | [SSH Terminal](https://github.com/Termix-SSH/Plugin-SSH-Terminal) | SSH terminal sessions with tabs, split screen, history, macros and a local terminal in the desktop app. |
| [Step CA](https://github.com/Termix-SSH/Plugin-Step-CA) | Connect to hosts with short-lived SSH certificates from a smallstep step-ca server. | | [Step CA](https://github.com/Termix-SSH/Plugin-Step-CA) | Connect to hosts with short-lived SSH certificates from a smallstep step-ca server. |
| [Storage Health](https://github.com/Termix-SSH/Plugin-Storage-Health) | Watch drive and array health over SSH: SMART, NVMe, ZFS, mdadm, btrfs and LVM, with history, alerts and self tests. |
| [Sync](https://github.com/Termix-SSH/Plugin-Sync) | Sync the desktop app with one or more servers, and manage other Termix servers as remote sites from a master. | | [Sync](https://github.com/Termix-SSH/Plugin-Sync) | Sync the desktop app with one or more servers, and manage other Termix servers as remote sites from a master. |
| [Tailscale](https://github.com/Termix-SSH/Plugin-Tailscale) | Add tailnet devices as hosts and connect with Tailscale SSH. | | [Tailscale](https://github.com/Termix-SSH/Plugin-Tailscale) | Add tailnet devices as hosts and connect with Tailscale SSH. |
| [Termix Identity](https://github.com/Termix-SSH/Plugin-Termix-Identity) | Publish your SSH public keys under a public handle and run your own SSH certificate authority. | | [Termix Identity](https://github.com/Termix-SSH/Plugin-Termix-Identity) | Publish your SSH public keys under a public handle and run your own SSH certificate authority. |
| [Tmux Monitor](https://github.com/Termix-SSH/Plugin-Tmux-Monitor) | Browse and control tmux sessions, windows and panes across your hosts. | | [Tmux Monitor](https://github.com/Termix-SSH/Plugin-Tmux-Monitor) | Browse and control tmux sessions, windows and panes across your hosts. |
| [TOTP](https://github.com/Termix-SSH/Plugin-TOTP) | Two-factor sign in with a code from an authenticator app, with backup codes. | | [TOTP](https://github.com/Termix-SSH/Plugin-TOTP) | Two-factor sign in with a code from an authenticator app, with backup codes. |
| [Tunnels](https://github.com/Termix-SSH/Plugin-Tunnels) | SSH port forwarding that reconnects on its own, plus client tunnels from the desktop app. | | [Tunnels](https://github.com/Termix-SSH/Plugin-Tunnels) | SSH port forwarding that reconnects on its own, plus client tunnels from the desktop app. |
| [UPS Manager](https://github.com/Termix-SSH/Plugin-UPS-Manager) | Watch your UPS devices over NUT, apcupsd or SNMP, with history, alerts and self tests. |
| [Uptime](https://github.com/Termix-SSH/Plugin-Uptime) | Watch websites, ports, hosts and services, get alerts when they go down, and publish status pages. |
| [Usage Statistics](https://github.com/Termix-SSH/Plugin-Telemetry) | Sends a small anonymous daily report so we can see how Termix is used. | | [Usage Statistics](https://github.com/Termix-SSH/Plugin-Telemetry) | Sends a small anonymous daily report so we can see how Termix is used. |
| [Users](https://github.com/Termix-SSH/Plugin-User-Manager) | Manage the user accounts, groups, passwords and SSH keys on your hosts. | | [Users](https://github.com/Termix-SSH/Plugin-User-Manager) | Manage the user accounts, groups, passwords and SSH keys on your hosts. |
| [Virtual Machines](https://github.com/Termix-SSH/Plugin-Virtual-Machines) | Create and manage KVM virtual machines on your Linux hosts over SSH with libvirt. |
| [Wake-on-LAN](https://github.com/Termix-SSH/Plugin-Wake-On-LAN) | Wake, shut down and track your machines from one power dashboard. | | [Wake-on-LAN](https://github.com/Termix-SSH/Plugin-Wake-On-LAN) | Wake, shut down and track your machines from one power dashboard. |
| [Warpgate](https://github.com/Termix-SSH/Plugin-Warpgate) | Connect to hosts through a Warpgate SSH bastion. | | [Warpgate](https://github.com/Termix-SSH/Plugin-Warpgate) | Connect to hosts through a Warpgate SSH bastion. |
| [Web Endpoint](https://github.com/Termix-SSH/Plugin-Web-Endpoint) | Open a host's web UI inside Termix, directly or over an SSH tunnel. | | [Web Endpoint](https://github.com/Termix-SSH/Plugin-Web-Endpoint) | Open a host's web UI inside Termix, directly or over an SSH tunnel. |
| [Web Servers](https://github.com/Termix-SSH/Plugin-Web-Servers) | Manage nginx, Apache and Caddy on your hosts: sites, config, logs and HTTPS, with every change tested first. |
| [WireGuard](https://github.com/Termix-SSH/Plugin-WireGuard) | Install WireGuard on your hosts and manage interfaces, clients and configs from one tab. | | [WireGuard](https://github.com/Termix-SSH/Plugin-WireGuard) | Install WireGuard on your hosts and manage interfaces, clients and configs from one tab. |
| [Workspaces](https://github.com/Termix-SSH/Plugin-Workspaces) | Save your open tabs and split layouts and reopen them in one click. | | [Workspaces](https://github.com/Termix-SSH/Plugin-Workspaces) | Save your open tabs and split layouts and reopen them in one click. |
+22 -1
View File
@@ -1,4 +1,4 @@
import { afterEach, describe, expect, it } from "vitest"; import { afterEach, describe, expect, it, vi } from "vitest";
import crypto from "node:crypto"; import crypto from "node:crypto";
import fs from "node:fs"; import fs from "node:fs";
import os from "node:os"; import os from "node:os";
@@ -471,6 +471,27 @@ describe("rebuilding local plugins", () => {
expect(isLocalBuildStale(root)).toBe(false); expect(isLocalBuildStale(root)).toBe(false);
}); });
it("survives a build replacing dist during the scan", () => {
const root = repo(tempDir(), "Plugin-A", "a");
const gone = path.join(root, "dist", "migrations", "postgres");
fs.mkdirSync(gone, { recursive: true });
fs.writeFileSync(path.join(root, "manifest.json"), "{}");
const realStat = fs.statSync;
const spy = vi.spyOn(fs, "statSync").mockImplementation(((
target: string,
) => {
if (target === gone) {
throw Object.assign(new Error("gone"), { code: "ENOENT" });
}
return realStat(target);
}) as typeof fs.statSync);
try {
expect(() => isLocalBuildStale(root)).not.toThrow();
} finally {
spy.mockRestore();
}
});
it("builds with this checkout's SDK CLI, not the plugin's own", () => { it("builds with this checkout's SDK CLI, not the plugin's own", () => {
const [command, args] = localSdkBuildCommand(); const [command, args] = localSdkBuildCommand();
expect(command).toBe(process.execPath); expect(command).toBe(process.execPath);
+6 -1
View File
@@ -370,8 +370,9 @@ const BUILD_INPUTS = [
"package.json", "package.json",
]; ];
// A build can replace dist while this walks it, so a path can vanish mid scan.
function newestMtime(target) { function newestMtime(target) {
if (!fs.existsSync(target)) return 0; try {
const stat = fs.statSync(target); const stat = fs.statSync(target);
if (!stat.isDirectory()) return stat.mtimeMs; if (!stat.isDirectory()) return stat.mtimeMs;
let newest = 0; let newest = 0;
@@ -379,6 +380,10 @@ function newestMtime(target) {
newest = Math.max(newest, newestMtime(path.join(target, name))); newest = Math.max(newest, newestMtime(path.join(target, name)));
} }
return newest; return newest;
} catch (error) {
if (error.code === "ENOENT") return 0;
throw error;
}
} }
/** True when a plugin repo has never been built or its sources changed since. */ /** True when a plugin repo has never been built or its sources changed since. */
+5 -2
View File
@@ -42,17 +42,20 @@ function useReachesBottom(ref: React.RefObject<HTMLElement | null>) {
if (!element || !scroller) return; if (!element || !scroller) return;
// Measured without the line itself, so showing it never flips the answer. // Measured without the line itself, so showing it never flips the answer.
const update = () => { const update = () => {
const line = reachesRef.current ? 0 : 1;
const end = const end =
element.getBoundingClientRect().bottom - element.getBoundingClientRect().bottom -
scroller.getBoundingClientRect().top + scroller.getBoundingClientRect().top +
scroller.scrollTop - scroller.scrollTop -
(reachesRef.current ? 0 : 1); line;
setReaches(end >= scroller.clientHeight - 0.5); // Compared with the whole scrollable height, so content below keeps the line.
setReaches(end >= scroller.scrollHeight - line - 0.5);
}; };
update(); update();
const observer = new ResizeObserver(update); const observer = new ResizeObserver(update);
observer.observe(scroller); observer.observe(scroller);
observer.observe(element); observer.observe(element);
for (const child of Array.from(scroller.children)) observer.observe(child);
return () => observer.disconnect(); return () => observer.disconnect();
}, [ref]); }, [ref]);
return reaches; return reaches;