<?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>Forem: NGB Platform</title>
    <description>The latest articles on Forem by NGB Platform (@ngbplatform).</description>
    <link>https://forem.com/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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3898160%2F08c55292-432d-4ea7-b776-d8123140c9be.png</url>
      <title>Forem: NGB Platform</title>
      <link>https://forem.com/ngbplatform</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ngbplatform"/>
    <language>en</language>
    <item>
      <title>How NGB Platform Works: Documents, Posting, Registers, and Reporting</title>
      <dc:creator>NGB Platform</dc:creator>
      <pubDate>Tue, 05 May 2026 13:38:22 +0000</pubDate>
      <link>https://forem.com/ngbplatform/how-ngb-platform-works-documents-posting-registers-and-reporting-5f4l</link>
      <guid>https://forem.com/ngbplatform/how-ngb-platform-works-documents-posting-registers-and-reporting-5f4l</guid>
      <description>&lt;h2&gt;
  
  
  A follow-up: how the architecture works
&lt;/h2&gt;

&lt;p&gt;In my previous article, I explained why I built &lt;strong&gt;NGB Platform&lt;/strong&gt; and what problem it is trying to solve:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://dev.to/ngbplatform/i-built-an-open-source-platform-foundation-for-accounting-centric-business-apps-b7g"&gt;I Built an Open-Source Platform Foundation for Accounting-Centric Business Apps&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That article was mostly about the &lt;strong&gt;why&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Why generic web frameworks are not enough for serious business applications.&lt;/p&gt;

&lt;p&gt;Why large ERP products solve many of the right problems, but often inside closed and complex product ecosystems.&lt;/p&gt;

&lt;p&gt;And why I wanted to build an open-source platform foundation for accounting-centric business applications.&lt;/p&gt;

&lt;p&gt;This article is the follow-up.&lt;/p&gt;

&lt;p&gt;Instead of focusing on why NGB exists, I want to walk through &lt;strong&gt;how the architecture works&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how documents represent business intent&lt;/li&gt;
&lt;li&gt;how posting turns that intent into durable effects&lt;/li&gt;
&lt;li&gt;how accounting entries and registers preserve business truth&lt;/li&gt;
&lt;li&gt;how audit history and reporting are connected to the same model&lt;/li&gt;
&lt;li&gt;how multiple vertical solutions reuse the same platform core&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also recorded a short architecture walkthrough video.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Business documents are intent. Posting creates durable effects. Reports read from durable business truth.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That separation is the foundation of the architecture.&lt;/p&gt;

&lt;p&gt;A draft document means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is what the user wants to do.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A posted document means:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This business event is now part of durable system truth.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That distinction matters because serious business applications cannot rely on mutable CRUD state alone.&lt;/p&gt;

&lt;p&gt;They need traceability.&lt;/p&gt;

&lt;p&gt;They need auditability.&lt;/p&gt;

&lt;p&gt;They need reporting.&lt;/p&gt;

&lt;p&gt;They need a way to explain not only what the current value is, but also how the system got there.&lt;/p&gt;

&lt;h2&gt;
  
  
  The flow: from document to business truth
&lt;/h2&gt;

&lt;p&gt;A typical NGB flow looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A user creates or updates a document draft.&lt;/li&gt;
&lt;li&gt;The runtime validates the payload against metadata and business rules.&lt;/li&gt;
&lt;li&gt;The user posts the document.&lt;/li&gt;
&lt;li&gt;Posting creates durable effects.&lt;/li&gt;
&lt;li&gt;Those effects are persisted in PostgreSQL.&lt;/li&gt;
&lt;li&gt;Reports, document flows, audit history, and UI screens read from durable state.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is the high-level path.&lt;/p&gt;

&lt;p&gt;But each step exists for a reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Document draft
&lt;/h2&gt;

&lt;p&gt;In NGB, documents are first-class platform concepts.&lt;/p&gt;

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

&lt;p&gt;It represents a business action with meaning.&lt;/p&gt;

