-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
283 lines (268 loc) · 24.6 KB
/
Copy pathindex.html
File metadata and controls
283 lines (268 loc) · 24.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Diffhero — Free Online Diff Checker for Text & Code</title>
<meta name="description" content="A free diff checker for text and code. See what changed between two versions, with the exact words highlighted. No signup, nothing uploaded.">
<link rel="canonical" href="https://diffhero.app/">
<meta property="og:title" content="Diffhero — Free Online Diff Checker for Text & Code">
<meta property="og:description" content="A free diff checker for text and code. See what changed between two versions, with the exact words highlighted. No signup, nothing uploaded.">
<meta property="og:type" content="website">
<meta property="og:url" content="https://diffhero.app/">
<meta property="og:image" content="https://diffhero.app/assets/og-image.png">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:image" content="https://diffhero.app/assets/og-image.png">
<link rel="icon" type="image/svg+xml" href="./assets/favicon.svg">
<meta name="theme-color" content="#0a0d12">
<meta name="msvalidate.01" content="5A4EFD6B7BD09C4C115B7ACCF3688E1C">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500;600;700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="./assets/style.css?v=f12ce522">
<script async src="https://www.googletagmanager.com/gtag/js?id=G-Q907KGWEP4"></script>
<script>window.dataLayer=window.dataLayer||[];function gtag(){dataLayer.push(arguments)}
gtag('js',new Date());gtag('config','G-Q907KGWEP4');</script>
<script type="application/ld+json">{"@context":"https://schema.org","@type":"WebApplication","name":"Diffhero","url":"https://diffhero.app/","description":"A free diff checker for text and code. See what changed between two versions, with the exact words highlighted. No signup, nothing uploaded.","applicationCategory":"UtilitiesApplication","operatingSystem":"Any (web browser)","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"author":{"@type":"Person","name":"Bruno FK","url":"https://brunofk.dev"},"datePublished":"2026-07-18","dateModified":"2026-07-18"}</script>
<script type="application/ld+json">{"@context":"https://schema.org","@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"name":"Diffhero","item":"https://diffhero.app/"}]}</script>
<script type="application/ld+json">{"@context":"https://schema.org","@type":"Organization","@id":"https://diffhero.app/#organization","name":"Diffhero","url":"https://diffhero.app/","logo":"https://diffhero.app/assets/og-image.png","description":"A free diff checker for text and code. See what changed between two versions, with the exact words highlighted. No signup, nothing uploaded.","founder":{"@type":"Person","name":"Bruno FK","url":"https://brunofk.dev"}}</script>
<script type="application/ld+json">{"@context":"https://schema.org","@type":"WebSite","@id":"https://diffhero.app/#website","name":"Diffhero","url":"https://diffhero.app/","description":"A free diff checker for text and code. See what changed between two versions, with the exact words highlighted. No signup, nothing uploaded.","publisher":{"@id":"https://diffhero.app/#organization"},"inLanguage":"en"}</script>
<script type="application/ld+json">{"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"Is Diffhero free, and is there a usage limit?","acceptedAnswer":{"@type":"Answer","text":"It is free with no usage limit, no account and no paid tier. There is nothing metered — syntax highlighting, character-level diffing, 3-way merge and image comparison are all available on every visit."}},{"@type":"Question","name":"Is my text or code uploaded to a server?","acceptedAnswer":{"@type":"Answer","text":"No. The entire comparison runs in your browser using JavaScript, so nothing you paste is transmitted anywhere. You can confirm this yourself by opening your browser's dev tools and watching the Network tab while you diff."}},{"@type":"Question","name":"What can Diffhero compare?","acceptedAnswer":{"@type":"Answer","text":"Plain text and prose, source code in any language, JSON, CSV and tabular data, YAML and XML, config files, PDFs and Word documents (the text is extracted locally), and images pixel-by-pixel."}},{"@type":"Question","name":"How does it decide what changed?","acceptedAnswer":{"@type":"Answer","text":"It aligns the two inputs with a longest-common-subsequence match over lines, then runs a second word-level pass inside each changed line. That is why you see the precise words that differ rather than just \"this whole line is different\"."}},{"@type":"Question","name":"Can I compare two files rather than pasting text?","acceptedAnswer":{"@type":"Answer","text":"Yes — drag a file onto either pane. The file is read locally in your browser and never uploaded, which means you can compare files you would not be allowed to upload to a website at all."}},{"@type":"Question","name":"How is this different from Diffchecker?","acceptedAnswer":{"@type":"Answer","text":"The main practical difference is metering: Diffchecker's free tier limits syntax highlighting to a handful of uses per month and reserves several formats for paid tiers. Diffhero has no tiers, so nothing is held back."}}]}</script>
<script data-grow-initializer="">
!(function(){window.growMe||((window.growMe=function(e){window.growMe._.push(e);}),(window.growMe._=[]));var e=document.createElement("script");(e.type="text/javascript"),(e.src="https://faves.grow.me/main.js"),(e.defer=!0),e.setAttribute("data-grow-faves-site-id","U2l0ZTpiZTY1ZGY2My0zODg3LTQwOTEtYjliMi0zNTgzODU3ZWIxZTY=");var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t);})();
</script>
</head>
<body>
<a class="skip-link" href="#main">Skip to content</a>
<header class="topbar">
<a class="logo" href="/">
<svg class="logo-mark" width="20" height="20" viewBox="0 0 22 22" fill="none" aria-hidden="true"><rect x="2" y="3" width="7" height="16" fill="currentColor"/><rect x="13" y="7" width="7" height="12" fill="currentColor" opacity="0.45"/></svg>
Diffhero
</a>
<nav class="topnav" aria-label="Main">
<a href="/">Tools</a>
<a href="/guides">Guides</a>
<a href="/diffchecker-alternative">Compare</a>
<a href="/about">About</a>
</nav>
<div class="topbar-end">
<span class="topbar-note">no upload · no account</span>
<button type="button" class="theme-toggle" id="themeToggle" aria-label="Toggle light/dark">
<svg class="icon-sun" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" aria-hidden="true"><circle cx="12" cy="12" r="4"/><path d="M12 2v2.5M12 19.5V22M4.2 4.2l1.8 1.8M18 18l1.8 1.8M2 12h2.5M19.5 12H22M4.2 19.8 6 18M18 6l1.8-1.8"/></svg>
<svg class="icon-moon" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20.2 14.6A8.5 8.5 0 1 1 9.4 3.8a7 7 0 0 0 10.8 10.8Z"/></svg>
</button>
</div>
</header>
<div class="shell shell--app">
<nav class="rail" aria-label="All diff tools">
<div class="rail-in">
<p class="rail-title"><a href="/">30 diff tools</a></p>
<section class="rail-group">
<p class="rail-head" id="rail-general">General</p>
<ul class="rail-list is-here" aria-labelledby="rail-general">
<li><a href="/diff/text-compare">Text Compare</a></li>
<li><a href="/diff/compare-two-text-files">Compare Two Files</a></li>
<li><a href="/diff/online-diff-checker">Diff Checker</a></li>
<li><a href="/diff/code-diff">Code Diff</a></li>
<li><a href="/diff/compare-two-lists">Compare Lists</a></li>
<li><a href="/diff/private-diff-checker">Private Diff Checker</a></li>
</ul>
</section>
<section class="rail-group">
<p class="rail-head" id="rail-merge-patch">Merge & patch</p>
<ul class="rail-list is-here" aria-labelledby="rail-merge-patch">
<li><a href="/diff/merge-conflict-resolver">Merge Conflict Resolver</a></li>
<li><a href="/diff/git-diff-viewer">Git Diff Viewer</a></li>
</ul>
</section>
<section class="rail-group">
<p class="rail-head" id="rail-data">Data</p>
<ul class="rail-list is-here" aria-labelledby="rail-data">
<li><a href="/diff/json-diff">JSON Diff</a></li>
<li><a href="/diff/csv-diff">CSV Diff</a></li>
<li><a href="/diff/csv-table-diff">CSV Table Diff</a></li>
<li><a href="/diff/xml-diff">XML Diff</a></li>
<li><a href="/diff/yaml-diff">YAML Diff</a></li>
<li><a href="/diff/sql-diff">SQL Diff</a></li>
</ul>
</section>
<section class="rail-group">
<p class="rail-head" id="rail-markup-styles">Markup & styles</p>
<ul class="rail-list is-here" aria-labelledby="rail-markup-styles">
<li><a href="/diff/markdown-diff">Markdown Diff</a></li>
<li><a href="/diff/html-diff">HTML Diff</a></li>
<li><a href="/diff/css-diff">CSS Diff</a></li>
</ul>
</section>
<section class="rail-group">
<p class="rail-head" id="rail-config-devops">Config & DevOps</p>
<ul class="rail-list is-here" aria-labelledby="rail-config-devops">
<li><a href="/diff/config-diff">Config Diff</a></li>
<li><a href="/diff/env-diff">ENV Diff</a></li>
<li><a href="/diff/package-json-diff">package.json Diff</a></li>
<li><a href="/diff/log-diff">Log Diff</a></li>
</ul>
</section>
<section class="rail-group">
<p class="rail-head" id="rail-documents">Documents</p>
<ul class="rail-list is-here" aria-labelledby="rail-documents">
<li><a href="/diff/contract-diff">Contract Diff</a></li>
<li><a href="/diff/resume-diff">Resume Diff</a></li>
<li><a href="/diff/essay-diff">Essay Diff</a></li>
<li><a href="/diff/pdf-diff">PDF Diff</a></li>
<li><a href="/diff/word-diff">Word Diff</a></li>
<li><a href="/diff/subtitle-diff">Subtitle Diff</a></li>
</ul>
</section>
<section class="rail-group">
<p class="rail-head" id="rail-ai-prompts">AI & prompts</p>
<ul class="rail-list is-here" aria-labelledby="rail-ai-prompts">
<li><a href="/diff/prompt-diff">Prompt Diff</a></li>
</ul>
</section>
<section class="rail-group">
<p class="rail-head" id="rail-inspect">Inspect</p>
<ul class="rail-list is-here" aria-labelledby="rail-inspect">
<li><a href="/diff/image-diff">Image Diff</a></li>
<li><a href="/diff/invisible-character-checker">Invisible Characters</a></li>
</ul>
</section>
</div>
</nav>
<main class="content" id="main">
<div class="toolhead toolhead--home">
<div class="toolhead-id">
<p class="crumb"><span>Diff checker</span></p>
<h1>Diffhero</h1>
</div>
<p class="toolhead-lede">A diff checker that doesn't hold anything back: syntax highlighting across ~17 languages, character-level detail, split and unified views, 3-way merge, image and CSV comparison — all free, all unlimited, all running on your own machine.</p>
<ul class="toolhead-spec">
<li><span class="dot" aria-hidden="true"></span>Client-side</li>
<li>Nothing uploaded</li>
<li>~17 languages</li>
<li>No account</li>
</ul>
<p class="toolhead-claim">Most free diff tools do plain line comparison and stop. The big paid one meters syntax highlighting at five uses a month. <a href="/diffchecker-alternative">See the comparison →</a></p>
<p class="toolhead-claim toolhead-more">Also: <a href="/diff/image-diff">image diff</a>, <a href="/diff/merge-conflict-resolver">3-way merge</a>, <a href="/diff/csv-diff">CSV compare →</a></p>
</div>
<section class="tool difftool" data-format="text" data-lang="plain" data-slug="">
<div class="diff-inputs">
<div class="diff-pane" data-side="a">
<div class="diff-pane-head">
<label class="diff-label" for="original">Original</label>
<span class="diff-drop-hint">paste, type, or drop a file (.txt, .pdf, .docx)</span>
</div>
<textarea id="original" class="editor code" placeholder="Paste the original version here…" spellcheck="false" autocapitalize="off" autocomplete="off" autocorrect="off"></textarea>
</div>
<div class="diff-pane" data-side="b">
<div class="diff-pane-head">
<label class="diff-label" for="changed">Changed</label>
<span class="diff-drop-hint">paste, type, or drop a file (.txt, .pdf, .docx)</span>
</div>
<textarea id="changed" class="editor code" placeholder="Paste the changed version here…" spellcheck="false" autocapitalize="off" autocomplete="off" autocorrect="off"></textarea>
</div>
</div>
<div class="tool-bar">
<div class="view-toggle" role="group" aria-label="Diff view">
<button type="button" class="seg is-active" id="viewSplit" data-view="split" aria-pressed="true">Split</button>
<button type="button" class="seg" id="viewUnified" data-view="unified" aria-pressed="false">Unified</button>
</div>
<label class="opt lang-opt"><span class="sr-only">Syntax language</span><select id="langSel" class="lang-sel" aria-label="Syntax highlighting language"><option value="plain" selected>Plain text</option><option value="clike">Code (C-like)</option><option value="javascript">JavaScript / TS</option><option value="python">Python</option><option value="json">JSON</option><option value="html">HTML / XML</option><option value="xml">XML</option><option value="css">CSS</option><option value="sql">SQL</option><option value="yaml">YAML</option><option value="go">Go</option><option value="java">Java</option><option value="php">PHP</option><option value="csharp">C#</option><option value="rust">Rust</option><option value="kotlin">Kotlin</option><option value="swift">Swift</option></select></label>
<label class="opt"><input type="checkbox" id="optWhitespace"> Ignore whitespace</label>
<label class="opt"><input type="checkbox" id="optCase"> Ignore case</label>
<label class="opt"><input type="checkbox" id="optChar" title="Mark the exact changed characters inside a changed word, not just the word"> Character detail</label>
<label class="opt"><input type="checkbox" id="optInv" title="Render invisible characters (non-breaking spaces, zero-width characters, tabs) as visible symbols"> Show invisibles</label>
<label class="opt"><input type="checkbox" id="optCollapse" checked> Collapse unchanged</label>
<label class="opt"><input type="checkbox" id="optWrap" checked> Wrap</label>
<div class="change-nav" id="changeNav" hidden>
<button type="button" class="btn-icon" id="prevChange" aria-label="Previous change" title="Previous change (Alt+↑)">↑</button>
<button type="button" class="btn-icon" id="nextChange" aria-label="Next change" title="Next change (Alt+↓)">↓</button>
<span class="change-count" id="changeCount" aria-live="polite"></span>
</div>
<span class="diff-summary" id="diffSummary" role="status" aria-live="polite"></span>
</div>
<div class="tool-actions">
<button type="button" class="btn primary" id="swapBtn">Swap sides</button>
<button type="button" class="btn" id="exampleBtn">Load example</button>
<button type="button" class="btn" id="shareBtn">Copy share link</button>
<button type="button" class="btn" id="copyBtn">Copy result</button>
<button type="button" class="btn" id="downloadBtn">Download .diff</button>
<button type="button" class="btn" id="printBtn" title="Prints only the diff result — use your browser's 'Save as PDF' destination for a PDF report">Print / PDF</button>
<button type="button" class="btn" id="clearBtn">Clear</button>
</div>
<details class="fr">
<summary>Find & replace</summary>
<div class="fr-row">
<input type="text" id="frFind" placeholder="Find (exact text)" autocomplete="off">
<input type="text" id="frRepl" placeholder="Replace with" autocomplete="off">
<button type="button" class="btn" id="frA">Original</button>
<button type="button" class="btn" id="frB">Changed</button>
<button type="button" class="btn" id="frBoth">Both</button>
</div>
</details>
<div class="diff-output" id="diffOutput" aria-live="polite"></div>
</section>
<div class="ad-slot ad-slot--placeholder" aria-hidden="true"><!-- ad slot reserved; height is held so the layout never shifts --></div>
<div class="below">
<div class="below-read">
<section class="howto">
<h2>How to compare two files with Diffhero</h2>
<div class="howto-grid">
<div class="howto-step"><p>Paste or type the original version into the left box (or drag a file onto it).</p></div>
<div class="howto-step"><p>Paste the changed version into the right box.</p></div>
<div class="howto-step"><p>See the result instantly: additions in green, deletions in red, and the exact changed words highlighted inline.</p></div>
<div class="howto-step"><p>Switch between Split and Unified view, jump between changes with the arrows, or download a .diff.</p></div>
</div>
</section>
<section class="guide">
<h2>What a diff checker is for</h2>
<p>A diff (short for "difference") checker takes two versions of the same text and works out the smallest set of changes that turns one into the other — then shows you those changes instead of making you hunt for them line by line. It's the engine behind the <code>diff</code> command, the review view on GitHub, and the "compare versions" feature in a word processor, distilled to a single page with nothing to install.</p>
<p>You reach for one whenever you have a "before" and an "after" and need to know exactly what moved: two drafts of a document, a config file before and after an edit, a code snippet you're refactoring, two exports that are supposed to match, or a contract that came back from the other side with "just a couple of tweaks." Diffhero highlights not only which <em>lines</em> differ but the exact <em>words</em> inside a changed line, so a one-character fix doesn't light up the whole row.</p>
<h2>Text, code, data and documents</h2>
<p>Because the comparison works on text, it's language- and format-agnostic. Diffhero has dedicated pages tuned to the formats people compare most — each with guidance on that format's particular pitfalls:</p>
<ul>
<li><strong>Code</strong> in any language, with syntax highlighting and whitespace handling that respects indentation-sensitive languages like Python and YAML.</li>
<li><strong>Structured data</strong> — <a href="/diff/json-diff">JSON</a>, <a href="/diff/csv-diff">CSV</a>, <a href="/diff/xml-diff">XML</a>, <a href="/diff/yaml-diff">YAML</a> — where key order and formatting can hide the real change.</li>
<li><strong>Config and DevOps</strong> files — <a href="/diff/config-diff">Dockerfiles, Terraform and nginx</a>, <a href="/diff/env-diff">.env</a> — where a one-line change has outsized effects.</li>
<li><strong>Documents</strong> — <a href="/diff/pdf-diff">PDF</a>, <a href="/diff/word-diff">Word</a>, <a href="/diff/contract-diff">contracts</a> and <a href="/diff/resume-diff">résumés</a> — with text extracted from the file in your browser.</li>
</ul>
<h2>Why "nothing uploaded" matters</h2>
<p>Most online diff tools send your text to a server to compute the comparison. Diffhero doesn't: the whole diff runs in your browser with JavaScript, so whatever you paste — proprietary code, a draft agreement, a config file full of secrets, personal data — never leaves your device. You can confirm it yourself in your browser's Network tab, and the tool keeps working offline once it has loaded. That makes it safe for exactly the material you shouldn't paste into a typical web tool.</p>
</section>
</div>
<div class="below-margin">
<section class="feature-list" aria-label="Features">
<h2>What you get</h2>
<div class="feature-row feature-row--add"><h3>Word-level highlighting</h3><p>Not just which lines changed — the exact words inside a changed line are marked, so you see the real edit at a glance.</p></div>
<div class="feature-row feature-row--del"><h3>Split & unified views</h3><p>Compare side by side with line numbers, or switch to a single unified column. Your choice is remembered.</p></div>
<div class="feature-row feature-row--add"><h3>Nothing is uploaded</h3><p>Every comparison runs in your browser. Your text and code never touch a server, so it's safe for private files and works offline.</p></div>
<div class="feature-row feature-row--del"><h3>Free, no signup, no limits</h3><p>No account, no daily cap, no paywall. Open the page and compare — every feature is free, immediately.</p></div>
<div class="feature-row feature-row--add"><h3>Formatting-aware JSON</h3><p>On the JSON page, both sides are normalised first, so a minified and a pretty-printed file with the same data read as identical.</p></div>
<div class="feature-row feature-row--del"><h3>Share & export</h3><p>Copy a link that reopens the same comparison, or download a standard unified <code>.diff</code> patch.</p></div>
</section>
</div>
</div>
<script type="application/ld+json">{"@context":"https://schema.org","@type":"HowTo","name":"How to compare two files with Diffhero","step":[{"@type":"HowToStep","position":1,"text":"Paste or type the original version into the left box (or drag a file onto it)."},{"@type":"HowToStep","position":2,"text":"Paste the changed version into the right box."},{"@type":"HowToStep","position":3,"text":"See the result instantly: additions in green, deletions in red, and the exact changed words highlighted inline."},{"@type":"HowToStep","position":4,"text":"Switch between Split and Unified view, jump between changes with the arrows, or download a .diff."}]}</script>
<section class="faq">
<h2>Common questions</h2>
<dl class="faq-grid">
<div class="faq-item"><h3>Is Diffhero free, and is there a usage limit?</h3><dd>It is free with no usage limit, no account and no paid tier. There is nothing metered — syntax highlighting, character-level diffing, 3-way merge and image comparison are all available on every visit.</dd></div>
<div class="faq-item"><h3>Is my text or code uploaded to a server?</h3><dd>No. The entire comparison runs in your browser using JavaScript, so nothing you paste is transmitted anywhere. You can confirm this yourself by opening your browser's dev tools and watching the Network tab while you diff.</dd></div>
<div class="faq-item"><h3>What can Diffhero compare?</h3><dd>Plain text and prose, source code in any language, JSON, CSV and tabular data, YAML and XML, config files, PDFs and Word documents (the text is extracted locally), and images pixel-by-pixel.</dd></div>
<div class="faq-item"><h3>How does it decide what changed?</h3><dd>It aligns the two inputs with a longest-common-subsequence match over lines, then runs a second word-level pass inside each changed line. That is why you see the precise words that differ rather than just "this whole line is different".</dd></div>
<div class="faq-item"><h3>Can I compare two files rather than pasting text?</h3><dd>Yes — drag a file onto either pane. The file is read locally in your browser and never uploaded, which means you can compare files you would not be allowed to upload to a website at all.</dd></div>
<div class="faq-item"><h3>How is this different from Diffchecker?</h3><dd>The main practical difference is metering: Diffchecker's free tier limits syntax highlighting to a handful of uses per month and reserves several formats for paid tiers. Diffhero has no tiers, so nothing is held back.</dd></div>
</dl>
</section>
</main>
</div>
<footer>
<div class="foot-in">
<div><span class="fb">Diffhero</span> — See exactly what changed. · <a href="/guides">Guides</a> · <a href="/diffchecker-alternative">Compare</a> · <a href="/about">About</a> · <a href="/privacy">Privacy</a> · <a href="/terms">Terms</a> · <a href="/contact">Contact</a> · <a href="mailto:hello@diffhero.app">hello@diffhero.app</a></div>
<div>Free. No signup, no upload — everything runs in your browser.<br>
Built and maintained by <a href="https://brunofk.dev" rel="author noopener" target="_blank">Bruno FK</a>, an independent developer in Edinburgh.</div>
</div>
</footer>
<script src="./assets/app.js?v=915cb235" defer></script>
</body>
</html>