<?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: foss42</title>
    <description>The latest articles on DEV Community by foss42 (foss42).</description>
    <link>https://dev.to/foss42</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%2Forganization%2Fprofile_image%2F13306%2F1d73e463-4ac6-493c-87c2-0a93a755673e.png</url>
      <title>DEV Community: foss42</title>
      <link>https://dev.to/foss42</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/foss42"/>
    <language>en</language>
    <item>
      <title>Building API Dash MCP Server - Adding SPA MCP App</title>
      <dc:creator>Abdelrahman El-Borgy</dc:creator>
      <pubDate>Mon, 17 Aug 2026 18:40:37 +0000</pubDate>
      <link>https://dev.to/foss42/building-api-dash-mcp-server-adding-spa-mcp-app-10b4</link>
      <guid>https://dev.to/foss42/building-api-dash-mcp-server-adding-spa-mcp-app-10b4</guid>
      <description>&lt;p&gt;We are officially at the halfway mark of Google Summer of Code &lt;a href="https://summerofcode.withgoogle.com" rel="noopener noreferrer"&gt;GSoC 2026&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Over the past period, my core focus has been bridging the gap between traditional API testing workflows and modern AI-assisted development. Working on API Dash—an open-source, lightweight API client—my mission is to transform standard request-and-response workflows into a fully autonomous, AI-native testing ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Foundation: What is &lt;a href="https://apidash.dev/" rel="noopener noreferrer"&gt;API Dash&lt;/a&gt;?
&lt;/h2&gt;

&lt;p&gt;Before adding AI to the mix, &lt;strong&gt;&lt;a href="https://apidash.dev/" rel="noopener noreferrer"&gt;API Dash&lt;/a&gt;&lt;/strong&gt; is a standalone, open-source developer tool. Whenever developers write backend code or build web services, they need a way to test if their URLs (endpoints) are working, sending the right data, and returning the correct responses. Developers traditionally use visual tools like Postman, Insomnia, or API Dash to manually build and fire off these HTTP requests. &lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Problem: The "Context-Switching" Tax
&lt;/h2&gt;

&lt;p&gt;As AI assistants (like VS Code Copilot, Cursor, or Claude) have become standard in coding, a new bottleneck has emerged. &lt;br&gt;
If an AI suggests a piece of code to fetch data from an API, the developer still has to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Leave their code editor.&lt;/li&gt;
&lt;li&gt;Open their API client (like API Dash).&lt;/li&gt;
&lt;li&gt;Copy and paste the URL, authentication tokens, and JSON payloads.&lt;/li&gt;
&lt;li&gt;Click "Send" and manually read the errors.&lt;/li&gt;
&lt;li&gt;Go back to the AI and explain what went wrong.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This constant tab-switching breaks a developer's focus. &lt;/p&gt;
&lt;h2&gt;
  
  
  3. The Solution: The API Dash &lt;a href="https://modelcontextprotocol.io/docs/2026-07-28/getting-started/intro" rel="noopener noreferrer"&gt;MCP&lt;/a&gt; Server
&lt;/h2&gt;

&lt;p&gt;This is where the &lt;strong&gt;API Dash MCP Server&lt;/strong&gt; comes in. If the &lt;a href="https://modelcontextprotocol.io/docs/2026-07-28/getting-started/intro" rel="noopener noreferrer"&gt;Model Context Protocol (MCP)&lt;/a&gt; is the "universal USB-C port," then the API Dash MCP Server is the &lt;strong&gt;smart adapter&lt;/strong&gt; plugged into that port. &lt;/p&gt;

