<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Martin Grüner</title>
    <description>The latest articles on DEV Community by Martin Grüner (@martingruner).</description>
    <link>https://dev.to/martingruner</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4085350%2Fbf107504-f459-41f5-845c-d627cf599a2e.jpg</url>
      <title>DEV Community: Martin Grüner</title>
      <link>https://dev.to/martingruner</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/martingruner"/>
    <language>en</language>
    <item>
      <title>How to compare two folders on a Mac (Terminal, Git, and a visual diff)</title>
      <dc:creator>Martin Grüner</dc:creator>
      <pubDate>Sun, 11 Oct 2026 10:47:13 +0000</pubDate>
      <link>https://dev.to/martingruner/how-to-compare-two-folders-on-a-mac-terminal-git-and-a-visual-diff-29e4</link>
      <guid>https://dev.to/martingruner/how-to-compare-two-folders-on-a-mac-terminal-git-and-a-visual-diff-29e4</guid>
      <description>&lt;p&gt;You have two copies of a project, a backup and the original, or two versions of a delivery, and you need to know what is different between them. Finder cannot tell you. Here are three ways to do it on a Mac, from the quickest to the most thorough.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Terminal: &lt;code&gt;diff -rq&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;macOS ships with &lt;code&gt;diff&lt;/code&gt;, and it can compare whole folder trees:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;diff &lt;span class="nt"&gt;-rq&lt;/span&gt; &lt;span class="s2"&gt;"Folder A"&lt;/span&gt; &lt;span class="s2"&gt;"Folder B"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;-r&lt;/code&gt; walks every subfolder and &lt;code&gt;-q&lt;/code&gt; only reports which files differ instead of printing every changed line. The output lists files that differ and files that exist on only one side:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Files Folder A/config.json and Folder B/config.json differ
Only in Folder B/assets: logo@2x.png
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is fast and always available. It tells you &lt;em&gt;which&lt;/em&gt; files differ, not &lt;em&gt;what&lt;/em&gt; changed inside them, and a file that was moved shows up twice: once as missing and once as new.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Git: &lt;code&gt;git diff --no-index&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;If you want to see the changed lines too, Git can compare two folders that are not in a repository:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git diff &lt;span class="nt"&gt;--no-index&lt;/span&gt; &lt;span class="s2"&gt;"Folder A"&lt;/span&gt; &lt;span class="s2"&gt;"Folder B"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get a normal patch for every changed text file, with colors and your usual pager. Add &lt;code&gt;--stat&lt;/code&gt; for a summary of changed files first. It works well for source code. It is harder to read for spreadsheets, PDFs, Word documents, and images, which show up as binary files.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. A visual folder comparison
&lt;/h2&gt;

&lt;p&gt;When the folders are large, mix file types, or you need to be sure nothing is missing, a visual comparison is easier to review. I build &lt;a href="https://martingruner.com/projects/diffanything" rel="noopener noreferrer"&gt;Diff Anything&lt;/a&gt;, a comparison app for Mac and Windows, so this is the workflow I use:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Choose the original folder on the left and the copy or newer version on the right.&lt;/li&gt;
&lt;li&gt;Check the folder options: include subfolders, decide whether hidden files such as &lt;code&gt;.env&lt;/code&gt; belong in the review, and add ignore patterns for build output like &lt;code&gt;DerivedData&lt;/code&gt; or &lt;code&gt;node_modules&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Read the results in a tree or a table. Each path is marked as only on the left, only on the right, changed, moved, or identical, and you can search and filter by status.&lt;/li&gt;
&lt;li&gt;Open any changed pair to see what is different inside it: text and code as a side-by-side diff, spreadsheets cell by cell, PDF and Word documents by their text, and images with an overlay.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Two settings matter when you need an exact answer. Turn on &lt;strong&gt;Compare hashes&lt;/strong&gt; for a byte-level content check rather than trusting names, sizes, and dates. Leave &lt;strong&gt;Semantic structured files&lt;/strong&gt; on when you are reviewing configuration: JSON, YAML, XML, CSV, and environment files are then compared by their parsed content, so reordered JSON keys do not show up as a change.&lt;/p&gt;

