<?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: NGB Platform</title>
    <description>The latest articles on DEV Community by NGB Platform (@ngbplatform).</description>
    <link>https://dev.to/ngbplatform</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%2F3898160%2F08c55292-432d-4ea7-b776-d8123140c9be.png</url>
      <title>DEV Community: NGB Platform</title>
      <link>https://dev.to/ngbplatform</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ngbplatform"/>
    <language>en</language>
    <item>
      <title>NGB Platform v3.2.0: Build and Upgrade Apps Outside the Monorepo</title>
      <dc:creator>NGB Platform</dc:creator>
      <pubDate>Tue, 13 Oct 2026 13:02:48 +0000</pubDate>
      <link>https://dev.to/ngbplatform/ngb-platform-v320-build-and-upgrade-apps-outside-the-monorepo-141j</link>
      <guid>https://dev.to/ngbplatform/ngb-platform-v320-build-and-upgrade-apps-outside-the-monorepo-141j</guid>
      <description>&lt;h1&gt;
  
  
  NGB Platform v3.2.0: Build and Upgrade Apps Outside the Monorepo
&lt;/h1&gt;

&lt;p&gt;NGB Platform v3.2.0 is out.&lt;/p&gt;

&lt;p&gt;This is a relatively small technical release. No new business modules or major UI features this time.&lt;/p&gt;

&lt;p&gt;Instead, the focus is on something important for developers building applications on top of NGB: &lt;strong&gt;independent application development and reliable upgrades&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Until now, NGB already provided published NuGet and npm packages, and CRM demonstrated package-based consumption. But creating a completely independent application outside the NGB repository still involved additional setup.&lt;/p&gt;

&lt;p&gt;Version 3.2.0 addresses that.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create an independent NGB application
&lt;/h2&gt;

&lt;p&gt;The release introduces an official .NET application template.&lt;/p&gt;

&lt;p&gt;Install it and create a new project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;dotnet new &lt;span class="nb"&gt;install &lt;/span&gt;NGB.Platform.Templates::3.2.0
dotnet new ngb &lt;span class="nt"&gt;-n&lt;/span&gt; MyApplication
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configure and start the application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;MyApplication
node infrastructure/configure.mjs administrator@example.com
node infrastructure/ngb.mjs start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The generated application includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;.NET 10 API&lt;/li&gt;
&lt;li&gt;Vue frontend&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;Keycloak authentication&lt;/li&gt;
&lt;li&gt;Database Migrator&lt;/li&gt;
&lt;li&gt;Background Jobs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You get a working application with authentication, navigation, user and role management, audit history, and background processing.&lt;/p&gt;

&lt;p&gt;The starter does not include demo business modules, unnecessary infrastructure, or empty application layers.&lt;/p&gt;

&lt;p&gt;More importantly, &lt;strong&gt;it doesn't depend on the NGB source repository&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Backend dependencies come from published &lt;code&gt;NGB.Platform.*&lt;/code&gt; NuGet packages, while the frontend consumes &lt;code&gt;@ngbplatform/ui&lt;/code&gt; from npm.&lt;/p&gt;

&lt;p&gt;This makes it possible to start building your own business application without cloning the entire NGB monorepo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extending the platform
&lt;/h2&gt;

&lt;p&gt;NGB applications can introduce their own business definitions, runtime logic, and PostgreSQL persistence.&lt;/p&gt;

&lt;p&gt;The architecture remains layered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Definitions describe application-specific business objects.&lt;/li&gt;
&lt;li&gt;Runtime contains application behavior and orchestration.&lt;/li&gt;
&lt;li&gt;PostgreSQL projects own SQL, migrations, and provider-specific persistence.&lt;/li&gt;
&lt;li&gt;API, Migrator, and Background Jobs remain composition roots.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The starter doesn't generate empty projects for responsibilities you don't need yet.&lt;/p&gt;

&lt;p&gt;You add those layers as your application grows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Upgrade certification
&lt;/h2&gt;

&lt;p&gt;Creating a new application is one part of the story. Keeping an existing application working across platform releases is another.&lt;/p&gt;

&lt;p&gt;Version 3.2.0 introduces automated external application upgrade certification.&lt;/p&gt;

&lt;p&gt;Instead of only checking whether new packages compile, the certification process takes an existing application built against an older NGB release and upgrades it.&lt;/p&gt;

&lt;p&gt;The process includes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Building and running the original application.&lt;/li&gt;
&lt;li&gt;Creating persistent data using the original platform version.&lt;/li&gt;
&lt;li&gt;Updating the application dependencies.&lt;/li&gt;
&lt;li&gt;Applying database migrations to the same database.&lt;/li&gt;
&lt;li&gt;Starting the upgraded application.&lt;/li&gt;
&lt;li&gt;Verifying that data, permissions, audit history, and custom extensions still work.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first registered and certified upgrade transition is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NGB 3.1.0 → 3.2.0&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There's also migration-aware application tooling for previewing changes before applying them.&lt;/p&gt;

&lt;p&gt;For an existing 3.1.0 external application, run the following from an NGB 3.2.0 repository checkout:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Preview the upgrade&lt;/span&gt;
node ngb.mjs upgrade &lt;span class="nt"&gt;--app&lt;/span&gt; ../MyApplication &lt;span class="nt"&gt;--to&lt;/span&gt; 3.2.0

&lt;span class="c"&gt;# Apply the dependency changes&lt;/span&gt;
node ngb.mjs upgrade &lt;span class="nt"&gt;--app&lt;/span&gt; ../MyApplication &lt;span class="nt"&gt;--to&lt;/span&gt; 3.2.0 &lt;span class="nt"&gt;--apply&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Applying dependency changes is not a substitute for following the database migration and deployment procedure described in the upgrade guide.&lt;/p&gt;

&lt;h2&gt;
  
  
  API compatibility is a separate guarantee
&lt;/h2&gt;

&lt;p&gt;One important detail: upgrade certification and public API compatibility are not the same thing.&lt;/p&gt;

&lt;p&gt;An upgrade test verifies a specific application transition.&lt;/p&gt;

&lt;p&gt;API compatibility checks protect the public contracts used by application developers.&lt;/p&gt;

&lt;p&gt;In NGB 3.2.0, compatibility validation covers the applicable major-version baseline and the previous published release, helping catch breaking changes to APIs introduced after the original 3.0.0 baseline.&lt;/p&gt;

&lt;p&gt;A successful upgrade test doesn't mean breaking public API changes are acceptable in a minor release.&lt;/p&gt;

&lt;p&gt;These are independent checks, and both matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frontend improvements
&lt;/h2&gt;

&lt;p&gt;The release also introduces a public Tailwind preset:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;@ngbplatform/ui/tailwind-preset&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;External applications can now use the NGB design tokens without importing shared configuration files from inside the NGB monorepo.&lt;/p&gt;

&lt;p&gt;The release also strengthens validation of the published npm package, including its public entry points, TypeScript contracts, CSS, and static assets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Release certification
&lt;/h2&gt;

&lt;p&gt;Another improvement is the release pipeline.&lt;/p&gt;

&lt;p&gt;Candidate NuGet and npm artifacts are validated before publication, including external application consumption and upgrade checks.&lt;/p&gt;

&lt;p&gt;After publication, registry verification checks the actual published artifacts.&lt;/p&gt;

&lt;p&gt;The goal is straightforward: validate what developers will actually install, not just what happens to build inside the NGB repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;NGB continues to focus on reusable infrastructure for building document-driven business applications.&lt;/p&gt;

&lt;p&gt;Version 3.2.0 doesn't add much visible business functionality.&lt;/p&gt;

&lt;p&gt;But it makes an important part of the developer experience more practical: creating an independent application, extending it without breaking architectural boundaries, and upgrading it through documented, tested transitions.&lt;/p&gt;

&lt;p&gt;That's what this release is about.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;NGB Platform is open source and licensed under Apache 2.0.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/ngbplatform/NGB" rel="noopener noreferrer"&gt;https://github.com/ngbplatform/NGB&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Release v3.2.0: &lt;a href="https://github.com/ngbplatform/NGB/releases/tag/v3.2.0" rel="noopener noreferrer"&gt;https://github.com/ngbplatform/NGB/releases/tag/v3.2.0&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;External Applications &amp;amp; Upgrades: &lt;a href="https://docs.ngbplatform.com/architecture/external-app-upgrades" rel="noopener noreferrer"&gt;https://docs.ngbplatform.com/architecture/external-app-upgrades&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Website: &lt;a href="https://ngbplatform.com" rel="noopener noreferrer"&gt;https://ngbplatform.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>architecture</category>
      <category>dotnet</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>NGB Platform v3.1.0: Attachments &amp; Notes</title>
      <dc:creator>NGB Platform</dc:creator>
      <pubDate>Wed, 07 Oct 2026 13:50:21 +0000</pubDate>
      <link>https://dev.to/ngbplatform/ngb-platform-v310-attachments-notes-9jn</link>
      <guid>https://dev.to/ngbplatform/ngb-platform-v310-attachments-notes-9jn</guid>
      <description>&lt;p&gt;NGB Platform v3.1.0 is out, introducing &lt;strong&gt;Attachments &amp;amp; Notes&lt;/strong&gt; — a new platform-level capability for managing files and notes associated with business objects.&lt;/p&gt;

&lt;p&gt;The implementation follows an important architectural principle in NGB: &lt;strong&gt;adding a file or editing a note should not modify the underlying business document.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why independent lifecycle matters
&lt;/h2&gt;

&lt;p&gt;In document-driven business applications, posting a document can produce operational, reference, or accounting effects.&lt;/p&gt;

&lt;p&gt;But what happens when someone needs to attach a supporting PDF or add a note to an already posted document?&lt;/p&gt;

&lt;p&gt;Those operations shouldn't require unposting the document, modifying its version, or recalculating its business effects.&lt;/p&gt;

&lt;p&gt;In NGB, Attachments and Notes have their own lifecycle, completely independent of the parent object's posting state and business effects.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's included in v3.1.0
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Attachments:&lt;/strong&gt; Upload, download, and mark files for deletion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notes:&lt;/strong&gt; Create, edit, and logically delete plain-text notes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit Log integration:&lt;/strong&gt; Track changes, review previous note content, and access retained attachments, even after logical deletion.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permissions:&lt;/strong&gt; Separate access controls for attachments and notes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform-wide support:&lt;/strong&gt; Available for catalogs, documents, and General Journal Entries.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same capabilities work across all four NGB verticals: Property Management, Trade, Agency Billing, and CRM.&lt;/p&gt;

&lt;h2&gt;
  
  
  A few implementation details
&lt;/h2&gt;

&lt;p&gt;Attachments use &lt;strong&gt;MinIO object storage&lt;/strong&gt;, with short-lived presigned URLs for direct file transfers.&lt;/p&gt;

&lt;p&gt;Notes are stored separately and use their own versioning for concurrency control.&lt;/p&gt;

&lt;p&gt;Deletion is logical. Content disappears from active lists, but the audit history is preserved. Completed attachments remain available through the Audit Log with appropriate permissions.&lt;/p&gt;

&lt;p&gt;Neither capability changes the parent object's version, posting state, accounting entries, or register movements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Short demo
&lt;/h2&gt;