&lt;p&gt;It is a specialized backend program that runs locally on your computer and allows your AI assistant to "drive" API Dash for you. It safely exposes API Dash's core capabilities directly to the AI, turning a manual visual tool into an automated, AI-driven testing engine.&lt;/p&gt;
&lt;h3&gt;
  
  
  What it actually does for the user:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Automated Testing:&lt;/strong&gt; Instead of you manually clicking buttons, you can just tell your AI, &lt;em&gt;"Test the user login API and tell me if it works."&lt;/em&gt; The AI communicates through the MCP Server to fire the request using the API Dash engine.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxuhu8t24j7pznghtm42k.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxuhu8t24j7pznghtm42k.gif" width="760" alt="API Dash MCP Server Demonstration" height="1254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Embedded Interactive UIs:&lt;/strong&gt; When the AI tests an API, it doesn't just spit back a wall of text. The server generates &lt;strong&gt;interactive UI widgets&lt;/strong&gt; (Single Page Applications) right inside your chat window. You get a fully functional mini-version of API Dash directly in your editor to tweak headers, view history, or read logs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9d4ynqksavfgg5ucjmqj.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9d4ynqksavfgg5ucjmqj.gif" width="760" alt="API Dash MCP Server Demonstration" height="918"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Database Memory:&lt;/strong&gt; It hooks into your local database (Hive) so the AI can review past requests. You can ask, &lt;em&gt;"Show my past history requests in apidash"&lt;/em&gt; and the server will fetch that history for you.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe95gtol6hylz6n82mx94.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe95gtol6hylz6n82mx94.gif" width="760" alt="API Dash MCP Server Demonstration" height="1227"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ultimately, the API Dash MCP Server turns your AI assistant into a proactive co-pilot that can natively test, debug, and visualize your network requests without you ever having to leave your coding environment.&lt;/p&gt;
&lt;h3&gt;
  
  
  The Architecture:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;The AI Host (Client):&lt;/strong&gt; The developer prompts their AI assistant in the IDE.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;The Bridge (apidash-mcp):&lt;/strong&gt; A lightweight NPM wrapper spawns the local API Dash binary and bridges communications via standard input/output (stdio) streams using standard JSON-RPC 2.0 messages.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;The Dart Engine (mcp_dart):&lt;/strong&gt; Running headlessly in API Dash (&lt;code&gt;--mcp-engine&lt;/code&gt;), the Dart backend executes HTTP requests, manages local Hive database history, and evaluates environment variables.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;The MCP App Canvas:&lt;/strong&gt; Instead of responding with plain text, the engine serves interactive Single Page Applications (SPAs) directly into the AI chat interface via the emerging &lt;code&gt;text/html;profile=mcp-app&lt;/code&gt; standard.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  The User Experience: API Dash in Action
&lt;/h2&gt;

&lt;p&gt;Here is what the end-to-end developer experience looks like in practice:&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: One-Line Configuration
&lt;/h3&gt;

&lt;p&gt;Developers configure their AI client (like VS Code or Cursor) by simply adding the NPM bridge to their &lt;code&gt;mcp.json&lt;/code&gt; file. No manual binary compilation is required:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"servers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"apidash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npx"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"apidash-mcp@latest"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Step 2: Natural Language Prompting &amp;amp; Tab Navigation
&lt;/h3&gt;

&lt;p&gt;Once connected, the AI model automatically registers API Dash tools. A developer can now talk to their API workspace naturally:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;em&gt;"Execute a GET request to &lt;a href="https://api.github.com/users/foss42" rel="noopener noreferrer"&gt;https://api.github.com/users/foss42&lt;/a&gt;"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;em&gt;"Show my request history"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;  &lt;em&gt;"Open the environment variables manager"&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent intelligently routes the prompt to the correct tool and triggers the appropriate workbench view.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Embedded Interactive Workbenches Inside Chat
&lt;/h3&gt;

&lt;p&gt;Instead of dumping raw JSON responses into the conversation, API Dash embeds a rich, interactive visual studio directly into the chat pane:&lt;br&gt;
Developers can click, tweak headers, edit URL params, inspect execution timings in milliseconds, or switch environment variables right inside their AI chat.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Achievements &amp;amp; Technical Milestones
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Implemented MCP Server &amp;amp; Core Tools
&lt;/h3&gt;