&lt;p&gt;For example, depending on the vertical, a document can represent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a lease&lt;/li&gt;
&lt;li&gt;a rent charge&lt;/li&gt;
&lt;li&gt;a payment&lt;/li&gt;
&lt;li&gt;a credit memo&lt;/li&gt;
&lt;li&gt;a sales invoice&lt;/li&gt;
&lt;li&gt;a purchase document&lt;/li&gt;
&lt;li&gt;a timesheet&lt;/li&gt;
&lt;li&gt;a work order&lt;/li&gt;
&lt;li&gt;a project invoice&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the draft stage, the document represents business intent.&lt;/p&gt;

&lt;p&gt;It may be incomplete.&lt;/p&gt;

&lt;p&gt;It may need validation.&lt;/p&gt;

&lt;p&gt;It may still be edited.&lt;/p&gt;

&lt;p&gt;It has not yet produced durable accounting or operational consequences.&lt;/p&gt;

&lt;p&gt;This gives the system a clear boundary between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;preparing a business action&lt;/li&gt;
&lt;li&gt;committing that action as system truth&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That boundary is one of the most important parts of the architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Metadata and validation
&lt;/h2&gt;

&lt;p&gt;NGB is metadata-driven.&lt;/p&gt;

&lt;p&gt;That means the platform does not treat every form, grid, and payload as a one-off implementation.&lt;/p&gt;

&lt;p&gt;Document and catalog definitions describe the structure of business objects.&lt;/p&gt;

&lt;p&gt;The runtime can use those definitions to understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;available fields&lt;/li&gt;
&lt;li&gt;required fields&lt;/li&gt;
&lt;li&gt;payload shape&lt;/li&gt;
&lt;li&gt;document parts&lt;/li&gt;
&lt;li&gt;validation rules&lt;/li&gt;
&lt;li&gt;UI metadata&lt;/li&gt;
&lt;li&gt;reporting metadata&lt;/li&gt;
&lt;li&gt;allowed actions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This does not remove the need for business logic.&lt;/p&gt;

&lt;p&gt;It creates a consistent foundation around it.&lt;/p&gt;

&lt;p&gt;Instead of every vertical rebuilding the same infrastructure from scratch, vertical modules can focus on the business-specific rules that actually matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Posting
&lt;/h2&gt;

&lt;p&gt;Posting is the moment where a document becomes durable business truth.&lt;/p&gt;

&lt;p&gt;This is not just a status update.&lt;/p&gt;

&lt;p&gt;Posting is where NGB records the consequences of the business event.&lt;/p&gt;

&lt;p&gt;A posted document may create:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;accounting entries&lt;/li&gt;
&lt;li&gt;operational register movements&lt;/li&gt;
&lt;li&gt;reference register updates&lt;/li&gt;
&lt;li&gt;document relationships&lt;/li&gt;
&lt;li&gt;audit log records&lt;/li&gt;
&lt;li&gt;reporting state&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means posting is a boundary.&lt;/p&gt;

&lt;p&gt;Before posting, the document is intent.&lt;/p&gt;

&lt;p&gt;After posting, the document has effects.&lt;/p&gt;

&lt;p&gt;This is what makes the model different from a typical CRUD application where data is often edited in place and business consequences are scattered across services, triggers, reports, and custom tables.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Accounting effects
&lt;/h2&gt;

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

&lt;p&gt;That does not mean every document is an accounting document.&lt;/p&gt;

&lt;p&gt;It means the platform is designed with accounting semantics in mind from the beginning.&lt;/p&gt;

&lt;p&gt;For money-moving or accounting-relevant events, posting can produce accounting entries.&lt;/p&gt;

&lt;p&gt;Those entries are durable effects of the posted document.&lt;/p&gt;

&lt;p&gt;The goal is not to hide accounting behind UI screens.&lt;/p&gt;

&lt;p&gt;The goal is to make accounting consequences explicit, traceable, and reportable.&lt;/p&gt;

&lt;p&gt;A report should be able to answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which document created this accounting entry?&lt;/li&gt;
&lt;li&gt;Which period does it belong to?&lt;/li&gt;
&lt;li&gt;Which accounts were affected?&lt;/li&gt;
&lt;li&gt;Which dimensions were used?&lt;/li&gt;
&lt;li&gt;How does this line connect back to the business workflow?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why accounting is part of the architecture, not an afterthought.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Append-only effects and reversals
&lt;/h2&gt;

