<?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.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 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>
    <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://dev.to/ngbplatform/how-ngb-platform-works-documents-posting-registers-and-reporting-5f4l</link>
      <guid>https://dev.to/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://dev.to/ngbplatform/i-built-an-open-source-platform-foundation-for-accounting-centric-business-apps-b7g</link>
      <guid>https://dev.to/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>
