<?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: KAMATIL</title>
    <description>The latest articles on DEV Community by KAMATIL (@kamatil).</description>
    <link>https://dev.to/kamatil</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%2F870183%2Fdae0933b-8dbd-4262-89b0-b8f535e56933.png</url>
      <title>DEV Community: KAMATIL</title>
      <link>https://dev.to/kamatil</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kamatil"/>
    <language>en</language>
    <item>
      <title>Column Selection Is Not an Index: Two Different Ways to Reduce Database Work</title>
      <dc:creator>KAMATIL</dc:creator>
      <pubDate>Sat, 17 Oct 2026 18:15:00 +0000</pubDate>
      <link>https://dev.to/kamatil/column-selection-is-not-an-index-two-different-ways-to-reduce-database-work-261</link>
      <guid>https://dev.to/kamatil/column-selection-is-not-an-index-two-different-ways-to-reduce-database-work-261</guid>
      <description>&lt;p&gt;A product list might display a name and a price while each product record also contains a long description, supplier details, and internal notes. Asking for only the displayed fields is a sensible starting point. It does not, by itself, explain how the database finds the products.&lt;/p&gt;

&lt;p&gt;Two separate questions matter: which records must the engine locate, and which fields must it return?&lt;/p&gt;

&lt;h3&gt;
  
  
  Projection controls the&amp;nbsp;fields
&lt;/h3&gt;

&lt;p&gt;Column selection, also called projection, specifies the fields in the result. An application can ask for name and price rather than every field.&lt;/p&gt;

&lt;p&gt;This can reduce the amount of data materialized, serialized, and transferred. Whether it also reduces disk reads depends on the storage layout and execution path. A smaller response is not proof that the database performed less physical I/O.&lt;/p&gt;

&lt;p&gt;iniBase provides a concrete example. Its documentation describes separate files for columns and a columns option in its TypeScript read API. That makes the relationship between requested fields and storage particularly visible. It still does not establish the cost of every filtered query.&lt;/p&gt;

&lt;h3&gt;
  
  
  An index helps locate&amp;nbsp;records
&lt;/h3&gt;

&lt;p&gt;Now imagine looking for a particular product code among many records. Returning only two fields does not automatically prevent a scan of the field used in the filter.&lt;/p&gt;

&lt;p&gt;An appropriate index can provide a way to locate matching entries without examining every record. SQLite's query-planning documentation illustrates this distinction through scans, indexed lookups, and covering indexes. A covering index contains the data needed for a query and can avoid an additional table lookup.&lt;/p&gt;

&lt;p&gt;These techniques can work together: an access path helps find records, while projection limits the requested fields. Neither technique alone describes the complete query plan.&lt;/p&gt;

&lt;h3&gt;
  
  
  Compare two different screens
&lt;/h3&gt;

&lt;p&gt;For a broad export of product names and prices, reading a small number of columns may be useful. For a lookup of one rare product code, the way records are located may dominate. Sorting, filters, caches, and the number of matching rows can change the outcome.&lt;/p&gt;

&lt;p&gt;That is why "column-based" and "indexed" are not interchangeable performance labels. A storage choice can fit one access pattern well and still involve compromises for another.&lt;/p&gt;

&lt;h3&gt;
  
  
  Measure the work your application actually&amp;nbsp;does
&lt;/h3&gt;

&lt;p&gt;Start with two requests against the same dataset: one returning complete records and one returning only the fields the screen uses. Keep filters, ordering, pagination, and durability settings fixed.&lt;/p&gt;

&lt;p&gt;Then vary the selectivity of the filter separately. Include a request that matches very few records and one that matches many. Record latency, response bytes, CPU time, and peak process memory. Distinguish a cold start from a warmed cache; do not label a run "cold" unless the relevant cache state is actually controlled.&lt;/p&gt;

&lt;p&gt;Also separate database timings from HTTP serialization and network time. A faster database call does not guarantee a faster end-to-end request, and smaller allocated disk usage does not establish lower peak RAM.&lt;/p&gt;

&lt;h3&gt;
  
  
  Carry the distinction into the&amp;nbsp;CMS
&lt;/h3&gt;

&lt;p&gt;iniContent, the Nuxt-based CMS above iniBase, is an example of where these questions become practical: a table screen and a detailed editor can need different fields. Whether a particular screen sends a projected request must be checked in its implementation; the database capability alone does not prove that it does.&lt;/p&gt;

