<?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>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;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.&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;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.&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;&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>