&lt;p&gt;Built using &lt;code&gt;mcp_dart&lt;/code&gt; and &lt;code&gt;apidash_core&lt;/code&gt;, the engine exposes a rich suite of capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;&lt;code&gt;apidash_execute_request&lt;/code&gt;&lt;/strong&gt;: Executes HTTP requests (GET, POST, PUT, DELETE, etc.) with custom headers and body payloads.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;&lt;code&gt;apidash_get_results&lt;/code&gt; &amp;amp; &lt;code&gt;apidash_list_history&lt;/code&gt;&lt;/strong&gt;: Queries local Hive database storage for instant session ledger reviews.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;&lt;code&gt;apidash_delete_request&lt;/code&gt;&lt;/strong&gt;: Removes history records safely by ID.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;&lt;code&gt;apidash_launch_*&lt;/code&gt;&lt;/strong&gt;: Direct navigation tools (&lt;code&gt;apidash_launch_workbench&lt;/code&gt;, &lt;code&gt;apidash_launch_history_tab&lt;/code&gt;, &lt;code&gt;apidash_launch_variables_tab&lt;/code&gt;, &lt;code&gt;apidash_launch_logs_tab&lt;/code&gt;) to launch specific UI panes.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;&lt;code&gt;apidash_btn_send&lt;/code&gt;&lt;/strong&gt;: An agentic pre-flight sanity inspector triggered on UI submission.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Multi-Tab SPA MCP App Workbenches
&lt;/h3&gt;

&lt;p&gt;We created a modular SPA framework rendered cleanly inside the MCP App window with full theme awareness:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Request Studio&lt;/strong&gt;: Complete HTTP request/response builder.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Environment Variables Manager&lt;/strong&gt;: Manage Global and local variables, bearer tokens, and base URLs.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Session Execution Ledger&lt;/strong&gt;: Live history feed directly connected to Hive DB.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. The Node.js Bridge on NPM &lt;a href="https://www.npmjs.com/package/apidash-mcp" rel="noopener noreferrer"&gt;apidash-mcp&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Published live at &lt;a href="https://www.npmjs.com/package/apidash-mcp" rel="noopener noreferrer"&gt;apidash-mcp&lt;/a&gt; on NPM:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Smart Path Resolution&lt;/strong&gt;: Automatically resolves executable paths across Windows, macOS, and Linux, checking &lt;code&gt;APIDASH_PATH&lt;/code&gt;, system &lt;code&gt;PATH&lt;/code&gt;, and standard OS directories.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Process Lifecycle Safety&lt;/strong&gt;: Implemented strict signals (&lt;code&gt;SIGINT&lt;/code&gt;, &lt;code&gt;SIGTERM&lt;/code&gt;, &lt;code&gt;exit&lt;/code&gt;) to ensure zero orphan Flutter processes are left behind when the IDE closes.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Key Learnings &amp;amp; Technical Highlights
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Cross-Boundary Communication (&lt;code&gt;postMessage&lt;/code&gt; &amp;amp; RPC)&lt;/strong&gt;: Connected embedded iframe-based MCP Apps to host IDEs using &lt;code&gt;ResizeObserver&lt;/code&gt; and &lt;code&gt;postMessage&lt;/code&gt; (&lt;code&gt;MCP_APP_RESIZE&lt;/code&gt;) for smooth, auto-adjusting canvas heights.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Native IDE Theme Synchronization&lt;/strong&gt;: Dynamically mapped host CSS environment tokens (VS Code theme colors) into the workbench canvas so it adapts instantly to Light/Dark modes.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Agentic Pre-Flight Sanity Inspection&lt;/strong&gt;: Created a pre-flight inspector (&lt;code&gt;apidash_btn_send&lt;/code&gt;) that analyzes drafted payloads before execution to catch missing auth tokens or malformed URLs early.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What’s Next for the Second Half?
&lt;/h2&gt;