&lt;p&gt;For clarity, iniContent's client is Apache-2.0, while its backend API is proprietary.&lt;/p&gt;

&lt;p&gt;The useful habit is to ask what work each layer avoids, then measure it. Requesting fewer fields and finding fewer records are both valuable ideas, but they solve different parts of the problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Technical references
&lt;/h3&gt;

&lt;p&gt;SQLite query planning, including covering indexes: &lt;a href="//sqlite.org/queryplanner.html"&gt;sqlite.org/queryplanner.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;iniBase storage description and read API: &lt;a href="//github.com/inicontent/inibase"&gt;inicontent/inibase&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;iniContent architecture and licensing: &lt;a href="//github.com/inicontent/inicontent"&gt;inicontent/inicontent&lt;/a&gt;&lt;/p&gt;

</description>
      <category>backend</category>
      <category>database</category>
      <category>performance</category>
    </item>
    <item>
      <title>Meet iniSON: A Lightweight Alternative to JSON for Modern Applications</title>
      <dc:creator>KAMATIL</dc:creator>
      <pubDate>Thu, 15 Oct 2026 00:12:03 +0000</pubDate>
      <link>https://dev.to/kamatil/meet-inison-a-lightweight-alternative-to-json-for-modern-applications-5anm</link>
      <guid>https://dev.to/kamatil/meet-inison-a-lightweight-alternative-to-json-for-modern-applications-5anm</guid>
      <description>&lt;p&gt;&lt;strong&gt;Discover how iniSON simplifies data serialization, reduces storage overhead, and powers a growing ecosystem of developer tools, including iniBase and iniContent.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction: Do We Really Need All That JSON?
&lt;/h2&gt;

&lt;p&gt;JSON (JavaScript Object Notation) has become the universal language of modern applications. From REST APIs to configuration files and databases, developers rely on JSON to exchange and store structured information.&lt;/p&gt;

&lt;p&gt;Its simplicity, readability, and broad compatibility have made it an industry standard.&lt;/p&gt;

&lt;p&gt;But JSON has an often-overlooked disadvantage: &lt;strong&gt;its syntax introduces storage overhead.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every object contains quotation marks, colons, commas, and braces. Although these characters serve an important purpose, they also consume additional bytes.&lt;/p&gt;

&lt;p&gt;For individual API responses, the difference may seem insignificant. However, when applications store millions of records or repeatedly serialize complex objects, even small inefficiencies deserve attention.&lt;/p&gt;

&lt;p&gt;This raises an interesting question:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if we could represent JavaScript objects using less syntax without sacrificing their structure?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's the idea behind &lt;a href="https://github.com/inicontent/inison" rel="noopener noreferrer"&gt;iniSON&lt;/a&gt;, an open-source serialization library designed as a lightweight alternative to JSON. &lt;a href="https://github.com/inicontent/inison" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is iniSON?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;iniSON (Inison)&lt;/strong&gt; is a TypeScript-based serialization library that provides an alternative way to convert structured JavaScript data into strings and reconstruct it afterward.&lt;/p&gt;

&lt;p&gt;Rather than relying on JSON's conventional syntax, iniSON uses a more compact representation that removes unnecessary quotation marks and escapes special characters when needed.&lt;/p&gt;

&lt;p&gt;Its primary objective is straightforward:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Store structured data more efficiently while keeping serialization simple for developers.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Consider a standard JSON object:&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;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"age"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"New York"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"active"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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;With iniSON, the same information can be represented more compactly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{name:Alice,age:28,city:New York,active:true}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice the difference.&lt;/p&gt;

&lt;p&gt;The property names no longer require quotation marks, and ordinary string values can be stored without surrounding quotes.&lt;/p&gt;

&lt;p&gt;The result is a more compact representation that remains recognizable to anyone familiar with JavaScript objects.&lt;/p&gt;

&lt;p&gt;Of course, reducing syntax doesn't automatically guarantee better performance in every situation. Actual savings depend on the data, and serialization speed must be evaluated independently.&lt;/p&gt;

&lt;p&gt;Nevertheless, iniSON offers an interesting approach for applications where compact, structured storage matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started With iniSON
&lt;/h2&gt;

&lt;p&gt;One of iniSON's advantages is its straightforward JavaScript API.&lt;/p&gt;

