<?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: Raju Gundu</title>
    <description>The latest articles on DEV Community by Raju Gundu (@rajugundu).</description>
    <link>https://dev.to/rajugundu</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%2F240941%2F55bbab33-db9d-4657-9f94-b476091bdcae.jpg</url>
      <title>DEV Community: Raju Gundu</title>
      <link>https://dev.to/rajugundu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/rajugundu"/>
    <language>en</language>
    <item>
      <title>I got tired of AG Grid's paywall, so I built a free alternative</title>
      <dc:creator>Raju Gundu</dc:creator>
      <pubDate>Tue, 24 Mar 2026 10:51:12 +0000</pubDate>
      <link>https://dev.to/rajugundu/i-got-tired-of-ag-grids-paywall-so-i-built-a-free-alternative-4dbe</link>
      <guid>https://dev.to/rajugundu/i-got-tired-of-ag-grids-paywall-so-i-built-a-free-alternative-4dbe</guid>
      <description>&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;Every time I started a new internal tool, I'd reach for AG Grid. It's the go-to React data grid and for good reason — it's powerful and well-documented.&lt;/p&gt;

&lt;p&gt;Then I'd hit the wall.&lt;/p&gt;

&lt;p&gt;Audit trail? Enterprise. Workflow states? Enterprise. A proper rules engine for validation? Enterprise. AG Grid Enterprise costs $1,500+ per developer per year. For a small team building internal tooling, that's a hard sell.&lt;/p&gt;

&lt;p&gt;So I built RGGrid.&lt;/p&gt;




&lt;h2&gt;
  
  
  What RGGrid is
&lt;/h2&gt;

&lt;p&gt;RGGrid is a production-grade React + TypeScript data grid built for internal tools and business applications. It's open source, free, and ships everything I kept bumping into on AG Grid's paywall.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install:&lt;/strong&gt;&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; @rg-grid/rg-grid
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Basic usage:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@rg-grid/rg-grid/styles.css&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;RGGrid&lt;/span&gt; &lt;span class="p"&gt;}&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;@rg-grid/rg-grid&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;h2&gt;
  
  
  What's free that AG Grid charges for
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Audit trail
&lt;/h3&gt;

&lt;p&gt;Every cell edit is logged with the user and timestamp. Access it imperatively:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;logs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;gridRef&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;getAuditLogs&lt;/span&gt;&lt;span class="p"&gt;?.()&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Workflow states
&lt;/h3&gt;

&lt;p&gt;Model real business processes directly in the grid:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;workflow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;column&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;status&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;states&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;draft&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;review&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;approved&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;rejected&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="na"&gt;transitions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;draft&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;review&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;review&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;approved&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;rejected&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="na"&gt;rejected&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;review&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;h3&gt;
  
  
  Rules engine
&lt;/h3&gt;

&lt;p&gt;Sync and async validation on any cell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rules&lt;/span&gt; &lt;span class="o"&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;column&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mrr&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;error&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MRR cannot be negative&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;h3&gt;
  
  
  Tree / hierarchical rows
&lt;/h3&gt;

&lt;p&gt;Works with flat (parent ID) or nested (children key) structures. Fully compatible with sorting, filtering, and pagination.&lt;/p&gt;




&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The core idea is a deterministic data pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Raw Data → CoreRow → Feature Plugins → ViewRow → Render Layer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Features are ordered, priority-based plugins. The UI is a thin render layer. No wrapper components. No hidden magic.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Live demo: &lt;a href="https://rg-grid.vercel.app/" rel="noopener noreferrer"&gt;https://rg-grid.vercel.app/&lt;/a&gt;&lt;br&gt;
GitHub: (link)&lt;br&gt;
npm: @rg-grid/rg-grid&lt;/p&gt;

&lt;p&gt;If you've been stuck behind the AG Grid paywall, I'd love to hear your use case. Drop a comment below.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>react</category>
      <category>showdev</category>
      <category>typescript</category>
    </item>
    <item>
      <title>RGGrid — a workflow-ready React data grid with rules, audit logs &amp; workflow states</title>
      <dc:creator>Raju Gundu</dc:creator>
      <pubDate>Sat, 28 Feb 2026 17:38:51 +0000</pubDate>
      <link>https://dev.to/rajugundu/rggrid-a-workflow-ready-react-data-grid-with-rules-audit-logs-workflow-states-k2m</link>
      <guid>https://dev.to/rajugundu/rggrid-a-workflow-ready-react-data-grid-with-rules-audit-logs-workflow-states-k2m</guid>
      <description>&lt;p&gt;I’ve been working on a React data grid called RGGrid, built specifically for internal tools and business applications.&lt;/p&gt;

&lt;p&gt;Most grid libraries stop at sorting/filtering. In real apps I kept needing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Audit trail for cell edits&lt;/li&gt;
&lt;li&gt;Workflow states (draft → review → approved)&lt;/li&gt;
&lt;li&gt;Conditional rule engine (sync + async)&lt;/li&gt;
&lt;li&gt;Plugin architecture&lt;/li&gt;
&lt;li&gt;Theme control without Tailwind dependency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I built RGGrid around those use cases.&lt;/p&gt;

&lt;p&gt;Key features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sorting, filtering, pagination&lt;/li&gt;
&lt;li&gt;Column + row reordering&lt;/li&gt;
&lt;li&gt;Rules engine (with async support + abort signals)&lt;/li&gt;
&lt;li&gt;Audit logging with user context&lt;/li&gt;
&lt;li&gt;Workflow transitions with validation&lt;/li&gt;
&lt;li&gt;Plugin system&lt;/li&gt;
&lt;li&gt;60+ design tokens&lt;/li&gt;
&lt;li&gt;Light/Dark theme&lt;/li&gt;
&lt;li&gt;Fully typed TypeScript API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Would love feedback — especially around API design and plugin architecture.&lt;/p&gt;

&lt;p&gt;Demo: &lt;a href="https://buymeacoffee.com/rajugundu" rel="noopener noreferrer"&gt;Playground&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If this project ends up helping you, you can support it here: &lt;a href="https://buymeacoffee.com/rajugundu" rel="noopener noreferrer"&gt;Buy me a coffee&lt;/a&gt;&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>fullstack</category>
      <category>ai</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