&lt;p&gt;For accounting-centric systems, silently rewriting history is dangerous.&lt;/p&gt;

&lt;p&gt;NGB follows an append-only philosophy for durable effects.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;Posted business effects should be preserved. Corrections should be explicit.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When something needs to be corrected, the system should not simply mutate historical truth in place.&lt;/p&gt;

&lt;p&gt;Instead, it should use reversal or storno-style semantics where appropriate.&lt;/p&gt;

&lt;p&gt;This makes the system easier to audit.&lt;/p&gt;

&lt;p&gt;It also makes reports more trustworthy, because they are based on recorded effects rather than a constantly rewritten version of the past.&lt;/p&gt;

&lt;p&gt;This approach is especially important for systems that need financial reporting, period close, audit history, and operational traceability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Operational registers
&lt;/h2&gt;

&lt;p&gt;Not every business effect is a double-entry accounting entry.&lt;/p&gt;

&lt;p&gt;Business systems also need operational state.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;open receivables&lt;/li&gt;
&lt;li&gt;settlement balances&lt;/li&gt;
&lt;li&gt;inventory quantities&lt;/li&gt;
&lt;li&gt;occupancy state&lt;/li&gt;
&lt;li&gt;work order progress&lt;/li&gt;
&lt;li&gt;project hours&lt;/li&gt;
&lt;li&gt;budget usage&lt;/li&gt;
&lt;li&gt;pending applications&lt;/li&gt;
&lt;li&gt;document relationships&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;NGB models this through operational registers.&lt;/p&gt;

&lt;p&gt;Operational registers capture business state derived from posted documents.&lt;/p&gt;

&lt;p&gt;They are not a replacement for accounting.&lt;/p&gt;

&lt;p&gt;They are a complementary layer for operational truth.&lt;/p&gt;

&lt;p&gt;Accounting can explain the financial effect.&lt;/p&gt;

&lt;p&gt;Operational registers can explain the business state that the application needs to run workflows and reports.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7: Reference registers
&lt;/h2&gt;

&lt;p&gt;Some business facts are effective over time.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;prices&lt;/li&gt;
&lt;li&gt;rates&lt;/li&gt;
&lt;li&gt;policies&lt;/li&gt;
&lt;li&gt;account mappings&lt;/li&gt;
&lt;li&gt;configuration values&lt;/li&gt;
&lt;li&gt;reference facts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A value that is true today may not have been true last month.&lt;/p&gt;

&lt;p&gt;A report or posting rule may need to know what value was effective at a specific point in time.&lt;/p&gt;

&lt;p&gt;Reference registers help model this kind of time-aware reference data.&lt;/p&gt;

&lt;p&gt;This matters because serious business systems often need historical correctness, not just current values.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 8: Audit history
&lt;/h2&gt;

&lt;p&gt;Audit history is not optional in business software.&lt;/p&gt;

&lt;p&gt;Users need to understand what changed.&lt;/p&gt;

&lt;p&gt;Administrators need to understand who did what.&lt;/p&gt;

&lt;p&gt;Developers need to debug business behavior.&lt;/p&gt;

&lt;p&gt;Auditors need to trace facts back to their source.&lt;/p&gt;

&lt;p&gt;NGB treats audit history as part of the platform foundation.&lt;/p&gt;

&lt;p&gt;The goal is to make important business actions explainable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;document creation&lt;/li&gt;
&lt;li&gt;posting&lt;/li&gt;
&lt;li&gt;reversal&lt;/li&gt;
&lt;li&gt;catalog changes&lt;/li&gt;
&lt;li&gt;period close&lt;/li&gt;
&lt;li&gt;workflow actions&lt;/li&gt;
&lt;li&gt;state changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Auditability should not be something added later when the system becomes important.&lt;/p&gt;

&lt;p&gt;It should be designed into the system from the beginning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 9: Reporting
&lt;/h2&gt;

&lt;p&gt;In many applications, reporting starts as a few SQL queries.&lt;/p&gt;

&lt;p&gt;Then it becomes a collection of special cases.&lt;/p&gt;

