<?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: Marco Marques</title>
    <description>The latest articles on DEV Community by Marco Marques (@marquesantero).</description>
    <link>https://dev.to/marquesantero</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%2F3995443%2F38ed2aee-2996-48e6-8790-1c816f380e94.jpg</url>
      <title>DEV Community: Marco Marques</title>
      <link>https://dev.to/marquesantero</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/marquesantero"/>
    <language>en</language>
    <item>
      <title>I'm opening ContractForge — define data ingestion intent once, run it natively anywhere</title>
      <dc:creator>Marco Marques</dc:creator>
      <pubDate>Sun, 21 Jun 2026 16:26:20 +0000</pubDate>
      <link>https://dev.to/marquesantero/im-opening-contractforge-define-data-ingestion-intent-once-run-it-natively-anywhere-a4d</link>
      <guid>https://dev.to/marquesantero/im-opening-contractforge-define-data-ingestion-intent-once-run-it-natively-anywhere-a4d</guid>
      <description>&lt;p&gt;Every data engineer who works across platforms knows this pain:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You build a clean ingestion layer for one platform. The next project is on another. You rewrite the same logic &lt;em&gt;again&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The intent is always the same — ingest this source, this way, with these rules. Only the runtime changed: Databricks → Snowflake → Fabric → BigQuery.&lt;/p&gt;

&lt;p&gt;The usual fix is a generic abstraction that "hides" the platform. But that almost always becomes a &lt;strong&gt;lowest common denominator&lt;/strong&gt; — you lose Auto Loader, Iceberg, Unity Catalog, the very native features you chose the platform for.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;ContractForge&lt;/strong&gt; to try a different idea: &lt;strong&gt;define the intent once, let each platform execute it its own native way.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The contract is just YAML
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;source&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;incremental_files&lt;/span&gt;
  &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;s3://landing/orders&lt;/span&gt;
  &lt;span class="na"&gt;format&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;json&lt;/span&gt;

&lt;span class="na"&gt;target&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;catalog&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;main&lt;/span&gt;
  &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bronze&lt;/span&gt;
  &lt;span class="na"&gt;table&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;orders&lt;/span&gt;

&lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;append&lt;/span&gt;
&lt;span class="na"&gt;schema_policy&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;additive_only&lt;/span&gt;
&lt;span class="na"&gt;quality_rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;not_null&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;order_id&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The semantic core plans it, and each adapter renders &lt;strong&gt;native&lt;/strong&gt; artifacts — Delta/Auto Loader on Databricks, Glue/Iceberg on AWS, and so on.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I care about most: honest portability
&lt;/h2&gt;

&lt;p&gt;Most multi-platform tools lie — they "support everything" by silently degrading your semantics to fit the weakest engine.&lt;/p&gt;

&lt;p&gt;ContractForge does the opposite. The planner returns one of:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SUPPORTED&lt;/code&gt; · &lt;code&gt;SUPPORTED_WITH_WARNINGS&lt;/code&gt; · &lt;code&gt;REVIEW_REQUIRED&lt;/code&gt; · &lt;code&gt;UNSUPPORTED&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If an adapter can't safely preserve your contract, it &lt;strong&gt;says so&lt;/strong&gt; — instead of producing something that looks fine in a demo and breaks in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's in it today
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A platform-neutral semantic core for ingestion contracts&lt;/li&gt;
&lt;li&gt;Native adapters for &lt;strong&gt;Databricks, AWS, Snowflake, Microsoft Fabric and GCP&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Bronze-to-gold patterns, write modes (&lt;code&gt;append&lt;/code&gt;, &lt;code&gt;overwrite&lt;/code&gt;, &lt;code&gt;upsert&lt;/code&gt;, hash-diff upsert, historical &amp;amp; snapshot reconciliation)&lt;/li&gt;
&lt;li&gt;Deterministic validation, evidence artifacts and platform parity reports&lt;/li&gt;
&lt;li&gt;ContractForge-AI — turns user intent into deterministic contract inputs, never skipping validation&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  It's a public technical preview
&lt;/h2&gt;

&lt;p&gt;Not GA. I'm calling it a preview because it's already useful, documented and covered by &lt;strong&gt;2,000+ tests&lt;/strong&gt; — but still evolving as more real-world scenarios get validated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contributors welcome
&lt;/h2&gt;

&lt;p&gt;This is a &lt;strong&gt;public technical preview&lt;/strong&gt;, and the most useful thing right now is real-world pressure from people who do this for a living. If any of these sound like you, I'd love your help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;New adapters / sources&lt;/strong&gt; — your platform or connector isn't covered yet? Let's add it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write modes &amp;amp; edge cases&lt;/strong&gt; — break the &lt;code&gt;upsert&lt;/code&gt;, hash-diff or snapshot logic with a scenario from your own pipelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real contract scenarios&lt;/strong&gt; — the more messy, real ingestion cases we validate, the stronger the core gets.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs &amp;amp; examples&lt;/strong&gt; — found something unclear? That's a contribution too.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Just open an issue&lt;/strong&gt; — even "this confused me" is valuable signal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No contribution is too small — a typo fix, a question, or a "have you considered X?" all count. Check the &lt;a href="https://github.com/marquesantero/contractforge/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;contributing guide&lt;/a&gt; and pick anything that catches your eye.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/marquesantero/contractforge" rel="noopener noreferrer"&gt;https://github.com/marquesantero/contractforge&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Docs:&lt;/strong&gt; &lt;a href="https://marquesantero.github.io/contractforge/" rel="noopener noreferrer"&gt;https://marquesantero.github.io/contractforge/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's your approach to ingestion across platforms today? Drop it in the comments. I genuinely want to know.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>dataengineering</category>
      <category>datacontract</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