&lt;p&gt;Install the package using npm:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;inison
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then import the library:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Inison&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;inison&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Alice&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;age&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;New York&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;hobbies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Coding&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Reading&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;active&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// Serialize&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;serialized&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Inison&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;serialized&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Deserialize&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;restored&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Inison&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unstringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;serialized&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;restored&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The library exposes two principal operations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Inison.stringify()&lt;/code&gt; converts structured data into its serialized representation.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Inison.unstringify()&lt;/code&gt; reconstructs the serialized data into a JavaScript value.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;iniSON also supports nested objects, arrays, and escaping special characters, making it suitable for more than just simple key-value structures.&lt;/p&gt;

&lt;p&gt;Developers can explore the implementation, tests, and benchmarks directly in the &lt;a href="https://github.com/inicontent/inison" rel="noopener noreferrer"&gt;official GitHub repository&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Storage Efficiency Matters
&lt;/h2&gt;

&lt;p&gt;Modern software systems generate enormous amounts of structured data.&lt;/p&gt;

&lt;p&gt;An e-commerce platform might store products, customers, inventory records, and transactions.&lt;/p&gt;

&lt;p&gt;A content management system might handle thousands of pages, components, configuration objects, and metadata records.&lt;/p&gt;

&lt;p&gt;A business management application might continuously process operational information.&lt;/p&gt;

&lt;p&gt;In each case, data serialization is a small but important component of the overall architecture.&lt;/p&gt;

&lt;p&gt;Reducing unnecessary storage overhead can potentially provide several advantages, including smaller serialized payloads, reduced disk consumption, and more efficient processing of certain data structures.&lt;/p&gt;

&lt;p&gt;However, serialization is only one part of the equation.&lt;/p&gt;

&lt;p&gt;A production application also needs reliable data storage, indexing or efficient retrieval strategies, concurrency control, validation, and suitable APIs.&lt;/p&gt;

&lt;p&gt;This is where iniSON becomes particularly interesting: it is part of a broader ecosystem of developer-focused technologies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond Serialization: Meet iniBase
&lt;/h2&gt;

&lt;p&gt;While iniSON focuses on representing structured data efficiently, &lt;strong&gt;&lt;a href="https://github.com/inicontent/inibase" rel="noopener noreferrer"&gt;iniBase&lt;/a&gt;&lt;/strong&gt; addresses a different challenge:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;How can developers build applications with a capable relational database without necessarily depending on a separate database server?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;iniBase is an open-source, TypeScript-based, file-oriented relational database management system.&lt;/p&gt;

&lt;p&gt;Instead of requiring an external database service, iniBase manages data using files on disk.&lt;/p&gt;

&lt;p&gt;Its architecture emphasizes efficient memory usage, structured data management, and developer-friendly APIs.&lt;/p&gt;

&lt;p&gt;Among its capabilities are relational table operations, validation, selective column retrieval, caching, optional compression, and transactional durability mechanisms.&lt;/p&gt;

&lt;p&gt;Importantly, iniBase includes &lt;strong&gt;iniSON as a dependency&lt;/strong&gt;, demonstrating how compact serialization can fit into a larger database architecture. &lt;a href="https://raw.githubusercontent.com/inicontent/inibase/master/package.json" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  A Database That Works With Your Application
&lt;/h3&gt;

&lt;p&gt;Getting started with iniBase is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;inibase
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a database instance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Inibase&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;inibase&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;db&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;Inibase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;myDatabase&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Retrieve records:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or request only specific fields:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;users&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;email&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This API allows developers to interact with relational data directly from TypeScript without writing SQL for these operations.&lt;/p&gt;

&lt;p&gt;For developers building Node.js applications, internal management systems, content platforms, or specialized backend services, iniBase offers an alternative worth exploring.&lt;/p&gt;

&lt;p&gt;Its file-oriented design can be particularly interesting in deployment environments where infrastructure simplicity and control over storage are priorities.&lt;/p&gt;

&lt;p&gt;Like any database technology, however, its suitability depends on workload requirements, concurrency patterns, operational needs, and performance testing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explore iniBase:&lt;/strong&gt; &lt;a href="https://github.com/inicontent/inibase" rel="noopener noreferrer"&gt;https://github.com/inicontent/inibase&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  From Database to Complete Platform: Introducing iniContent
&lt;/h2&gt;

&lt;p&gt;A serialization library solves how data is represented.&lt;/p&gt;

&lt;p&gt;A database solves how data is stored and retrieved.&lt;/p&gt;

&lt;p&gt;But developers building complete applications need much more.&lt;/p&gt;