&lt;p&gt;Here's a quick walkthrough of the functionality in action:&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/QTo0E_4zKjE" width="710" height="399"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;NGB is an open-source platform built with &lt;strong&gt;.NET 10 and PostgreSQL&lt;/strong&gt; for developing document-driven business applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source code:&lt;/strong&gt; &lt;a href="https://github.com/ngbplatform/NGB" rel="noopener noreferrer"&gt;https://github.com/ngbplatform/NGB&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Website:&lt;/strong&gt; &lt;a href="https://ngbplatform.com" rel="noopener noreferrer"&gt;https://ngbplatform.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation:&lt;/strong&gt; &lt;a href="https://docs.ngbplatform.com" rel="noopener noreferrer"&gt;https://docs.ngbplatform.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>postgres</category>
      <category>opensource</category>
      <category>architecture</category>
    </item>
    <item>
      <title>NGB Platform 3.0.0: Architecture, Performance, and Reliability</title>
      <dc:creator>NGB Platform</dc:creator>
      <pubDate>Wed, 30 Sep 2026 13:04:15 +0000</pubDate>
      <link>https://dev.to/ngbplatform/ngb-platform-300-architecture-performance-and-reliability-167n</link>
      <guid>https://dev.to/ngbplatform/ngb-platform-300-architecture-performance-and-reliability-167n</guid>
      <description>&lt;p&gt;NGB Platform v3.0.0 is out.&lt;/p&gt;

&lt;p&gt;This release is different from the previous major NGB releases.&lt;/p&gt;

&lt;p&gt;There is no single new feature at the center of it.&lt;/p&gt;

&lt;p&gt;Instead, v3.0.0 focuses on the platform itself: architecture boundaries, data-access performance, reporting, reliability, testing, and deployment contracts.&lt;/p&gt;

&lt;p&gt;It is also a breaking release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Clearer architecture boundaries
&lt;/h2&gt;

&lt;p&gt;One of the biggest changes in 3.0 is making infrastructure ownership explicit.&lt;/p&gt;

&lt;p&gt;Several responsibilities that previously leaked across packages now have dedicated boundaries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;NGB.Platform.Hosting.AspNetCore&lt;/code&gt; — shared authentication, branding, CORS, health responses, and HTTP error handling&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;NGB.Platform.Runtime.Hosting&lt;/code&gt; — runtime startup validation&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;NGB.Platform.PostgreSql.AspNetCore&lt;/code&gt; — PostgreSQL-specific HTTP error mapping and health checks&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;NGB.Platform.BackgroundJobs.PostgreSql&lt;/code&gt; — PostgreSQL-backed Hangfire storage and inspection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is simple: provider-neutral platform code should not depend on PostgreSQL or hosting implementation details just because an application happens to use them.&lt;/p&gt;

&lt;p&gt;Architecture tests now enforce these dependency directions.&lt;/p&gt;

&lt;p&gt;For custom NGB hosts, this means package references, namespaces, and composition roots need to be updated when moving from 2.x to 3.0.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reducing N+1 database work
&lt;/h2&gt;

&lt;p&gt;A large part of this release was spent going through data-access paths across:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;catalogs&lt;/li&gt;
&lt;li&gt;documents&lt;/li&gt;
&lt;li&gt;operational registers&lt;/li&gt;
&lt;li&gt;reference registers&lt;/li&gt;
&lt;li&gt;reporting&lt;/li&gt;
&lt;li&gt;vertical-specific workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Several operations that previously required repeated individual reads now use batched access.&lt;/p&gt;

&lt;p&gt;This reduces database round trips and unnecessary allocations, especially when resolving related entities or processing larger result sets.&lt;/p&gt;

&lt;p&gt;I intentionally do not attach a universal percentage speedup to this release. Performance depends heavily on the workload, dataset, hardware, and configuration.&lt;/p&gt;

&lt;p&gt;The performance test framework now includes reproducible run manifests and tooling for controlled before/after comparisons instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reporting changed significantly
&lt;/h2&gt;

&lt;p&gt;Reporting received some of the largest contract changes in 3.0.&lt;/p&gt;

&lt;p&gt;Reports now support cursor-based continuation instead of relying on increasingly large offsets.&lt;/p&gt;

&lt;p&gt;Execution responses can return:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;hasMore&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;nextCursor&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;nullable totals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Composable reports can also load nested groups incrementally using their group paths.&lt;/p&gt;

&lt;p&gt;For large exports, complete XLSX downloads now use a streaming path rather than building the whole export as one bounded in-memory report result.&lt;/p&gt;

&lt;p&gt;There are also per-instance admission limits for report execution. Clients need to handle HTTP &lt;code&gt;429&lt;/code&gt; and &lt;code&gt;Retry-After&lt;/code&gt; when the configured reporting budget is exhausted.&lt;/p&gt;

&lt;p&gt;These changes make report execution more predictable as datasets grow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bounded requests
&lt;/h2&gt;

&lt;p&gt;3.0 also makes several limits explicit.&lt;/p&gt;

&lt;p&gt;Catalog and document paging is bounded, and large clients should follow continuation cursors instead of increasing offsets indefinitely.&lt;/p&gt;

&lt;p&gt;Document payloads also have limits for tabular parts, rows, and cells.&lt;/p&gt;

&lt;p&gt;I prefer explicit limits over allowing a single request to consume arbitrary resources and hoping it remains manageable in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  100% coverage gates
&lt;/h2&gt;

&lt;p&gt;One of the biggest changes to the release process is testing.&lt;/p&gt;

&lt;p&gt;The NGB 3.0 quality gates require:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100% backend line coverage&lt;/li&gt;
&lt;li&gt;100% backend branch coverage&lt;/li&gt;
&lt;li&gt;100% backend method coverage&lt;/li&gt;
&lt;li&gt;100% frontend line coverage&lt;/li&gt;
&lt;li&gt;100% frontend branch coverage&lt;/li&gt;
&lt;li&gt;100% frontend function coverage&lt;/li&gt;
&lt;li&gt;100% frontend statement coverage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These requirements apply to eligible production source.&lt;/p&gt;

&lt;p&gt;The validation also checks coverage per file and source-file completeness, so a high aggregate number cannot hide an untested production file.&lt;/p&gt;

&lt;p&gt;The backend gate includes integration and volume tests using isolated PostgreSQL fixtures.&lt;/p&gt;

&lt;p&gt;The frontend gate includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;type checking&lt;/li&gt;
&lt;li&gt;public-export validation&lt;/li&gt;
&lt;li&gt;unit tests&lt;/li&gt;
&lt;li&gt;browser tests&lt;/li&gt;
&lt;li&gt;Playwright E2E tests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A release requires both complete runners to pass.&lt;/p&gt;

&lt;p&gt;Coverage itself is not treated as proof that the software is correct, but it is now one of the release gates rather than an informational metric.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integration test isolation
&lt;/h2&gt;

&lt;p&gt;The integration-test infrastructure was also reworked.&lt;/p&gt;

&lt;p&gt;Database-backed test collections now use controlled fixture startup and stronger isolation.&lt;/p&gt;

&lt;p&gt;Regression tests cover areas such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;deterministic paging&lt;/li&gt;
&lt;li&gt;database migration concurrency&lt;/li&gt;
&lt;li&gt;query counts&lt;/li&gt;
&lt;li&gt;full report exports&lt;/li&gt;
&lt;li&gt;application startup&lt;/li&gt;
&lt;li&gt;vertical workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This work exposed several issues that were difficult to see when tests shared too much infrastructure state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance testing
&lt;/h2&gt;

&lt;p&gt;The NGB performance-testing workspace was reorganized as part of this release as well.&lt;/p&gt;

&lt;p&gt;The Property Management suite now includes scenarios around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reads&lt;/li&gt;
&lt;li&gt;reporting&lt;/li&gt;
&lt;li&gt;document lifecycle operations&lt;/li&gt;
&lt;li&gt;posting&lt;/li&gt;
&lt;li&gt;capacity&lt;/li&gt;
&lt;li&gt;contention&lt;/li&gt;
&lt;li&gt;write-heavy workloads&lt;/li&gt;
&lt;li&gt;breakpoint testing&lt;/li&gt;
&lt;li&gt;focused diagnostic probes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The framework records workload configuration and revision identity so results can be compared offline without losing the context in which a run was executed.&lt;/p&gt;

&lt;p&gt;Trade and Agency Billing currently have lighter smoke scaffolds, while CRM does not yet have a dedicated k6 suite.&lt;/p&gt;

&lt;p&gt;I think it is important to state that explicitly instead of implying that all four verticals currently have identical performance-test depth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four verticals move together
&lt;/h2&gt;

&lt;p&gt;NGB currently includes four vertical applications:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Property Management&lt;/li&gt;
&lt;li&gt;Trade&lt;/li&gt;
&lt;li&gt;Agency Billing&lt;/li&gt;
&lt;li&gt;CRM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of them move to 3.0.0 together.&lt;/p&gt;

&lt;p&gt;The release also includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;20 &lt;code&gt;NGB.Platform.*&lt;/code&gt; NuGet packages&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@ngbplatform/ui@3.0.0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;APIs&lt;/li&gt;
&lt;li&gt;migrators&lt;/li&gt;
&lt;li&gt;background-job hosts&lt;/li&gt;
&lt;li&gt;watchdogs&lt;/li&gt;
&lt;li&gt;web applications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Backend components target .NET 10.&lt;/p&gt;

&lt;h2&gt;
  
  
  Breaking changes
&lt;/h2&gt;

&lt;p&gt;This is a coordinated breaking release.&lt;/p&gt;

&lt;p&gt;Mixing NGB 2.x and 3.x packages or web applications is not supported.&lt;/p&gt;

&lt;p&gt;Public service and repository interfaces changed, several DTOs changed, reporting contracts changed, and hosting responsibilities moved between packages.&lt;/p&gt;

&lt;p&gt;Applications consuming NGB packages should be recompiled against 3.0 instead of swapping individual assemblies into an existing 2.x deployment.&lt;/p&gt;

&lt;p&gt;The migration guide covers the complete upgrade sequence:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.ngbplatform.com/guides/migrating-to-3.0.html" rel="noopener noreferrer"&gt;https://docs.ngbplatform.com/guides/migrating-to-3.0.html&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What v3.0 means for NGB
&lt;/h2&gt;

&lt;p&gt;Previous NGB releases added major platform capabilities such as reusable packages, CRM, Document Actions, and Work Center.&lt;/p&gt;

&lt;p&gt;v3.0 is more about strengthening the foundation underneath them.&lt;/p&gt;

&lt;p&gt;The platform now has clearer architecture boundaries, more bounded execution paths, better behavior for large report workloads, fewer repeated database reads, and much stricter release validation.&lt;/p&gt;

&lt;p&gt;There is still a lot to build.&lt;/p&gt;

&lt;p&gt;But before adding more layers to the platform, I wanted the existing ones to have stronger boundaries and better operational characteristics.&lt;/p&gt;

&lt;p&gt;NGB is open source and built with .NET 10 and PostgreSQL.&lt;/p&gt;

&lt;p&gt;GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ngbplatform/NGB" rel="noopener noreferrer"&gt;https://github.com/ngbplatform/NGB&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NGB Platform v3.0.0 release:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ngbplatform/NGB/releases/tag/v3.0.0" rel="noopener noreferrer"&gt;https://github.com/ngbplatform/NGB/releases/tag/v3.0.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Documentation:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.ngbplatform.com" rel="noopener noreferrer"&gt;https://docs.ngbplatform.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tags: &lt;code&gt;dotnet&lt;/code&gt;, &lt;code&gt;opensource&lt;/code&gt;, &lt;code&gt;architecture&lt;/code&gt;, &lt;code&gt;postgresql&lt;/code&gt;&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>dotnet</category>
      <category>infrastructure</category>
      <category>performance</category>
    </item>
    <item>
      <title>NGB Platform v2.0: Document Actions + Work Center</title>
      <dc:creator>NGB Platform</dc:creator>
      <pubDate>Tue, 18 Aug 2026 13:15:00 +0000</pubDate>
      <link>https://dev.to/ngbplatform/ngb-platform-v20-document-actions-work-center-1l9p</link>
      <guid>https://dev.to/ngbplatform/ngb-platform-v20-document-actions-work-center-1l9p</guid>
      <description>&lt;h1&gt;
  
  
  NGB Platform v2.0: Document Actions + Work Center