&lt;p&gt;Then it becomes difficult to maintain.&lt;/p&gt;

&lt;p&gt;NGB treats reporting as a first-class platform subsystem.&lt;/p&gt;

&lt;p&gt;The goal is to support both:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;canonical reports for important accounting and business scenarios&lt;/li&gt;
&lt;li&gt;composable reports for metadata-driven analysis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reports should not be disconnected from the rest of the platform.&lt;/p&gt;

&lt;p&gt;They should understand documents, catalogs, dimensions, filters, grouping, sorting, accounting effects, registers, and drilldowns.&lt;/p&gt;

&lt;p&gt;A report should not just show numbers.&lt;/p&gt;

&lt;p&gt;It should help users navigate back to the business facts behind those numbers.&lt;/p&gt;

&lt;p&gt;That is why reporting belongs in the architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this is different from typical CRUD
&lt;/h2&gt;

&lt;p&gt;A typical CRUD system often starts with tables and screens:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Create table. Build form. Add list page. Add report later.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That can work for simple applications.&lt;/p&gt;

&lt;p&gt;But serious business software needs more structure.&lt;/p&gt;

&lt;p&gt;NGB starts from a different model:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Define business documents. Validate intent. Post durable effects. Preserve history. Report from business truth.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That difference changes the shape of the system.&lt;/p&gt;

&lt;p&gt;The architecture is not centered only around tables.&lt;/p&gt;

&lt;p&gt;It is centered around business events and their durable consequences.&lt;/p&gt;

&lt;h2&gt;
  
  
  One core, multiple verticals
&lt;/h2&gt;

&lt;p&gt;NGB is not built around a single demo application.&lt;/p&gt;

&lt;p&gt;The same platform concepts are reused across multiple vertical solutions.&lt;/p&gt;

&lt;p&gt;Current demonstration verticals include:&lt;/p&gt;

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

&lt;p&gt;Each vertical has its own domain model.&lt;/p&gt;

&lt;p&gt;Each vertical has its own catalogs, documents, workflows, posting rules, and reports.&lt;/p&gt;

&lt;p&gt;But they reuse the same core ideas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;documents&lt;/li&gt;
&lt;li&gt;catalogs&lt;/li&gt;
&lt;li&gt;posting&lt;/li&gt;
&lt;li&gt;accounting effects&lt;/li&gt;
&lt;li&gt;operational registers&lt;/li&gt;
&lt;li&gt;reference registers&lt;/li&gt;
&lt;li&gt;audit history&lt;/li&gt;
&lt;li&gt;reporting&lt;/li&gt;
&lt;li&gt;metadata-driven UI&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The goal is not to hardcode one industry solution.&lt;/p&gt;

&lt;p&gt;The goal is to provide a reusable foundation for building accounting-centric vertical business applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why .NET and PostgreSQL
&lt;/h2&gt;

&lt;p&gt;NGB is built with a pragmatic stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;.NET&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vue&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes-oriented deployment practices&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important architectural choice is that PostgreSQL is treated as the system of record.&lt;/p&gt;

&lt;p&gt;For this kind of software, the database is not just a persistence detail.&lt;/p&gt;

&lt;p&gt;It is where durable business truth lives.&lt;/p&gt;

&lt;p&gt;The .NET runtime orchestrates commands, validation, posting, reporting, and vertical behavior.&lt;/p&gt;

&lt;p&gt;PostgreSQL provides transactions, constraints, data integrity, and durable storage.&lt;/p&gt;

&lt;p&gt;Vue provides the web client layer.&lt;/p&gt;

&lt;p&gt;The stack is intentionally practical.&lt;/p&gt;

&lt;p&gt;For business systems, boring and reliable technology is often the right choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the video covers
&lt;/h2&gt;

&lt;p&gt;The architecture walkthrough focuses on the model behind NGB.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;why CRUD alone is not enough for serious business software&lt;/li&gt;
&lt;li&gt;how documents represent business intent&lt;/li&gt;
&lt;li&gt;how posting creates durable effects&lt;/li&gt;
&lt;li&gt;how accounting entries and registers preserve business truth&lt;/li&gt;
&lt;li&gt;why append-only effects and reversals matter&lt;/li&gt;
&lt;li&gt;how operational and reference registers fit into the model&lt;/li&gt;
&lt;li&gt;how audit history and reporting connect to posted business events&lt;/li&gt;
&lt;li&gt;how Property Management, Trade, and Agency Billing reuse the same platform core&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The video is not a UI demo.&lt;/p&gt;

