<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Jupyter on Ujjwal Chowdhury</title><link>https://u77w41.github.io/tags/jupyter/</link><description>Recent content in Jupyter on Ujjwal Chowdhury</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><lastBuildDate>Sun, 01 Nov 2026 00:00:00 +0530</lastBuildDate><atom:link href="https://u77w41.github.io/tags/jupyter/index.xml" rel="self" type="application/rss+xml"/><item><title>Diff Checker: In-Browser Text and Jupyter Notebook Comparisons</title><link>https://u77w41.github.io/p/diff-checker/</link><pubDate>Sun, 01 Nov 2026 00:00:00 +0530</pubDate><guid>https://u77w41.github.io/p/diff-checker/</guid><description>&lt;img src="https://u77w41.github.io/p/diff-checker/diff-checker-cover.jpg" alt="Featured image of post Diff Checker: In-Browser Text and Jupyter Notebook Comparisons" /&gt;&lt;p&gt;&lt;strong&gt;&lt;a class="link" href="https://u77w41.github.io/diff-checker/" target="_blank" rel="noopener"&#10; &gt;Open Diff Checker&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h2 id="overview"&gt;Overview&#10;&lt;/h2&gt;&lt;p&gt;Comparing files often means pasting proprietary code or data into online tools that upload your text to external servers. Standard diff viewers also struggle with structured formats like Jupyter notebooks (&lt;code&gt;.ipynb&lt;/code&gt;), where minor metadata or execution counts obscure the actual code changes.&lt;/p&gt;&#10;&lt;p&gt;Diff Checker is a fast, web-based comparison tool designed to solve both problems. It handles plain text, source code, and Jupyter notebooks entirely inside your browser tab. Your files never leave your computer, no account is required, and the application works offline as an installable Progressive Web App (PWA).&lt;/p&gt;&#10;&lt;h2 id="text-and-code-comparison"&gt;Text and Code Comparison&#10;&lt;/h2&gt;&lt;p&gt;The text comparison engine handles raw text, scripts, configuration files, and documentation with multiple viewing modes and customization options:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Split and Unified Views:&lt;/strong&gt; Toggle between a two-column side-by-side view and a single-column unified diff view with a single keypress (&lt;code&gt;u&lt;/code&gt;).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Granular Highlighting:&lt;/strong&gt; Choose between character-level, word-level, and line-level difference highlighting to spot single-character edits or large structural shifts.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Diff Normalization:&lt;/strong&gt; Toggle options to ignore whitespace discrepancies, ignore case variations, skip blank lines, or ignore carriage return line endings (&lt;code&gt;\r\n&lt;/code&gt; vs &lt;code&gt;\n&lt;/code&gt;).&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Swap Panes:&lt;/strong&gt; Switch the original and modified inputs with one click to reverse the comparison direction.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Patch Export:&lt;/strong&gt; Generate and copy standard unified diff patches ready to apply with &lt;code&gt;git apply&lt;/code&gt; or &lt;code&gt;patch&lt;/code&gt;.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="jupyter-notebook-ipynb-diffing"&gt;Jupyter Notebook (&lt;code&gt;.ipynb&lt;/code&gt;) Diffing&#10;&lt;/h2&gt;&lt;p&gt;Jupyter notebooks store code, rendered outputs, and execution metadata together in a JSON structure. A standard diff tool often shows dozens of meaningless changes when all you did was run a cell.&lt;/p&gt;&#10;&lt;p&gt;Diff Checker parses the notebook structure to deliver cell-level diffs:&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Feature&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;How Diff Checker handles it&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Cell Separation&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Groups changes by Markdown cells and Code cells instead of raw JSON lines.&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Cell Movement&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Detects when a cell has been moved up or down within the notebook.&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Noisy Metadata Filtering&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Ignores execution counts, cell collapse states, and execution timestamps that create false diffs.&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Rich Output Comparison&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Compares cell outputs including plain text, stdout, stderr, HTML tables, and embedded images (PNG, JPEG, SVG).&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Fallback Plaintext Mode&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Allows switching back to raw text comparison if a notebook contains malformed JSON.&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="privacy-and-local-execution"&gt;Privacy and Local Execution&#10;&lt;/h2&gt;&lt;p&gt;Diff Checker is hosted as a static site on GitHub Pages:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Zero Server Uploads:&lt;/strong&gt; All diff parsing and Myers difference algorithms run locally in client-side JavaScript.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Background Processing:&lt;/strong&gt; Large files and notebooks are processed inside dedicated Web Workers so the browser UI remains responsive.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;No Tracking:&lt;/strong&gt; No analytics cookies, trackers, or third-party tracking scripts are loaded.&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Strict Content Security Policy:&lt;/strong&gt; The site enforces strict HTTP headers restricting scripts and network requests to local origins.&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="keyboard-shortcuts"&gt;Keyboard Shortcuts&#10;&lt;/h2&gt;&lt;p&gt;The interface is built for keyboard-first navigation:&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Key&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Action&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;kbd&gt;n&lt;/kbd&gt; / &lt;kbd&gt;p&lt;/kbd&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Jump to next or previous difference chunk&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;kbd&gt;j&lt;/kbd&gt; / &lt;kbd&gt;k&lt;/kbd&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Jump to next or previous notebook cell&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;kbd&gt;u&lt;/kbd&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Toggle between unified and split views&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;kbd&gt;Ctrl&lt;/kbd&gt; + &lt;kbd&gt;Enter&lt;/kbd&gt; / &lt;kbd&gt;Cmd&lt;/kbd&gt; + &lt;kbd&gt;Enter&lt;/kbd&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Run the diff comparison&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;kbd&gt;?&lt;/kbd&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Display keyboard shortcuts guide&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;kbd&gt;Esc&lt;/kbd&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Close dialogs, drawers, and modal overlays&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;Shortcuts pause automatically while your cursor is inside an active text input area.&lt;/p&gt;&#10;&lt;h2 id="install-and-offline-support"&gt;Install and Offline Support&#10;&lt;/h2&gt;&lt;p&gt;Diff Checker is configured as a Progressive Web App (PWA). Once you load the page in Chrome, Edge, Safari, or Firefox, the application assets cache in the browser. You can install it directly to your dock or home screen, and it will continue functioning without an active internet connection.&lt;/p&gt;&#10;&lt;h2 id="under-the-hood"&gt;Under the Hood&#10;&lt;/h2&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Layer&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th style="text-align: left"&gt;Technologies&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Framework &amp;amp; UI&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Svelte 5, TypeScript, Modern CSS&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Build Tool&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Vite, with &lt;code&gt;vite-plugin-pwa&lt;/code&gt; and Workbox service workers&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Diff Engine&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;Myers diff algorithm implementation with Web Worker offloading&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Notebook Parsing&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;In-browser nbformat 4 JSON parser with rich output decoding&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;&lt;strong&gt;Hosting&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td style="text-align: left"&gt;GitHub Pages via automated GitHub Actions deployment&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;</description></item></channel></rss>