&lt;p&gt;They need authentication, APIs, content management, reusable components, and interfaces through which users can interact with their data.&lt;/p&gt;

&lt;p&gt;This is the problem that &lt;strong&gt;&lt;a href="https://inicontent.com" rel="noopener noreferrer"&gt;iniContent&lt;/a&gt;&lt;/strong&gt; aims to address.&lt;/p&gt;

&lt;p&gt;iniContent is a headless content management system built around iniBase, combining a modern application interface with structured data management.&lt;/p&gt;

&lt;p&gt;Built with Nuxt, it provides a foundation for managing content and application data without starting every project from scratch.&lt;/p&gt;

&lt;h3&gt;
  
  
  More Than a Traditional CMS
&lt;/h3&gt;

&lt;p&gt;Unlike content management systems focused exclusively on articles and blog posts, iniContent is designed to accommodate broader application requirements.&lt;/p&gt;

&lt;p&gt;Its capabilities include database administration, structured content management, REST APIs, authentication, rich-text editing, and customizable page components.&lt;/p&gt;

&lt;p&gt;Developers can also extend its interface through Nuxt and define custom content blocks.&lt;/p&gt;

&lt;p&gt;The platform provides a foundation for building websites, administration interfaces, and data-driven applications.&lt;/p&gt;

&lt;p&gt;iniContent's public documentation also describes the use of iniSON-serialized parameters in its REST API, establishing a practical connection between the serialization library and applications built with the platform. &lt;a href="https://github.com/inicontent/inicontent" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Built for Developers Who Want Flexibility
&lt;/h3&gt;

&lt;p&gt;One of iniContent's central design goals is to provide an application foundation without eliminating developer control.&lt;/p&gt;

&lt;p&gt;For example, a developer building an inventory-management application needs more than a collection of database tables.&lt;/p&gt;

&lt;p&gt;The application may also require an administrative interface, access control, product management, custom workflows, and ways to connect external services.&lt;/p&gt;

&lt;p&gt;Instead of developing all these components independently, developers can use iniContent as a starting point and extend it according to their requirements.&lt;/p&gt;

&lt;p&gt;The same approach can be applied to e-commerce administration, business management platforms, content-driven websites, and other data-intensive applications.&lt;/p&gt;

&lt;p&gt;The result is a more integrated development workflow built around a common technology ecosystem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explore iniContent:&lt;/strong&gt; &lt;a href="https://inicontent.com" rel="noopener noreferrer"&gt;https://inicontent.com&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Technologies, One Development Philosophy
&lt;/h2&gt;

&lt;p&gt;Although iniSON, iniBase, and iniContent solve different problems, they share a common direction: simplifying application development while keeping efficiency and flexibility in focus.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Primary purpose&lt;/th&gt;
&lt;th&gt;What it offers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;iniSON&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Data serialization&lt;/td&gt;
&lt;td&gt;A compact alternative to JSON&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;iniBase&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Data persistence&lt;/td&gt;
&lt;td&gt;A file-based relational database&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;iniContent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Application and content management&lt;/td&gt;
&lt;td&gt;A headless CMS powered by iniBase&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These technologies operate at different levels of application architecture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;iniSON focuses on data representation.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;iniBase focuses on persistent data management.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;iniContent focuses on building and managing applications around that data.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Developers can explore each project independently or consider how their capabilities complement one another.&lt;/p&gt;

&lt;p&gt;This modular approach is important because not every application needs the same tools.&lt;/p&gt;

&lt;p&gt;A developer who only needs compact serialization can use iniSON.&lt;/p&gt;

&lt;p&gt;Someone building a TypeScript backend with file-based persistence can evaluate iniBase.&lt;/p&gt;

&lt;p&gt;A team requiring a complete content-management and application foundation can explore iniContent.&lt;/p&gt;

&lt;p&gt;Together, they illustrate an approach to software engineering that emphasizes practical tools rather than unnecessary complexity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Is iniSON a Replacement for JSON?
&lt;/h2&gt;

&lt;p&gt;Not necessarily.&lt;/p&gt;

&lt;p&gt;JSON remains an excellent choice for interoperability, public APIs, and systems requiring broad compatibility across programming languages.&lt;/p&gt;

&lt;p&gt;Its extensive ecosystem and standardized behavior are major strengths.&lt;/p&gt;

&lt;p&gt;iniSON is better understood as an alternative for situations where developers control the serialization and deserialization process and want to explore a more compact representation.&lt;/p&gt;