&lt;p&gt;It is an architecture walkthrough.&lt;/p&gt;

&lt;p&gt;The goal is to explain the core model behind the platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  What NGB is - and what it is not
&lt;/h2&gt;

&lt;p&gt;NGB is an open-source platform foundation for accounting-centric business applications.&lt;/p&gt;

&lt;p&gt;It is not just another generic web framework.&lt;/p&gt;

&lt;p&gt;It is also not positioned as a finished replacement for every established ERP product.&lt;/p&gt;

&lt;p&gt;Instead, I think of it as a reusable architecture and runtime foundation for teams that need to build serious business applications with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;documents&lt;/li&gt;
&lt;li&gt;posting&lt;/li&gt;
&lt;li&gt;accounting effects&lt;/li&gt;
&lt;li&gt;operational state&lt;/li&gt;
&lt;li&gt;audit history&lt;/li&gt;
&lt;li&gt;reporting&lt;/li&gt;
&lt;li&gt;vertical extensibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is the space NGB is exploring.&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;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;Website: &lt;a href="https://ngbplatform.com" rel="noopener noreferrer"&gt;https://ngbplatform.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Architecture Brief: &lt;a href="https://docs.ngbplatform.com/architecture/architecture-brief" rel="noopener noreferrer"&gt;https://docs.ngbplatform.com/architecture/architecture-brief&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ecosystem Brief: &lt;a href="https://docs.ngbplatform.com/ecosystem/erp-accounting-software-teams" rel="noopener noreferrer"&gt;https://docs.ngbplatform.com/ecosystem/erp-accounting-software-teams&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Previous article: &lt;a href="https://dev.to/ngbplatform/i-built-an-open-source-platform-foundation-for-accounting-centric-business-apps-b7g"&gt;https://dev.to/ngbplatform/i-built-an-open-source-platform-foundation-for-accounting-centric-business-apps-b7g&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Feedback welcome
&lt;/h2&gt;

&lt;p&gt;I would especially appreciate feedback from people who have worked on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ERP systems&lt;/li&gt;
&lt;li&gt;accounting software&lt;/li&gt;
&lt;li&gt;vertical SaaS&lt;/li&gt;
&lt;li&gt;internal business platforms&lt;/li&gt;
&lt;li&gt;.NET architecture&lt;/li&gt;
&lt;li&gt;PostgreSQL-backed business systems&lt;/li&gt;
&lt;li&gt;reporting engines&lt;/li&gt;
&lt;li&gt;audit-heavy applications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The area I am most interested in discussing is the architecture itself:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How should serious business applications model documents, posting, accounting effects, operational state, audit history, and reporting without rebuilding the same foundation every time?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the problem NGB is trying to solve.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>postgres</category>
      <category>opensource</category>
      <category>architecture</category>
    </item>
    <item>
      <title>I Built an Open-Source Platform Foundation for Accounting-Centric Business Apps</title>
      <dc:creator>NGB Platform</dc:creator>
      <pubDate>Tue, 28 Apr 2026 13:09:01 +0000</pubDate>
      <link>https://forem.com/ngbplatform/i-built-an-open-source-platform-foundation-for-accounting-centric-business-apps-b7g</link>
      <guid>https://forem.com/ngbplatform/i-built-an-open-source-platform-foundation-for-accounting-centric-business-apps-b7g</guid>
      <description>&lt;h2&gt;
  
  
  The problem I kept running into
&lt;/h2&gt;

&lt;p&gt;Every serious line-of-business project I worked on eventually forced me to solve the same hard problems from scratch.&lt;/p&gt;

&lt;p&gt;Not the fun architectural problems.&lt;/p&gt;