&lt;p&gt;Moved files are matched by content at a different path, so a renamed asset appears once as a move instead of a deletion plus an addition.&lt;/p&gt;

&lt;p&gt;Everything runs on your Mac. There is no account, no upload, and no AI involved, which matters when the folders hold client work, credentials, or anything you would rather not paste into a website. It needs macOS 13 or later, and there is a free version to try it on a small pair of folders.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which one to use
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quick check of which files differ:&lt;/strong&gt; &lt;code&gt;diff -rq&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code changes you want to read as a patch:&lt;/strong&gt; &lt;code&gt;git diff --no-index&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backups, client handoffs, mixed file types, or moved files:&lt;/strong&gt; a visual comparison.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The full guide, with a two-minute video and a table explaining every result label, is here: &lt;a href="https://martingruner.com/compare-folders-mac" rel="noopener noreferrer"&gt;Compare two folders on Mac and see what changed&lt;/a&gt;. If you are on Windows, there is a &lt;a href="https://martingruner.com/compare-folders-windows" rel="noopener noreferrer"&gt;Windows version of the guide&lt;/a&gt; too.&lt;/p&gt;

</description>
      <category>macos</category>
      <category>productivity</category>
      <category>git</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Testing deep links on a real phone without emailing them to yourself</title>
      <dc:creator>Martin Grüner</dc:creator>
      <pubDate>Fri, 02 Oct 2026 13:11:14 +0000</pubDate>
      <link>https://dev.to/martingruner/testing-deep-links-on-a-real-phone-without-emailing-them-to-yourself-4oa9</link>
      <guid>https://dev.to/martingruner/testing-deep-links-on-a-real-phone-without-emailing-them-to-yourself-4oa9</guid>
      <description>&lt;p&gt;On a simulator or a phone connected by cable, opening a deep link is one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# iOS Simulator&lt;/span&gt;
xcrun simctl openurl booted &lt;span class="s2"&gt;"myapp://orders/1234"&lt;/span&gt;

&lt;span class="c"&gt;# Android device or emulator over adb&lt;/span&gt;
adb shell am start &lt;span class="nt"&gt;-W&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; android.intent.action.VIEW &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"myapp://orders/1234"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the phone in your hand, with no cable and no terminal, most of us do something worse. We paste the link into Notes, send it to ourselves in Slack, or email it to our own address, then tap it and hope it opens the right screen. When the order number changes, we do it again.&lt;/p&gt;

&lt;p&gt;It gets harder when someone else reports the bug. The ticket says "open this link on a device and check the order screen", and someone has to get that link onto a phone, open it, and write down what happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a phone needs for this
&lt;/h2&gt;

&lt;p&gt;After doing this by hand for a while, I wanted four things on the test phone itself:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Links kept per app&lt;/strong&gt;, so one app's staging links don't mix with another's.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Values in the link.&lt;/strong&gt; Save &lt;code&gt;myapp://orders/{{orderId}}&lt;/code&gt; once and change &lt;code&gt;orderId&lt;/code&gt; when you open it, instead of editing the URL each time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A record of each open&lt;/strong&gt;, including whether the phone accepted the link, so you know what you already tried.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A fast way in.&lt;/strong&gt; Copying a link on a laptop and getting it onto the phone should be one step, not a message to yourself.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How I handle it now
&lt;/h2&gt;

&lt;p&gt;I built TestDock, an iPhone and Android app, for this. Full disclosure: it's my app. Version 1.1 is about the fourth point, getting the link onto the phone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Paste and open.&lt;/strong&gt; Copy a link anywhere and a Paste button appears. On iPhone it uses Apple's paste button, so there is no "Allow Paste" prompt. TestDock finds the link inside whatever text you copied.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quick open.&lt;/strong&gt; Open any URL without saving it first. The last five stay in a list, each marked as opened or failed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paste a whole list.&lt;/strong&gt; Paste text that contains several links and save them all at once. Links you already saved are skipped.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Share in.&lt;/strong&gt; Share a link from Slack, Mail, Safari, or any app that shares text or links, and it lands in Quick open.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Putting the test in the ticket
&lt;/h2&gt;