&lt;p&gt;There are also trade-offs to consider.&lt;/p&gt;

&lt;p&gt;Smaller serialized strings do not automatically mean faster parsing, lower total memory consumption, or smaller compressed files.&lt;/p&gt;

&lt;p&gt;Developers should benchmark realistic datasets and verify compatibility before adopting a serialization format in production.&lt;/p&gt;

&lt;p&gt;The goal is not to replace JSON everywhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The goal is to give developers another option when JSON's trade-offs do not perfectly match their requirements.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bigger Picture: Building Software With Fewer Unnecessary Layers
&lt;/h2&gt;

&lt;p&gt;Software development has become increasingly dependent on complex infrastructure.&lt;/p&gt;

&lt;p&gt;Even relatively small applications may involve database servers, authentication providers, content management tools, backend APIs, and multiple external services.&lt;/p&gt;

&lt;p&gt;These technologies offer significant advantages, but every additional dependency also introduces configuration, maintenance, and operational considerations.&lt;/p&gt;

&lt;p&gt;Projects such as iniSON, iniBase, and iniContent explore another direction.&lt;/p&gt;

&lt;p&gt;They demonstrate how developers can rethink familiar architectural components and build tools around specific goals such as storage efficiency, manageable infrastructure, and flexibility.&lt;/p&gt;

&lt;p&gt;Rather than assuming that every application requires the same architecture, this ecosystem encourages developers to evaluate the actual needs of their projects.&lt;/p&gt;

&lt;p&gt;Sometimes a conventional relational database is the right choice.&lt;/p&gt;

&lt;p&gt;Sometimes a managed backend provides the best development experience.&lt;/p&gt;

&lt;p&gt;And sometimes a lightweight, file-oriented architecture can offer compelling benefits.&lt;/p&gt;

&lt;p&gt;The important thing is having choices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion: Small Optimizations, Bigger Possibilities
&lt;/h2&gt;

&lt;p&gt;iniSON began with a simple idea: structured data does not always need the full syntactic overhead of JSON.&lt;/p&gt;

&lt;p&gt;That idea extends naturally into a broader discussion about how modern applications store data, manage content, and organize their infrastructure.&lt;/p&gt;

&lt;p&gt;With iniBase providing a file-based relational database and iniContent offering a development platform built around it, developers have an opportunity to explore a connected ecosystem designed with efficiency and flexibility in mind.&lt;/p&gt;

&lt;p&gt;Whether you are experimenting with alternative serialization formats, building a custom backend, or developing a complete content-management application, these projects offer interesting technologies to investigate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explore the ecosystem, examine the source code, and decide what works best for your next project.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Get Started
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;iniSON — Lightweight data serialization&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/inicontent/inison" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://www.npmjs.com/package/inison" rel="noopener noreferrer"&gt;npm&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;iniBase — File-based relational database&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/inicontent/inibase" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; · &lt;a href="https://www.npmjs.com/package/inibase" rel="noopener noreferrer"&gt;npm&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;iniContent — Headless CMS and application platform&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://inicontent.com" rel="noopener noreferrer"&gt;Official Website&lt;/a&gt; · &lt;a href="https://github.com/inicontent/inicontent" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;iniSON and iniBase are MIT-licensed open-source projects. The iniContent client repository is available under Apache 2.0, while its backend API is proprietary.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Suggested SEO title:&lt;/strong&gt; iniSON: A Lightweight JSON Alternative Powering iniBase and iniContent&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Meta description:&lt;/strong&gt; Discover iniSON, a lightweight alternative to JSON, and explore how its compact serialization approach connects with iniBase and the iniContent headless CMS.&lt;/p&gt;

</description>
      <category>json</category>
      <category>typescript</category>
      <category>node</category>
    </item>
    <item>
      <title>Meet Inibase: a file-based TypeScript database with column storage</title>
      <dc:creator>KAMATIL</dc:creator>
      <pubDate>Wed, 14 Oct 2026 22:10:59 +0000</pubDate>
      <link>https://dev.to/kamatil/meet-inibase-a-file-based-typescript-database-with-column-storage-36e3</link>
      <guid>https://dev.to/kamatil/meet-inibase-a-file-based-typescript-database-with-column-storage-36e3</guid>
      <description>&lt;p&gt;An article listing usually needs a title and a slug. The full article body can wait until someone opens the page.&lt;/p&gt;