&lt;p&gt;The tedious, load-bearing ones that every business system needs but most general-purpose frameworks deliberately do not provide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A document model with lifecycle, posting, and reversal&lt;/li&gt;
&lt;li&gt;An accounting engine with real ledger semantics&lt;/li&gt;
&lt;li&gt;Operational registers for stock, balances, and settlements&lt;/li&gt;
&lt;li&gt;Reference registers for prices, rates, and effective facts&lt;/li&gt;
&lt;li&gt;An audit log that explains what happened and why&lt;/li&gt;
&lt;li&gt;Metadata-driven UI so forms are not hardcoded screen by screen&lt;/li&gt;
&lt;li&gt;A clean way to build multiple vertical solutions on one shared core&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first time you build these things, you think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;OK, that was hard, but now I know how.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The second time, you think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I should have kept that code from the last project.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The third time, you think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;There has to be a better way.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the problem I wanted to solve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two common options — and a missing third path
&lt;/h2&gt;

&lt;p&gt;In practice, teams usually end up choosing between two imperfect options.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 1: Generic web frameworks
&lt;/h3&gt;

&lt;p&gt;ASP.NET Core is excellent.&lt;/p&gt;

&lt;p&gt;But it deliberately stays out of your business domain. It gives you HTTP, routing, middleware, dependency injection, authentication integration, and hosting primitives.&lt;/p&gt;

&lt;p&gt;That is exactly what a general-purpose framework should do.&lt;/p&gt;

&lt;p&gt;But it also means every serious business application team eventually has to design its own document lifecycle, posting model, audit trail, reporting approach, and business state tracking.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 2: Large ERP products
&lt;/h3&gt;

&lt;p&gt;SAP, Oracle, Dynamics, and similar systems have solved many of these problems.&lt;/p&gt;

&lt;p&gt;But they solve them inside a product.&lt;/p&gt;

&lt;p&gt;Customization can be difficult. Vendor lock-in is real. The cost and complexity can be high. And for many teams, the problem is not “we need to install an ERP.”&lt;/p&gt;

&lt;p&gt;The problem is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We need to build a business application, but we do not want to rebuild the same accounting and workflow foundation again.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  The missing option: a reusable platform foundation
&lt;/h3&gt;

&lt;p&gt;This is what I set out to build.&lt;/p&gt;

&lt;p&gt;Not another generic web framework.&lt;/p&gt;

&lt;p&gt;Not a full ERP replacement.&lt;/p&gt;

&lt;p&gt;But a reusable open-source foundation for accounting-centric business applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built — NGB Platform
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;NGB Platform&lt;/strong&gt; is an open-source platform foundation for accounting-centric business applications, built on &lt;strong&gt;.NET 10&lt;/strong&gt; and &lt;strong&gt;PostgreSQL&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The goal is to handle the hard, load-bearing concerns at the architecture level, so teams can focus on their vertical domain instead of rebuilding infrastructure on every project.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Core architecture
&lt;/h2&gt;

&lt;p&gt;At the center is &lt;strong&gt;NGB.Runtime&lt;/strong&gt; — the orchestration layer for document workflow, posting, reporting, validation, and response shaping.&lt;/p&gt;

&lt;p&gt;Specialized engines handle specific concerns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;NGB.Accounting&lt;/strong&gt; — ledger semantics, posting flows, debit/credit effects, and financial reporting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NGB.OperationalRegisters&lt;/strong&gt; — movement-based state tracking such as stock levels, settlement balances, and operational balances&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NGB.ReferenceRegisters&lt;/strong&gt; — effective fact tracking such as prices, rates, terms, and other point-in-time facts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Business AuditLog&lt;/strong&gt; — append-only history of what happened, who did it, and what effects were produced&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything persists through &lt;strong&gt;NGB.PostgreSql&lt;/strong&gt; into PostgreSQL, which acts as the authoritative system of record.&lt;/p&gt;

&lt;p&gt;Authentication is handled by &lt;strong&gt;Keycloak&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Background jobs are handled by &lt;strong&gt;Hangfire&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The frontend is built with &lt;strong&gt;Vue 3 + Vite + Tailwind CSS&lt;/strong&gt;, using a shared metadata-driven UI workspace.&lt;/p&gt;

&lt;p&gt;The whole platform can run locally with &lt;strong&gt;Docker Compose&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key design decisions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Append-only effects instead of silent mutation
&lt;/h3&gt;