&lt;/h1&gt;

&lt;p&gt;NGB Platform v2.0 introduces two closely connected capabilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Document Actions&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Work Center&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is simple: connect what can happen to a business document with the work users actually need to perform next.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/2l_7sQvYfJs"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Document Actions
&lt;/h2&gt;

&lt;p&gt;Document operations are now exposed through a single backend-driven action model.&lt;/p&gt;

&lt;p&gt;For every document, the backend determines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which actions the current user is allowed to see;&lt;/li&gt;
&lt;li&gt;whether an action is currently available;&lt;/li&gt;
&lt;li&gt;why an action may be disabled;&lt;/li&gt;
&lt;li&gt;how the action should be executed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The frontend no longer needs to duplicate these rules.&lt;/p&gt;

&lt;p&gt;Document Actions are also not limited to lifecycle operations such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Post&lt;/li&gt;
&lt;li&gt;Unpost&lt;/li&gt;
&lt;li&gt;Repost&lt;/li&gt;
&lt;li&gt;Mark for Deletion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The same model can represent derivations, navigation actions, and view actions.&lt;/p&gt;

&lt;p&gt;For example, a CRM Lead Intake can expose &lt;strong&gt;Create Lead Qualification&lt;/strong&gt; as a normal Document Action.&lt;/p&gt;

&lt;h2&gt;
  
  
  Work Center
&lt;/h2&gt;

&lt;p&gt;The second part of the release is the new Work Center.&lt;/p&gt;

&lt;p&gt;Work Center brings together two different concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tasks&lt;/strong&gt; — business work that still requires action.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Notifications&lt;/strong&gt; — information that the user should know about.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They are intentionally separate models, but presented through one attention queue.&lt;/p&gt;

&lt;p&gt;The badge in the application header is therefore not simply an unread notification count.&lt;/p&gt;

&lt;p&gt;It represents:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;open actionable tasks + unread notifications&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A task remains actionable even after the user has opened or read it.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Lead Intake to actionable work
&lt;/h2&gt;

&lt;p&gt;The video uses a CRM flow to demonstrate how these two capabilities work together.&lt;/p&gt;

&lt;p&gt;A Lead Intake is posted.&lt;/p&gt;

&lt;p&gt;That business event creates a task for the Sales team:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Qualify Lead&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The task is available in Work Center and is connected to its source document.&lt;/p&gt;

&lt;p&gt;If the task is assigned to a role, an eligible user can claim it.&lt;/p&gt;

&lt;p&gt;From Work Center, the user executes &lt;strong&gt;Create Lead Qualification&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is not a special Work Center command. It is the same Document Action infrastructure used by the document itself.&lt;/p&gt;

&lt;p&gt;The user completes the Lead Qualification and posts it with a &lt;strong&gt;Qualified&lt;/strong&gt; result.&lt;/p&gt;

&lt;p&gt;At that point, the original task is completed automatically.&lt;/p&gt;

&lt;p&gt;The important part is that nobody manually checks a box saying that the task is finished.&lt;/p&gt;

&lt;p&gt;The underlying business state determines that the work has actually been resolved.&lt;/p&gt;

&lt;p&gt;And the next task appears:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Convert Lead&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The process continues through the same model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tasks represent business state
&lt;/h2&gt;

&lt;p&gt;This distinction is important.&lt;/p&gt;

&lt;p&gt;Opening a task does not complete it.&lt;/p&gt;

&lt;p&gt;Reading a task does not complete it.&lt;/p&gt;

&lt;p&gt;Claiming a task does not complete it.&lt;/p&gt;

&lt;p&gt;The task stays active until the business condition behind it is resolved.&lt;/p&gt;

&lt;p&gt;That makes Work Center different from a traditional notification list.&lt;/p&gt;

&lt;p&gt;It represents actionable business work, not just messages about things that happened.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping the Platform generic
&lt;/h2&gt;

&lt;p&gt;Work Center itself does not know what a Lead Intake, Lead Qualification, or Lead Conversion means.&lt;/p&gt;

&lt;p&gt;The CRM vertical owns those business rules.&lt;/p&gt;

&lt;p&gt;The Platform provides the reusable infrastructure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Document Action definitions and execution;&lt;/li&gt;
&lt;li&gt;permission and availability evaluation;&lt;/li&gt;
&lt;li&gt;user and role task assignment;&lt;/li&gt;
&lt;li&gt;claiming and snoozing;&lt;/li&gt;
&lt;li&gt;tasks and notifications;&lt;/li&gt;
&lt;li&gt;automatic task lifecycle based on business events;&lt;/li&gt;
&lt;li&gt;attention tracking;&lt;/li&gt;
&lt;li&gt;the compact Work Center drawer;&lt;/li&gt;
&lt;li&gt;the full Work Center page;&lt;/li&gt;
&lt;li&gt;in-app notification preferences.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This keeps vertical-specific business behavior outside the Platform while still giving every vertical the same infrastructure to build on.&lt;/p&gt;

&lt;h2&gt;
  
  
  NGB Platform v2.0
&lt;/h2&gt;

&lt;p&gt;The main idea behind this release can be summarized in two lines:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Document Actions define what the user can do next.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Work Center shows what actually needs attention next.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Together, they connect document operations with actionable business work.&lt;/p&gt;

&lt;p&gt;Watch demo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/2l_7sQvYfJs" rel="noopener noreferrer"&gt;https://youtu.be/2l_7sQvYfJs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Source code:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ngbplatform/NGB" rel="noopener noreferrer"&gt;https://github.com/ngbplatform/NGB&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>postgres</category>
      <category>opensource</category>
      <category>architecture</category>
    </item>
    <item>
      <title>NGB Platform v1.3.1: CRM Demo Built with NuGet and npm Packages</title>
      <dc:creator>NGB Platform</dc:creator>
      <pubDate>Sun, 12 Jul 2026 16:54:47 +0000</pubDate>
      <link>https://dev.to/ngbplatform/ngb-platform-v131-crm-demo-built-with-nuget-and-npm-packages-5bfc</link>
      <guid>https://dev.to/ngbplatform/ngb-platform-v131-crm-demo-built-with-nuget-and-npm-packages-5bfc</guid>
      <description>&lt;p&gt;NGB Platform v1.3.1 is released.&lt;/p&gt;

&lt;p&gt;This release is an important milestone for the project because it shows something I wanted to prove from the beginning:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NGB is not a single vertical application.&lt;br&gt;&lt;br&gt;
NGB is a platform for building vertical business systems.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The new CRM demo is not intended to be a Salesforce replacement or a full CRM product.&lt;/p&gt;

&lt;p&gt;It is a demonstration of how a completely different business vertical can be built on top of NGB Platform using published packages.&lt;/p&gt;

&lt;p&gt;Live demo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://crm-demo.ngbplatform.com" rel="noopener noreferrer"&gt;https://crm-demo.ngbplatform.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Release:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ngbplatform/NGB/releases/tag/v1.3.1" rel="noopener noreferrer"&gt;https://github.com/ngbplatform/NGB/releases/tag/v1.3.1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ngbplatform/NGB" rel="noopener noreferrer"&gt;https://github.com/ngbplatform/NGB&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What changed in v1.3.1
&lt;/h2&gt;

&lt;p&gt;The main highlight of this release is the new &lt;strong&gt;NGB CRM demo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But the more important part is how it was built.&lt;/p&gt;

&lt;p&gt;The CRM demo consumes NGB Platform as packages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;NGB.Platform.*&lt;/code&gt; NuGet packages&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;@ngbplatform/ui&lt;/code&gt; npm package&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means the CRM demo does not need to clone the platform source projects directly.&lt;/p&gt;

&lt;p&gt;This is a major step for NGB because it moves the project closer to a real platform model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;platform core&lt;/li&gt;
&lt;li&gt;published backend packages&lt;/li&gt;
&lt;li&gt;published UI package&lt;/li&gt;
&lt;li&gt;vertical applications built on top&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why CRM?
&lt;/h2&gt;

&lt;p&gt;Previous NGB demos were closer to traditional business and ERP-like domains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Property Management&lt;/li&gt;
&lt;li&gt;Trade&lt;/li&gt;
&lt;li&gt;Agency Billing&lt;/li&gt;
&lt;li&gt;Accounting and reporting scenarios&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those demos are useful, but they can create the wrong impression.&lt;/p&gt;

&lt;p&gt;It may look like NGB is only about accounting-heavy systems.&lt;/p&gt;

&lt;p&gt;That is not the goal.&lt;/p&gt;

&lt;p&gt;NGB is designed for business applications in general:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;catalogs&lt;/li&gt;
&lt;li&gt;documents&lt;/li&gt;
&lt;li&gt;lifecycle actions&lt;/li&gt;
&lt;li&gt;posting semantics&lt;/li&gt;
&lt;li&gt;reference registers&lt;/li&gt;
&lt;li&gt;operational registers&lt;/li&gt;
&lt;li&gt;accounting registers&lt;/li&gt;
&lt;li&gt;reports&lt;/li&gt;
&lt;li&gt;auditability&lt;/li&gt;
&lt;li&gt;metadata-driven UI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some verticals need accounting.&lt;/p&gt;

&lt;p&gt;Some do not.&lt;/p&gt;

&lt;p&gt;CRM is a good example of a vertical that can use the NGB model without using the accounting engine at all.&lt;/p&gt;




&lt;h2&gt;
  
  
  CRM demo without accounting
&lt;/h2&gt;

&lt;p&gt;The CRM demo does not use the accounting engine.&lt;/p&gt;

&lt;p&gt;It also does not use operational accounting-style movements.&lt;/p&gt;

&lt;p&gt;That is the point.&lt;/p&gt;

&lt;p&gt;The demo is built around CRM concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;accounts&lt;/li&gt;
&lt;li&gt;contacts&lt;/li&gt;
&lt;li&gt;products&lt;/li&gt;
&lt;li&gt;opportunity stages&lt;/li&gt;
&lt;li&gt;lead intake&lt;/li&gt;
&lt;li&gt;lead qualification&lt;/li&gt;
&lt;li&gt;lead conversion&lt;/li&gt;
&lt;li&gt;opportunity updates&lt;/li&gt;
&lt;li&gt;quotes&lt;/li&gt;
&lt;li&gt;activity logs&lt;/li&gt;
&lt;li&gt;sales pipeline reporting&lt;/li&gt;
&lt;li&gt;activity reporting&lt;/li&gt;
&lt;li&gt;quote register reporting&lt;/li&gt;
&lt;li&gt;lead conversion funnel&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The CRM flow is document-driven.&lt;/p&gt;

&lt;p&gt;A lead is captured as a document.&lt;/p&gt;

&lt;p&gt;Qualification is a document.&lt;/p&gt;

&lt;p&gt;Lead conversion is a document.&lt;/p&gt;

&lt;p&gt;Opportunity updates are documents.&lt;/p&gt;

&lt;p&gt;Quotes are documents with reusable product lines.&lt;/p&gt;

&lt;p&gt;Activities are documents.&lt;/p&gt;

&lt;p&gt;When documents are posted, they update read-side projections through reference registers.&lt;/p&gt;

&lt;p&gt;Reports are built from those projections.&lt;/p&gt;

&lt;p&gt;So even without accounting, the same NGB platform ideas still apply:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;source documents → posting boundary → register projections → reports&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Why packages matter
&lt;/h2&gt;

&lt;p&gt;Before this release, it was possible to build verticals inside the repository.&lt;/p&gt;

