<?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: Eugene Popov</title>
    <description>The latest articles on DEV Community by Eugene Popov (@kaaboeld).</description>
    <link>https://dev.to/kaaboeld</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%2F4074239%2F11903151-d16c-4d93-a838-b012e9e982fa.png</url>
      <title>DEV Community: Eugene Popov</title>
      <link>https://dev.to/kaaboeld</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kaaboeld"/>
    <language>en</language>
    <item>
      <title>Your API Shouldn't Expose Tables. It Should Expose Memory Acts</title>
      <dc:creator>Eugene Popov</dc:creator>
      <pubDate>Wed, 12 Aug 2026 07:22:02 +0000</pubDate>
      <link>https://dev.to/kaaboeld/your-api-shouldnt-expose-tables-it-should-expose-memory-acts-4j0</link>
      <guid>https://dev.to/kaaboeld/your-api-shouldnt-expose-tables-it-should-expose-memory-acts-4j0</guid>
      <description>&lt;h1&gt;
  
  
  Your API Shouldn't Expose Tables. It Should Expose Memory Acts.
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"When everyone lies, INDB remembers what you saw."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We didn't set out to build a faster PostgreSQL.&lt;/p&gt;

&lt;p&gt;We set out to build something awkward to categorize: an &lt;strong&gt;Interpretational Database&lt;/strong&gt; — memory where &lt;strong&gt;meaning is read, not filed&lt;/strong&gt;. Not an archive that swells. A system that inhales chaos, exhales noise, and keeps a signed core.&lt;/p&gt;

&lt;p&gt;Live at &lt;a href="https://indb.tech" rel="noopener noreferrer"&gt;indb.tech&lt;/a&gt;. Docs at &lt;a href="https://docs.indb.tech" rel="noopener noreferrer"&gt;docs.indb.tech&lt;/a&gt;. This is what we actually shipped in v0.7.&lt;/p&gt;




&lt;h2&gt;
  
  
  The category mistake
&lt;/h2&gt;

&lt;p&gt;Most data systems assume:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You &lt;strong&gt;define&lt;/strong&gt; meaning at write time (schema, types, migrations)&lt;/li&gt;
&lt;li&gt;You &lt;strong&gt;store&lt;/strong&gt; rows&lt;/li&gt;
&lt;li&gt;You &lt;strong&gt;query&lt;/strong&gt; with SQL-shaped verbs&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Human memory doesn't work like that.&lt;/p&gt;

&lt;p&gt;You &lt;strong&gt;observe&lt;/strong&gt; first. Meaning arrives later — context-dependent, sometimes contradictory. Repetition compresses into habit. Some things you store but never consciously access.&lt;/p&gt;

&lt;p&gt;INDB models that pipeline explicitly:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Phase&lt;/th&gt;
&lt;th&gt;Metaphor&lt;/th&gt;
&lt;th&gt;What happens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inhale&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ingest&lt;/td&gt;
&lt;td&gt;Accept raw events — tokens + location, no judgment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Exhale&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fusion&lt;/td&gt;
&lt;td&gt;Compress repetition; reputation filters noise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Axiom&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Sign&lt;/td&gt;
&lt;td&gt;What survives can be Ed25519-signed, tamper-evident&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's not marketing poetry. It's how the API is organized.&lt;/p&gt;




&lt;h2&gt;
  
  
  Seven fields. No schema. On purpose.
&lt;/h2&gt;

&lt;p&gt;INDB has &lt;strong&gt;no migrations&lt;/strong&gt;. No column types in the SQL sense. Everything is an &lt;code&gt;Event&lt;/code&gt; — a universal container:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string&lt;/td&gt;
&lt;td&gt;UUID v4 — auto-generated, immutable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;timestamp&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;float&lt;/td&gt;
&lt;td&gt;Unix epoch — time of observation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;raw_data_anchor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string[]&lt;/td&gt;
&lt;td&gt;Tokenized signal — abstract fingerprint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;location&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string | OSM&lt;/td&gt;
&lt;td&gt;Spatial anchor — path or geo object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ttl&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int | null&lt;/td&gt;
&lt;td&gt;Decay in seconds (null = permanent)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fusion_count&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;int&lt;/td&gt;
&lt;td&gt;How many observations merged&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;source_id&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string | null&lt;/td&gt;
&lt;td&gt;Trust chain / reputation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;blind_payload&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;string | null&lt;/td&gt;
&lt;td&gt;Zero-knowledge encrypted blob&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;binary_payload&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;bytes | null&lt;/td&gt;
&lt;td&gt;Raw binary — images, streams, gRPC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you need forty columns, you're probably modeling an archive — not memory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inhale&lt;/strong&gt; an event:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.indb.tech/api/v2/events &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "raw_data_anchor": ["server", "heartbeat", "ok"],
    "location": "infra/edge/eu-west",
    "ttl": 86400
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You're not inserting a row. You're teaching the engine a new fragment of reality.&lt;/p&gt;