&lt;p&gt;Every business action produces explicit, durable effects.&lt;/p&gt;

&lt;p&gt;Reversals are new records, not deletions.&lt;/p&gt;

&lt;p&gt;That means the system can explain what happened, when it happened, who triggered it, and how it affected accounting, operational registers, reference registers, and audit history.&lt;/p&gt;

&lt;p&gt;The goal is not just to store data.&lt;/p&gt;

&lt;p&gt;The goal is to preserve business meaning.&lt;/p&gt;

&lt;h3&gt;
  
  
  Metadata-driven documents and UI
&lt;/h3&gt;

&lt;p&gt;Documents, catalogs, forms, lists, actions, and UI behavior are described as metadata.&lt;/p&gt;

&lt;p&gt;The frontend does not need a custom hardcoded form for every business document.&lt;/p&gt;

&lt;p&gt;This makes it possible to build new vertical solutions on the same runtime without rewriting the whole application layer each time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hosts compose, libraries execute
&lt;/h3&gt;

&lt;p&gt;API hosts, background job hosts, and watchdog hosts are thin composition roots.&lt;/p&gt;

&lt;p&gt;Business logic lives in runtime services, engines, providers, and vertical modules — not scattered across controllers or HTTP handlers.&lt;/p&gt;

&lt;p&gt;That separation has been one of the most important architectural decisions in the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three live vertical demos
&lt;/h2&gt;

&lt;p&gt;To prove that the same platform core can support different business domains, I built three vertical solutions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Property Management
&lt;/h3&gt;

&lt;p&gt;Leases, tenants, rent charges, receivables, payments, credit memos, allocations, maintenance requests, work orders, and accounting reports.&lt;/p&gt;

&lt;h3&gt;
  
  
  Trade
&lt;/h3&gt;

&lt;p&gt;Products, inventory, purchase orders, sales orders, invoices, stock movements, supplier accounts, customer accounts, and trade-focused reporting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agency Billing
&lt;/h3&gt;

&lt;p&gt;Clients, contracts, service delivery, billing runs, revenue recognition, and agency financial reporting.&lt;/p&gt;

&lt;p&gt;All three share the same runtime, accounting engine, reporting pipeline, PostgreSQL provider, and Vue UI framework.&lt;/p&gt;

&lt;p&gt;Demo login works for all three demo environments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Email: &lt;code&gt;alex.carter@demo.ngbplatform.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Password: &lt;code&gt;DemoAdmin!2026&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Demo environments:&lt;/p&gt;

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

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; .NET 10, C#&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database:&lt;/strong&gt; PostgreSQL&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Authentication:&lt;/strong&gt; Keycloak&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Background jobs:&lt;/strong&gt; Hangfire&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migrations:&lt;/strong&gt; Evolve&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; Vue 3, Vite, Tailwind CSS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local development:&lt;/strong&gt; Docker Compose&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License:&lt;/strong&gt; Apache 2.0&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/ngbplatform/NGB.git
&lt;span class="nb"&gt;cd &lt;/span&gt;NGB
docker compose &lt;span class="nt"&gt;-f&lt;/span&gt; docker-compose.ab.yml &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--env-file&lt;/span&gt; .env.ab up &lt;span class="nt"&gt;--build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full 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;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 I would love feedback on
&lt;/h2&gt;

&lt;p&gt;If you have built serious line-of-business software on .NET, I would genuinely love your feedback.&lt;/p&gt;

&lt;p&gt;In particular:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Does this architecture make sense to you?&lt;/li&gt;
&lt;li&gt;What would you do differently?&lt;/li&gt;
&lt;li&gt;Which part would you want to see explained in more detail?&lt;/li&gt;
&lt;li&gt;Is there a vertical use case you would like to see covered?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;NGB Platform is open source under the Apache 2.0 license.&lt;/p&gt;

&lt;p&gt;Version &lt;code&gt;v1.0.0&lt;/code&gt; has just been released.&lt;/p&gt;

&lt;p&gt;Stars are welcome, but architecture feedback is even more valuable.&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>postgres</category>
      <category>opensource</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
