11# Invisibles
22
3- Some text carries characters you can't see: zero-width spaces, non-breaking spaces that aren't real
4- spaces, direction controls, the odd characters that ride along in text copied out of an AI.
5- Invisibles shows you what's hiding and strips it, all in your browser.
3+ Paste text, see every hidden character in it with its name and code point, then
4+ click once to strip them. Zero-width spaces, non-breaking spaces that look like
5+ real ones, direction controls, the odd characters that ride along in text copied
6+ out of an AI.
67
78[ ![ Ko-fi] ( https://img.shields.io/badge/Ko--fi-buy_me_a_coffee-FF5E5B?style=flat-square&logo=ko-fi&logoColor=white )] ( https://ko-fi.com/jju1s )
89[ ![ License] ( https://img.shields.io/badge/license-MIT-blue?style=flat-square )] ( LICENSE )
910[ ![ Tests] ( https://img.shields.io/github/actions/workflow/status/cig13zs/invisibles/test.yml?style=flat-square&label=tests )] ( https://github.com/cig13zs/invisibles/actions )
1011
11- Web app: ** [ cig13zs.github.io/invisibles] ( https://cig13zs.github.io/invisibles/ ) ** . Or install the
12- [ browser extension] ( #browser-extension ) so it's one click from any tab, offline.
12+ Web app: ** [ cig13zs.github.io/invisibles] ( https://cig13zs.github.io/invisibles/ ) ** .
13+ Or install the [ browser extension] ( #browser-extension ) so it's one click from
14+ any tab, offline.
1315
14- Paste text, see every hidden character with its name and code point, then click once to remove them.
15- One invisible character kept a PlayStation trophy stuck for ten years. The same kind of thing breaks
16- CSV and JSON imports, stops passwords from matching, throws off code search, and hides inside text
17- pasted out of ChatGPT. Most editors never draw these characters, so you find out after something
18- breaks.
16+ One invisible character kept a PlayStation trophy stuck for ten years. The same
17+ thing breaks CSV and JSON imports, stops passwords matching, throws off code
18+ search, and hides in text pasted out of ChatGPT. Most editors never draw these
19+ characters, so you find out after something breaks.
1920
20- There are two builds and they share one engine (` core.js ` ):
21+ Almost every other tool for this is a website you paste into, which means your
22+ text goes to their server first. This one has no server. It's one HTML page and
23+ one small script, and it works offline.
2124
22- - ** Web app** , nothing to install: [ cig13zs.github.io/invisibles] ( https://cig13zs.github.io/invisibles/ )
23- - ** Browser extension** , a popup you can open from any page. Works offline, declares no permissions.
24-
25- ## It doesn't upload anything
26-
27- Almost every other "remove invisible characters" or "AI text cleaner" tool is a website you paste
28- into, so your text goes to their server first. This one has no server. It's one HTML page and one
29- small script. It works offline and it's free.
25+ There are two builds sharing one engine (` core.js ` ): the web app, and a popup
26+ extension that declares no permissions.
3027
3128## What it looks for
3229
@@ -40,16 +37,19 @@ small script. It works offline and it's free.
4037| Variation selectors | ` U+FE00 ` ..` U+FE0F ` | Invisible; can carry hidden data |
4138| Control chars | C0/C1, line and paragraph separators | Non-printing; break parsers |
4239
43- Look-alike spaces are replaced with a normal space so words don't run together. Everything else is
44- removed. There's an optional toggle that also swaps fancy punctuation (curly quotes, em dashes,
45- ellipsis) for plain ASCII, for when you're scrubbing the typographic giveaways out of AI text.
40+ Look-alike spaces get replaced with a normal space so words don't run together.
41+ Everything else is removed. There's an optional toggle that also swaps fancy
42+ punctuation (curly quotes, em dashes, ellipsis) for plain ASCII, for scrubbing
43+ typographic giveaways out of AI text.
4644
4745## Browser extension
4846
49- The extension is popup-only. Click the toolbar icon, paste, clean, copy. It declares no permissions
50- and no host access, so it can't read any page you visit. It works with no connection.
47+ Popup only. Click the toolbar icon, paste, clean, copy. It declares no
48+ permissions and no host access, so it can't read any page you visit, and it
49+ works with no connection.
5150
52- Not on the Chrome Web Store yet, so load it unpacked (Chrome, Edge, Brave, Opera):
51+ Not on the Chrome Web Store yet, so load it unpacked in Chrome, Edge, Brave or
52+ Opera:
5353
54541 . Download the latest zip from [ Releases] ( https://github.com/cig13zs/invisibles/releases ) and unzip it.
55552 . Open ` chrome://extensions ` and turn on Developer mode.
@@ -58,7 +58,8 @@ Not on the Chrome Web Store yet, so load it unpacked (Chrome, Edge, Brave, Opera
5858
5959## Use it as a library
6060
61- ` core.js ` has no dependencies and runs in the browser (` window.Invisibles ` ) or in Node (` require ` ).
61+ ` core.js ` has no dependencies and runs in the browser (` window.Invisibles ` ) or
62+ in Node (` require ` ).
6263
6364``` js
6465const I = require (' ./core.js' );
@@ -72,13 +73,13 @@ I.normalizePunctuation('“a”—b'); // '"a"--b' (opt-in)
7273
7374` scan() ` and ` clean() ` never throw, even on non-string input.
7475
75- ## How it's built
76+ ## Files
7677
7778```
78- core.js classify() + scan() + clean() + normalizePunctuation(), browser and Node
79+ core.js classify() + scan() + clean() + normalizePunctuation()
7980core.test.js node core.test.js
80- index.html the web app: paste, reveal, clean, copy . No framework, no build step
81- extension/ MV3 popup (popup.html + core.js + icons) , no permissions
81+ index.html the web app. No framework, no build step
82+ extension/ MV3 popup, no permissions
8283```
8384
8485``` bash
@@ -87,18 +88,20 @@ node core.test.js
8788
8889## Limits
8990
90- It flags characters, not intent. A non-breaking space is sometimes there on purpose, so the reveal
91- view shows you exactly what and where before you strip anything. The punctuation normalize is opt-in
92- and lossy, since em dashes become ` -- ` , and it's off by default. It can't tell you whether text was
93- written by an AI; it only shows the characters that are actually there.
91+ It flags characters, not intent. A non-breaking space is sometimes deliberate,
92+ so the reveal view shows you exactly what and where before you strip anything.
9493
95- ## More tools
94+ The punctuation normalize is opt-in and lossy, since em dashes become ` -- ` . It's
95+ off by default.
9696
97- - ** [ Carryover ] ( https://github.com/cig13zs/carryover ) ** — AI chat context transfer for ChatGPT, DeepSeek & Grok
98- - ** [ Rinse ] ( https://github.com/cig13zs/rinse ) ** — see the GPS in a photo, then wash it off
99- - ** [ Return Google Cache ] ( https://github.com/cig13zs/return-google-cache ) ** — put the Cached link back on Google results
100- - ** [ Return 100 Results ] ( https://github.com/cig13zs/return-100-results ) ** — browse ~ 100 Google results as one page
97+ It can't tell you whether text was written by an AI. It only shows the
98+ characters that are actually there.
99+
100+ ## More tools
101101
102- All free, all offline, all open source. [ More →] ( https://github.com/cig13zs/About-Me )
102+ - [ Carryover] ( https://github.com/cig13zs/carryover ) , AI chat context transfer for ChatGPT, DeepSeek and Grok
103+ - [ Rinse] ( https://github.com/cig13zs/rinse ) , see the GPS in a photo and wash it off
104+ - [ Return Google Cache] ( https://github.com/cig13zs/return-google-cache ) , put the Cached link back on Google results
105+ - [ Return 100 Results] ( https://github.com/cig13zs/return-100-results ) , browse ~ 100 Google results as one page
103106
104- MIT licensed. Do what you like with it .
107+ MIT licensed. [ Ko-fi ] ( https://ko-fi.com/jju1s ) if it saved you a headache .
0 commit comments