<?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: Djowda</title>
    <description>The latest articles on DEV Community by Djowda (@mosescodedev).</description>
    <link>https://dev.to/mosescodedev</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2302373%2F652b59b9-feae-4add-a66b-e2ac63729a90.png</url>
      <title>DEV Community: Djowda</title>
      <link>https://dev.to/mosescodedev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mosescodedev"/>
    <language>en</language>
    <item>
      <title>We Open Sourced the Djowda Platform — Here Are 6 Challenges for the Community</title>
      <dc:creator>Djowda</dc:creator>
      <pubDate>Mon, 20 Apr 2026 23:07:54 +0000</pubDate>
      <link>https://dev.to/djowda/we-open-sourced-the-djowda-platform-here-are-6-challenges-for-the-community-38op</link>
      <guid>https://dev.to/djowda/we-open-sourced-the-djowda-platform-here-are-6-challenges-for-the-community-38op</guid>
      <description>&lt;p&gt;The WFP just released &lt;a href="https://hungermap.wfp.org" rel="noopener noreferrer"&gt;Hunger Map Live&lt;/a&gt; — a real-time global food insecurity dashboard. The timing felt right to contribute back.&lt;/p&gt;

&lt;p&gt;Today we're open sourcing the Djowda platform architecture: a miniature reference implementation of one food ecosystem component, built on top of the &lt;a href="https://djowda.com/difp" rel="noopener noreferrer"&gt;DIFP protocol&lt;/a&gt; concept.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/Moses-Code-Dev/FoodSecurity-DIFP-Android-Playground" rel="noopener noreferrer"&gt;github.com/Moses-Code-Dev/FoodSecurity-DIFP-Android-Playground&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  A note on what this is
&lt;/h2&gt;

&lt;p&gt;The production codebase is going through a sanitization process — a single production component sits at ~250k lines of code. This release is intentionally simplified so that developers and AI tools can ingest the core architecture without noise.&lt;/p&gt;

&lt;p&gt;The full codebase will be released gradually at &lt;strong&gt;&lt;a href="https://github.com/Djowda" rel="noopener noreferrer"&gt;github.com/Djowda&lt;/a&gt;&lt;/strong&gt; over the coming months, component by component.&lt;/p&gt;




&lt;h2&gt;
  
  
  What you can build on top of this
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;🌍 Next-gen food coordination infrastructure&lt;/strong&gt;&lt;br&gt;
The &lt;a href="https://djowda.com/difp" rel="noopener noreferrer"&gt;DIFP protocol&lt;/a&gt; is designed for internationally interoperable food coordination. The repo is a working starting point. A Tunisian cooperative and an Indian marketplace speaking the same protocol, with zero custom integration — that's what this is pointing toward.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📍 Geo-targeted food discovery on live maps&lt;/strong&gt;&lt;br&gt;
The MinMax99 spatial grid bakes location into every message. Hyper-local, cell-based food visibility — collaborative, affordable, or free for producers who need reach without a marketing budget.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎮 Interactive map engine for games&lt;/strong&gt;&lt;br&gt;
The MinMax99 grid is essentially a ready-made spatial coordinate system. Lords of Mobile-style interactive maps, powered by native in-device Android code, are a natural derivation. The IP is there if you want to use it.&lt;/p&gt;




&lt;h2&gt;
  
  
  6 Challenges for the community
&lt;/h2&gt;