&lt;p&gt;That is useful for development, but it is not enough to prove a platform.&lt;/p&gt;

&lt;p&gt;A real platform should be usable from the outside.&lt;/p&gt;

&lt;p&gt;With v1.3.1, NGB now has public package families:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NuGet packages for backend platform capabilities&lt;/li&gt;
&lt;li&gt;npm package for the UI framework&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes the platform boundary much clearer.&lt;/p&gt;

&lt;p&gt;A vertical solution can depend on NGB Platform packages instead of directly depending on platform source projects.&lt;/p&gt;

&lt;p&gt;That is important for several reasons.&lt;/p&gt;

&lt;p&gt;First, it validates the public API surface.&lt;/p&gt;

&lt;p&gt;If a vertical can only work by referencing internal source projects, the platform boundary is not real yet.&lt;/p&gt;

&lt;p&gt;Second, it makes versioning more meaningful.&lt;/p&gt;

&lt;p&gt;A vertical can target a specific platform version.&lt;/p&gt;

&lt;p&gt;Third, it makes the project easier to understand.&lt;/p&gt;

&lt;p&gt;Developers can look at CRM as an example of how to consume NGB Platform rather than digging through the entire platform implementation first.&lt;/p&gt;




&lt;h2&gt;
  
  
  Current live demos
&lt;/h2&gt;

&lt;p&gt;NGB now has multiple live demos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Property Management: &lt;a href="https://pm-demo.ngbplatform.com" rel="noopener noreferrer"&gt;https://pm-demo.ngbplatform.com&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Trade: &lt;a href="https://trade-demo.ngbplatform.com" rel="noopener noreferrer"&gt;https://trade-demo.ngbplatform.com&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Agency Billing: &lt;a href="https://ab-demo.ngbplatform.com" rel="noopener noreferrer"&gt;https://ab-demo.ngbplatform.com&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CRM: &lt;a href="https://crm-demo.ngbplatform.com" rel="noopener noreferrer"&gt;https://crm-demo.ngbplatform.com&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each demo shows a different type of vertical application built on the same platform foundation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;The CRM demo is intentionally not a full CRM product.&lt;/p&gt;

&lt;p&gt;That is not the purpose.&lt;/p&gt;

&lt;p&gt;The purpose is to show that NGB Platform can be used to build vertical business applications of different types and different complexity levels.&lt;/p&gt;

&lt;p&gt;With v1.3.1, NGB takes an important step toward that platform model:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;published packages, reusable UI, and a new vertical built as an external consumer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Release:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ngbplatform/NGB/releases/tag/v1.3.1" rel="noopener noreferrer"&gt;https://github.com/ngbplatform/NGB/releases/tag/v1.3.1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ngbplatform/NGB" rel="noopener noreferrer"&gt;https://github.com/ngbplatform/NGB&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>postgres</category>
      <category>opensource</category>
      <category>architecture</category>
    </item>
    <item>
      <title>User Roles &amp; Permissions for Business</title>
      <dc:creator>NGB Platform</dc:creator>
      <pubDate>Tue, 23 Jun 2026 13:05:33 +0000</pubDate>
      <link>https://dev.to/ngbplatform/user-roles-permissions-for-business-3g9p</link>
      <guid>https://dev.to/ngbplatform/user-roles-permissions-for-business-3g9p</guid>
      <description>&lt;p&gt;NGB v1.2.0 is now available.&lt;/p&gt;

&lt;p&gt;This release adds &lt;strong&gt;user roles, permissions, and application-level access management&lt;/strong&gt; to NGB Platform.&lt;/p&gt;

&lt;p&gt;The core idea is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Keycloak handles identity.&lt;br&gt;
NGB handles application access.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/zaW638VhoT8"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;Authentication and authorization are not the same thing.&lt;/p&gt;

&lt;p&gt;Authentication answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Who is this user?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But a business platform also needs to answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What is this user allowed to do inside the application?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For simple apps, this can often be hardcoded.&lt;/p&gt;

&lt;p&gt;For serious business applications, that does not scale.&lt;/p&gt;

&lt;p&gt;Users have different responsibilities.&lt;br&gt;
Different departments need different access.&lt;br&gt;
Some users should only view data.&lt;br&gt;
Some users can create drafts.&lt;br&gt;
Some can post documents.&lt;br&gt;
Some can run reports.&lt;br&gt;
Some can export data.&lt;br&gt;
Some can manage other users and roles.&lt;/p&gt;

&lt;p&gt;That is why NGB v1.2.0 adds application-level access management as a platform capability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keycloak for identity, NGB for application access
&lt;/h2&gt;

&lt;p&gt;NGB does not try to replace Keycloak.&lt;/p&gt;

&lt;p&gt;Keycloak remains responsible for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;authentication&lt;/li&gt;
&lt;li&gt;SSO sessions&lt;/li&gt;
&lt;li&gt;external user identity&lt;/li&gt;
&lt;li&gt;enabled / disabled identity-provider users&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;NGB is responsible for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;application roles&lt;/li&gt;
&lt;li&gt;permission assignments&lt;/li&gt;
&lt;li&gt;effective access&lt;/li&gt;
&lt;li&gt;permission-aware metadata&lt;/li&gt;
&lt;li&gt;menu and report filtering&lt;/li&gt;
&lt;li&gt;backend permission checks&lt;/li&gt;
&lt;li&gt;security audit records&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This separation is intentional.&lt;/p&gt;

&lt;p&gt;Keycloak owns identity.&lt;br&gt;
NGB owns business application access.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was added in v1.2.0
&lt;/h2&gt;

&lt;p&gt;This release adds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NGB-managed roles and permissions&lt;/li&gt;
&lt;li&gt;user management&lt;/li&gt;
&lt;li&gt;role assignment&lt;/li&gt;
&lt;li&gt;permission definitions&lt;/li&gt;
&lt;li&gt;permission matrix&lt;/li&gt;
&lt;li&gt;effective access snapshots&lt;/li&gt;
&lt;li&gt;access-version invalidation&lt;/li&gt;
&lt;li&gt;permission-aware UI surfaces&lt;/li&gt;
&lt;li&gt;backend-enforced access checks&lt;/li&gt;
&lt;li&gt;Keycloak Admin integration&lt;/li&gt;
&lt;li&gt;security audit foundations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first vertical wired with this model is the NGB Property Management demo.&lt;/p&gt;

&lt;p&gt;It includes seeded roles such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;PM Administrator&lt;/li&gt;
&lt;li&gt;PM Accountant&lt;/li&gt;
&lt;li&gt;PM AR Clerk&lt;/li&gt;
&lt;li&gt;PM AP Clerk&lt;/li&gt;
&lt;li&gt;PM Property Manager&lt;/li&gt;
&lt;li&gt;PM Maintenance Coordinator&lt;/li&gt;
&lt;li&gt;PM Auditor&lt;/li&gt;
&lt;li&gt;PM Read Only&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are not just UI labels.&lt;/p&gt;

&lt;p&gt;They map to concrete permissions across documents, catalogs, reports, accounting tools, admin pages, audit access, and other platform surfaces.&lt;/p&gt;

&lt;h2&gt;
  
  
  Effective access
&lt;/h2&gt;

&lt;p&gt;One important part of this release is &lt;strong&gt;effective access&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A user can have multiple roles.&lt;/p&gt;

&lt;p&gt;NGB combines those roles and shows what the user can actually access.&lt;/p&gt;

&lt;p&gt;That makes administration easier because you can answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can this user execute this report?&lt;/li&gt;
&lt;li&gt;Can this user export report data?&lt;/li&gt;
&lt;li&gt;Can this user manage roles?&lt;/li&gt;
&lt;li&gt;Can this user access audit information?&lt;/li&gt;
&lt;li&gt;Can this user post a specific document type?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is especially important for business software, where permissions are not just technical details. They are part of the operating model of the company.&lt;/p&gt;

&lt;h2&gt;
  
  
  Permission-aware UI, but backend as the source of truth
&lt;/h2&gt;

&lt;p&gt;The UI is now permission-aware.&lt;/p&gt;

&lt;p&gt;Menus, document metadata, catalog metadata, reports, command palette entries, admin pages, and actions can be filtered or disabled based on the current user's access.&lt;/p&gt;

&lt;p&gt;But the UI is not the security boundary.&lt;/p&gt;

&lt;p&gt;Backend checks are still enforced by the runtime.&lt;/p&gt;

&lt;p&gt;Hiding a button improves the user experience, but backend authorization is what actually protects the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is a platform feature
&lt;/h2&gt;

&lt;p&gt;NGB is a document-driven business application platform.&lt;/p&gt;

&lt;p&gt;That means access control cannot be implemented as a one-off feature for one screen or one demo.&lt;/p&gt;

&lt;p&gt;Documents, catalogs, reports, accounting tools, operational registers, reference registers, admin pages, and vertical-specific features all need a consistent authorization model.&lt;/p&gt;

&lt;p&gt;That is what this release starts to provide.&lt;/p&gt;

&lt;p&gt;NGB v1.2.0 is an important foundation for production-oriented vertical business applications where users do not all have the same access.&lt;/p&gt;

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

&lt;p&gt;GitHub: &lt;a href="https://github.com/ngbplatform/NGB" rel="noopener noreferrer"&gt;https://github.com/ngbplatform/NGB&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Documentation: &lt;a href="https://docs.ngbplatform.com/" rel="noopener noreferrer"&gt;https://docs.ngbplatform.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Release: &lt;a href="https://github.com/ngbplatform/NGB/releases/tag/v1.2.0" rel="noopener noreferrer"&gt;https://github.com/ngbplatform/NGB/releases/tag/v1.2.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Video: &lt;a href="https://youtu.be/zaW638VhoT8" rel="noopener noreferrer"&gt;https://youtu.be/zaW638VhoT8&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>postgres</category>
      <category>keycloak</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Reference Registers in NGB Platform: Effective Business State Over Time</title>
      <dc:creator>NGB Platform</dc:creator>
      <pubDate>Thu, 18 Jun 2026 13:08:46 +0000</pubDate>
      <link>https://dev.to/ngbplatform/reference-registers-in-ngb-platform-effective-business-state-over-time-3n4b</link>
      <guid>https://dev.to/ngbplatform/reference-registers-in-ngb-platform-effective-business-state-over-time-3n4b</guid>
      <description>&lt;p&gt;In many business applications, reference data starts simple.&lt;/p&gt;

&lt;p&gt;An item has a price.&lt;br&gt;
A contract has terms.&lt;br&gt;
A rate has a value.&lt;br&gt;
A customer has settings.&lt;/p&gt;

&lt;p&gt;At first, it feels natural to store this as one current value.&lt;/p&gt;

&lt;p&gt;But serious business software usually needs more than the current value.&lt;/p&gt;

&lt;p&gt;It needs to know what value was effective at a specific point in time.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/Ej0iDW3zyic"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with one mutable current value
&lt;/h2&gt;

&lt;p&gt;Imagine an item price.&lt;/p&gt;

&lt;p&gt;If the price changes today, should old documents suddenly look like they used the new price?&lt;/p&gt;

&lt;p&gt;Usually not.&lt;/p&gt;

&lt;p&gt;A sales document created last month should be able to use the price that was effective last month.&lt;/p&gt;

&lt;p&gt;A report should be able to explain which price was active on the report date.&lt;/p&gt;

&lt;p&gt;A new document should use the currently effective price.&lt;/p&gt;

&lt;p&gt;That is hard to model if the system only stores one mutable &lt;code&gt;current_price&lt;/code&gt; field.&lt;/p&gt;

&lt;p&gt;When the value changes, history becomes harder to explain.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are Reference Registers?
&lt;/h2&gt;

&lt;p&gt;In NGB Platform, Reference Registers track effective reference state over time.&lt;/p&gt;