&lt;p&gt;With the foundational backend engine, bridge, persistence layer, and SPA workbenches complete, my goals for the remaining coding period are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Full Feature Parity&lt;/strong&gt;: Expanding the MCP tools to support collection management.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;In-App AI Chat Engine&lt;/strong&gt;: Embedding a native AI assistant directly into the API Dash desktop application.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Chained Agentic Workflows&lt;/strong&gt;: Enabling autonomous end-to-end API test generation and multi-step verification pipelines.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>mcp</category>
      <category>npm</category>
    </item>
    <item>
      <title>Building the Foundation for Git and Scan Sync in API Dash (GSoC 2026)</title>
      <dc:creator>Shashwat Pratap Singh</dc:creator>
      <pubDate>Mon, 20 Jul 2026 19:25:06 +0000</pubDate>
      <link>https://dev.to/foss42/building-the-foundation-for-git-and-scan-sync-in-api-dash-gsoc-2026-3nk9</link>
      <guid>https://dev.to/foss42/building-the-foundation-for-git-and-scan-sync-in-api-dash-gsoc-2026-3nk9</guid>
      <description>&lt;p&gt;Git was not the most difficult part of my Google Summer of Code project.&lt;/p&gt;

&lt;p&gt;The greater challenge was recognizing that our storage layer could not support the collaboration experience we intended to deliver.&lt;/p&gt;

&lt;p&gt;Git, Scan Sync, and live filesystem updates all followed from addressing that foundation first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I started
&lt;/h2&gt;

&lt;p&gt;I'm a Google Summer of Code 2026 contributor with &lt;a href="https://github.com/foss42/apidash" rel="noopener noreferrer"&gt;&lt;strong&gt;API Dash&lt;/strong&gt;&lt;/a&gt;, working on &lt;a href="https://github.com/foss42/apidash/discussions/1689" rel="noopener noreferrer"&gt;Git Support, UI Workflow Builder &amp;amp; Collection Dashboard&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The midterm objective was not a single feature. It was a shared architectural spine:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Make collections &lt;strong&gt;real, shareable workspaces&lt;/strong&gt; so desktop teams can use Git, and your phone can stay in the loop without fighting the stack.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In practice, that meant one folder on disk that desktop Git, phone Sync, and the UI could all treat as the same source of truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;API Dash previously persisted data in Hive. That approach worked for a single machine, but the data was binary and neither human-readable nor suitable for Git. Introducing a conversion layer on top would have created two sources of truth and ongoing translation overhead.&lt;/p&gt;

&lt;p&gt;In discussion with mentors, we chose a clearer path: &lt;strong&gt;own a filesystem workspace&lt;/strong&gt; instead. See &lt;a href="https://github.com/foss42/apidash/pull/1695" rel="noopener noreferrer"&gt;PR #1695 (storage migration)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A workspace is simply a folder: collections, environments, and workflows as readable JSON. Secrets stay in secure storage on the device, not in those files , so sharing a workspace does not accidentally share keys.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why JSON?
&lt;/h2&gt;

&lt;p&gt;Flutter and API Dash were already oriented around this model. Domain models already exposed &lt;code&gt;toJson&lt;/code&gt; / &lt;code&gt;fromJson&lt;/code&gt;. The architecture already used maps and JSON for requests, imports, and code generation. Writing that same shape to disk was not a new serialization dialect; it was aligning persistence with what the application already trusted.&lt;/p&gt;

&lt;p&gt;The approach was fast to implement, straightforward to diff, and easy for users to inspect. It avoided maintaining a parallel serialization path.&lt;/p&gt;