&lt;p&gt;These are genuine open problems. If you work on any of them, open an issue or share what you find.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Challenge 1 — Web version across 6 components&lt;/strong&gt;&lt;br&gt;
Build a web implementation covering at least 6 different food ecosystem component types (farmer, store, wholesaler, restaurant, delivery, user) that all speak the same DIFP protocol without breaking interoperability. Bonus: make them federate across two independent nodes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Challenge 2 — Jetpack Compose port&lt;/strong&gt;&lt;br&gt;
Rewrite the existing component in Jetpack Compose. A good test of how well the architecture holds up across UI paradigms — and a useful contribution if you get it right.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Challenge 3 — Android Gemini fused response renderer&lt;/strong&gt;&lt;br&gt;
This one is genuinely unsolved and widely needed: build an Android library for rendering mixed UI from a single AI response message — text, chart, grid of items, and action buttons all in one response surface. The current Gemini SDK on Android doesn't handle this cleanly. If you solve it, it's useful well beyond this repo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Challenge 4 — MinMax99 map overlay&lt;/strong&gt;&lt;br&gt;
Overlay the MinMax99 grid as a layer on top of existing map engines — Google Maps, OpenStreetMap, Mapbox. Build a layer switcher. Visualize cell boundaries, cell IDs, and participant density per cell. This would be a powerful tool for anyone using the protocol.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Challenge 5 — Stress test at scale&lt;/strong&gt;&lt;br&gt;
Simulate millions of concurrent users on the coordination layer. Document what breaks first. We have assumptions about Firebase fan-out performance at scale that have not been tested under real load. If you run this, share the numbers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Challenge 6 — AI coding benchmark&lt;/strong&gt;&lt;br&gt;
Can your AI coding tool produce a production-ready DIFP component from the spec alone?&lt;/p&gt;

&lt;p&gt;Test it. Take the &lt;a href="https://djowda.com/difp" rel="noopener noreferrer"&gt;DIFP v0.2 specification&lt;/a&gt;, give it to Claude, Gemini, Copilot, or whatever tool you use, and ask it to build a conformant node component. Document what it gets right, what it misses, and where the spec needs to be clearer. This is useful both as a benchmark and as protocol feedback.&lt;/p&gt;




&lt;h2&gt;
  
  
  Repo details
&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;License&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;   &lt;span class="s"&gt;AGPL-3.0&lt;/span&gt;
&lt;span class="na"&gt;Protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="s"&gt;DIFP v0.2 (message envelope + spatial grid)&lt;/span&gt;
&lt;span class="na"&gt;Platform&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;  &lt;span class="s"&gt;Android (Java)&lt;/span&gt;
&lt;span class="na"&gt;Status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;    &lt;span class="s"&gt;Miniature reference — full releases at github.com/Djowda&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Before publishing any derivative app:&lt;/strong&gt; rename the package identifier to avoid Play Store conflicts. The Djowda name and logo are trademarks — see the README for full notices.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;📦 Playground repo: &lt;a href="https://github.com/Moses-Code-Dev/FoodSecurity-DIFP-Android-Playground" rel="noopener noreferrer"&gt;github.com/Moses-Code-Dev/FoodSecurity-DIFP-Android-Playground&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📄 DIFP Protocol Spec: &lt;a href="https://djowda.com/difp" rel="noopener noreferrer"&gt;djowda.com/difp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🏗 Full platform (coming): &lt;a href="https://github.com/Djowda" rel="noopener noreferrer"&gt;github.com/Djowda&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🌍 WFP Hunger Map: &lt;a href="https://hungermap.wfp.org" rel="noopener noreferrer"&gt;hungermap.wfp.org&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;We built this in the open because the food coordination problem is bigger than any one team. The repo is yours — fork it, break it, build on it, and tell us what you find.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>android</category>
      <category>foodsecurity</category>
      <category>challenge</category>
    </item>
    <item>
      <title>We Open-Sourced a Protocol to Fix How the Food Supply Chain Talks to Itself</title>
      <dc:creator>Djowda</dc:creator>
      <pubDate>Wed, 11 Mar 2026 02:21:29 +0000</pubDate>
      <link>https://dev.to/djowda/we-open-sourced-a-protocol-to-fix-how-the-food-supply-chain-talks-to-itself-5h0b</link>
      <guid>https://dev.to/djowda/we-open-sourced-a-protocol-to-fix-how-the-food-supply-chain-talks-to-itself-5h0b</guid>
      <description>&lt;p&gt;Almost one billion people face food insecurity every year — not because the world doesn't produce enough food, but because the &lt;strong&gt;coordination infrastructure between producers and consumers is broken&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Farmers don't know who needs what. Stores don't know what's available 2km away. Surplus rots while scarcity persists — sometimes in the same city block.&lt;/p&gt;