&lt;p&gt;They are not Operational Registers.&lt;/p&gt;

&lt;p&gt;They are not Accounting entries.&lt;/p&gt;

&lt;p&gt;Reference Registers answer a different question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What value, rule, status, or relationship was effective at a specific point in time?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Examples can include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;item prices;&lt;/li&gt;
&lt;li&gt;rates;&lt;/li&gt;
&lt;li&gt;contract terms;&lt;/li&gt;
&lt;li&gt;assignments;&lt;/li&gt;
&lt;li&gt;statuses;&lt;/li&gt;
&lt;li&gt;rules;&lt;/li&gt;
&lt;li&gt;configuration values.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the Trade vertical, the clearest example is item pricing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: Item Price Updates in Trade
&lt;/h2&gt;

&lt;p&gt;In the Trade vertical, item prices are changed through an &lt;code&gt;Item Price Update&lt;/code&gt; document.&lt;/p&gt;

&lt;p&gt;The document contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;effective date;&lt;/li&gt;
&lt;li&gt;item;&lt;/li&gt;
&lt;li&gt;price type;&lt;/li&gt;
&lt;li&gt;currency;&lt;/li&gt;
&lt;li&gt;unit price.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When the document is posted, it writes Reference Register rows.&lt;/p&gt;

&lt;p&gt;Those rows represent the effective item price state.&lt;/p&gt;

&lt;p&gt;The important part is that the previous value is not silently overwritten.&lt;/p&gt;

&lt;p&gt;A new value becomes effective from a specific date.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current Item Prices
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;Current Item Prices&lt;/code&gt; report reads from Reference Register state.&lt;/p&gt;

&lt;p&gt;It can show the effective price by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;item;&lt;/li&gt;
&lt;li&gt;price type;&lt;/li&gt;
&lt;li&gt;currency;&lt;/li&gt;
&lt;li&gt;effective date;&lt;/li&gt;
&lt;li&gt;source document.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gives the system a clear answer to a practical business question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What price is currently effective for this item and price type?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But the system still keeps the history behind that answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters for documents
&lt;/h2&gt;

&lt;p&gt;A Sales Invoice should not just guess a price from a mutable field.&lt;/p&gt;

&lt;p&gt;It should be able to use the price that is effective for its context.&lt;/p&gt;

&lt;p&gt;That context may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;document date;&lt;/li&gt;
&lt;li&gt;item;&lt;/li&gt;
&lt;li&gt;price type;&lt;/li&gt;
&lt;li&gt;currency;&lt;/li&gt;
&lt;li&gt;customer or other vertical-specific dimensions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why Reference Registers are useful.&lt;/p&gt;

&lt;p&gt;They make reference state time-aware, durable, and explainable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reference Registers are not Operational Registers
&lt;/h2&gt;

&lt;p&gt;Operational Registers track operational movements and balances.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inventory increased;&lt;/li&gt;
&lt;li&gt;inventory decreased;&lt;/li&gt;
&lt;li&gt;quantity was consumed;&lt;/li&gt;
&lt;li&gt;balance changed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reference Registers track effective reference state.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;this item price is effective from this date;&lt;/li&gt;
&lt;li&gt;this rate applies from this date;&lt;/li&gt;
&lt;li&gt;these terms became effective from this date.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are important, but they solve different problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reference Registers are not Accounting
&lt;/h2&gt;

&lt;p&gt;Accounting tracks financial ledger effects.&lt;/p&gt;

&lt;p&gt;Reference Registers do not replace accounting.&lt;/p&gt;

&lt;p&gt;They answer a different question.&lt;/p&gt;

&lt;p&gt;Accounting says what financial entries were created.&lt;/p&gt;

&lt;p&gt;Reference Registers say what reference value, rule, or state was effective at a point in time.&lt;/p&gt;

&lt;p&gt;In NGB Platform, Operational Registers, Reference Registers, and Accounting are peer platform capabilities.&lt;/p&gt;

&lt;p&gt;A document action can create:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Operational Register movements;&lt;/li&gt;
&lt;li&gt;Reference Register changes;&lt;/li&gt;
&lt;li&gt;Accounting entries;&lt;/li&gt;
&lt;li&gt;any combination of them;&lt;/li&gt;
&lt;li&gt;or none of them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Reference Registers matter
&lt;/h2&gt;

&lt;p&gt;Reference Registers help avoid a common problem in business software:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Important business values are treated as mutable fields, and history becomes unclear.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With Reference Registers, the system can preserve time-aware business state.&lt;/p&gt;

&lt;p&gt;That makes documents, reports, and future actions easier to explain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The core idea
&lt;/h2&gt;

&lt;p&gt;The core idea is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Reference Registers track effective business state over time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In the Trade vertical, that means item prices can change through source documents, become effective from specific dates, and remain available for reports and document processing.&lt;/p&gt;

&lt;p&gt;That is one of the reasons NGB Platform is built around documents, actions, durable effects, and traceable business state.&lt;/p&gt;

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

&lt;p&gt;Video: &lt;a href="https://youtu.be/Ej0iDW3zyic" rel="noopener noreferrer"&gt;https://youtu.be/Ej0iDW3zyic&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/ngbplatform/NGB" rel="noopener noreferrer"&gt;https://github.com/ngbplatform/NGB&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://ngbplatform.com" rel="noopener noreferrer"&gt;https://ngbplatform.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Docs: &lt;a href="https://docs.ngbplatform.com" rel="noopener noreferrer"&gt;https://docs.ngbplatform.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>postgres</category>
      <category>architecture</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Operational Registers in NGB Platform: Tracking Operational Business State</title>
      <dc:creator>NGB Platform</dc:creator>
      <pubDate>Tue, 16 Jun 2026 13:03:26 +0000</pubDate>
      <link>https://dev.to/ngbplatform/operational-registers-in-ngb-platform-tracking-operational-business-state-kme</link>
      <guid>https://dev.to/ngbplatform/operational-registers-in-ngb-platform-tracking-operational-business-state-kme</guid>
      <description>&lt;p&gt;Most business applications eventually need to track more than documents.&lt;/p&gt;

&lt;p&gt;A purchase document is not only a form.&lt;/p&gt;

&lt;p&gt;A sales document is not only a row in a table.&lt;/p&gt;

&lt;p&gt;A business action can change operational state:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inventory available;&lt;/li&gt;
&lt;li&gt;quantity consumed;&lt;/li&gt;
&lt;li&gt;customer balance;&lt;/li&gt;
&lt;li&gt;resource usage;&lt;/li&gt;
&lt;li&gt;allocation;&lt;/li&gt;
&lt;li&gt;operational progress;&lt;/li&gt;
&lt;li&gt;reportable state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is where Operational Registers come in.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/Ra54WlrXSJU"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  What are Operational Registers?
&lt;/h2&gt;

&lt;p&gt;In NGB Platform, Operational Registers are used to track durable operational business state.&lt;/p&gt;

&lt;p&gt;They are not accounting entries.&lt;/p&gt;

&lt;p&gt;They are not just audit logs.&lt;/p&gt;

&lt;p&gt;They answer a different question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What changed in the business operation?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how many units are available?&lt;/li&gt;
&lt;li&gt;how much quantity was consumed?&lt;/li&gt;
&lt;li&gt;what balance changed?&lt;/li&gt;
&lt;li&gt;which resource was allocated?&lt;/li&gt;
&lt;li&gt;what state should be available for reports or future business actions?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Operational Registers are about operational truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not store this directly on the document?
&lt;/h2&gt;

&lt;p&gt;A document stores business intent and context.&lt;/p&gt;

&lt;p&gt;For example, a purchase document can say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We received these items into this warehouse.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A sales document can say:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We sold these items to this customer.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But operational state should not be hidden only inside mutable document rows.&lt;/p&gt;

&lt;p&gt;If inventory availability, balances, usage, or progress are stored only as fields on documents, the system becomes harder to explain and harder to report on.&lt;/p&gt;

&lt;p&gt;Instead, a posted document action can create durable Operational Register movements.&lt;/p&gt;

&lt;p&gt;That gives the system a separate, reportable history of what changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: purchase and sale
&lt;/h2&gt;

&lt;p&gt;In the Trade vertical, a purchase document can increase inventory.&lt;/p&gt;

&lt;p&gt;A sales document can decrease inventory.&lt;/p&gt;

&lt;p&gt;The documents represent the business events.&lt;/p&gt;

&lt;p&gt;The Operational Register rows record the operational effects.&lt;/p&gt;

&lt;p&gt;A simplified example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Purchase Invoice → +10 units
Sales Invoice    → -3 units
Available stock  →  7 units
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important part is not just the final number.&lt;/p&gt;

&lt;p&gt;The important part is that the number can be explained through durable movements.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operational Registers are not Accounting
&lt;/h2&gt;

&lt;p&gt;Operational Registers are separate from Accounting.&lt;/p&gt;

&lt;p&gt;Accounting tracks financial ledger effects.&lt;/p&gt;

&lt;p&gt;Operational Registers track operational movements and balances.&lt;/p&gt;

&lt;p&gt;A sale may create accounting entries, but it may also change inventory, quantities, allocations, usage, or other operational state.&lt;/p&gt;

&lt;p&gt;Those are different concerns.&lt;/p&gt;

&lt;p&gt;Putting every business effect into accounting would be wrong.&lt;/p&gt;

&lt;p&gt;Not every business document is financial.&lt;/p&gt;

&lt;p&gt;And not every business effect belongs in accounting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Operational Registers are not Audit Logs
&lt;/h2&gt;

&lt;p&gt;Operational Registers are also separate from audit history.&lt;/p&gt;

&lt;p&gt;Audit history answers questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;who did something?&lt;/li&gt;
&lt;li&gt;when did they do it?&lt;/li&gt;
&lt;li&gt;what action was executed?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Operational Registers answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;what quantity changed?&lt;/li&gt;
&lt;li&gt;what balance changed?&lt;/li&gt;
&lt;li&gt;what operational state is now available?&lt;/li&gt;
&lt;li&gt;what can reports and future actions rely on?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both are useful, but they solve different problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  OR, RR, and Accounting are peer capabilities
&lt;/h2&gt;

&lt;p&gt;In NGB Platform, Operational Registers, Reference Registers, and Accounting are peer platform capabilities.&lt;/p&gt;

&lt;p&gt;Operational Registers track operational movements and balances.&lt;/p&gt;

&lt;p&gt;Reference Registers track effective reference state over time.&lt;/p&gt;

&lt;p&gt;Accounting tracks financial ledger effects.&lt;/p&gt;

&lt;p&gt;A document action can create:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Operational Register movements;&lt;/li&gt;
&lt;li&gt;Reference Register changes;&lt;/li&gt;
&lt;li&gt;Accounting entries;&lt;/li&gt;
&lt;li&gt;any combination of them;&lt;/li&gt;
&lt;li&gt;or none of them.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That flexibility matters because different vertical business applications need different kinds of durable business state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Operational Registers matter
&lt;/h2&gt;

&lt;p&gt;Operational Registers make business software easier to reason about.&lt;/p&gt;

&lt;p&gt;They make operational state:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;durable;&lt;/li&gt;
&lt;li&gt;reportable;&lt;/li&gt;
&lt;li&gt;explainable;&lt;/li&gt;
&lt;li&gt;reusable by future actions;&lt;/li&gt;
&lt;li&gt;separate from accounting;&lt;/li&gt;
&lt;li&gt;separate from audit history.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is especially important in document-driven applications where business actions create consequences that should outlive the document form itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The core idea
&lt;/h2&gt;