&lt;p&gt;The change I use most is test links. A test in TestDock is a list of steps: open a link, check the expected result, add a note. You can copy a link to a test and paste it into a bug ticket. The link can carry the values for the run, such as &lt;code&gt;orderId=1234&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Whoever opens the ticket on a phone with TestDock taps the link, sees which test it is with the values filled in, and starts it. They mark each step Pass, Fail, or Skip, attach a screenshot, and share the result back as Markdown, PDF, JSON, or text. Tokens and passwords in links are masked in the shared result. After the fix, the same link runs the same test again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the data lives
&lt;/h2&gt;

&lt;p&gt;TestDock has no account and no server. Profiles, links, and results stay on the phone. It connects to the internet only when you open a link, send a push notification, or inspect an association file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free and Pro
&lt;/h2&gt;

&lt;p&gt;TestDock is free for one app, with unlimited saved links, Quick open, Paste, sharing into TestDock, app-icon shortcuts, and one test of your own. Pro is a one-time purchase that adds unlimited apps and tests, push notification testing (Expo Push, Firebase Cloud Messaging, and APNs on iPhone), share-sheet testing, apple-app-site-association and assetlinks.json inspection, and profile import and export.&lt;/p&gt;

&lt;p&gt;The full write-up with screenshots: &lt;a href="https://martingruner.com/blog/testdock-1-1" rel="noopener noreferrer"&gt;https://martingruner.com/blog/testdock-1-1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;How do you get links onto a physical test device today? I'm curious whether anyone has a better routine than messaging themselves.&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>testing</category>
      <category>ios</category>
      <category>android</category>
    </item>
    <item>
      <title>Making active local development work visible in DevDock 1.4</title>
      <dc:creator>Martin Grüner</dc:creator>
      <pubDate>Fri, 25 Sep 2026 19:03:38 +0000</pubDate>
      <link>https://dev.to/martingruner/making-active-local-development-work-visible-in-devdock-14-2hp6</link>
      <guid>https://dev.to/martingruner/making-active-local-development-work-visible-in-devdock-14-2hp6</guid>
      <description>&lt;p&gt;A project dashboard can list repositories, commands, and containers, yet still miss the state that matters most: what is changing right now.&lt;/p&gt;

&lt;p&gt;For DevDock 1.4, I focused on three pieces of active state.&lt;/p&gt;

&lt;h2&gt;
  
  
  See when an agent is working in a project
&lt;/h2&gt;

&lt;p&gt;DevDock now shows when Claude Code or Codex is working in a registered project. For Claude Code, it reads the recent local transcripts already stored under &lt;code&gt;~/.claude/projects&lt;/code&gt;, including sessions started from a terminal or the desktop app. The project list can show the session title or latest prompt without an account connection.&lt;/p&gt;

&lt;p&gt;That visible state helps prevent accidental overlap: switching branches, starting a build, or editing the same files while an agent is active.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep long Git operations within reach
&lt;/h2&gt;

&lt;p&gt;Long Git operations no longer need to hold the workspace open. A new Activity center lists running operations and recent results.&lt;/p&gt;

&lt;p&gt;Hiding a progress window leaves the operation running. Selecting it in the Activity center reopens the current step and live output. Pull-before-push still continues into the original push after a successful pull.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stop the whole command process tree
&lt;/h2&gt;

&lt;p&gt;Stopping a saved command now stops its complete process tree. Scripts such as &lt;code&gt;npm run dev&lt;/code&gt; often start a child dev server or watcher. Ending only the parent can leave a port occupied, so DevDock now tracks and stops every process the command starts, including when the app closes.&lt;/p&gt;

&lt;p&gt;There is a step-by-step guide to &lt;a href="https://martingruner.com/run-development-commands-windows" rel="noopener noreferrer"&gt;running recurring development commands on Windows&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Smaller improvements that remove friction
&lt;/h2&gt;

&lt;p&gt;The release also improves toolchain detection, event-stream reconnection, action-specific status, Git authentication feedback, command controls, and Microsoft Store purchase restoration.&lt;/p&gt;