&lt;p&gt;We spent years building a prototype to solve this. Today we're publishing the protocol that powers it.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://djowda.com/difp" rel="noopener noreferrer"&gt;djowda.com/difp&lt;/a&gt;&lt;/strong&gt; — DIFP v0.1, Provisional Specification · CC-BY 4.0 · Free to implement&lt;/p&gt;




&lt;h2&gt;
  
  
  What DIFP actually is
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;DIFP&lt;/strong&gt; (Djowda Interconnected Food Protocol) is a lightweight, open, spatial food coordination protocol. It defines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Participant identity&lt;/strong&gt; — how food ecosystem actors identify themselves globally without a central registry&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spatial addressing&lt;/strong&gt; — how Earth's surface is divided into ~500m × 500m cells, each acting as a coordination zone&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Presence &amp;amp; discovery&lt;/strong&gt; — how participants announce and find each other within and across cells&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The trade message format&lt;/strong&gt; — a universal structure for orders, asks, and donations between any two participants&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Protocol federation&lt;/strong&gt; — how independent DIFP nodes interoperate without a central broker&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is &lt;strong&gt;transport-agnostic&lt;/strong&gt;. The reference implementation uses Firebase Realtime Database. Conformant implementations may use REST, WebSockets, MQTT, or anything equivalent.&lt;/p&gt;




&lt;h2&gt;
  
  
  The problem it solves for developers
&lt;/h2&gt;

&lt;p&gt;Right now if you're building a grocery delivery app, a farm management tool, a restaurant POS, or a truck routing system — you're building in isolation.&lt;/p&gt;

&lt;p&gt;There's no shared layer. No common identity. No standard way to say &lt;em&gt;"I'm a farmer at this location with these items available."&lt;/em&gt; Every integration is custom. Every partnership is a new API contract.&lt;/p&gt;

&lt;p&gt;DIFP proposes a fix: &lt;strong&gt;one protocol, one grid, one trade message format&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Any two systems that implement DIFP can discover each other, exchange availability data, and complete trades — with zero custom integration work.&lt;/p&gt;




&lt;h2&gt;
  
  
  The spatial grid — the core innovation
&lt;/h2&gt;

&lt;p&gt;The foundational piece of DIFP is a deterministic global grid called &lt;strong&gt;MinMax99&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The entire surface of Earth is divided into &lt;strong&gt;~3.44 billion cells&lt;/strong&gt;, each 500×500 meters. Every participant gets a &lt;strong&gt;cell ID&lt;/strong&gt; derived from their GPS coordinates using a single pure-math function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;long&lt;/span&gt; &lt;span class="nf"&gt;geoToCellNumber&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;latitude&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;longitude&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="c1"&gt;// Longitude → x in meters (linear)&lt;/span&gt;
    &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;longitude&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;180.0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;EARTH_WIDTH_METERS&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;360.0&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Latitude → y in meters (Mercator, origin at top)&lt;/span&gt;
    &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;EARTH_HEIGHT_METERS&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
             &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;log&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;tan&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;PI&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;4.0&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;toRadians&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;latitude&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt;
               &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;EARTH_HEIGHT_METERS&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;PI&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;

    &lt;span class="c1"&gt;// Meters → cell indices&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;xCell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;floor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="no"&gt;CELL_SIZE_METERS&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// CELL_SIZE_METERS = 500&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;yCell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;floor&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="no"&gt;CELL_SIZE_METERS&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Clamp + encode&lt;/span&gt;
    &lt;span class="n"&gt;xCell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;min&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xCell&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;NUM_COLUMNS&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;  &lt;span class="c1"&gt;// NUM_COLUMNS = 82,000&lt;/span&gt;
    &lt;span class="n"&gt;yCell&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;max&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;min&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;yCell&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="no"&gt;NUM_ROWS&lt;/span&gt;    &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;));&lt;/span&gt;  &lt;span class="c1"&gt;// NUM_ROWS    = 42,000&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;long&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;xCell&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="no"&gt;NUM_ROWS&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;yCell&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Grid constants&lt;/strong&gt; (all conformant implementations MUST use these exactly):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;EARTH_WIDTH_METERS  = 40,075,000
