Text Diff Checker
Compare two texts side by side. Highlight character, word, or line changes and download a private diff.
This tool runs entirely in your browser. Your data is never uploaded, never stored, and never leaves your device.
Compares two texts in a line-numbered side-by-side view or an inline view, with character, word and line highlighting plus change counts and navigation.
How to use it
- 1Paste each version or load two local text files; the result updates without a Compare button.
- 2Choose character, word or line detail, and ignore case, whitespace or CRLF-versus-LF noise when those differences do not matter.
- 3Review the side-by-side rows, jump between change groups, then copy or download the plain-text diff if you need to keep it.
Example
- Input
- Original: "The quick brown fox jumps over the lazy dog." · Changed: "The quick red fox leaps over the lazy dog."
- Output
- One modified line; the inline Word view marks "brown" and "jumps" red and "red" and "leaps" green.
Character detail can isolate the missing u in colour versus color, while word detail is easier to scan in prose and line detail matches code-review language. A moved paragraph is still reported once as removed and once as added because a two-way diff cannot know that it was moved. Character comparisons above 50,000 combined characters and word comparisons above 100,000 fall back to responsive line detail with a visible notice.
What happens to your data
This tool runs entirely in your browser. Your input is never uploaded to a server, never stored, and never logged. The comparison is done by the diff library bundled into the page, so both versions stay in the tab and a reload empties them — which is the difference that matters when you are checking a contract draft against the counterparty's redline, or a config file that still has credentials in it.
Last updated September 2026
You reach for a diff when two things that ought to be identical are not, and reading them in parallel has stopped working. A contract comes back with no track changes. One config file works and its twin does not. Someone sends over "the updated version" and will not say what changed. A text comparison finds the altered number, dropped word or rewritten line before your eyes skip over it.
Use this online text compare to paste two versions or compare two files without uploading them. It shows each difference between two texts, so you can highlight differences between two texts side by side or in one unified reading flow.
The side-by-side result aligns the texts, numbers each line, counts modified, added and removed lines, and lets you jump from one change group to the next. Switch to the unified view when you want the old and new wording marked in a single reading flow.
Character detail isolates a changed letter or punctuation mark. Word detail is usually clearest for prose. Line detail matches the way source control describes code, configuration and logs. These controls change the highlight granularity without changing either input.
The ignore controls are there for noise, not correctness. Letter case can matter in code and defined contract terms; indentation can matter in YAML and Python. Leave those differences visible when they carry meaning. Ignore case or whitespace for ordinary prose, and ignore CRLF-versus-LF endings when the files came from different operating systems.
Copy the result or download a .diff text file when you need a record. This is still a two-way comparison rather than a merge editor: it does not accept changes, identify moved blocks, keep history or put private text into a shareable URL.
Everything runs in the page. Loaded files are read by the browser, comparison happens locally, and neither the text nor the file names are sent to a server or written to browser storage. Reloading empties both sides. Each local file is capped at 5 MB so an accidental giant log cannot lock the tab.
How it works
Toolvore creates two related results from the same inputs. The side-by-side view tokenises both texts into lines, aligns unchanged runs, pairs similar replacement lines, and labels each remaining row as modified, added or removed. Consecutive changed rows form one change group, which is what the Previous and Next buttons navigate. The figures above the result are line counts, not word counts.
The unified view uses jsdiff's Myers comparison. Character detail calls diffChars, word detail uses word tokens, and line detail uses diffLines. Clicking a detail button opens this unified view so the selected granularity is immediately visible. Character detail falls back to lines above 50,000 combined characters and word detail above 100,000; a notice explains the fallback.
Ignore case uses the same invariant case fold in both views. Ignore whitespace trims each line and collapses internal spaces and tabs before comparison. Ignore CRLF versus LF normalises Windows, old-Mac and Unix line separators to LF. Those controls affect the displayed verdict, but the copied or downloaded patch deliberately preserves the exact original text, including a difference hidden by an Ignore option.
The .diff export is a valid unified patch with file headers and hunk ranges. It normally keeps three unchanged context lines around each change, keeping distant unchanged text out of the clipboard; an exceptionally dense change falls back to a valid full-file replacement hunk rather than disabling export. If the inputs are local files, their names become the two safe patch labels.
Comparison cost depends on how different the texts are, so every diff has an edit-distance and execution-time guard. A pathological pair stops with an honest message instead of locking the page. The side-by-side DOM renders at most 5,000 aligned rows around the selected change, while counts and export still use the complete successful comparison. Inputs above 50,000 lines per side or 10 million characters combined are refused before diffing.
Neither view detects moved blocks: a paragraph moved elsewhere is one removal and one addition. Nor does this parse document structure or formatting. A .docx, PDF or rich-text file must first be converted or copied to plain text; the local file picker accepts text-based formats only.
No comparison calls a server. Pasted text, loaded file contents and file names live only in component memory, analytics receives only the chosen mode and aggregate change counts, and a reload clears both inputs.
Common use cases
- Checking a contract that came back from the other side with no track changes on it
- Finding the one line that differs between a config file that works and one that does not
- Confirming a copy-edit changed only what it was meant to, before the text goes to print
- Comparing two API responses to see which field actually changed
- Checking that a find-and-replace across a document hit only what it was supposed to hit
- Seeing what a colleague altered in "the updated version" when no change note came with it
- Checking a student's rewrite against the draft it was written from
- Comparing two translations of the same paragraph to find where the wording diverged
- Working out which value differs between a staging environment file and the production one
- Checking a terms or privacy page against the copy you saved before it was updated
- Comparing log excerpts from a run that worked and a run that did not
- Confirming a licence or policy text was pasted in unaltered
- Comparing two exports of the same spreadsheet column to find the rows that stopped matching
- Checking that a proofreader's returned text kept every figure, date and name intact
- Comparing an email draft with the version that actually went out
- Seeing what an AI rewrite changed in a paragraph you wrote yourself
- Checking a CV tailored for one application against the version sent for another
- Reading what changed between two versions of a Dockerfile, package.json or CI config
Frequently asked questions
How do I compare text and highlight differences?+
Paste or load the starting version under Original and the other under Changed. The line-numbered side-by-side result appears automatically and counts modified, added and removed lines. Choose Character, Word or Line to open an inline highlight at that detail, or use Previous and Next to move through the side-by-side change groups.
Can I upload two files, or does the text have to be pasted?+
Either works for plain-text files. Use Load original file and Load changed file for text, Markdown, CSV, JSON, XML, source code, configuration or log files up to 5 MB each, or paste directly into the boxes. The browser reads the file locally. Rich formats such as .docx and PDF are not text files, so extract or copy their text first.
What do red and green marks mean in a difference highlighter?+
Red belongs to Original and means removed or replaced; green belongs to Changed and means added or replacement text. The side-by-side view colours the affected line, while Unified marks the exact character, word or line. The colours show direction rather than right and wrong, so swapping the two inputs swaps red and green.
Does it show the two versions side by side?+
Yes. Side by side is the default result: both versions share one scroll area, carry their own line numbers, and keep corresponding rows aligned. Modified lines sit opposite each other; a missing side is blank for a pure addition or removal. Unified remains available when a single inline reading flow is easier.
Is Word-level or Line-level more accurate?+
Neither is more correct; they show the same edit at different detail. Character isolates a letter or punctuation mark, Word is easiest to scan in prose, and Line matches code reviews, configuration and logs. Side-by-side counts are always line-based, while those three controls set the Unified highlight detail.
Which mode should I use for source code or a configuration file?+
Start with Side by side and Line detail because the numbered rows match the language of a pull request. Keep whitespace visible for YAML, Python and makefiles. If a modified line is not obvious, choose Character or Word to open Unified and isolate the identifier, number or punctuation that changed.
Which mode is better for an essay, a contract or an email?+
Word detail is usually clearest because it points to an altered figure, name or clause without treating wrapping as the edit. Character detail is useful for punctuation and spelling. Ignore whitespace or case only when those differences genuinely do not matter; capitalisation can change the meaning of a defined contract term.
Why is it flagging text that looks identical to me?+
Look for a straight versus curly quote, hyphen versus dash, non-breaking space, extra indentation or different line ending. Toggle whitespace, letter case or CRLF-versus-LF to test whether the difference is only formatting noise. Character detail is the best way to expose a remaining invisible or one-character edit.
Why does every line look changed when I edited only one?+
The files may use different line separators. Windows commonly writes CRLF while macOS and Linux use LF; old Mac text can use CR. CRLF versus LF is ignored by default here, so turn that control off only if the byte-level line ending itself is what you need to audit.
Why is a whole word marked when only one letter changed?+
Word detail deliberately treats a word as the useful unit. Choose Character and the Unified view will isolate the exact letter — for example, colour versus color marks only the u. Side by side continues to colour the containing line because its job is alignment and navigation.
Does it show text that was moved rather than rewritten?+
No, and this is the limitation most likely to catch you out. Neither mode has any notion of a move. Take a paragraph from the middle of a document and put it at the top and it appears green where it now sits and red where it used to, the same text coloured twice, with nothing to say they are the same text. On a reordered config file that makes a small edit look enormous. If you only need to know whether anything was lost in the reshuffle, sort both versions the same way before pasting.
What happens if the two texts turn out to be the same?+
The status says the texts match with the selected options, the side-by-side rows remain plain, and the change buttons disable. Remember that a match can be conditional: if Ignore case or Ignore whitespace is on, the exact source may still differ. The downloaded patch preserves those exact differences.
What if I leave one of the boxes empty?+
Every line on the populated side is marked because, compared with nothing, it is all added or all removed. The side-by-side view leaves the other column blank; Unified colours the text in one direction. This is valid, but a result entirely in one colour often means the second paste or file selection did not happen.
How much text can it compare at once?+
Each loaded file can be up to 5 MB, each side can contain up to 50,000 lines, and the pair can contain up to 10 million characters. Character detail falls back to Line above 50,000 combined characters and Word above 100,000. A heavily different pair can be harder than a longer similar pair, so the comparison also stops safely if its time or edit-distance guard is reached and asks for smaller sections.
Is there a limit on the number of lines?+
Each side is capped at 50,000 physical lines. The side-by-side result gives both versions their original line numbers and Previous and Next buttons jump through adjacent change groups. To protect the page from tens of thousands of DOM rows, it displays a 5,000-row window around the selected change while counts and a successful export still cover the whole comparison.
Is my text sent anywhere?+
No. The comparison happens in the page: the diff library is part of the JavaScript already downloaded, the component makes no network request of any kind, and there is no server route behind it. Nothing is kept either — both boxes are ordinary component state, so closing the tab is the whole of the cleanup. That matters more here than on most text tools, because a diff is by definition two copies of something important enough to have a before and an after: a settlement letter against the version your solicitor returned, or two exports of a customer list.
Does it keep a history of what I have compared?+
It does not. Both boxes are ordinary page state and nothing is written to your browser storage, so a reload returns two empty boxes rather than your last comparison. There is no list of recent runs, no account to attach one to, and no way to reopen something from yesterday. If a comparison matters, keep the two versions themselves — they are the thing worth saving, and the result takes seconds to produce again.
Can I send someone a link to a comparison?+
No. Nothing you paste is put into the address bar, so this page URL is the same one everybody else has and sending it hands over the empty tool rather than your text. That is a deliberate trade: text placed in a URL travels into browser history, into whatever chat window the link is pasted into, and into the logs of every server in between. To show a colleague what changed, send the two versions and let them paste.
Can I copy or download the marked-up result?+
Yes. Copy diff puts a valid unified patch on the clipboard and Download .diff saves the same kind of patch. It includes file headers, hunk ranges and normally three context lines, so distant unchanged text is left out. The export records exact text even when an Ignore control hides a difference in the visual result.
Will it work on a .docx from Word or Google Docs?+
Its plain text will, once you copy and paste it, but .docx is a ZIP-based document format and is not accepted by the text-file picker. Formatting-only changes — comments, font, highlighting, heading style or table borders — have no plain-text difference and cannot appear. Export each document to .txt first if you want to use file loading.
What about two PDFs?+
Same route, with one thing to check first. Copy the text out of each and paste it in; the comparison then behaves normally. A PDF produced by a scanner or a phone camera holds a picture of a page and no text at all, so there is nothing to select — that needs character recognition first. And text copied from a PDF arrives with the line breaks the layout happened to have rather than the ones the sentences want, so use Word-level, which does not care where lines fall.
Can I compare two columns from a spreadsheet?+
Yes, and it is one of the quicker uses for this. Copy one column into Original, the other into Changed, and choose Line-level: a spreadsheet copies one cell per line, so each row becomes a line and the two sides align naturally. You get which entries differ, in order. What you do not get is any awareness of a row that simply moved, so sort both columns the same way first — otherwise a reordered list comes back looking as though every row changed.
Is there a way to treat capitals and lower case as the same?+
Yes. Tick Letter case under Ignore and "The Client" matches "the client" in both views. Leave it off for code, environment variables and defined contract terms, where capitalisation can change meaning. The downloaded patch remains exact and therefore still records the case change.
Can it ignore extra spaces and indentation?+
Yes. Ignore Whitespace trims horizontal spaces and tabs, collapses runs, and drops whitespace-only lines before comparing. It does not silently decide that a missing final newline is the same thing; line-ending type has its own control. Keep whitespace visible for YAML, Python, makefiles and any format where indentation carries meaning.
Can I compare three or more versions at once?+
No — two boxes is the whole tool. A three-way comparison is a different job, the one a version-control system does when it reconciles two sets of edits against a common ancestor, and it needs a different interface to display. The practical approach here is pairs: original against first revision, then first revision against second. Two passes tell you what changed at each step, which is usually the question underneath anyway.
How is this different from track changes in a word processor?+
Track changes records edits as they are made, so it knows who typed what and when, and each mark can be accepted or rejected individually. This works the other way round: it is handed two finished texts and works out what must have happened between them. That is exactly what you need when track changes was never switched on, or when the copy you were sent had every mark accepted before it reached you. The trade is that it shows a difference but cannot apply or undo one.
How is this different from a git diff?+
A git diff compares committed versions of files inside a repository, reports in whole lines, and carries the context a repository holds: who changed it, when, against which commit. This has no repository and no memory. It compares two blocks of text you paste, which is the point — the two things you want to check are often not in version control at all, or sit on different machines, or are an email and a document. Line-level gives the same granularity without either version being committed anywhere.
Does it work on a phone?+
Yes. The inputs stack on a narrow screen. The line-numbered result keeps its two-column alignment and scrolls horizontally inside its own panel, while Unified is easier for reading prose on a phone. Nothing is stored, so load both local text files or keep both versions ready before navigating away from the page.
Will it still work with no internet connection?+
Once you have opened the page while connected, yes. The site stores this page and the files it depends on, so reopening it with the network off gives a working tool rather than an error. That turns the claim about local processing into something you can test rather than something you have to believe: a tool still comparing text with the connection pulled cannot be sending it anywhere. Only the first visit needs a connection.
Is it free, and is there an account?+
It is free with no account or sign-in. Character, word and line detail, both result views, file loading, ignore controls, navigation, copy and download are all available on the page. Device-safety limits are shown plainly: 5 MB per loaded file, 50,000 lines per side and 10 million characters combined.
Does it work on text that is not in English?+
Yes, on anything your browser can display. Accented letters are treated as part of the words they belong to, so "café" against "cafe" marks that word. Scripts written without spaces between words behave differently but well: a Chinese sentence is compared character by character, so altering one two-character word marks those two characters and leaves the rest plain, which is tighter than word granularity would manage. Japanese behaves the same way. Thai does not: it has no spaces either, but the comparison cuts inside words rather than between them, so a changed word comes back as two fragments and a stray letter.
Should I format two JSON documents before comparing them?+
Yes, and format both the same way. This compares text and knows nothing about structure, so a minified document against a pretty-printed one is reported as one enormous change even when every value matches. Run both through a JSON formatter first, then compare at Line-level, since each key then sits on its own line. One thing survives the tidying: reordering keys changes nothing about the data and everything about the text, so a reordered document is still marked as changed throughout.
Can I use this to check for plagiarism?+
Not in the sense the word usually means. It compares two texts you supply and nothing else — it does not search the web, has no library of documents behind it, and cannot tell you where a passage came from. What it can settle is a suspicion you already have: paste the passage in question and the source you think it came from, and the uncoloured stretches are the parts that match word for word. That answers how much is the same, not where it came from.
Why did swapping the two boxes change the colours?+
Because Original is the starting point and Changed is measured against it. Swap sides trades every removal for an addition and therefore every red direction for green. The set of edits is the same, but its direction is reversed. Use the Swap sides button if the versions went into the wrong boxes.
Related tools
Compare Two Lists
Find shared and unique list items with explicit matching options and local text downloads.
Find & Replace
Replace every match at once, with case-sensitive, whole-word or regex options and a count of replacements.
Whitespace Cleaner
Remove line breaks, extra spaces, and tabs from text.
Text Sorter & Deduplicator
Sort lines alphabetically or numerically and remove duplicates.