&lt;p&gt;The core idea is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Documents describe business intent.&lt;br&gt;
Actions create durable business history.&lt;br&gt;
Operational Registers record operational movements and balances.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That gives NGB Platform a reusable way to model operational truth across different vertical business applications.&lt;/p&gt;

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

&lt;p&gt;Video: &lt;a href="https://youtu.be/Ra54WlrXSJU" rel="noopener noreferrer"&gt;https://youtu.be/Ra54WlrXSJU&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/ngbplatform/NGB" rel="noopener noreferrer"&gt;https://github.com/ngbplatform/NGB&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://ngbplatform.com" rel="noopener noreferrer"&gt;https://ngbplatform.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Docs: &lt;a href="https://docs.ngbplatform.com" rel="noopener noreferrer"&gt;https://docs.ngbplatform.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>postgres</category>
      <category>architecture</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Document Action Effects Report: How NGB Models Business Flows</title>
      <dc:creator>NGB Platform</dc:creator>
      <pubDate>Thu, 11 Jun 2026 13:59:43 +0000</pubDate>
      <link>https://dev.to/ngbplatform/document-action-effects-report-how-ngb-models-business-flows-550p</link>
      <guid>https://dev.to/ngbplatform/document-action-effects-report-how-ngb-models-business-flows-550p</guid>
      <description>&lt;p&gt;Most business applications start as CRUD.&lt;/p&gt;

&lt;p&gt;Create a record.&lt;br&gt;
Edit it.&lt;br&gt;
Delete it.&lt;br&gt;
Show it in a list.&lt;/p&gt;

&lt;p&gt;That works for simple data management.&lt;/p&gt;

&lt;p&gt;But serious business software usually needs a different model.&lt;/p&gt;

&lt;p&gt;A business document is not just a row in a table.&lt;/p&gt;

&lt;p&gt;It represents business intent.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/ua44kdbpszA"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Document → Action → Effects → Report
&lt;/h2&gt;

&lt;p&gt;In NGB Platform, a business flow starts with a document.&lt;/p&gt;

&lt;p&gt;The document can represent an invoice, a lease, a payment, an order, or another business event.&lt;/p&gt;

&lt;p&gt;The important part is that the document has business meaning before and after the user acts on it.&lt;/p&gt;

&lt;p&gt;Then the user executes a business action.&lt;/p&gt;

&lt;p&gt;In NGB, documents can move through actions such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Draft;&lt;/li&gt;
&lt;li&gt;Post;&lt;/li&gt;
&lt;li&gt;Apply;&lt;/li&gt;
&lt;li&gt;Mark for Deletion.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These actions are not just CRUD operations.&lt;/p&gt;

&lt;p&gt;They represent business boundaries.&lt;/p&gt;

&lt;h2&gt;
  
  
  Actions create durable business history
&lt;/h2&gt;

&lt;p&gt;A business action may create durable business history.&lt;/p&gt;

&lt;p&gt;Depending on the document and the vertical, that history may include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Operational Register movements;&lt;/li&gt;
&lt;li&gt;Reference Register changes;&lt;/li&gt;
&lt;li&gt;Accounting entries;&lt;/li&gt;
&lt;li&gt;audit history;&lt;/li&gt;
&lt;li&gt;document relationships;&lt;/li&gt;
&lt;li&gt;reportable state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But not every document creates every kind of effect.&lt;/p&gt;

&lt;p&gt;Some documents create several effects.&lt;/p&gt;

&lt;p&gt;Some create one.&lt;/p&gt;

&lt;p&gt;Some posted documents create no register or accounting movements at all, but still represent an important business boundary.&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;

&lt;p&gt;Posting is not the same thing as “creating accounting entries”.&lt;/p&gt;

&lt;p&gt;Posting is a document lifecycle boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Effects depend on the document
&lt;/h2&gt;

&lt;p&gt;In NGB, Operational Registers, Reference Registers, and Accounting are peer platform capabilities.&lt;/p&gt;

&lt;p&gt;A document action may produce movements in any combination of them.&lt;/p&gt;

&lt;p&gt;Or it may produce no register/accounting movements at all.&lt;/p&gt;

&lt;p&gt;The platform should not force every document into the same shape.&lt;/p&gt;

&lt;p&gt;A lease, an invoice, a payment, and an operational document can all have different consequences.&lt;/p&gt;

&lt;p&gt;The important part is that the system preserves the business meaning of the action.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reports should stay connected to the source
&lt;/h2&gt;

&lt;p&gt;Reports should not be disconnected from the documents and actions behind them.&lt;/p&gt;

&lt;p&gt;When users see a number, status, or result, they should be able to understand where it came from.&lt;/p&gt;

&lt;p&gt;That means reports should stay connected to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;source documents;&lt;/li&gt;
&lt;li&gt;business actions;&lt;/li&gt;
&lt;li&gt;durable business history;&lt;/li&gt;
&lt;li&gt;register movements;&lt;/li&gt;
&lt;li&gt;accounting entries when they exist;&lt;/li&gt;
&lt;li&gt;audit history;&lt;/li&gt;
&lt;li&gt;related records.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This traceability is part of the architecture, not just a UI feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  The core idea
&lt;/h2&gt;

&lt;p&gt;The core idea behind NGB Platform is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Documents represent intent.&lt;br&gt;
Actions create durable business history.&lt;br&gt;
Reports stay connected to the source.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is why NGB is built as a document-driven business application platform on .NET and PostgreSQL.&lt;/p&gt;

&lt;p&gt;It is not a low-code CRUD generator.&lt;/p&gt;

&lt;p&gt;It is not only an accounting platform.&lt;/p&gt;

&lt;p&gt;It is a reusable foundation for building vertical business applications with catalogs, documents, actions, Operational Registers, Reference Registers, Accounting, audit history, reporting, metadata-driven UI, and traceability.&lt;/p&gt;

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

&lt;p&gt;YouTube video: &lt;a href="https://youtu.be/ua44kdbpszA" rel="noopener noreferrer"&gt;https://youtu.be/ua44kdbpszA&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/ngbplatform/NGB" rel="noopener noreferrer"&gt;https://github.com/ngbplatform/NGB&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://ngbplatform.com" rel="noopener noreferrer"&gt;https://ngbplatform.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Docs: &lt;a href="https://docs.ngbplatform.com" rel="noopener noreferrer"&gt;https://docs.ngbplatform.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>postgres</category>
      <category>architecture</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Why CRUD Is Not Enough for Serious Business Apps</title>
      <dc:creator>NGB Platform</dc:creator>
      <pubDate>Tue, 09 Jun 2026 13:02:15 +0000</pubDate>
      <link>https://dev.to/ngbplatform/why-crud-is-not-enough-for-serious-business-apps-5agf</link>
      <guid>https://dev.to/ngbplatform/why-crud-is-not-enough-for-serious-business-apps-5agf</guid>
      <description>&lt;p&gt;Most business applications start as CRUD.&lt;/p&gt;

&lt;p&gt;Create a record.&lt;br&gt;
Edit it.&lt;br&gt;
Delete it.&lt;br&gt;
Show it in a list.&lt;/p&gt;

&lt;p&gt;That works well at the beginning.&lt;/p&gt;

&lt;p&gt;But serious business software usually does not stay that simple.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/bgMmbLHz3M8"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  When CRUD stops being enough
&lt;/h2&gt;

&lt;p&gt;CRUD is a good starting point for simple data management.&lt;/p&gt;

&lt;p&gt;But in real business applications, records often become business documents.&lt;/p&gt;

&lt;p&gt;And a business document is not just a row in a table.&lt;/p&gt;

&lt;p&gt;It can have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;status;&lt;/li&gt;
&lt;li&gt;lifecycle actions;&lt;/li&gt;
&lt;li&gt;business meaning;&lt;/li&gt;
&lt;li&gt;audit history;&lt;/li&gt;
&lt;li&gt;related documents;&lt;/li&gt;
&lt;li&gt;reportable consequences;&lt;/li&gt;
&lt;li&gt;traceability requirements.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An invoice is not only a row.&lt;br&gt;
A lease is not only a row.&lt;br&gt;
A payment is not only a row.&lt;br&gt;
An inventory movement is not only a row.&lt;/p&gt;

&lt;p&gt;These documents represent business intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Actions matter
&lt;/h2&gt;

&lt;p&gt;In a CRUD application, the main operations are usually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;create;&lt;/li&gt;
&lt;li&gt;read;&lt;/li&gt;
&lt;li&gt;update;&lt;/li&gt;
&lt;li&gt;delete.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In business software, the important operations often look different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;post;&lt;/li&gt;
&lt;li&gt;approve;&lt;/li&gt;
&lt;li&gt;apply;&lt;/li&gt;
&lt;li&gt;complete;&lt;/li&gt;
&lt;li&gt;close;&lt;/li&gt;
&lt;li&gt;reverse;&lt;/li&gt;
&lt;li&gt;trace.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These actions are not just UI buttons.&lt;/p&gt;

&lt;p&gt;They represent business boundaries.&lt;/p&gt;

&lt;p&gt;An action may create durable effects. Depending on the document and the vertical, those effects may include Operational Register movements, Reference Register changes, Accounting entries, audit history, document relationships, reporting state, or any combination of them.&lt;/p&gt;

&lt;p&gt;Sometimes a posted document may create no register or accounting movements at all.&lt;/p&gt;

&lt;p&gt;For example, a lease can be posted because the business state itself is meaningful, even if it does not create accounting or register movements at that moment.&lt;/p&gt;

&lt;p&gt;That is an important distinction.&lt;/p&gt;

&lt;p&gt;Posting is not the same thing as “creating accounting entries”.&lt;/p&gt;

&lt;p&gt;Posting is a business lifecycle boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reports need traceability
&lt;/h2&gt;

&lt;p&gt;Another place where CRUD starts to break down is reporting.&lt;/p&gt;

&lt;p&gt;In many systems, reports become disconnected from the source documents that created the numbers.&lt;/p&gt;

&lt;p&gt;That creates a problem:&lt;/p&gt;

&lt;p&gt;A user sees a number, but cannot easily understand where it came from.&lt;/p&gt;

&lt;p&gt;In serious business applications, reports should not be dead ends.&lt;/p&gt;

&lt;p&gt;A report should stay connected to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;source documents;&lt;/li&gt;
&lt;li&gt;business actions;&lt;/li&gt;
&lt;li&gt;durable effects;&lt;/li&gt;
&lt;li&gt;registers;&lt;/li&gt;
&lt;li&gt;audit history;&lt;/li&gt;
&lt;li&gt;related records.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That traceability is part of the architecture, not just a UI feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I’m building NGB Platform
&lt;/h2&gt;

&lt;p&gt;This is the gap NGB Platform is built for.&lt;/p&gt;

&lt;p&gt;NGB Platform is an open-source .NET + PostgreSQL platform for document-driven business applications.&lt;/p&gt;

&lt;p&gt;The core idea is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Documents represent business intent.&lt;br&gt;
Actions create durable business history.&lt;br&gt;
Reports should stay connected to source documents.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;NGB is not a low-code CRUD generator.&lt;/p&gt;

&lt;p&gt;It is also not only an accounting platform.&lt;/p&gt;

&lt;p&gt;It provides a reusable foundation for business applications built around catalogs, documents, lifecycle actions, Operational Registers, Reference Registers, Accounting, audit history, reporting, metadata-driven UI, and vertical demos.&lt;/p&gt;

&lt;p&gt;The goal is to make the hard parts of serious business software reusable.&lt;/p&gt;

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