&lt;p&gt;That distinction is a useful way to introduce Inibase: a file-based database written in TypeScript that stores columns in separate files and lets you select the fields you want to read.&lt;/p&gt;

&lt;p&gt;I'm the creator of &lt;a href="https://github.com/inicontent/inibase" rel="noopener noreferrer"&gt;Inibase&lt;/a&gt;. In this article, I'll walk through a small example and explain some of the design's tradeoffs.&lt;/p&gt;

&lt;h2&gt;
  
  
  A database inside your application
&lt;/h2&gt;

&lt;p&gt;Inibase runs in your Node.js application and persists data on the filesystem. You don't start a separate database server to use it.&lt;/p&gt;

&lt;p&gt;It supports schemas, relations, column selection, caching, optional gzip compression, and an explicit transaction API. Its API uses JavaScript objects rather than SQL strings.&lt;/p&gt;

&lt;p&gt;File-based storage still needs a suitable home: your deployment must provide writable, persistent storage. A temporary filesystem in a short-lived function is not a durable database location.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a small article database
&lt;/h2&gt;

&lt;p&gt;For this example, use Node.js 22 or later on macOS or Linux. Windows users should check the repository's Unix utility requirements; WSL is one option.&lt;/p&gt;

&lt;p&gt;In a fresh directory, install the version used for this example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
npm &lt;span class="nb"&gt;install &lt;/span&gt;inibase@3.8.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create &lt;code&gt;demo.mjs&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;Inibase&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;inibase&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;db&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;Inibase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;article-demo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createTable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;articles&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;slug&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;body&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;articles&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Getting started with Inibase&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;slug&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;getting-started-with-inibase&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;This is the full article content.&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;articles&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;articles&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;columns&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;slug&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;articles&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node demo.mjs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This example creates a table, inserts an article, and requests its title and slug without requesting the body. It is an initial setup script, not an idempotent migration: use a fresh database directory when repeating the complete example.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why store columns separately?
&lt;/h2&gt;

&lt;p&gt;Inibase organizes storage into databases, tables, and column files.&lt;/p&gt;

&lt;p&gt;For a listing page, selecting two columns can avoid reading the article body column. That is especially interesting when bodies are much larger than titles and slugs.&lt;/p&gt;

&lt;p&gt;The practical benefit depends on the workload: row count, field sizes, compression, filesystem behavior, and caching all matter. Column selection alone does not establish that one database is faster than another.&lt;/p&gt;

&lt;p&gt;Updates also involve a tradeoff. On a plain table, an update rewrites the affected column files. Inibase offers an opt-in update log that appends update frames instead, with later compaction and additional restrictions. Start with the basic storage path, then evaluate logging against your actual write pattern.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happens if a write fails?
&lt;/h2&gt;

&lt;p&gt;Writing a row across multiple column files raises an obvious question: what if the process stops halfway through?&lt;/p&gt;

&lt;p&gt;Inibase documents a journal and recovery protocol for crash-atomic single-table data mutations. Its default full durability mode uses &lt;code&gt;fsync&lt;/code&gt;; the guarantees depend on the operating system and filesystem honoring those operations.&lt;/p&gt;

&lt;p&gt;It also provides &lt;code&gt;begin&lt;/code&gt;, &lt;code&gt;commit&lt;/code&gt;, and &lt;code&gt;rollback&lt;/code&gt; for explicit multi-table transactions. The current transaction model has important limits, including one mutation per table per transaction and no read-your-writes behavior. Cross-table operations outside a transaction do not acquire its atomicity guarantees automatically.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/inicontent/inibase#durability--crash-safety" rel="noopener noreferrer"&gt;durability documentation&lt;/a&gt; explains the scope and limitations in detail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I would evaluate it
&lt;/h2&gt;

&lt;p&gt;Inibase is worth exploring if you want a TypeScript API, file-based persistence, and control over which columns an application reads. A small content application is one concrete workload to try.&lt;/p&gt;

&lt;p&gt;For applications built around frequent indexed lookups, heavy concurrent writes, or richer transaction semantics, compare alternatives using representative data. SQLite and other established databases are valuable baselines.&lt;/p&gt;

&lt;p&gt;Inibase is MIT-licensed. You can find installation instructions, examples, and benchmark methodology in the &lt;a href="https://github.com/inicontent/inibase" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Try the example with your own content structure. What read or write pattern would you want to see tested next?&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>node</category>
      <category>database</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
