Text Cleanup & List Tools
Deduplicate lines, trim whitespace, sort, change case and count Unicode — all locally in your browser, never uploaded.Processed locally · no backend
Operations
Remove duplicate lines
Remove duplicate lines. Case-sensitive by default, keeping the first occurrence; optional ignore-case, trim-before-compare, Unicode normalisation and drop-blank switches, plus an ordered multi-step pipeline.
Trim lines & remove blanks
Strip leading/trailing Unicode whitespace per line (incl. ideographic and non-breaking spaces); optional blank-line removal, inner-whitespace collapsing, left-only/right-only trimming. EOL style and trailing newline are preserved explainably.
Sort lines (lex / numeric / length)
Three modes: lexicographic (declared locale — en Intl.Collator by default, or deterministic codepoint order), numeric (full-line numbers, 2/10/1 → 1/2/10) and grapheme-length; ascending/descending. Result metadata names the mode and locale.
Change case
Upper / lower / title / sentence / invert case per line with Unicode-aware conversion; non-letter scripts such as Chinese are untouched, and ZWJ emoji or combining-mark sequences are never split.
Character / grapheme / word count
Local statistics: Unicode code points, graphemes (Intl.Segmenter), UTF-16 units, UTF-8 bytes, lines / blank lines, English words, CJK characters and EOL style. Chinese is never faked as space-delimited words.
Real examples and limits
Initial configuration: at most 2 MiB of UTF-8 input and 100 000 lines per run; exceeding either limit is rejected before processing with a readable reason. No full re-run on every keystroke for large text — manual Run or a 300ms debounce, cancellable at any time. Plain text only: no AI rewriting, no subtitle timecodes, no Chinese word segmentation. CRLF / LF / lone CR are parsed as LF; output keeps the input’s dominant EOL and trailing-newline state by default. Combining marks and ZWJ emoji are never silently rewritten. Downloads are UTF-8: no BOM by default (recommended), with an explicit BOM option for legacy Windows Notepad.
FAQ
Is my text uploaded?
No. All five operations are pure front-end ESM; logic.mjs never calls fetch/apiFetch. There is no account, backend or third-party runtime dependency. Even when analytics is configured, only event names and whitelisted metadata are sent — never text, filenames or full URLs.
What remains after deduplicating a / A / a?
By default comparison is case-sensitive and the first occurrence wins, so a and A remain. With "ignore case" only the first a remains. NFD e+combining-acute and NFC é are treated as equal only when Unicode normalisation is explicitly enabled.
How are 2 / 10 / 1 sorted?
Numeric mode yields 1 / 2 / 10; lexicographic (string) mode yields 1 / 10 / 2 and the result metadata names the mode and locale. Lexicographic defaults to locale=en (Intl.Collator, sensitivity=variant, numeric=false); locale=codepoint gives deterministic Unicode code-point order independent of the host runtime.
Do you report a Chinese word count?
No fake word count. The report gives Unicode code points, graphemes, UTF-16 units, UTF-8 bytes, lines, English words (Latin-letter runs), CJK character count and indicative whitespace-separated fragments — with an explicit note that Chinese is not space-segmented.
Will downloaded Chinese text be mojibake?
Download bytes are UTF-8 with MIME text/plain;charset=utf-8. No BOM by default; a leading U+FEFF on input is stripped and reported. If a legacy Windows Notepad needs a BOM, explicitly choose "include BOM" (EF BB BF). Both policies are documented in the result metadata.
Do parameter changes or clearing the result overwrite my input?
No. Parameter changes only produce a new preview; the input string is untouched. Clearing the result clears only the output pane, never the input. Reset and undo-last-parameter-change (history stack) are provided; Cancel uses AbortController with checks between steps so the textarea stays responsive.