&lt;p&gt;The complete release article includes screenshots, user-facing details, and update instructions:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://martingruner.com/blog/devdock-1-4" rel="noopener noreferrer"&gt;Read the DevDock 1.4 release notes&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devtools</category>
      <category>git</category>
      <category>productivity</category>
      <category>claude</category>
    </item>
    <item>
      <title>Designing a smart code diff without replacing the line diff</title>
      <dc:creator>Martin Grüner</dc:creator>
      <pubDate>Wed, 09 Sep 2026 08:41:55 +0000</pubDate>
      <link>https://dev.to/martingruner/designing-a-smart-code-diff-without-replacing-the-line-diff-5h7o</link>
      <guid>https://dev.to/martingruner/designing-a-smart-code-diff-without-replacing-the-line-diff-5h7o</guid>
      <description>&lt;p&gt;A conventional line diff is valuable because it is literal. It is also easy to overwhelm with formatter churn, wrapped expressions, and code reflow. For Diff Anything 1.5, I treated those as two different review questions instead of making one algorithm answer both.&lt;/p&gt;

&lt;h2&gt;
  
  
  One comparison, two views
&lt;/h2&gt;

&lt;p&gt;Smart Diff aligns language-aware tokens and uses conservative language-family rules for whitespace, indentation, statement boundaries, strings, and comments. Line Diff remains available in the same toolbar for the exact patch. Both views operate on the same source pair and retain syntax highlighting, editing, and apply controls.&lt;/p&gt;

&lt;p&gt;The difficult boundary was avoiding an inflated claim: this is not an AST diff and it does not claim compiler-level semantic equivalence. That constraint made it practical to support all 117 non-plain-text editor languages consistently, including 18 newly maintained definitions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Test the packaged application, not only the engine
&lt;/h2&gt;

&lt;p&gt;I built a release fixture matrix for code, text, structured data, spreadsheets, images, PDFs, archives, folders, merge, transforms, save, export, and recovery. Running it through the packaged macOS app caught a malformed-YAML footer issue and a one-way apply dirty-state bug before release.&lt;/p&gt;

&lt;p&gt;The same release also tightens large-comparison performance, cancellation, virtualization, interaction feedback, accessibility, and recovery.&lt;/p&gt;

&lt;p&gt;If you are choosing between diff tools, I wrote up &lt;a href="https://martingruner.com/beyond-compare-alternative" rel="noopener noreferrer"&gt;how Diff Anything compares with Beyond Compare&lt;/a&gt; and where each one fits.&lt;/p&gt;

&lt;p&gt;The full release write-up includes the language list, exact product boundaries, and a screenshot from the actual app:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://martingruner.com/blog/diff-anything-1-5" rel="noopener noreferrer"&gt;https://martingruner.com/blog/diff-anything-1-5&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devtools</category>
      <category>programming</category>
      <category>testing</category>
      <category>performance</category>
    </item>
    <item>
      <title>Comparing XLSX, ODS, Numbers, CSV, and TSV without converting first</title>
      <dc:creator>Martin Grüner</dc:creator>
      <pubDate>Wed, 26 Aug 2026 08:17:19 +0000</pubDate>
      <link>https://dev.to/martingruner/comparing-xlsx-ods-numbers-csv-and-tsv-without-converting-first-403n</link>
      <guid>https://dev.to/martingruner/comparing-xlsx-ods-numbers-csv-and-tsv-without-converting-first-403n</guid>
      <description>&lt;p&gt;Diff Anything 1.3 adds the spreadsheet workflow I most wanted the product to have: comparing files even when they use different spreadsheet formats. An XLSX workbook can be compared with ODS, an Apple Numbers file with Excel, or a CSV/TSV table with a workbook. There is no conversion step before the comparison.&lt;/p&gt;

&lt;p&gt;The comparison is based on stored cell values. Both sides stay in an aligned, sheet-aware grid with row numbers, column letters, empty cells, values, and the selected coordinate connected to the Differences pane. Large populated ranges are virtualized so the review does not need to render an entire workbook at once.&lt;/p&gt;

&lt;p&gt;The boundary matters as much as the feature: spreadsheet mode does not compare formulas, formatting, charts, macros, or workbook layout. It compares the stored values a reviewer can inspect cell by cell.&lt;/p&gt;

