engineering / skill
Hidden Character Scanner
Find invisible characters, text-direction tricks, and mixed-script words in local text.
At a glance
- Purpose
- Find invisible characters, text-direction tricks, and mixed-script words in local text.
- Runs in
- Local agent with shell
- Operating systems
- macOS, Linux
- Needs
- Runtime: Python 3.10+, standard library only; Needs internet: No; Needs accounts or API keys beyond your agent: No
- Files and data
- Reads files: Yes; Writes files: No; Sends data to other services: No
- Tool type
- Skill
- Delivery
- Download from Skills Outpost
- Version
- 0.1.1
- ZIP SHA-256
- af62b3f0b63b376cfd9e5dbfe5f487c95bae4deb1afff5dfcba1627dccff2021
- Access
- Download from Skills Outpost
- Compatibility
- Python 3.10+, standard library only. File scanning supports macOS and Linux with POSIX directory-descriptor and no-follow APIs: os.name == "posix", os.O_NOFOLLOW, os.O_DIRECTORY, os.open and os.stat in os.supports_dir_fd, os.stat in os.supports_follow_symlinks, and os.scandir in os.supports_fd. Windows file scanning is unsupported. Any scan containing a path other than - checks these capabilities before reading any input and returns a one-line error and status 1 if unavailable. Stdin-only scan and decode-tags TEXT|- remain available on Windows and other systems with Python 3.10+. Runs in a terminal or an Agent Skills compatible harness able to run local Python. No account, external service, or network connection is needed.
- External costs
- None. The package is free under the MIT license and runs locally with Python 3.10 or newer.
- Permissions
- Read access to the exact user-supplied files or directories, or standard input. The CLI does not follow symlinks. An explicit symlink path or symlinked parent is skipped and marks the scan incomplete; a symlink found during directory traversal is skipped without that marker. Use a resolved path when needed. The product writes only to standard output and standard error. It reads no credentials or environment variables and needs no network permission. Bundled tests create synthetic files in the system temporary directory; hygiene reads only package files. Ordinary scanner use creates no files.
- Usage terms
- MIT license. Copyright 2026 Zero Width Lab. No vendor products or services are used. By Zero Width Lab (zerowidthlab.com)
Download from Skills Outpost
Get this version
FreeStatic source, format, secret-pattern and declaration checks with independent human source review.
- SHA-256 of the released ZIP
af62b3f0b63b376cfd9e5dbfe5f487c95bae4deb1afff5dfcba1627dccff2021
The creator shows this version's package files publicly: anyone can read SKILL.md and the other files under Files, without an account. The ZIP download needs the version in your Library (how it works).
Sign in to add this version to your library and follow its creator for free.
Sign in to get freeA creator follow is free, not a paid membership. Your email is not shared with the creator.
Files
Version 0.1.1, shown publicly by its creator, exactly as in this version's ZIP. ZIP SHA-256: af62b3f0b63b376cfd9e5dbfe5f487c95bae4deb1afff5dfcba1627dccff2021. License: MIT (read it).
Each file has its own address. Read one as a web page at https://, or as JSON at https://; replace SKILL.md with any path below.
- manifest.json · 2.5 KiB
- LICENSE.txt · 1.0 KiB
- README.md · 4.2 KiB
- SETUP.md · 3.5 KiB
- SKILL.md · 5.5 KiB
- agents/hidden-character-scanner-agent.md · 2.1 KiB
- references/findings.md · 1.8 KiB
- scripts/hidden_character_scanner.py · 13.7 KiB
- source-package.json · 2.8 KiB
- tests/test_hidden_character_scanner.py · 16.7 KiB
- tests/test_hygiene.py · 6.9 KiB
MIT
MIT LicenseCopyright (c) 2026 Zero Width Lab
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Version history
- Version 0.1.1 Current
No release notes for this version.
What it does
Hidden Character Scanner is an offline command-line Agent Skill that finds invisible Unicode, text-direction controls, tag text, unusual whitespace, and mixed-script words in local text. An agent harness is software that can install the skill and run its Python command for a user. It needs Python 3.10 or newer. File scans support macOS and Linux with POSIX directory-descriptor and no-follow APIs; Windows file scanning is unsupported. Stdin-only scan and decoding work on Windows with Python 3.10+. Supply read access to the files or standard input you select. It is free under the MIT license. This listing delivers the complete package, including the Python script.Run scan on one or more paths, a directory tree, or standard input for a prompt. Findings identify the category, severity, Unicode code point and name, file, line, and column. High severity trojan-source findings mark an unterminated bidirectional embedding or isolate on a line. The decoder reveals ASCII carried by Unicode tag characters; it never creates hidden text. Other format characters (Cf) and unusual whitespace are reported only in code files; zero-width, bidirectional, tag, and variation-selector findings apply to every text file. The emoji-base allow-list is a fixed heuristic, not full Unicode emoji data. No confusables table is shipped.
The tool skips symlinks, binary files, and common dependency and build directories. An explicit symlink path or symlinked parent marks the scan incomplete; a symlink found during directory traversal does not. Hidden entries are excluded by default, with an option to include them outside the fixed skip directories. An incomplete scan lists skipped oversized or unreadable inputs and exits with status 2 unless --allow-partial is selected. Text output escapes untrusted paths and characters; --json gives structured findings and a summary. It never changes files or contacts a service. Approval-gated means a write needs a matching user-approved preview. This read-only tool has no send, upload, delete, or file-creation action.
Who it is for
Developers, security reviewers, prompt authors, and skill-package maintainers who want an offline, read-only check of text they choose.Example tasks
Scan a source directory for hidden Unicode and report exact locations.Check a prompt supplied on standard input for bidirectional controls or tag characters.
Review a skill package for mixed-script words and unusual whitespace.
Decode ASCII carried by Unicode tag characters in supplied text.
Produce JSON findings for a local review workflow.
Getting started
SKILL.md and the scripts can be read without an account: SKILL.md at https://
From the package directory run:
python3 scripts/hidden_character_scanner.py scan ./src
python3 scripts/hidden_character_scanner.py scan - < ./prompt.txt
python3 scripts/hidden_character_scanner.py scan ./package --json
python3 scripts/hidden_character_scanner.py decode-tags - < ./prompt.txt
Provide only paths or text you intend to inspect. An explicit symlink path or symlinked parent is skipped and makes the scan incomplete, so use a resolved path when necessary. Symlinks found during directory traversal are skipped without making it incomplete. Use --max-file-bytes N to change the 1 MiB per-file limit, --include-hidden for other hidden paths, and --allow-partial only when you will review the skipped list. File scans need macOS or Linux with the declared POSIX capabilities. decode-tags stdin is UTF-8 and limited to 1 MiB (1048576 bytes); overflow or invalid UTF-8 returns status 1.