EARTH_HEIGHT_METERS = 20,000,000
CELL_SIZE_METERS    = 500
NUM_COLUMNS         = 82,000
NUM_ROWS            = 42,000
TOTAL_CELLS         ≈ 3.44 billion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Reference test vectors&lt;/strong&gt; to validate your port:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Location&lt;/th&gt;
&lt;th&gt;lat, lng&lt;/th&gt;
&lt;th&gt;Cell ID&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Algiers, Algeria&lt;/td&gt;
&lt;td&gt;36.7372, 3.0868&lt;/td&gt;
&lt;td&gt;3440210&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paris, France&lt;/td&gt;
&lt;td&gt;48.8566, 2.3522&lt;/td&gt;
&lt;td&gt;3467891&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tokyo, Japan&lt;/td&gt;
&lt;td&gt;35.6762, 139.6503&lt;/td&gt;
&lt;td&gt;6543210&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New York, USA&lt;/td&gt;
&lt;td&gt;40.7128, -74.0060&lt;/td&gt;
&lt;td&gt;1823445&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Why a grid instead of geo-queries?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Discovery is O(1).&lt;/strong&gt; To find all stores near a farmer, query the farmer's cell + immediate neighbors. No radius search. No expensive geo API call.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cells are lobbies.&lt;/strong&gt; All components in the same cell share context — they can discover each other without knowing each other in advance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works offline.&lt;/strong&gt; Cell IDs are computed client-side from GPS. No server round-trip needed to know your own address.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cheap at scale.&lt;/strong&gt; A Firebase &lt;code&gt;equalTo(cellId)&lt;/code&gt; query is fast and inexpensive. No PostGIS, no Elasticsearch geo-shape queries.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Neighbor resolution
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_nearby_cells&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;center_cell_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;xC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;yC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;cell_number_to_xy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;center_cell_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;dx&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;dy&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;radius&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xC&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;dx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;NUM_COLUMNS&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;clamp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;yC&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;dy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;NUM_ROWS&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;NUM_ROWS&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Radius&lt;/th&gt;
&lt;th&gt;Grid&lt;/th&gt;
&lt;th&gt;Cells&lt;/th&gt;
&lt;th&gt;Coverage&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1×1&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;~0.25 km²&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;3×3&lt;/td&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;~2.25 km²&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;5×5&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;~6.25 km²&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;11×11&lt;/td&gt;
&lt;td&gt;121&lt;/td&gt;
&lt;td&gt;~30 km²&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Participant identity — DIDs without a blockchain
&lt;/h2&gt;

&lt;p&gt;DIFP uses a &lt;strong&gt;Decentralized Identifier (DID)&lt;/strong&gt; scheme that requires no central authority and works offline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;difp://{cellId}/{typeCode}/{componentId}

# Examples
difp://3440210/f/ali-farm-01       # Farmer in cell 3,440,210 (Algiers)
difp://3440210/s/safeway-dz-042    # Store in same cell
difp://1820044/fa/cevital-plant-1  # Factory in cell 1,820,044
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ten canonical component types:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Actor&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Seed Provider&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;f&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Farmer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fa&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Factory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;w&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Wholesaler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;s&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Store&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;r&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Restaurant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;u&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;User / Consumer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;t&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Transport&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Delivery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Admin&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The trade message — one format for everything
&lt;/h2&gt;