&lt;p&gt;That decision unlocked the rest: Git for desktop team collaboration, Scan Sync for laptop and phone, and disk-to-UI synchronization so folder changes appear in the application - all on the same workspace.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A workspace you can actually open and understand.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiyw6qmsl1ulmxa7oib9c.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiyw6qmsl1ulmxa7oib9c.gif" alt=" " width="719" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F73zdwbekswz2blq8oub5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F73zdwbekswz2blq8oub5.png" alt=" " width="800" height="198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Git vs Scan Sync
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Git for teams (desktop)
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Desktop Git&lt;/strong&gt; is the natural collaboration path: system Git, OS credentials, clone / commit / push / pull, and Visual/Raw diffs in a Collaboration tab. See &lt;a href="https://github.com/foss42/apidash/pull/1734" rel="noopener noreferrer"&gt;PR #1734 (scan sync / collaboration)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The workspace folder is the repo. History and local-only files stay out of Git by design; what you review and push is the same JSON you can open in Finder.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiwku70c5elbxx3c0d6cc.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiwku70c5elbxx3c0d6cc.gif" alt=" " width="800" height="544"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Review before you push or pull. Same diff language everywhere.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Scan Sync for your phone
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Full Git on mobile&lt;/strong&gt; appeared consistent in theory and awkward in practice authentication, SSH, and conflict resolution on a small screen for a job that is usually simply &lt;em&gt;"get this workspace onto my phone."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We therefore built &lt;strong&gt;Scan Sync&lt;/strong&gt;: same Wi‑Fi, QR pairing, a device-to-device link, the same review diffs as Git, then Apply. Under the hood, file hashes (SHA) keep a shared baseline so later syncs can show only what changed—Send or Receive without copying the whole workspace every time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Git&lt;/strong&gt;: collaborate with a team over a remote&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scan Sync&lt;/strong&gt;: move &lt;em&gt;your&lt;/em&gt; workspace between &lt;em&gt;your&lt;/em&gt; devices, quickly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same files. Right tool for each side.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm8pen71auaopz6b60mp6.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm8pen71auaopz6b60mp6.gif" alt=" " width="720" height="407"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Scan Sync: pair on the same Wi‑Fi, review, Apply.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Watching the filesystem
&lt;/h2&gt;

&lt;p&gt;A filesystem-first design only works if the interface remains accurate. We added an event tracker on disk so the desktop app notices when a collection or request is added or removed outside the UI; the catalog updates accordingly. The application's own writes are filtered out so autosave does not conflict with the watcher.&lt;/p&gt;

&lt;p&gt;Whether the change comes from Git pull, Scan Sync Apply, or an edit in Finder, the expectation is the same: &lt;strong&gt;the UI matches the folder.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Delete on disk. The UI follows.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Do not paper over the foundation.&lt;/strong&gt; A Hive-to-file bridge would have deferred the real design. Mentors advocated filesystem-first. That was the unlock.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use what the architecture already provides.&lt;/strong&gt; JSON was not a fashion choice. &lt;code&gt;toJson&lt;/code&gt; / &lt;code&gt;fromJson&lt;/code&gt; was already familiar ground for Flutter and API Dash.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The filesystem must be usable for humans&lt;/strong&gt;, not only correct for Git. Folders and names should make sense in Finder so users always know &lt;em&gt;what&lt;/em&gt; they are looking at and &lt;em&gt;where&lt;/em&gt; their data lives. If they cannot tell what a file is, the workspace is incomplete.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One truth, several doors.&lt;/strong&gt; Storage, Git, Scan Sync, and disk-to-UI are connected by design, not bolted on separately.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Match the tool to the job.&lt;/strong&gt; Git where teams collaborate. Scan Sync where phone speed matters.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reuse the review path.&lt;/strong&gt; One Visual/Raw mental model for pull and for phone Apply.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Land the pull requests, then Workflow Builder and Dashboard on a workspace we can trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking back
&lt;/h2&gt;

&lt;p&gt;In retrospect, Git was not really the project.&lt;/p&gt;

&lt;p&gt;The project was building a &lt;strong&gt;workspace architecture&lt;/strong&gt; that Git, Scan Sync, and future features could all rely on.&lt;/p&gt;

&lt;p&gt;Along the way, my priorities also shifted. I previously optimized primarily for clean, maintainable code. That still matters. I now place greater weight on &lt;strong&gt;user experience&lt;/strong&gt;: Can someone open the folder and understand what they are looking at? Can they sync to their phone without fighting the application? Does the UI remain accurate when the disk changes?&lt;/p&gt;

&lt;p&gt;Maintainable code is how you get there. Usability is why it matters.&lt;/p&gt;

</description>
      <category>git</category>
      <category>opensource</category>
      <category>dart</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