&lt;h2&gt;
  
  
  Semantic types, not SQL columns
&lt;/h2&gt;

&lt;p&gt;Under those seven fields sits a &lt;strong&gt;semantic type system&lt;/strong&gt; — types describe &lt;em&gt;what kind of thought&lt;/em&gt; you're storing, not how many bytes it occupies:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Role&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;location&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The Anchor — spatial grounding via OSM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;blind&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The Secret — client-encrypted, server-opaque&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;binary&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The Payload — raw media, sensor streams, files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;struct&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The Graph — nested, recursively validated objects&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;bigint&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The Scale — nanosecond precision, crypto integers &amp;gt; 2⁵³&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;string&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The Narrative — text with optional regex/length constraints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;number&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The Value — quantifiable floats and ints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;code&gt;null&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The Void — explicit absence&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;On ingest, INDB &lt;strong&gt;infers&lt;/strong&gt; intent: a dict with &lt;code&gt;lat&lt;/code&gt;/&lt;code&gt;lon&lt;/code&gt; becomes &lt;code&gt;location&lt;/code&gt;; raw bytes become &lt;code&gt;binary&lt;/code&gt;; nested dicts become &lt;code&gt;struct&lt;/code&gt;. You don't declare &lt;code&gt;ALTER TABLE&lt;/code&gt; — you send data, the kernel classifies it.&lt;/p&gt;

&lt;p&gt;The distinction that matters for privacy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;binary&lt;/code&gt;&lt;/strong&gt; — server knows it's binary, validates size and MIME, but does not interpret content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;blind&lt;/code&gt;&lt;/strong&gt; — server does not know what's inside; ChaCha20-encrypted client-side, stored as Base64 opaque blob. Cognitive modules skip it entirely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full spec: &lt;a href="https://docs.indb.tech/TYPING/" rel="noopener noreferrer"&gt;docs.indb.tech/TYPING/&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Space is index
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;location&lt;/code&gt; field is not a tag. It is a &lt;strong&gt;spatial anchor&lt;/strong&gt; — the Cognitive Engine uses it for proximity, clustering, and relevance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Format A — virtual namespace&lt;/strong&gt; (logical paths, agents, books, services):&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;"location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"books/Dostoevsky/The_Idiot"&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;p&gt;&lt;strong&gt;Format B — OSM geo object&lt;/strong&gt; (real-world grounding):&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;"location"&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;"lat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;55.7558&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lon"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;37.6173&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"osm_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node/1234567"&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;p&gt;Coordinates are validated (&lt;code&gt;lat&lt;/code&gt; −90…90, &lt;code&gt;lon&lt;/code&gt; −180…180). &lt;code&gt;osm_id&lt;/code&gt; accepts all three OpenStreetMap entity types — &lt;code&gt;node/&lt;/code&gt;, &lt;code&gt;way/&lt;/code&gt;, &lt;code&gt;relation/&lt;/code&gt;. A café, a street, a district — all valid anchors.&lt;/p&gt;

&lt;p&gt;Geo also lives in tokens. Prefix &lt;code&gt;osm:&lt;/code&gt; in &lt;code&gt;raw_data_anchor&lt;/code&gt; (e.g. &lt;code&gt;osm:London, UK&lt;/code&gt;) ties the signal to a place without duplicating the location field.&lt;/p&gt;

