尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证A terminal where paste is safe by construction: ASCII-only display, no escape interpretation, minimal signal keys. Python + Qt6.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
A terminal where paste is safe by design.
Paste a command copied from the web, or read text a program printed, without
worrying about invisible characters, bidi overrides or escape sequences.
secure-terminal accepts plain printable ASCII and, in its default display mode,
shows only that -- so a pasted or printed lie has nothing to hide in. The other
display modes trade some of that back deliberately (see below); what holds in
every mode is that no invisible, bidi or control character reaches you unmarked.
This is the problem output lies documents,
removed at the source.查看完整 README ↗A terminal where paste is safe by design.
Paste a command copied from the web, or read text a program printed, without worrying about invisible characters, bidi overrides or escape sequences. secure-terminal accepts plain printable ASCII and, in its default display mode, shows only that -- so a pasted or printed lie has nothing to hide in. The other display modes trade some of that back deliberately (see below); what holds in every mode is that no invisible, bidi or control character reaches you unmarked.
This is the problem output lies documents, removed at the source.
secure-terminal does not sandbox the programs you run. If you choose to run something harmful, it runs, exactly as in any terminal; nothing at the terminal layer can change that.
What it guards is viewing untrusted data. The danger in a normal terminal is that bytes you did not author, and did not choose to execute, can act rather than merely display: a crafted file you open, a program's output, an SSH login banner, a filename in a listing or a commit message can carry escape sequences. On a normal terminal, merely reading such output can quietly change your clipboard (so a later paste inserts text you never copied), draw a link whose visible text lies about its destination, put text onto your input line, or paint text invisibly. A passive, low-suspicion action causes a side-effect you never intended, without you running anything.
secure-terminal removes those escapes so that reading untrusted output is safe, and sanitizes paste so untrusted text cannot smuggle a hidden command into your shell. It does nothing about the programs you deliberately run.
Printable-ASCII display by default. Program output is passed through a sanitizer: ANSI/OSC
escape sequences are removed and every byte that is not printable ASCII (plus
tab and newline) is dropped, the way stcat does for logs. A hostile filename
or a Trojan-Source comment cannot reorder what you read, and nothing a program
prints can reach a line you have already scrolled past.
No escape-sequence parser to attack. CLI mode runs no ANSI/OSC/APC/DCS
parser. Two narrow exceptions are honored, both deliberate: safe,
contrast-guarded colour (SGR), and the four line-local editing ops a shell's
line editor emits -- cursor forward/back, cursor-to-column, and erase-in-line
-- and those only within the line being written. Vertical and absolute
movement, alternate screens and OSC hyperlinks are stripped, so a program can
never reach an earlier line or the scrollback. The worst it can do is redraw
its own current line, exactly as a carriage return already does -- so a forged
status line can overwrite itself before you read it, the same way a progress
bar does. Those four ops are what tab completion needs: Tab makes the shell
rewrite the line you are typing in place. The Line editing setting
(Settings -> Text rendering) chooses how much of the current line a program may
redraw: full (the default), read-safe (drop the four escapes; carriage return
and backspace still act), or append-only (also neutralize those, so the current
line can never be overwritten -- each neutralized redraw is flagged in the left
gutter). See the line_editing entry in
usr/lib/secure-terminal.d/30_defaults.conf for what each gains and costs.
Sanitized paste, with a review. When a paste contains unicode or control characters, a review bar opens inside the window and holds the paste before it reaches the shell. The paste opens FULLY REVEALED in one editable box -- nothing is silently pre-dropped, so a trap cannot hide by being cleaned away before you see it: every hidden character stays in place, named and risk-class-coloured by the terminal's own renderer (a look-alike tinted, an invisible or a bidi override shown as a named badge). While any hidden character is present the Deliver button is disabled and red ("blocked -- N hidden"), so nothing unreviewed can cross. You clear the trap with one of the labelled transforms -- Strip unicode (ASCII only), ASCII-fold (replace look-alikes with the plain letter they imitate) or Keep printable unicode (drop the invisible/reordering characters, keep the rest) -- or by editing the box directly; Deliver then enables, amber for printable unicode or uncoloured for plain ASCII. Restore original re-reveals the untouched paste at any time. While the paste is held, terminal input is suspended and the paste's Deliver is countdown-gated (configurable; Enter or Esc rejects), so a stray key cannot wave a hostile paste through. In CLI mode a plain-ASCII paste is not interrupted; the warning is configurable to always, only-on-unicode (the default), or never.
The same review for copy, going the other way. Text leaving via copy is
reviewed too, with the same revealed box: after cat evil-log, selecting and
copying in Show mode (where real glyphs are kept) would otherwise put a look-alike
straight on the system clipboard, so the copy opens fully revealed and the same
transforms clean it before it crosses -- stripped to ASCII, with printable unicode
kept, or not at all. Configured separately from the paste warning (copy and paste
are opposite trust directions): always, only-on-unicode (the default), or never.
Tiny input allowlist. You type printable ASCII plus a small set of control keys that the pseudo-terminal turns into signals:
| Key | Signal |
|---|---|
Ctrl+C | SIGINT |
Ctrl+Z | SIGTSTP |
Ctrl+\ | SIGQUIT |
Ctrl+D | EOF |
We only write the control byte; the kernel line discipline does the rest. Backspace is honored so you can rub out a typo; it erases one character and never crosses a line, so it cannot rewrite earlier output.
The safety model above does not cost you the usual conveniences:
Ctrl+Shift+T, close with Ctrl+Shift+W; closing a shell closes its tab.Ctrl+Shift+C / Ctrl+Shift+V
(plain Ctrl+C stays SIGINT). Paste is still sanitized before it reaches
the shell.Ctrl+wheel, Ctrl+plus / Ctrl+minus, or the percentage box
in the top right (Up/Down keys or type a value). Ctrl+0 resets to 100%.<U+XXXX NAME> (the codepoint plus its
official Unicode name, what unicode-show annotates), so a homoglyph reads as its
identity rather than a bare number. Box replaces every
non-ASCII character with a coloured box, one per character, tinted by risk class
(a bidi override, a zero-width character and a plain foreign letter get different
colours); safe and hard to miss. The on-screen box is lossy, but a saved
transcript names each byte inline (<U+XXXX NAME>) so the record is not; a
copied box still maps to a plain ASCII _. Show renders legitimate unicode as glyphs so you can read a
log, but still tints each one by risk class -- a homoglyph confusable with ASCII
wears a louder colour than honest foreign text, and the invisible, bidi and
control classes (which have no visible glyph) still show as a coloured placeholder.
Reveal shows every non-ASCII character as a <U+XXXX> badge to inspect exactly
what is there (and badges the control chars BS/CR too; Detail names them, e.g.
<U+000D CARRIAGE RETURN>). State goes further, badging EVERY character (printable
ASCII included) as <U+XXXX>, each tinted by the program's OWN SGR attributes
(codepoint + attributes) -- the live sibling of Save Screen State Dump. It renders
inline in CLI mode; a TUI tab freezes the frame and renders the snapshot as badges,
since a badge cannot fit a fixed grid cell. Escapes are stripped in every mode./freeze, or
Ctrl+Shift+B). Pauses the live view in any mode so a fast or scrolling frame can
be read -- the program keeps running (output is still read; only the repaint is
suspended), and unfreezing catches up. Mainly a debugging aid: freeze a frame that
looks wrong and inspect it (while frozen, / return exactly
the frozen frame). Reveal/Detail/State auto-freeze in a TUI tab because their badges
cannot fit the grid; CLI never auto-freezes.The strict line mode above cannot run curses apps, because they are driven
entirely by the escape sequences it refuses to parse. TUI mode (top bar and
View -> TUI mode, per tab, default off, needs python3-pyte) relaxes that so
you can run ssh, an editor, htop, the Claude Code CLI, and use the shell's own
completion menus and progress displays. A yellow indicator and a hover tooltip
flag it while it is active, because it is a deliberate, lower-guarantee mode:
pyte)
that has no OS reach: it cannot touch the system clipboard, so that exfil
vector stays closed. A program MAY set the tab title (default on), but the title
is reduced to plain ASCII and shown on a separate, visibly-untrusted line of the
tab, so a spoofed title can never pose as the trusted, app-set label.TUI mode renders through the confined screen model at all times (with its own scrollback), so a program that positions the cursor renders faithfully: a completion menu, a progress bar, or a full-screen program on the alternate screen (which is snapshotted and restored so it normally leaves your scrollback untouched).
What you give up: because the cursor can be positioned, a program can draw a misleading interface (a fake prompt, say) or overwrite a line you already read, so only run programs you trust. This is "restricted-emulator safe," not "safe by design."
Security comparison with CLI mode. The line (CLI) mode, and everything the project's guarantees rest on, is unchanged: it runs no escape parser beyond safe colour and four line-local edits, the confined screen model is never fed in CLI mode, and vertical/absolute cursor movement is stripped, so a program can never reach back to an earlier line or the scrollback. Transcript integrity is therefore per-line: anything already scrolled past is append-only, while the line a program is currently writing can be redrawn by it (exactly as a carriage return does). TUI mode is the one place escapes are interpreted; the only change from earlier versions is that it now does so uniformly (at a shell prompt too, not only while a full-screen program holds the alternate screen). No new class of side-effect is enabled -- clipboard (OSC 52) and hyperlink escapes remain neutralized in both modes, and a program-set title is shown only on the quarantined, untrusted tab line -- and every on-screen cell is still filtered. The extension is contained entirely within the opt-in, clearly indicated TUI mode.
The default is a deliberately minimal, line-oriented display. Backspace works, but because line mode neutralizes the escapes readline uses to redraw, richer in-line editing (mid-line cursor movement, history recall, completion menus) is intentionally basic there; compose or paste a line, read the exact bytes, then run it. Turn on TUI mode when you want those interactive features to render.
The guarantees above are enforced by an extensive automated suite; independent human review is still pending. secure-terminal follows a three-stage review path: (1) written by AI and checked by that automated suite -- the current status; (2) human non-malicious review, confirming it works as intended with no backdoors; (3) a full human security audit of the whole design, the gold standard. See the review status page.
secure-terminal
Built with Python and Qt6. AI-assisted (see org-ai-assisted and the review status above).
secure-terminalA standard Debian source package. Build it from source (below) and install the
resulting .deb, or run it in place from a checkout (./usr/bin/secure-terminal).
Can be built using standard Debian package build tools such as:
dpkg-buildpackage -b
See instructions. (Replace generic-package with the actual name of this
package secure-terminal.)
secure-terminal requires donations to
stay alive!
ctl dump-statedump-tabCtrl+Shift+S). Writes the current tab's
scrollback to a file. Because the buffer is already sanitized plain ASCII, the
saved file is safe to open anywhere, unlike a normal terminal's raw log.~/.local/state/secure-terminal/session.json and restored next launch, with a
fresh shell under the restored history. The running programs are not
resurrected. Turn it off, or clear the saved session, from the File menu; when
off, nothing is written. An unlimited tab's saved scrollback is capped so the
file cannot grow without bound..conf files read, lowest precedence first, from
/usr/lib/secure-terminal.d/, /etc/secure-terminal.d/,
/usr/local/etc/secure-terminal.d/ and ~/.config/secure-terminal.d/ -- so a
distro or admin can seed defaults and the user overrides them. Only *.conf
files are read; within a directory they apply in lexical order, later winning.
The app writes its own settings to
~/.config/secure-terminal.d/20_auto-generated.conf (a higher-numbered .conf
you hand-maintain, e.g. 50_user.conf, wins over it). Settings -> Folders &
Files... shows every location with Copy and Open buttons.Ctrl+Shift+R). Opens
a tab straight into ssh host, tmux, claude, etc. instead of the login
shell. A plain new tab (Ctrl+Shift+T) still runs $SHELL.