&lt;p&gt;GitHub: &lt;a href="https://github.com/ngbplatform/NGB" rel="noopener noreferrer"&gt;https://github.com/ngbplatform/NGB&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://ngbplatform.com" rel="noopener noreferrer"&gt;https://ngbplatform.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Docs: &lt;a href="https://docs.ngbplatform.com" rel="noopener noreferrer"&gt;https://docs.ngbplatform.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;YouTube video: &lt;a href="https://youtu.be/bgMmbLHz3M8" rel="noopener noreferrer"&gt;https://youtu.be/bgMmbLHz3M8&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>postgres</category>
      <category>architecture</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Testing NGB Platform Beyond a Small Demo Dataset with k6 and TypeScript</title>
      <dc:creator>NGB Platform</dc:creator>
      <pubDate>Wed, 20 May 2026 14:54:09 +0000</pubDate>
      <link>https://dev.to/ngbplatform/testing-ngb-platform-beyond-a-small-demo-dataset-with-k6-and-typescript-47e3</link>
      <guid>https://dev.to/ngbplatform/testing-ngb-platform-beyond-a-small-demo-dataset-with-k6-and-typescript-47e3</guid>
      <description>&lt;p&gt;I recently released &lt;strong&gt;NGB Platform v1.1.1&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The main addition is the first &lt;strong&gt;NGB Performance Tests Framework&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is not just a set of endpoint benchmarks.&lt;/p&gt;

&lt;p&gt;NGB Platform is an open-source, metadata-driven business platform for building accounting-first industry solutions. The goal is not to build isolated CRUD applications, but complete business applications where documents, catalogs, accounting, audit history, workflows, reports, and background processes are part of the same architecture.&lt;/p&gt;

&lt;p&gt;So performance testing has to follow the same idea.&lt;/p&gt;

&lt;p&gt;It needs to test real platform behavior, not only isolated HTTP latency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why performance testing matters for NGB
&lt;/h2&gt;

&lt;p&gt;In many applications, performance testing starts with a few simple endpoint checks.&lt;/p&gt;

&lt;p&gt;That can be useful.&lt;/p&gt;

&lt;p&gt;But it does not answer the most important questions for a business platform.&lt;/p&gt;

&lt;p&gt;For NGB, the important questions are different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can users browse documents while other users are posting documents?&lt;/li&gt;
&lt;li&gt;Can reports stay usable as data volume grows?&lt;/li&gt;
&lt;li&gt;Can audit history remain readable under pressure?&lt;/li&gt;
&lt;li&gt;Can accounting effects be opened quickly after posting?&lt;/li&gt;
&lt;li&gt;Can document flow stay responsive?&lt;/li&gt;
&lt;li&gt;Can the platform preserve business correctness while handling mixed read/write workloads?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;NGB is accounting-first.&lt;/p&gt;

&lt;p&gt;That means a posted document is not just a saved record.&lt;/p&gt;

&lt;p&gt;It can produce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accounting entries&lt;/li&gt;
&lt;li&gt;Audit records&lt;/li&gt;
&lt;li&gt;Document relationships&lt;/li&gt;
&lt;li&gt;Reportable business effects&lt;/li&gt;
&lt;li&gt;Operational state changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So performance testing has to cover business workflows.&lt;/p&gt;

&lt;p&gt;Not just endpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was added in v1.1.1
&lt;/h2&gt;

&lt;p&gt;NGB v1.1.1 adds a dedicated performance testing workspace based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Grafana k6&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Reusable scenario profiles&lt;/li&gt;
&lt;li&gt;Keycloak tester authentication&lt;/li&gt;
&lt;li&gt;Custom metrics&lt;/li&gt;
&lt;li&gt;Thresholds&lt;/li&gt;
&lt;li&gt;Vertical-specific workload packages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The repository now includes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;performance-tests/
  ngb-performance-tests-framework/
  ngb-property-management-perf/
  ngb-trade-perf/
  ngb-agency-billing-perf/
  scripts/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The most important part is the boundary.&lt;/p&gt;

&lt;p&gt;The shared framework is vertical-neutral.&lt;/p&gt;

&lt;p&gt;It knows platform concepts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auth&lt;/li&gt;
&lt;li&gt;Health&lt;/li&gt;
&lt;li&gt;Metadata&lt;/li&gt;
&lt;li&gt;Catalogs&lt;/li&gt;
&lt;li&gt;Documents&lt;/li&gt;
&lt;li&gt;Reports&lt;/li&gt;
&lt;li&gt;Accounting effects&lt;/li&gt;
&lt;li&gt;Document flow&lt;/li&gt;
&lt;li&gt;Audit&lt;/li&gt;
&lt;li&gt;Scenarios&lt;/li&gt;
&lt;li&gt;Metrics&lt;/li&gt;
&lt;li&gt;Thresholds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It does not know Property Management, Trade, or Agency Billing.&lt;/p&gt;

&lt;p&gt;Vertical packages define their own document types, catalog types, report IDs, fixtures, and workload mixes.&lt;/p&gt;

&lt;p&gt;That separation matters.&lt;/p&gt;

&lt;p&gt;I do not want performance testing to become another place where platform and vertical layers start leaking into each other.&lt;/p&gt;

&lt;h2&gt;
  
  
  The first serious validation run
&lt;/h2&gt;

&lt;p&gt;For the first serious validation run, I used the NGB Property Management vertical.&lt;/p&gt;

&lt;p&gt;The environment was intentionally local:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local Docker deployment&lt;/li&gt;
&lt;li&gt;PostgreSQL database around 19GB&lt;/li&gt;
&lt;li&gt;Around 1.7M business documents&lt;/li&gt;
&lt;li&gt;Around 27M audit log records&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not a third-party audited benchmark.&lt;/p&gt;

&lt;p&gt;It is not a claim of unlimited scale.&lt;/p&gt;

&lt;p&gt;But it is an important production-readiness signal.&lt;/p&gt;

&lt;p&gt;NGB is no longer tested only as a small demo dataset.&lt;/p&gt;

&lt;p&gt;It now has repeatable performance workloads running against real platform behavior and non-trivial data volume.&lt;/p&gt;

&lt;h2&gt;
  
  
  What was tested
&lt;/h2&gt;

&lt;p&gt;The performance framework includes multiple workload profiles.&lt;/p&gt;

&lt;p&gt;Some of the important ones are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Smoke&lt;/li&gt;
&lt;li&gt;Baseline&lt;/li&gt;
&lt;li&gt;Platform read&lt;/li&gt;
&lt;li&gt;Platform reporting&lt;/li&gt;
&lt;li&gt;Platform read capacity&lt;/li&gt;
&lt;li&gt;Platform mixed capacity&lt;/li&gt;
&lt;li&gt;Platform breakpoint&lt;/li&gt;
&lt;li&gt;Document lifecycle&lt;/li&gt;
&lt;li&gt;Audit&lt;/li&gt;
&lt;li&gt;Maintenance&lt;/li&gt;
&lt;li&gt;Concurrency&lt;/li&gt;
&lt;li&gt;Business day&lt;/li&gt;
&lt;li&gt;Write-heavy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to run all of them every time.&lt;/p&gt;

&lt;p&gt;Different profiles answer different questions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Platform read capacity
&lt;/h3&gt;

&lt;p&gt;This profile focuses on read-heavy platform behavior.&lt;/p&gt;

&lt;p&gt;It helps validate whether common read paths stay stable under high concurrency.&lt;/p&gt;

&lt;h3&gt;
  
  
  Platform mixed capacity
&lt;/h3&gt;

&lt;p&gt;This is one of the most important profiles.&lt;/p&gt;

&lt;p&gt;It combines different types of platform activity instead of testing only one endpoint.&lt;/p&gt;

&lt;p&gt;The workload includes document reads, platform reads, reporting, audit-related operations, accounting effects, document flow, and other common application behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  Write-heavy
&lt;/h3&gt;

&lt;p&gt;This profile is more aggressive.&lt;/p&gt;

&lt;p&gt;It exercises document create/update/post operations while the system is also reading accounting effects, audit history, document flow, and reports.&lt;/p&gt;

&lt;p&gt;For an accounting-first platform, this is one of the most important scenarios.&lt;/p&gt;

&lt;p&gt;Writes are not just writes.&lt;/p&gt;

&lt;p&gt;They create durable business consequences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Selected results
&lt;/h2&gt;

&lt;p&gt;Here are selected results from the run set.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mixed capacity
&lt;/h3&gt;

&lt;p&gt;The mixed-capacity profile ran for around 80 minutes.&lt;/p&gt;

&lt;p&gt;Results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;9.5M+ requests&lt;/li&gt;
&lt;li&gt;1,000 peak virtual users&lt;/li&gt;
&lt;li&gt;0 dropped iterations&lt;/li&gt;
&lt;li&gt;0 business failures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This matters because the workload was not a single endpoint benchmark.&lt;/p&gt;

&lt;p&gt;It exercised mixed platform behavior under sustained load.&lt;/p&gt;

&lt;h3&gt;
  
  
  Read capacity
&lt;/h3&gt;

&lt;p&gt;The read-capacity profile pushed read pressure higher.&lt;/p&gt;

&lt;p&gt;Results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;10.8M+ requests&lt;/li&gt;
&lt;li&gt;1,400 peak virtual users&lt;/li&gt;
&lt;li&gt;0 dropped iterations&lt;/li&gt;
&lt;li&gt;0 business failures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important signal here is the combination of request volume, concurrency, and correctness.&lt;/p&gt;

&lt;p&gt;Not just one latency number.&lt;/p&gt;

&lt;h3&gt;
  
  
  Write-heavy workload
&lt;/h3&gt;

&lt;p&gt;The write-heavy profile ran document lifecycle operations under pressure.&lt;/p&gt;

&lt;p&gt;Results:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1.75M+ requests&lt;/li&gt;
&lt;li&gt;Document create/update/post activity&lt;/li&gt;
&lt;li&gt;Accounting effects reads&lt;/li&gt;
&lt;li&gt;Audit reads&lt;/li&gt;
&lt;li&gt;Document flow reads&lt;/li&gt;
&lt;li&gt;Report execution under write pressure&lt;/li&gt;
&lt;li&gt;0 dropped iterations&lt;/li&gt;
&lt;li&gt;0 business failures&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the kind of workload that matters for NGB.&lt;/p&gt;

&lt;p&gt;The platform needs to stay usable while documents are being created, posted, audited, explained, and reported on.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I look at
&lt;/h2&gt;

&lt;p&gt;For this framework, one metric is not enough.&lt;/p&gt;

&lt;p&gt;I care about several signals together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;HTTP failure rate&lt;/li&gt;
&lt;li&gt;Business operation failure rate&lt;/li&gt;
&lt;li&gt;Dropped iterations&lt;/li&gt;
&lt;li&gt;p95 latency&lt;/li&gt;
&lt;li&gt;p99 latency&lt;/li&gt;
&lt;li&gt;Checks&lt;/li&gt;
&lt;li&gt;Thresholds&lt;/li&gt;
&lt;li&gt;Report execution behavior&lt;/li&gt;
&lt;li&gt;Operation-level breakdowns&lt;/li&gt;
&lt;li&gt;Document post latency&lt;/li&gt;
&lt;li&gt;Accounting effects latency&lt;/li&gt;
&lt;li&gt;Audit latency&lt;/li&gt;
&lt;li&gt;Document flow latency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A good result is not just:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The test finished.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A good result means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No silent business failures&lt;/li&gt;
&lt;li&gt;No dropped iterations for the target profile&lt;/li&gt;
&lt;li&gt;No broken checks&lt;/li&gt;
&lt;li&gt;No hidden vertical coupling in the shared framework&lt;/li&gt;
&lt;li&gt;No report path that only works on a tiny dataset&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For business software, performance is not only speed.&lt;/p&gt;

&lt;p&gt;It is also correctness under pressure.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters for architecture
&lt;/h2&gt;