&lt;p&gt;Folder diff was rebuilt as a review workspace too. It now has two-pane tree and table layouts, search, status filters, progressive loading, ignore patterns, moved-file detection, and direct opening of nested file pairs. Pro synchronization turns a reviewed selection into an explicit create, update, delete, and move plan, with stale-result protection, recovery journals, rollback, and undo. Step-by-step guides: &lt;a href="https://martingruner.com/compare-folders-mac" rel="noopener noreferrer"&gt;compare two folders on a Mac&lt;/a&gt; and &lt;a href="https://martingruner.com/compare-folders-windows" rel="noopener noreferrer"&gt;compare two folders on Windows&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;PDF review now makes two different questions explicit. Visual diff renders both versions and highlights page-pixel changes, which can reveal changed charts, replaced or moved images, visible signature changes, stamps, missing elements, and layout shifts. Extracted text is a separate mode for additions, removals, and changed wording. Visual diff does not authenticate a digital signature or inspect hidden PDF metadata.&lt;/p&gt;

&lt;p&gt;All comparisons still run locally on macOS and Windows. There is no Diff Anything account, cloud comparison service, analytics, or telemetry.&lt;/p&gt;

&lt;p&gt;The full release notes include the exact boundaries and four new screenshots: &lt;a href="https://martingruner.com/blog/diff-anything-1-3" rel="noopener noreferrer"&gt;https://martingruner.com/blog/diff-anything-1-3&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>devtools</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Keeping 3D device-frame perspective editable through native export</title>
      <dc:creator>Martin Grüner</dc:creator>
      <pubDate>Wed, 19 Aug 2026 16:43:21 +0000</pubDate>
      <link>https://dev.to/martingruner/keeping-3d-device-frame-perspective-editable-through-native-export-1in9</link>
      <guid>https://dev.to/martingruner/keeping-3d-device-frame-perspective-editable-through-native-export-1in9</guid>
      <description>&lt;p&gt;A device frame can explain what kind of app is being shown, but a flat mockup often sits on top of the composition instead of belonging to it. In Screen Studio Kit 1.2, I added controlled depth without flattening the frame into a finished bitmap.&lt;/p&gt;

&lt;p&gt;Device-frame layers now store independent Turn and Tilt angles. The hardware body, screen content, finish, shadows, and perspective remain connected to the same editable layer. Both angles are constrained from -60° to 60°, and the canvas updates immediately while the frame is edited.&lt;/p&gt;

&lt;p&gt;The detail that mattered most was export parity. The interactive canvas is not the final renderer, so the native export engine consumes the same stored angles. Existing projects migrate with zero-degree values, preserving their previous appearance until a frame is deliberately changed. Perspective is scene data, not a preview-only effect.&lt;/p&gt;

&lt;p&gt;This also needs restraint. Screen Studio Kit warns when a rotated custom iPhone frame is used for an App Store output so the artwork can be checked against Apple’s current requirements. The same reusable project can keep a 3D treatment for another store or campaign and reset the App Store version.&lt;/p&gt;

&lt;p&gt;The complete editor, local projects, asset management, preview, validation, device-frame editing, one size and one language per export, and up to 10 full-resolution exports per local day are in the Free tier.&lt;/p&gt;

&lt;p&gt;For the basics, there is a step-by-step guide to &lt;a href="https://martingruner.com/add-device-frames-to-screenshots" rel="noopener noreferrer"&gt;putting app captures in editable device frames&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The release notes show the real editor and exported artwork: &lt;a href="https://martingruner.com/blog/screen-studio-kit-1-2" rel="noopener noreferrer"&gt;https://martingruner.com/blog/screen-studio-kit-1-2&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>design</category>
      <category>productivity</category>
      <category>appdev</category>
    </item>
    <item>
      <title>A diff tool should fail honestly when the input gets difficult</title>
      <dc:creator>Martin Grüner</dc:creator>
      <pubDate>Wed, 19 Aug 2026 16:24:29 +0000</pubDate>
      <link>https://dev.to/martingruner/a-diff-tool-should-fail-honestly-when-the-input-gets-difficult-2gh9</link>
      <guid>https://dev.to/martingruner/a-diff-tool-should-fail-honestly-when-the-input-gets-difficult-2gh9</guid>
      <description>&lt;p&gt;Diff Anything 1.2 is a quality release in the literal sense: the same files produce more faithful results, difficult inputs fail more honestly, and every route into a comparison follows the same rules.&lt;/p&gt;