&lt;p&gt;All exchanges in the food ecosystem — commercial orders, donation offers, resource requests — are modeled as &lt;strong&gt;Trades&lt;/strong&gt; between exactly two participants.&lt;/p&gt;

&lt;p&gt;Three trade types:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Code&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;o&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Order&lt;/td&gt;
&lt;td&gt;Purchase request with items, quantities, prices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;a&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ask&lt;/td&gt;
&lt;td&gt;Demand signal — "I need this, who has it?"&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;d&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Donation&lt;/td&gt;
&lt;td&gt;Surplus signal — "I have this, who needs it?"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Ask and Donation types are first-class citizens of the protocol, not afterthoughts. They're how DIFP addresses food insecurity directly — signaling surplus and scarcity without requiring a commercial transaction.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trade message schema
&lt;/h3&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;"sId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"difp://3440210/f/ali-farm-01"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sT"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"f"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sC"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"3440210"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"difp://3440210/s/safeway-dz-042"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rT"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rC"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"3440210"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ty"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"o"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"st"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s2"&gt;"p"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"items"&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;"difp:item:dz:vegetables:tomato_kg:v1"&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;"q"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"p"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"u"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"kg"&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="nl"&gt;"total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"listSize"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"createdAt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1710000000000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"info"&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;"phone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"+213..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"address"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"comment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;
  
  
  Status lifecycle
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PENDING (p)
    │
    ├── receiver accepts ──► ACCEPTED (a)
    │                              │
    │                              └──► PROCESSING (pr) ──► COMPLETED (c) ✓
    │
    ├── receiver denies ──► DENIED (dn) ✗
    │
    └── sender cancels  ──► CANCELLED (x) ✗
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The four-node atomic write pattern (fan-out)
&lt;/h3&gt;

&lt;p&gt;Every trade touches four Firebase nodes in a &lt;strong&gt;single atomic &lt;code&gt;updateChildren()&lt;/code&gt; call&lt;/strong&gt;. No partial writes. No race conditions.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TD/{tradeId}                                    ← canonical full record
T/{senderType}/{senderId}/o/{tradeId}           ← sender outbox summary
T/{receiverType}/{receiverId}/i/{tradeId}       ← receiver inbox summary
TA/{tradeId}                                    ← analytics (no PII)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;updates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HashMap&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;();&lt;/span&gt;
&lt;span class="n"&gt;updates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"TD/"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;tradeId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tradeData&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;updates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"T/"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;senderType&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"/"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;senderId&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"/o/"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;tradeId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;senderSummary&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;updates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"T/"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;receiverType&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"/"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;receiverId&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"/i/"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;tradeId&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;receiverSummary&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;updates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"TA/"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;tradeId&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"/createdAt"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;updates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"TA/"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;tradeId&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"/senderCell"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;senderCell&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;updates&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;put&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"TA/"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;tradeId&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"/receiverCell"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;receiverCell&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;updateChildren&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;updates&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// atomic&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;TA&lt;/code&gt; (analytics) node tracks timing and cell pairs for map-route animation — and &lt;strong&gt;must never contain PII&lt;/strong&gt; (no phone numbers, no addresses, no item details).&lt;/p&gt;




&lt;h2&gt;
  
  
  The catalog system — PAD + live sync
&lt;/h2&gt;

&lt;p&gt;DIFP separates item metadata (static) from availability and pricing (live).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PAD (Pre-loaded Application Data):&lt;/strong&gt; ~6,000 items per country per component type, distributed as a compressed package with the app. Contains item names (multilingual), categories, units, thumbnail references. Never changes at runtime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live sync:&lt;/strong&gt; Only &lt;code&gt;price&lt;/code&gt; and &lt;code&gt;available&lt;/code&gt; travel over the wire during normal usage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means a farmer's app works in a village with 2G. The catalog is already on-device. Only the delta syncs.&lt;/p&gt;