&lt;p&gt;NGB is built around several platform-level ideas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Documents represent business intent&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Business operations are modeled as documents, not random database updates.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Posting creates durable effects&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Posted documents can create accounting entries, audit records, operational state, and reportable business consequences.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Auditability is part of the platform&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The system should explain what happened and why.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reports are connected to business truth&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Reporting is not just a separate dashboard layer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verticals extend the platform&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Property Management, Trade, and Agency Billing should reuse the same platform capabilities without duplicating the core engine.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The performance framework follows the same architecture.&lt;/p&gt;

&lt;p&gt;The shared framework tests platform concepts.&lt;/p&gt;

&lt;p&gt;Vertical packages provide vertical-specific workloads.&lt;/p&gt;

&lt;p&gt;That is the same boundary the runtime architecture is supposed to preserve.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this does not claim
&lt;/h2&gt;

&lt;p&gt;I want to be precise about the result.&lt;/p&gt;

&lt;p&gt;This does not mean:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NGB has been certified by an external benchmark&lt;/li&gt;
&lt;li&gt;NGB has unlimited scale&lt;/li&gt;
&lt;li&gt;A local Docker run is the same as a production Kubernetes deployment&lt;/li&gt;
&lt;li&gt;Every possible workload has been tested&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That would be an overclaim.&lt;/p&gt;

&lt;p&gt;What it does mean is more practical:&lt;/p&gt;

&lt;p&gt;NGB is now tested beyond a toy demo dataset.&lt;/p&gt;

&lt;p&gt;It has repeatable performance workloads for real platform behavior.&lt;/p&gt;

&lt;p&gt;It can validate documents, posting, audit, accounting effects, document flow, reports, and mixed read/write scenarios against meaningful data volume.&lt;/p&gt;

&lt;p&gt;That is a much stronger foundation than only saying:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It works on my machine.&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ngbplatform/NGB" rel="noopener noreferrer"&gt;https://github.com/ngbplatform/NGB&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Release:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ngbplatform/NGB/releases/tag/v1.1.1" rel="noopener noreferrer"&gt;https://github.com/ngbplatform/NGB/releases/tag/v1.1.1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Performance tests workspace:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ngbplatform/NGB/tree/main/performance-tests" rel="noopener noreferrer"&gt;https://github.com/ngbplatform/NGB/tree/main/performance-tests&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Documentation:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.ngbplatform.com" rel="noopener noreferrer"&gt;https://docs.ngbplatform.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Website:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ngbplatform.com" rel="noopener noreferrer"&gt;https://ngbplatform.com&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;Performance testing business software is not only about latency.&lt;/p&gt;

&lt;p&gt;It is about confidence.&lt;/p&gt;

&lt;p&gt;Confidence that the platform can preserve correctness under pressure.&lt;/p&gt;

&lt;p&gt;Confidence that reports still work when data grows.&lt;/p&gt;

&lt;p&gt;Confidence that audit history and document flow remain usable.&lt;/p&gt;

&lt;p&gt;Confidence that posting does not become a black box.&lt;/p&gt;

&lt;p&gt;NGB v1.1.1 is an important step in that direction.&lt;/p&gt;

&lt;p&gt;The platform is no longer validated only by functional demos.&lt;/p&gt;

&lt;p&gt;It now has a reusable performance testing framework for real business workloads.&lt;/p&gt;

&lt;p&gt;That is the kind of foundation I want for building serious accounting-first business applications.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>postgres</category>
      <category>opensource</category>
      <category>performance</category>
    </item>
    <item>
      <title>NGB Reports: Canonical + Composable Reporting on .NET and PostgreSQL</title>
      <dc:creator>NGB Platform</dc:creator>
      <pubDate>Tue, 12 May 2026 13:19:53 +0000</pubDate>
      <link>https://dev.to/ngbplatform/ngb-reports-canonical-composable-reporting-on-net-and-postgresql-1b77</link>
      <guid>https://dev.to/ngbplatform/ngb-reports-canonical-composable-reporting-on-net-and-postgresql-1b77</guid>
      <description>&lt;p&gt;I just published a new demo of &lt;strong&gt;NGB Reports&lt;/strong&gt; — the reporting layer of &lt;strong&gt;NGB Platform&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;NGB Platform is an open-source, metadata-driven business platform for building accounting-first industry solutions. The goal is not to build isolated CRUD applications, but complete business applications where documents, catalogs, accounting, operational registers, audit history, workflows, and reports are part of the same architecture.&lt;/p&gt;

&lt;p&gt;This demo focuses specifically on reporting.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/euqMDpjEcsM"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Why reporting matters in business applications
&lt;/h2&gt;

&lt;p&gt;In many business systems, reporting is added late.&lt;/p&gt;

&lt;p&gt;The application starts with forms, tables, documents, and workflows. Then, at some point, users need visibility:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What happened?&lt;/li&gt;
&lt;li&gt;Which documents created accounting entries?&lt;/li&gt;
&lt;li&gt;What is the current balance?&lt;/li&gt;
&lt;li&gt;Which invoices are still open?&lt;/li&gt;
&lt;li&gt;What is the profitability by project?&lt;/li&gt;
&lt;li&gt;Can I drill down from a report number to the source document?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If reporting is treated as a separate dashboard layer, it often becomes disconnected from the real business model.&lt;/p&gt;

&lt;p&gt;For NGB, reporting is a first-class platform capability.&lt;/p&gt;

&lt;p&gt;Reports need to understand the same metadata, document model, accounting structures, and navigation patterns as the rest of the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the demo shows
&lt;/h2&gt;

&lt;p&gt;The video walks through reporting inside the &lt;strong&gt;Agency Billing&lt;/strong&gt; vertical, but the reporting engine itself is platform-level and reusable across different NGB-based industry solutions.&lt;/p&gt;

&lt;p&gt;The demo covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Canonical accounting reports&lt;/li&gt;
&lt;li&gt;Composable business reports&lt;/li&gt;
&lt;li&gt;Report Composer&lt;/li&gt;
&lt;li&gt;Grouping&lt;/li&gt;
&lt;li&gt;Filters&lt;/li&gt;
&lt;li&gt;Fields&lt;/li&gt;
&lt;li&gt;Sorting&lt;/li&gt;
&lt;li&gt;Report variants&lt;/li&gt;
&lt;li&gt;Drilldowns from reports to source documents&lt;/li&gt;
&lt;li&gt;Document-aware reporting&lt;/li&gt;
&lt;li&gt;The reporting architecture behind the platform&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Canonical reports vs composable reports
&lt;/h2&gt;

&lt;p&gt;NGB Reports supports two important reporting models.&lt;/p&gt;

&lt;h3&gt;
  
  
  Canonical reports
&lt;/h3&gt;

&lt;p&gt;Canonical reports are predefined reports with strong business semantics.&lt;/p&gt;

&lt;p&gt;Examples include accounting reports such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trial Balance&lt;/li&gt;
&lt;li&gt;Balance Sheet&lt;/li&gt;
&lt;li&gt;Income Statement&lt;/li&gt;
&lt;li&gt;Cash Flow Statement&lt;/li&gt;
&lt;li&gt;General Journal&lt;/li&gt;
&lt;li&gt;Account Card&lt;/li&gt;
&lt;li&gt;General Ledger&lt;/li&gt;
&lt;li&gt;Ledger Analysis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These reports are not just generic grids. They represent known accounting/reporting concepts and can have specialized execution logic, validation rules, paging strategies, and drilldown behavior.&lt;/p&gt;

&lt;h3&gt;
  
  
  Composable reports
&lt;/h3&gt;

&lt;p&gt;Composable reports are more flexible.&lt;/p&gt;

&lt;p&gt;They allow users to configure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Row groupings&lt;/li&gt;
&lt;li&gt;Column groupings&lt;/li&gt;
&lt;li&gt;Visible fields&lt;/li&gt;
&lt;li&gt;Filters&lt;/li&gt;
&lt;li&gt;Sorting&lt;/li&gt;
&lt;li&gt;Aggregations&lt;/li&gt;
&lt;li&gt;Variants&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is useful for business-specific reports such as unbilled time, invoice registers, project profitability, aging reports, and operational summaries.&lt;/p&gt;

&lt;p&gt;The goal is to provide flexibility without turning the system into an unstructured reporting sandbox.&lt;/p&gt;

&lt;h2&gt;
  
  
  Report Composer
&lt;/h2&gt;

&lt;p&gt;One of the main parts of the demo is the &lt;strong&gt;Report Composer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The Composer allows users to configure report layout and behavior directly from the UI:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;General parameters&lt;/li&gt;
&lt;li&gt;Grouping&lt;/li&gt;
&lt;li&gt;Filters&lt;/li&gt;
&lt;li&gt;Fields&lt;/li&gt;
&lt;li&gt;Sorting&lt;/li&gt;
&lt;li&gt;Variants&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important design goal is that the frontend is metadata-driven. The UI does not need to hardcode every report layout manually. The backend provides report definitions and presentation metadata, and the frontend renders the report experience consistently.&lt;/p&gt;

&lt;p&gt;This keeps the platform extensible as new verticals and reports are added.&lt;/p&gt;

&lt;h2&gt;
  
  
  Drilldowns and document-aware reporting
&lt;/h2&gt;

&lt;p&gt;For business users, numbers in reports should not be dead ends.&lt;/p&gt;

&lt;p&gt;If a report shows a balance, invoice, account, project, or document-related value, the user should be able to navigate to the underlying source.&lt;/p&gt;

&lt;p&gt;In the demo, reports can drill down into source documents and related business records. This is especially important for accounting-first applications because users often need to trace a number back to the document or posting that produced it.&lt;/p&gt;

&lt;p&gt;This is one of the areas where reporting becomes tightly connected to the platform architecture.&lt;/p&gt;

&lt;p&gt;Reports are not only about displaying data.&lt;/p&gt;

&lt;p&gt;They are also about explainability.&lt;/p&gt;

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

&lt;p&gt;NGB Reports is designed around a few principles:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Metadata-driven definitions&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Reports are described by definitions and presentation metadata, instead of being hardcoded page by page.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Reusable platform engine&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
The same reporting infrastructure can be reused across different verticals.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Canonical + composable model&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Some reports need strong predefined semantics. Others need flexible user composition.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Document-aware navigation&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Reports should connect back to documents, catalogs, accounts, and business entities.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Production-oriented execution&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Reporting needs to handle paging, validation, stable execution paths, and performance considerations from the beginning.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Tech stack
&lt;/h2&gt;

&lt;p&gt;NGB Platform is built with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;.NET&lt;/li&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;Vue&lt;/li&gt;
&lt;li&gt;Metadata-driven architecture&lt;/li&gt;
&lt;li&gt;Kubernetes-oriented deployment practices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The reporting engine is part of the broader NGB Platform architecture, which includes documents, catalogs, accounting, operational registers, reference registers, audit history, background jobs, and vertical-specific business modules.&lt;/p&gt;

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

&lt;p&gt;Video demo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtu.be/euqMDpjEcsM" rel="noopener noreferrer"&gt;https://youtu.be/euqMDpjEcsM&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/ngbplatform/NGB" rel="noopener noreferrer"&gt;https://github.com/ngbplatform/NGB&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Website:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ngbplatform.com" rel="noopener noreferrer"&gt;https://ngbplatform.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Documentation:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.ngbplatform.com" rel="noopener noreferrer"&gt;https://docs.ngbplatform.com&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;Reporting is not just a UI table.&lt;/p&gt;

&lt;p&gt;In accounting-first business applications, reporting is part of the core product architecture.&lt;/p&gt;

&lt;p&gt;It needs to be connected to documents, accounting entries, business entities, auditability, and navigation.&lt;/p&gt;

&lt;p&gt;That is the direction behind NGB Reports.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>postgres</category>
      <category>opensource</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