&lt;p&gt;The visible change is a broader Free tier. The desktop app can now preview YAML, XML, CSV, environment files, HTTP responses, API schemas, folders, archives, PDF and Office documents, images, and binary files. Free previews are explicitly bounded: files up to 5 MiB per side, 10 new sessions per local day, the first 100 collection items, and the first 3 PDF page previews. The Free CLI remains focused on text and JSON.&lt;/p&gt;

&lt;p&gt;The less visible work is in awkward inputs. Structured comparison now handles cases such as duplicate keys, repeated CSV keys, repeated HTTP headers, YAML multi-documents, XML namespace meaning, and masked environment values with explicit warnings when a result cannot be represented without ambiguity. Image comparison handles transparency and decoded-size budgets more carefully. PDF and Office handling keeps extracted text and rendered evidence distinct.&lt;/p&gt;

&lt;p&gt;Everything stays local: there is no account, cloud comparison service, analytics, or telemetry. The point is not to claim that one engine can perfectly understand every format. It is to select a bounded specialist engine, show its limits, and keep desktop, CLI, Git, and CI behavior aligned. I wrote more about &lt;a href="https://martingruner.com/risks-of-online-diff-tools" rel="noopener noreferrer"&gt;why a diff should not require handing your files to someone else&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The full release notes include the exact boundaries and screenshots: &lt;a href="https://martingruner.com/blog/diff-anything-1-2" rel="noopener noreferrer"&gt;https://martingruner.com/blog/diff-anything-1-2&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>devtools</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>What a Windows developer workspace should remember between context switches</title>
      <dc:creator>Martin Grüner</dc:creator>
      <pubDate>Wed, 19 Aug 2026 16:23:48 +0000</pubDate>
      <link>https://dev.to/martingruner/what-a-windows-developer-workspace-should-remember-between-context-switches-3omi</link>
      <guid>https://dev.to/martingruner/what-a-windows-developer-workspace-should-remember-between-context-switches-3omi</guid>
      <description>&lt;p&gt;I built DevDock because reopening a codebase is not the same as recovering the context needed to work on it. A product may span several folders, and the useful state is scattered across commands, Docker, Git, databases, project health, and the checks I want to run before release.&lt;/p&gt;

&lt;p&gt;DevDock is my attempt to keep that context in one local Windows workspace. Each registered project gets an overview, saved commands, run history, Docker and Git state, database operations, local security findings, settings, and tools. A Today view keeps recent projects and saved daily workflows close when I switch between products.&lt;/p&gt;

&lt;p&gt;The important boundary is that it is a local tool. It does not upload source code. The security audit checks registered folders for exposed secrets, private keys, tracked credential files, unsafe permissions, escaping symlinks, and missing lockfiles, while withholding matched secret values. Database tools are deliberately bounded around schema inspection, constrained record lookups, migration review, diagnostics, and confirmed backup operations.&lt;/p&gt;

&lt;p&gt;The Free tier supports up to three local projects with core commands, Git, Docker, Project Doctor, and security audits. Pro is a one-time purchase for unlimited and multi-folder projects, custom workflows, complete history and insights, database tools, SSH transfers, and configuration backup and restore.&lt;/p&gt;

&lt;p&gt;I would especially value feedback from developers who work across several local repositories: which piece of context costs you the most time when you return to a project?&lt;/p&gt;

&lt;p&gt;If you want to try the workflow, I wrote a step-by-step guide to &lt;a href="https://martingruner.com/manage-development-projects-windows" rel="noopener noreferrer"&gt;keeping every development project on Windows ready to run&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://martingruner.com/projects/devdock" rel="noopener noreferrer"&gt;https://martingruner.com/projects/devdock&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>devtools</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
