What is NSTerm
nsterm (NSTerm) is a multi-session web terminal in a single Go binary: administrators publish applications (a command + args + working dir + environment + size), users open them in tabbed terminals over WebSocket (xterm), and every process is tracked as a session (app, user, PID, start, duration, children) that can be monitored and killed. Group-based access with per-user simultaneous-session quotas, audit log, and licensed with a 30-day trial.
Commands, apps, and users in the examples are fictional.
Use cases
1. Publish the corporate shell and open it in the browser
Create the shell app (/bin/bash) and open it with tabs, reconnect, and fullscreen.
nsterm init ./myterm
nsterm start --config ./myterm
nsterm status
Web flow: login → Administration → Applications → create (ID, name, command /bin/bash, args [], working dir, cols/rows, color scheme, env {"TERM":"xterm-256color"}, expand to container) → Dashboard → Open → terminal with new tab (+), reconnect, disconnect, fullscreen.
2. Give a team limited access to one app with a quota
The operators group may use prod-console with at most 2 simultaneous sessions per user.
Web flow: Users → create user → assign the operators group → Groups → assign the app to the group (max limit per user) → the user only sees their apps on the Dashboard; past the quota they get the session-limit notice.
3. Monitor and kill active sessions
See who runs what, inspect child processes, and kill a session with a reason.
Web flow: Sessions (app, user, PID, start, duration, children, live WebSocket updates) → Kill session (asks for a reason) → recorded in the audit log. The Dashboard shows the same active-session summary with open/kill actions.
4. Review who did what
Search the audit log for logins, app creations, and session kills.
Web flow: Audit Log → search/filter (time, user, action, detail, IP) → refresh. CLI: nsterm status and nsterm license for state and trial.
Interface

Reference
CLI commands
| Command | Description |
|---|---|
nsterm init [dir] | Creates the environment (config.yaml + db/ + logs, admin/admin123) |
nsterm start [dir] | Starts the server in the background |
nsterm stop | Stops the server |
nsterm status | Running state, PID, address |
nsterm license | License/trial status and fingerprint |
| Global flags | --config <dir> (alias: positional dir), --port N (override), --debug, --version |
There are no management subcommands: users, groups, apps, and sessions are managed from the web (/api/admin/* routes).
Main configuration (config.yaml)
| Key | Description |
|---|---|
server.host / server.port | Listen address (default 0.0.0.0:8200) |
database.path | SQLite (./db/nsterm.db) |
auth.jwtSecret / jwtExpiryMin / cookieName | Session (nsterm_session, 480 min) |
license.trialDays | Trial (30) |
logging.dir / maxSizeMB / maxAgeDays / maxBackups / compress | Log rotation (./logs, 10 MB, 30 days, 10 backups, compressed) |
Web UI areas
Dashboard (available apps + active sessions) · terminals (tabs, /terminal/:appId, pre-open limit check, WebSocket /api/terminal/:appId/ws) · sessions (live list, children, kill with reason) · administration · users (create/edit, alias, groups) · groups (role, assigned apps, per-user max quota) · applications (command, args, working dir, icon/logo, color, cols/rows, color scheme, environment, expand, active) · audit log (search, time/user/action/detail/IP) · login, password recovery, themes and language (EN/ES).
Commented examples
# 1. New environment on a custom port
nsterm init /opt/nsterm-prod
nsterm start --config /opt/nsterm-prod --port 8200
nsterm status
nsterm license
# 2. Positional directory as --config alias
nsterm start /opt/nsterm-prod
nsterm stop
# 3. Temporary debug
nsterm start --config ./myterm --debug
# Pre-open check before launching a terminal (with session cookie)
curl -b cookie.txt http://localhost:8200/api/terminal/shell/check
# Active sessions via API
curl -b cookie.txt http://localhost:8200/api/sessions
FAQ
What are the first-login credentials? admin / admin123 (change after first login); further users and groups are managed via the web.
How do I limit sessions per user? In Groups → assign app → max field (0 = unlimited); past the limit the terminal shows the limit notice.
Is the kill reason recorded? Yes: killing asks for a reason, stored in the audit log with logins, app creations, and group changes.
Which terminal is emulated? xterm with TERM=xterm-256color recommended in the app env; fixed cols/rows or expand-to-container (font adapts).