&lt;p&gt;Item identity is globally namespaced:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;difp:item:{countryCode}:{category}:{itemSlug}:{version}

# Examples
difp:item:dz:vegetables:tomato_kg:v1
difp:item:in:grains:basmati_rice_kg:v2
difp:item:fr:dairy:camembert_250g:v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Protocol federation
&lt;/h2&gt;

&lt;p&gt;DIFP is designed for independent operators — NGOs, national food agencies, regional cooperatives — to run their own nodes and interoperate.&lt;/p&gt;

&lt;p&gt;Every conformant node exposes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://{host}/.well-known/difp/info
# Returns: protocol version, nodeId, cell coverage, federated peers

GET https://{host}/.well-known/difp/cell/{cellId}
# Returns: all PresenceRecords in that cell

POST https://{host}/.well-known/difp/trade/incoming
# Accepts: signed TradeMessage from another DIFP node
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A Tunisian cooperative and an Indian marketplace running separate DIFP nodes can discover each other's participants and complete cross-node trades with zero custom integration — because they speak the same protocol.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to implement (minimum viable node)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — Port the grid algorithm.&lt;/strong&gt; Validate against the reference test vectors above. This is the only piece that MUST be bit-for-bit identical across all implementations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2 — Stand up a presence store.&lt;/strong&gt; Any backend (Firebase, PostgreSQL + PostGIS, DynamoDB). Index by &lt;code&gt;cell_id&lt;/code&gt; + &lt;code&gt;component_type&lt;/code&gt;. Expose the &lt;code&gt;/.well-known/difp/&lt;/code&gt; endpoints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 — Implement the trade engine.&lt;/strong&gt; Four-node write pattern. Role-based status transitions. Atomic writes.&lt;/p&gt;

&lt;p&gt;That's a working DIFP node. Steps 4 (catalog) and 5 (federation) can be added incrementally.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A working node with 10 participants is more valuable than a perfect spec with zero.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What this means for AI + food
&lt;/h2&gt;

&lt;p&gt;One thing we didn't anticipate when designing this: &lt;strong&gt;DIFP makes food data natively queryable by AI systems&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Because every participant has a DID, a cell ID, a typed presence record, and a live catalog — any AI assistant with access to a DIFP node can answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;"Which farmers within 3km have tomatoes available right now?"&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"What's the current wholesale price of potatoes in this region?"&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;"Which stores near me are broadcasting a donation?"&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No scraping. No stale listings. Live, structured, geographic data — in a format any system can query.&lt;/p&gt;




&lt;h2&gt;
  
  
  Current status &amp;amp; what's next (v0.2 targets)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ID&lt;/th&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;Ed25519 message signing for trustless cross-node verification&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;Supply &amp;amp; Demand Radar — Ask/Donation signals aggregate into cell-level heat maps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;Map route animation from TA cell pairs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;MQTT profile for IoT farm sensors&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E&lt;/td&gt;
&lt;td&gt;USSD/SMS fallback for participants with no smartphone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;I&lt;/td&gt;
&lt;td&gt;Conformance test suite&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Read the spec. Build on it. Break it.
&lt;/h2&gt;

&lt;p&gt;Full specification: &lt;strong&gt;&lt;a href="https://djowda.com/difp" rel="noopener noreferrer"&gt;djowda.com/difp&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Download: &lt;a href="https://djowda.com/assets/docs/DIFP-v0_1-Provisional.docx" rel="noopener noreferrer"&gt;DIFP-v0.1-Provisional.docx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Contact: &lt;a href="mailto:sales@djowda.com"&gt;sales@djowda.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;License: &lt;strong&gt;CC-BY 4.0&lt;/strong&gt; — free to implement, fork, extend, and commercialize. Credit required.&lt;/p&gt;




&lt;p&gt;The food system doesn't need another closed platform. It needs a shared language.&lt;/p&gt;

&lt;p&gt;We just published ours. 🌍&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>protocol</category>
      <category>foodtech</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
