webtun
v2.2.5
Published
Self-hosted web terminal with Cloudflare Tunnel, file explorer, and PWA support
Maintainers
Readme
Quick Start
npx webtunThat's it. Open http://localhost:3000 in your browser.
npx webtun --pin secret123 # With PIN protection
npx webtun --tunnel # With Cloudflare Tunnel (public URL)
npx webtun -p 8080 -t # Custom port + tunnel
npx webtun --help # Show all options
npx webtun --version # Show versionInstall globally
npm install -g webtun
webtunRecent npm note: Install scripts are blocked by default. Allow them for
node-pty:npm install -g --allow-scripts=webtun,node-pty webtunBuild tools required for native modules:
sudo apt-get install -y python3 make g++(Debian/Ubuntu) orxcode-select --install(macOS).
Other install methods
# One-command install
bash -c "$(curl -fsSL https://raw.githubusercontent.com/unn-Known1/webtun/main/install.sh)"
# Manual setup (setup.sh starts the server itself)
git clone https://github.com/unn-Known1/webtun.git && cd webtun && ./setup.shWindows note:
setup.sh/install.sh/stop.share bash-only and support Linux and macOS (Git Bash on Windows is not supported — the scripts exit with "Unsupported OS"). On Windows, use the Electron app above, WSL, ornpx webtundirectly (the server itself is cross-platform; only the provisioning scripts are not).
User Guide
New here? Read the visual guide: unn-known1.github.io/webtun/public/docs.html — every feature (terminal, editor, files, git, tunnels, sessions, shortcuts) in one page, ~5 minutes cover to cover.
It's also built into the app: open /docs on any running instance, or Settings → About → User guide & docs.
Features
Terminal
- Real shell sessions — node-pty backed, full bash/zsh/PowerShell support
- Multi-tab — drag to reorder, side-by-side sessions, new-tab button next to last tab
- Bracketed paste — Ctrl+V works in TUI apps (vim, nano, htop) — 60KB chunked
- Command history — keystroke-based capture, strips ANSI/control sequences
- Session persistence — tmux or in-memory PTY; tabs survive page reload (all platforms)
- Keyboard Shortcuts — reference dialog in the overflow menu (Ctrl+P/T/W/B/F, etc.)
File Explorer
- Browse, upload, download, rename, delete files — full filesystem access (
ALLOW_FULL_FS=trueby default) - Multi-select — batch delete, download, zip, cut, copy
- Zip/Extract — right-click any file or folder
- Image viewer — preview inline (png, jpg, gif, svg, webp)
- Conflict resolution — replace, merge, keep both, skip
- Unified path bar — tappable breadcrumb segments + click current folder (or pencil) to type any path,
Enterto go,Escto cancel - Rich rows — type-tinted icons, live photo thumbnails, size + modified dates, hover quick-download, sortable sticky folder/file groups
- Git mini-panel — branch switching/creation, stash, discard, repo init, staged/unstaged/untracked/conflict groups, colorized diffs, commit, push/pull; auto-shows inside repos; Simple mode hides rarely-used actions
- Settings control deck — collapsible groups with live search, runtime PIN set/change/disable (saved to
.env) - Editor — CodeMirror with autosave draft,
F11fullscreen (covers terminal area only, never the file explorer),horizontal/verticalsplit toggle, markdown/HTML preview - File tabs — open any file in its own tab beside your terminals (button in the editor header, or Open in Tab in the file context menu); up to 10 at once, each code file with its own live editor, cursor, scroll and undo history — so Tile view shows several files at once. Per-tab Save/Reload, and Panel hands the file (buffer and undo history included) to the split editor
Mobile
- Touch gestures — swipe to close tabs, pull-to-refresh
- Mobile keyboard bar — ESC, Tab, arrows, Ctrl combos
- Pinch-to-zoom — adjust font size with two fingers
- Virtual keyboard aware — no overlap when keyboard opens
- Selection mode — toggle between interaction and text selection
Cloudflare Tunnel
- Create tunnels from the UI — zero CLI commands
- Built-in health check before tunnel creation
- Live status indicators, tunnels survive restarts
- Stop/kill tunnels from settings panel
SSH Access
- On-demand key-only credentials for Termius, VS Code Remote-SSH, plain
ssh/rsync/sftp— nothing created until you ask (header SSH button → Generate, after enabling SSH once in Settings → Features) - ed25519 per device, private key shown once and never stored; per-key revoke; requires PIN protection
- Same user as your web terminals, so files and permissions match; host fingerprints + LAN/Tailscale addresses shown for first-connect verification
System Stats
- CPU, Memory, Disk, Uptime — real-time with progress bars
- GPU detection (nvidia-smi, system_profiler, WMI)
- Multi-GPU support with VRAM, utilization, temperature
- Top processes sorted by CPU — Kill button per row (
POST /api/system/kill)
Desktop (Electron)
- Cross-platform app for Linux, Windows, macOS
- Native window with system tray and file dialogs
- Self-updating: checks GitHub releases after launch and daily, installs on quit (Windows Setup + portable, Linux deb + AppImage, macOS arm64)
- Portable
.exeand AppImage builds cannot self-update (no installer to apply the update) — update failures are logged, and a manual update check is exposed to the UI; grab the next release from GitHub for those builds - Platform support: Windows x64, Linux x64, macOS arm64 (Intel Macs and Windows-on-ARM are currently unserved / emulation-only)
- Build:
npm run dist:linux/npm run dist:win/npm run dist:mac - Download latest release
- Windows "Unknown publisher" warning: the exe is unsigned by default. To ship signed builds, get an Authenticode code-signing certificate (OV), export it as
.pfx, and add two repo secrets (Settings → Secrets → Actions):WIN_CSC_LINK= base64 of the.pfx,WIN_CSC_KEY_PASSWORD= its password. The Windows CI build picks these up automatically (CSC_LINK/CSC_KEY_PASSWORD); without them it builds unsigned. Note: even signed, SmartScreen reputation takes time/downloads to build.
PWA
- Install to iOS/Android home screen
- Works offline with last session state
- Install banner with iOS instructions fallback
Configuration
CLI Flags
| Flag | Description | Default |
|------|-------------|---------|
| --port, -p | Server port | 3000 |
| --host, -h | Bind address | 0.0.0.0 |
| --pin | Authentication PIN | none |
| --tunnel, -t | Start Cloudflare Tunnel | off |
| --help | Show help | — |
| --version | Show version | — |
Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| PORT | Server port | 3000 |
| HOST | Bind address | 0.0.0.0 |
| PIN | Auth PIN (empty = no auth) | none |
| SHELL | Shell to use | platform default |
| WORKSPACE_ROOT | File explorer root | ~ |
| ALLOW_FULL_FS | Allow browsing outside WORKSPACE_ROOT (full FS) | true |
| TRUST_PROXY | Trust X-Forwarded-For from first proxy | false |
| WEBTUN_SHELL | Override shell on Windows | PowerShell |
| ALLOWED_ORIGINS | Extra WebSocket origins (comma-separated) when served from another hostname | same-origin only |
| PREVIEW_PORTS | Allow-list of ports the app preview may proxy (comma-separated) | any port except WebTun's own |
| SSH_PORT | Expected SSH port shown in Settings → SSH Access | 2222 |
Tech Stack
| Layer | Technology |
|-------|------------|
| Frontend | Vanilla JS, xterm.js, CodeMirror, PWA |
| Backend | Node.js, Express, node-pty |
| Tunnel | Cloudflare Tunnel (cloudflared) |
| Desktop | Electron + electron-builder |
| Archives | stdlib zip writer + reader (lib/zip-store.js, lib/zip-read.js) |
Security
- PIN authentication on all API endpoints (
x-pin-tokenheader or?token=query) - Change the PIN anytime from Settings → Security (applies instantly, saved to
.env; fresh sessions need another session's approval while others are signed in) - New devices sign in with the PIN but stay locked until an existing session approves them — see active sessions in Settings → Security
- CSP headers restrict script sources to CDN
- WebSocket origin check prevents cross-site hijacking
- Per-IP rate limiting on auth and search endpoints
- npm audit clean — 0 known vulnerabilities
Troubleshooting
| Problem | Solution |
|---------|----------|
| Tunnel not loading | Check quota at dash.cloudflare.com |
| Port 3000 in use | PORT=3001 npm start |
| Shell permission denied | chsh -s /bin/bash |
| Behind reverse proxy | Set TRUST_PROXY=true in .env |
| Windows shell wrong | Set WEBTUN_SHELL=/usr/bin/bash in .env |
| Windows "Unknown publisher" | Unsigned build — see Desktop (Electron) signing setup |
| Tunnel persists after restart | kill $(pgrep -f 'cloudflared tunnel') |
Changelog
v2.2.5
- SSH access (opt-in) — on-demand key-only ed25519 credentials from a header popup for Termius/mobile/
sshclients: status stat-trio with port pill, one-click Easy Setup checks (sshd, firewall, Tailscale userspace serve, built-in managed sshd) with per-check fix buttons, copy-ready Tailscale/LAN recipes (Docker-bridge addresses filtered), session single-use private keys; Features toggle is server-enforced (default off) and kills managed sshd + WebTun-started Tailnet on disable - Login — Enter-to-unlock now works on every showing of the PIN screen (plus input-level fallback), not just fresh boot
- File properties — permissions info button with live octal/symbolic decode
v2.2.4
- Security hardening (full-codebase grill-review fixes) — reflected-XSS escape in preview errors, fail-closed raw-PIN path, PIN rotation persist-first with pending-clearance, preview sockets reaped on rotate/revoke, per-UID 0600 tmux claim file
- Backend — tunnel/upload SSRF closed (all-address DNS vetting, non-canonical IP deny), CWD
cloudflaredcandidates removed, upload depth caps + no silent overwrite, zip running-total cap with fd-based writes, git route guards (--separators, root-diff reject, credential scrubbing), search walk capped + sandboxed,JSON_LIMIT/JSON_LIMIT_LARGEenv knobs, merge rollback now restores overwritten files - Frontend — terminal titles forwarded, streaming decode + cross-frame OSC, paste/history tracking, forced re-login on revoke/rotation, tab active-state + viewer-position persistence, panel A→B write race fixed, WCAG-AA theme contrast, folder-size auth, AVIF support, docs corrected and synced
- CLI/infra — setup PIN round-trip fix,
npm ci, systemd double-start guard,=flags, host-aware healthcheck, tunnel-fail teardown, SIGKILL escalation, strict version/tag/README gate
v2.2.3
- Tab features — tab-bar overhaul (pin protection, context menus, middle-click / right-click handling, keyboard reachability)
- File explorer fixes — audit pass over listing, selection and rows, plus zip/unzip jobs in the Transfer Center
- Settings & titlebar fixes — settings audit corrections and terminal context-menu work
- System stats & docs — stats panel additions, user-guide updates and launchpad screenshots
v2.2.2
- Terminal directory follows
cd— the file explorer's "Go to terminal directory" button (and new-tab / copy-path / bookmark from the terminal menu) now resolves the session's live directory on demand viaGET /api/sessions/:id/cwd(tmuxpane_current_path,/procon Linux,lsofon macOS) instead of the stale launch dir that OSC 7 rarely updated - Open files track external changes — text buffers snapshot
mtime/sizefrom/api/files/readand are re-statted every 10s and on refocus: clean buffers auto-reload (Updated from disk), dirty buffers keep your edits and raise a persistent cyanChanged on diskindicator (click to reload, Save to overwrite); deleted files are flagged the same way - Dependency bumps —
electron-builder26.16.1,actions/checkoutv7.0.1,actions/setup-nodev7.0.0 (Dependabot #4, #5, #6)
v2.2.1
- Express 5 —
express4 → 5.2.1; the app-preview wildcard route migrated to the new{*splat}syntax (handler unchanged, it slicesoriginalUrl); smoke-tested (/,/docs, file/git/system APIs, preview proxy) - Latest dependencies —
node-pty1.1.0,ws8.21.3 (spec + override),debug4.4.3 via the new tree;npm auditclean - Automation — weekly Dependabot (npm + GitHub Actions), a PR check workflow running the CI
verifysteps on every pull request, and a CodeRabbit review config with repo-specific instructions forserver.js,docs.htmlandapp.js
v2.2.0
Never tagged or published — the tree described here first shipped as v2.2.1; section kept for history (same convention as the v2.1.x sections below).
Everything since v2.0.4 as of this tree (v2.1.0–v2.1.2 were bumped and documented but never tagged or published either; the v2.1.x sections below are kept as-is for history). New since the 2.1.2 tree:
- Frontend split — the 10,491-line
public/js/app.jsis now 15 concern-sized scripts (core,ui,tabs,terminal,files,transfers,editor-panel,file-tabs,preview,viewers,launchpad,settings,security,git,misc), moved byte-verbatim with zero behavior change; Service Worker cache bumped towebtun-v8 - tmux ownership tracking — shutdown kills exactly the sessions this process created (recorded, never inferred from the name); a box-shared claim file arbitrates the orphan sweeps between live same-namespace siblings; the startup sweep runs only after the port binds
- Long filenames stay readable — file rows truncate in the middle so the extension is always visible; selecting a row unwraps the full name; the breadcrumb auto-scrolls to the current folder with no width cap
- Per-tab previews, un-scoped theme — markdown/HTML preview state is per file tab; the editor theme no longer leaks across tabs
- Dependency slimming —
archiverandyauzlreplaced with stdlib zip code (4 prod deps left); express/multer/electron bumped;typedarrayoverride pruned;npm auditclean - Fixes — stuck tunnel rows (id kept across restarts, idempotent stop, panel resync); build config moved to
electron-builder.yml; ignore files trimmed; stalehasInstallScriptdropped from the lockfile
v2.1.2
- Zero install scripts — the
postinstallhook is gone (manualnpm run rebuild:pty, repo-only, out of the tarball); the dead Yarn-onlyresolutionsblock is out ofpackage.json; 17 files ship with nothing executable at install time - App preview hardening — the
?token=bearer is stripped (selectively, so apps with their own token logins keep working) before anything reaches your app; preview auth matches the main gate (raw-PIN approval, pending sessions); cookies are port-scoped,Secure-aware and shorter-lived; upstream dials die with the client; docs no longer claim proxied WebSocket hot-reload - Previewing WebTun itself is refused up front — the terminal watcher, New Preview prompt and navigation compare against the server's real port (tunnel-safe), instead of serving a raw JSON frame
- Per-instance tmux sessions —
wt-webtun-<port>-<id>so a repo checkout and a global/npx server never adopt or kill each other's sessions (crafted ids can't escape the namespace); closed terminals (SIGHUP) now run exit cleanup instead of orphaning tunnels - Fixes — command library panel was inert (it sits inside
#content, which it inertted); HTML preview renders through blob URLs with<script>bodies exempt from URL rewriting; root-absolute assets resolve against the file's folder; Git panelShow more/Show advanced…share one row; default command set trimmed to project entries
v2.1.1
- Transfer Center — new up/down icon next to the coffee cup with live uploads, downloads and copy/move jobs: real bytes, speed and ETA, per-job Stop/Dismiss, hover-to-peek / click-to-pin panel with running-stripe bars. Single-file downloads report
Content-Lengthfor a true percent; copy/move pause while a conflict dialog waits and stop after the current file; zip/unzip and delete stay as toasts - Full HTML preview — the editor HTML preview gains a Full mode next to Safe: the file renders verbatim with its own scripts running inside the same isolated opaque-origin frame (no app access, storage, popups or navigation); relative and root-absolute asset URLs resolve against the file's folder; works without the sanitizer CDN; the isolation notice shows once
- Preview robustness — URL rewriting no longer touches
<script>bodies; a failed render explains itself in the pane instead of a silent blank; single-file server ops show activity + elapsed instead of a stuck 0%
v2.1.0
First release since v2.0.4. The 2.0.5 working tree was never tagged or published, so its changes ship here too — nothing was released under 2.0.5, so this upgrade path skips nothing.
- Full audit remediation — every actionable finding from the 2026-09-14 code review landed (113 fixed, 25 deliberately-kept behaviours left alone, including empty-PIN-is-open and full-filesystem-by-default)
- Security — concurrent logins can no longer both become active without approval; revoked or PIN-rotated sessions have their WebSocket connections actively closed (not merely asked to go away) with a 60s re-validation sweep; each rate limiter owns its own window; clipboard state is keyed per session with a TTL; tar entries that are links are refused and the extracted binary is containment-checked; error responses no longer leak absolute paths
- App preview — served on an opaque origin under a sandbox policy with the upstream CSP never merged, so a previewed app cannot reach your session token or files; proxy errors are normalized so it can no longer be used to probe which local ports are open; new
PREVIEW_PORTSallow-list narrows which ports are previewable - Terminal — clipboard reads (OSC 52 paste) are opt-in via Settings; pasting never splits multi-byte characters; docs hero and search work is unchanged in behaviour but far cheaper; pinch-zoom changes the size for the session only and no longer rewrites your saved font size
- Editor & docs — reopening a file offers to restore an unsaved draft (cleared on save or discard); EPUB previews are sandboxed; the tab strip is keyboard-reachable and modal panels make the rest of the page inert
- File tabs — open a file in its own tab next to your terminals (editor-header button or right-click → Open in Tab); every code file gets its own live editor, so Tile view shows several files side by side with independent cursors, scroll and undo history, plus a per-tab Save/Reload toolbar and a Panel button that hands the buffer to the split editor; PDF/EPUB/Office tabs share one live viewer instead, so several large documents stay open without the memory cost (parked tabs remember page, zoom, sheet and scroll); drafts, unsaved-changes guards and the two surfaces' buffers never diverge, and the tab layout is restored on reload
- Reliability — dead tunnels restart with backoff and give up cleanly instead of churning, and a recycled process ID can't pass as a live tunnel; the history cap survives restarts; staging a hunk is pinned to the hunk you clicked (it asks you to refresh rather than stage the wrong lines); the legacy state-file migration no longer runs on
require(); a dead preview or search request can't hang the server - Performance — system stats are cached and shared between the launchpad pulse, header icon and stats panel instead of each polling separately; live preview renders on edit rather than polling every second; upload progress updates once per frame; PDF scrolling no longer walks every page per frame
- Packaging & scripts — a version/lockfile/tag guard now gates CI and refuses a stale
npm publish;setup.shfetches and sanity-checks the NodeSource script instead of piping it into root bash;install.shpre-checks its tools and refuses a dirty tree;stop.shverifies the pidfile before signalling;nodemon.jsonkeeps dev restarts off runtime state files - Config — new
ALLOWED_ORIGINSandPREVIEW_PORTS; JSON bodies are capped at 2 MB (12 MB for file writes) instead of a blanket 50 MB; a missinggitbinary returns 501 instead of 400 - Docs — in-app user guide at
/docs(Settings → About → User guide & docs) covering terminal, editor, files, git, tunnels, sessions, shortcuts and troubleshooting, also published to GitHub Pages; keeping it current is now part of the agent workflow, so user-facing changes update/docsin the same change
v2.0.0
- Launchpad home dashboard — zero-tab hero, recent commands with one-click or
1–6keypress launch-and-run, places, live system pulse with sparkline, Today strip, optional screensaver - Home button pinned left of the tab bar, always visible; dashboard pauses explorer auto-reload while shown
- Number-key runs work regardless of focus; inline syntax-checked, no new dependencies
- Hardening — first-PIN setup on open instances is loopback-only, process-kill requires PIN protection, WS handshake brute-force throttle, preview iframe is opaque-origin + refused without sanitizer, reconnect auto-retry stops at 10, unzip extracts to temp dir (no rollback wipe), recursive delete refuses roots, upload/download/image/spawn output caps, no
x-powered-by,/api/versionrequires auth - Sessions — revocable per-device login tokens with trusted-device resume; new logins start pending and can do nothing until a different active session approves them (correct PIN alone opens nothing); active-sessions list with per-device revoke, persistent header warning triangle + live count on the keep-awake cup, instant new-login / approval / PIN-change alerts with remote kick; fresh-session PIN rotations need a second session's approval (60s, deny-by-default)
- PDF viewer — selectable text layer over each page; EPUB/PDF fixes as before
- Packaging — runtime state (
PIN, history, tunnels) moves to~/.config/webtunfor global/npx installs, PWA update flow, Electron single-instance + sandbox + no prod DevTools, Windowsnpm.cmdpostinstall fix, release assets fail loudly on missing files - npm jumps
1.5.6→2.0.0(v1.5.7was GitHub-only); ships under PolyForm Noncommercial 1.0.0 (≤v1.5.6 stays MIT)
v1.5.7
- Explorer overhaul — unified path bar, rich rows (type-tinted icons, photo thumbnails, dates), sortable sticky groups, skeleton loading, quick download, hover-peek bookmarks, segmented nav header; large folders load much faster
- Git mini-panel — branch switching/creation, stash, discard, repo init, colorized diffs, commit, push/pull with ahead/behind + stash badges
- Settings control deck — collapsible card groups (closed by default) with live search, staggered entrance, plus runtime PIN set/change/disable saved to
.env - Lock screen redesign, animated keep-awake indicator, spinning refresh state
- PDF viewer — duplicate-page fix, lazy rendering for big documents, download progress
- Security — dependency audit clean (0 vulnerabilities); source-available license from this version (PolyForm Noncommercial, ≤v1.5.6 stays MIT)
v1.5.6
- Explorer: fixed preview for unsupported file types, fixed HTML preview
- PDF/EPUB preview: PDF/EPUB preview with optional CDN loader, vertical scroll, instant setup, fixed EPUB stuck and PDF page numbers sorted
v1.5.5
- Explorer: full filesystem access by default (
ALLOW_FULL_FS=trueunlessALLOW_FULL_FS=false), symlink dirs now navigable (statisDirectory), fixed silent403bounce on..(nowtoast+ error div),parenthidden at workspace root,history/breadcrumbdesync fixed (deferred to success), stale closures on reused file items fixed (datasetlive), drag overlay stuck fixed (relatedTarget/dragend/blur), relativepath-inputnowjoinPath(currentPath),renamedialog no longer closes on error - Settings: drawer flicker fixed (
#main:isolation,#sidebar/#settings-panelwill-change/backface-visibility,#file-list-wrapcontent-visibilityremoved,inert/focusTrapdeferred viarAF+preventScroll,fileWatcherskips when drawer/overlay open) - Editor:
F11fullscreen nowabsoluteinside terminal area only (#editor-split-arearelative), never covers file explorer/sidebar or header, removedrequestFullscreenbrowser overlay,CodeMirrorheight100% - Terminal: removed
Shift+F11fullscreen button and#terminals.fullscreen/#content.terminal-fullscreenper request - UI:
#conn-statusmargin-left:6pxbefore dot
v1.5.4
- Security hardening: path sandbox
ALLOW_FULL_FS(default~), symlink containment, null-byte/array guards,renametraversal block,deleteuseslstat, batch caps 100, zip 1GB/unzip bomb guards,downloadheader sanitization,imageno-store,write10MB cap, tunnel SSRF (localhost-only) + URL validation - Auth & transport:
checkPinarray guard, length-leak freeconstantTimeEqual, rate limiter usesreq.ipwithtrust proxy+ Map cap 10k,--pinarg consumption fix, WScols/rowsclamp 2-500, Origin check +constantTimeEqualtoken,sessionIdlength 1-64, per-IPclipboard,historymax 1k &cmdhist.json0600 atomic writes,ptySessionsTTL 30m + cap 100,TMUX_PREFIX=wt-webtun- - Build: predictable
tmpviamkdtemp, tar-sliptzfvalidation, heredocprintfno-expansion,.envparser first-=fix,pkill $SCRIPT_DIR+kill -0race,electronparseInt PORT+autostartfilter,ws ^8.17.1 - UI/UX: touch 32-36px,
aria-pressed/aria-expanded/aria-modal/inert(siblings), focus-trap fix,confirmDialogqueue,skip-link,pan-y+contain,visualViewportSamsung+scale,pull-to-refresh,safe-area,cmd-libtrap,tiles min(300px,100%),upload 6px+cancel,paste 60KB,WebGL<4,iframe allow-scripts,autosave draft 2s+jsx:true - Explorer:
new-tabnext to last tab (sticky),sidebar-header/breadcrumbunified30px3px 6px gap3,file-item 2→1pxbreadcrumb 1px sep,sidebar-footer/bookmarkscompact, folder icon + path one lineflex gap2 - Editor:
F11fullscreen (fixed inset0) +horizontal/verticalsplit toggle stays usable,Escto exit,requestFullscreenfallback,closeEditorclears - Terminal:
Shift+F11fullscreen (#content.terminal-fullscreen+#terminals.fullscreen), header button,fitTermrefit - System Stats: Kill
POST /api/system/killper-row button (refuse1/self/cloudflared) - PWA:
sw.jsno immediateskipWaiting,token//wsbypass, stale-while-revalidate,manifest?newTerm=1+titlebar-areaCSS
v1.5.3
- Terminal session persistence without tmux (in-memory PTY on Windows + Linux)
- Session IDs always generated; tabs now survive page reload on all platforms
v1.5.2
- UI/UX audit fixes: theme-aware xterm selection color,
--fg3across all 6 themes - Replaced native
confirm()with a theme-aware, focus-trapped dialog - File explorer keyboard navigation (arrows, type-ahead, select-all) + loading state
- Mobile header overflow (more) menu; compact hostname restored on mobile
- Context menu keyboard navigation and
aria-expandedon submenus - SVG-ified remaining text glyphs; aria-labels on JS-generated icon buttons
- Single-line scrollable breadcrumb; tab-bar mask no longer clips new-tab
- Removed infinite keep-awake bounce; light-theme contrast bump
term.paste()replaces deprecatedexecCommand('insertText')- Pull-to-refresh indicator; tunnel rows use CSS classes
- JetBrains Mono web font + CSP
font-src; PWA screenshots - Fixed addon-webgl 404 (0.18.1 → 0.18.0); removed MiMo CLI default command
- Explicit Tokyo Night theme block +
color-schemefor all 6 themes - IBM Plex Sans UI font paired with JetBrains Mono (chrome vs code surfaces)
- Keyboard Shortcuts dialog in overflow menu; dialog
role/aria-modalsemantics - Busy-spinner buttons + inline field errors (rename/new file/new folder/tunnel/save)
- Toast type icons and max 4 visible; editor unsaved-changes dot + Discard dialog
- Deferred CDN scripts for faster first paint; icon stroke-width normalized to 2
- Empty-directory quick actions; Reset settings button; skip-link + landmark roles
- Terminal connecting spinner; install banner clears mobile key bar
- Search button touch targets on coarse pointers; subtle hover on plain buttons
v1.5.1
- Fixed command history saving terminal garbage instead of actual commands
- Fixed history 401 errors on Cloudflare tunnel URLs
- Fixed VT/ANSI parameter sequences leaking into history
- Fixed CodeMirror
defineSimpleModeerror - Fixed console accessibility warnings (labels, form fields)
- Added safe
localStoragewrapper for Tracking Prevention compatibility - New terminal icon matching in-app logo
v1.5.0
- Initial release
License
- Versions up to and including v1.5.6: MIT License.
- v1.5.7 and later: PolyForm Noncommercial 1.0.0 — free for noncommercial use (personal, research, education, charities, government). Commercial use is not allowed without permission.
- For a commercial license, contact [email protected]. See LICENSE.