&lt;p&gt;What the engine does with it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Echo&lt;/strong&gt; harmonic analysis weights &lt;strong&gt;meta-location at 50%&lt;/strong&gt; — events anchored to the same OSM object resonate stronger&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fusion&lt;/strong&gt; penalises multiple &lt;code&gt;osm:&lt;/code&gt; tokens in one event — prevents over-clustering on geographic coincidence alone&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Haversine distance&lt;/strong&gt; between coordinate pairs drives proximity scoring across the cluster&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same event, two ways to ground it — namespace for fiction and agents, OSM for sensors and field work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.indb.tech/api/v2/events &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "raw_data_anchor": ["sensor", "temperature", "22.4", "osm:Jerusalem, Israel"],
    "location": {"lat": 31.7683, "lon": 35.2137, "osm_id": "node/26131744"}
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Cognitive verbs, not CRUD
&lt;/h2&gt;

&lt;p&gt;Our public API reads like &lt;strong&gt;memory acts&lt;/strong&gt;, not database operations:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Verb&lt;/th&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;Question it answers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inhale&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /api/v2/events&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Remember this moment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Lens&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /api/v2/interpret&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;How do &lt;em&gt;you&lt;/em&gt; see it? (context, mood)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Echo&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;search / resonate&lt;/td&gt;
&lt;td&gt;Who else feels like this?&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Subwave&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /api/v2/subwave/broadcast&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Broadcast one frequency — horizontal resonance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Slice&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /api/v2/slice&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Shift the reading (what-if + observer profile)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Paradox&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;POST /api/v2/paradox&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Hold superposition &lt;em&gt;before&lt;/em&gt; content exists&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Recovery&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GET /api/v2/recovery/key/{key_id}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Restore by public identity — never private key&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Six protocols on the wire: HTTP, GraphQL, WebSocket, gRPC, UDP, MCP. &lt;strong&gt;Zero&lt;/strong&gt; Redis, Postgres, or Mongo in the kernel — we meant that literally.&lt;/p&gt;




&lt;h2&gt;
  
  
  Layer 2: what encryption alone can't give you
&lt;/h2&gt;

&lt;p&gt;AES-256-GCM and TLS are Layer 1. Every vendor has them.&lt;/p&gt;

&lt;p&gt;INDB's Layer 2 is structural:&lt;/p&gt;

&lt;h3&gt;
  
  
  Signed memory
&lt;/h3&gt;

&lt;p&gt;Clients sign events locally. The server stores &lt;code&gt;public_key + signature&lt;/code&gt; — &lt;strong&gt;private keys never traverse the API&lt;/strong&gt;. Recovery uses &lt;code&gt;key_id = SHA-256(public_key)&lt;/code&gt;, a public fingerprint. API responses are also sealed with Ed25519.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;blind_payload&lt;/code&gt; — the engine is a witness without eyes
&lt;/h3&gt;

&lt;p&gt;You encrypt client-side. INDB stores an opaque blob. Replicates it across Raft nodes. Returns it on request.&lt;/p&gt;

&lt;p&gt;It &lt;strong&gt;never reads it&lt;/strong&gt;. No decryption key on server. Prism, Echo, Instinct work only on &lt;code&gt;raw_data_anchor&lt;/code&gt; tokens — analytics without access to secrets.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Black Box Contract&lt;/strong&gt; is enforced at protocol level:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You may hide what is inside.&lt;br&gt;&lt;br&gt;
You may not hide that you were here.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When &lt;code&gt;blind_payload&lt;/code&gt; is set, &lt;code&gt;timestamp&lt;/code&gt; and &lt;code&gt;location&lt;/code&gt; are &lt;strong&gt;mandatory&lt;/strong&gt; — not a form validation quirk, a condition of existence. If authorities ask, the system has one answer:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Something was here. This location. This time."&lt;/em&gt;&lt;br&gt;&lt;br&gt;
What it was — architecturally unknown.&lt;/p&gt;

&lt;p&gt;We call this &lt;strong&gt;impossible to exfiltrate&lt;/strong&gt; — not because we promise nicely, but because there's nothing to hand over.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Client-side caveat: architecture breaks if your SDK logs keys into analytics. We document that boundary explicitly.)&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Two kinds of paradox (same word, different phase)
&lt;/h2&gt;

&lt;p&gt;This confused us internally until we named it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Paradox (type)&lt;/strong&gt; — &lt;em&gt;before&lt;/em&gt; observation.&lt;br&gt;&lt;br&gt;
&lt;code&gt;POST /api/v2/paradox&lt;/code&gt; with empty &lt;code&gt;raw_data_anchor&lt;/code&gt;. Context only. Content collapses when someone observes — &lt;code&gt;sample_once&lt;/code&gt; births a signed Event; &lt;code&gt;sample_on_read&lt;/code&gt; stays ephemeral.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prism paradox&lt;/strong&gt; — &lt;em&gt;after&lt;/em&gt; observation.&lt;br&gt;&lt;br&gt;
Fixed event, competing readings. Prism returns &lt;code&gt;meaning&lt;/code&gt;, &lt;code&gt;alternative_readings&lt;/code&gt;, &lt;code&gt;perception_gap&lt;/code&gt;, &lt;code&gt;is_paradoxical&lt;/code&gt;. The engine &lt;strong&gt;surfaces&lt;/strong&gt; contradiction instead of picking a winner.&lt;/p&gt;

&lt;p&gt;Same word. Different layer of memory. Both are signals, not errors.&lt;/p&gt;

&lt;p&gt;Try Prism with observer context — meaning is relational, not baked in:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.indb.tech/api/v2/prism/synthesize &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "query": "felt almost impossible",
    "observer_context": {
      "token_weights": {"silence": 2.0},
      "vocabulary": {"Subjective": ["felt", "almost"]},
      "harmonic_weights": {"emotion": 0.8}
    }
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same tokens. Different observer. Different reading. System doesn't decide who's "right."&lt;/p&gt;




&lt;h2&gt;
  
  
  Grain: when barcode logic meets human memory
&lt;/h2&gt;

&lt;p&gt;Strict Ed25519 is &lt;strong&gt;barcode-tier&lt;/strong&gt; verification: ~0% noise tolerance. Correct for axioms. Wrong for memory — partial quotes, export damage, surface change.&lt;/p&gt;

&lt;p&gt;So we shipped &lt;strong&gt;Grain&lt;/strong&gt; — one kernel module, four tiers on the noise-tolerance axis:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tier&lt;/th&gt;
&lt;th&gt;Real-world analog&lt;/th&gt;
&lt;th&gt;INDB mechanism&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;exact&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;EAN-13 barcode&lt;/td&gt;
&lt;td&gt;Ed25519 / &lt;code&gt;key_id&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;redundant&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;QR Reed–Solomon&lt;/td&gt;
&lt;td&gt;N-of-M signed cluster (~30% damage)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;resonant&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Handwriting biometrics&lt;/td&gt;
&lt;td&gt;Echo × source reputation, FAR/FRR knob&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;statistical&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SynthID-style watermark&lt;/td&gt;
&lt;td&gt;Token n-gram p-value&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One endpoint. &lt;code&gt;tier: auto&lt;/code&gt; picks from evidence. Responses expose uncertainty — &lt;code&gt;false_accept_risk&lt;/code&gt;, &lt;code&gt;insufficient_signal&lt;/code&gt; when the text is too short for statistical detection (honest floor, not fake confidence).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.indb.tech/api/v2/grain/tiers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full spec: &lt;a href="https://docs.indb.tech/GRAIN/" rel="noopener noreferrer"&gt;docs.indb.tech/GRAIN/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;External world: four silos (barcode SDK, QR lib, biometric FAR/FRR, generative watermark). INDB: one spectrum inside the same pipeline that ingests, fuses, and signs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Memory compresses (35:1 verified)
&lt;/h2&gt;

&lt;p&gt;Repetition isn't data — it's pattern.&lt;/p&gt;

&lt;p&gt;Three &lt;code&gt;"home arrived"&lt;/code&gt; events fuse into one with &lt;code&gt;fusion_count: 3&lt;/code&gt;. Routine compresses. An &lt;code&gt;"alarm at 3am"&lt;/code&gt; stays distinct. Fusion ratio in testing: &lt;strong&gt;35:1&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Reputation is gravity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Mass = Count × Reputation²
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A thousand bot messages (rep 0.01) weigh less than one sensor heartbeat (rep 0.99). The system exhales crowd noise as waste heat.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pluggable, not monolithic
&lt;/h2&gt;

&lt;p&gt;Hermes connector: LLM agent memory via MCP (&lt;code&gt;ingest_event&lt;/code&gt;, &lt;code&gt;query_events&lt;/code&gt;).&lt;br&gt;&lt;br&gt;
Moltbook connector: AI agent social feed → events at &lt;code&gt;moltbook://{submolt}/{author}&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Disable a connector — core still breathes. Modularity, not singleton.&lt;/p&gt;

&lt;p&gt;Ops: browser &lt;strong&gt;WUI&lt;/strong&gt; at &lt;a href="https://api.indb.tech/wui/" rel="noopener noreferrer"&gt;api.indb.tech/wui/&lt;/a&gt; or terminal &lt;strong&gt;TUI&lt;/strong&gt; (&lt;code&gt;./start_tui.sh&lt;/code&gt;).&lt;/p&gt;




&lt;h2&gt;
  
  
  Numbers we publish (v0.7 production)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&amp;lt;1ms&lt;/strong&gt; ingestion (standalone)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;99.7%&lt;/strong&gt; success under load (997/1000 events)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~20ms&lt;/strong&gt; Prism · &lt;strong&gt;&amp;lt;30ms&lt;/strong&gt; Echo · &lt;strong&gt;~25ms&lt;/strong&gt; Instinct&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;0&lt;/strong&gt; external databases in the stack&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;6&lt;/strong&gt; wire protocols including MCP for agents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Raft 3-node cluster for self-hosters who want consensus — Docker Compose in docs.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who is this for?
&lt;/h2&gt;

&lt;p&gt;Not everyone. INDB is for systems where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need &lt;strong&gt;signed, tamper-evident&lt;/strong&gt; history&lt;/li&gt;
&lt;li&gt;You must &lt;strong&gt;prove presence&lt;/strong&gt; without exposing &lt;strong&gt;content&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Contradictions should be &lt;strong&gt;surfaced&lt;/strong&gt;, not silently resolved&lt;/li&gt;
&lt;li&gt;Identity verification must tolerate &lt;strong&gt;noise&lt;/strong&gt; without abandoning &lt;strong&gt;axioms&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;AI agents need &lt;strong&gt;persistent interpretational memory&lt;/strong&gt;, not another vector table bolted on&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Legal evidence. Healthcare audit trails. Journalism source protection. IoT with UDP ingest and fusion. Agent memory (Hermes/MCP).&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it in five minutes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Health&lt;/span&gt;
curl https://api.indb.tech/health

&lt;span class="c"&gt;# Inhale&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://api.indb.tech/api/v2/events &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"raw_data_anchor":["devto","reader","hello"],"location":"blog/intro"}'&lt;/span&gt;

&lt;span class="c"&gt;# Grain spectrum&lt;/span&gt;
curl https://api.indb.tech/api/v2/grain/tiers

&lt;span class="c"&gt;# Swagger&lt;/span&gt;
open https://api.indb.tech/docs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Site:&lt;/strong&gt; &lt;a href="https://indb.tech" rel="noopener noreferrer"&gt;indb.tech&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation:&lt;/strong&gt; &lt;a href="https://docs.indb.tech" rel="noopener noreferrer"&gt;docs.indb.tech&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Grain:&lt;/strong&gt; &lt;a href="https://docs.indb.tech/GRAIN/" rel="noopener noreferrer"&gt;docs.indb.tech/GRAIN/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API:&lt;/strong&gt; &lt;a href="https://api.indb.tech/docs" rel="noopener noreferrer"&gt;api.indb.tech/docs&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contact:&lt;/strong&gt; &lt;a href="https://indb.tech/#contact" rel="noopener noreferrer"&gt;indb.tech/#contact&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;We're building for truth in the age of manipulation. If your stack treats data as memory — not filing cabinets — we'd love to hear what you'd stress-test first.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Inhale the chaos. Exhale the noise. Remember the Axiom.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>database</category>
      <category>ai</category>
      <category>security</category>
    </item>
  </channel>
</rss>
