<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Architecture Decision Records on Pledger.io</title><link>https://www.pledger.io/architecture/architecture-decision-records/</link><description>Recent content in Architecture Decision Records on Pledger.io</description><generator>Hugo</generator><language>en-us</language><copyright>Copyright © 2026 Pledger.io</copyright><atom:link href="https://www.pledger.io/architecture/architecture-decision-records/index.xml" rel="self" type="application/rss+xml"/><item><title>ADR-001 Contract-first OpenAPI with Micronaut code generation</title><link>https://www.pledger.io/architecture/architecture-decision-records/adr-001-contract-first-openapi/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pledger.io/architecture/architecture-decision-records/adr-001-contract-first-openapi/</guid><description>&lt;h2 id="status" class="heading "&gt;Status&lt;a href="#status" aria-labelledby="status"&gt;








&lt;!-- &lt;i class="fas fa-link anchor"&gt;&lt;/i&gt; --&gt;
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 576 512"&gt;&lt;use href="#fas-link"&gt;&lt;/use&gt;&lt;/svg&gt;&amp;nbsp;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Accepted&lt;/p&gt;





&lt;h2 id="context" class="heading "&gt;Context&lt;a href="#context" aria-labelledby="context"&gt;








&lt;!-- &lt;i class="fas fa-link anchor"&gt;&lt;/i&gt; --&gt;
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 576 512"&gt;&lt;use href="#fas-link"&gt;&lt;/use&gt;&lt;/svg&gt;&amp;nbsp;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The REST API must stay consistent for the separate web UI and any API clients.
Handwritten controllers and DTOs tend to drift from documentation unless the &lt;strong&gt;contract is the single source of truth&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The project already ships an OpenAPI 3.1 description split across &lt;code&gt;src/contract/&lt;/code&gt; and uses the Micronaut OpenAPI Gradle plugin.&lt;/p&gt;</description></item><item><title>ADR-002 Multi-database strategy with dialect-specific Flyway migrations</title><link>https://www.pledger.io/architecture/architecture-decision-records/adr-002-multi-database-flyway/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pledger.io/architecture/architecture-decision-records/adr-002-multi-database-flyway/</guid><description>&lt;h2 id="status" class="heading "&gt;Status&lt;a href="#status" aria-labelledby="status"&gt;








&lt;!-- &lt;i class="fas fa-link anchor"&gt;&lt;/i&gt; --&gt;
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 576 512"&gt;&lt;use href="#fas-link"&gt;&lt;/use&gt;&lt;/svg&gt;&amp;nbsp;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Accepted&lt;/p&gt;





&lt;h2 id="context" class="heading "&gt;Context&lt;a href="#context" aria-labelledby="context"&gt;








&lt;!-- &lt;i class="fas fa-link anchor"&gt;&lt;/i&gt; --&gt;
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 576 512"&gt;&lt;use href="#fas-link"&gt;&lt;/use&gt;&lt;/svg&gt;&amp;nbsp;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Users self-host Pledger.io on different environments.
The application supports &lt;strong&gt;PostgreSQL&lt;/strong&gt;, &lt;strong&gt;MySQL&lt;/strong&gt;, and &lt;strong&gt;H2&lt;/strong&gt; (development/tests).
SQL dialects differ (types, indexes, functions), so a single generic migration script set is fragile.&lt;/p&gt;





&lt;h2 id="decision" class="heading "&gt;Decision&lt;a href="#decision" aria-labelledby="decision"&gt;








&lt;!-- &lt;i class="fas fa-link anchor"&gt;&lt;/i&gt; --&gt;
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 576 512"&gt;&lt;use href="#fas-link"&gt;&lt;/use&gt;&lt;/svg&gt;&amp;nbsp;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Use &lt;strong&gt;Flyway&lt;/strong&gt; with &lt;strong&gt;separate migration trees&lt;/strong&gt; under &lt;code&gt;src/main/resources/db/migration/&lt;/code&gt; (for example &lt;code&gt;psql/&lt;/code&gt; and &lt;code&gt;mysql/&lt;/code&gt;).
Select the appropriate datasource and Flyway locations via Micronaut configuration profiles.
Rely on dialect-appropriate drivers at runtime.&lt;/p&gt;</description></item><item><title>ADR-003 Use Jetty as the HTTP server runtime</title><link>https://www.pledger.io/architecture/architecture-decision-records/adr-003-jetty-runtime/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pledger.io/architecture/architecture-decision-records/adr-003-jetty-runtime/</guid><description>&lt;h2 id="status" class="heading "&gt;Status&lt;a href="#status" aria-labelledby="status"&gt;








&lt;!-- &lt;i class="fas fa-link anchor"&gt;&lt;/i&gt; --&gt;
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 576 512"&gt;&lt;use href="#fas-link"&gt;&lt;/use&gt;&lt;/svg&gt;&amp;nbsp;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Accepted&lt;/p&gt;





&lt;h2 id="context" class="heading "&gt;Context&lt;a href="#context" aria-labelledby="context"&gt;








&lt;!-- &lt;i class="fas fa-link anchor"&gt;&lt;/i&gt; --&gt;
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 576 512"&gt;&lt;use href="#fas-link"&gt;&lt;/use&gt;&lt;/svg&gt;&amp;nbsp;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Micronaut supports multiple HTTP runtimes (notably Netty and Jetty).
The choice affects threading model, integration with servlet-style features, dependency footprint, and operational familiarity.&lt;/p&gt;





&lt;h2 id="decision" class="heading "&gt;Decision&lt;a href="#decision" aria-labelledby="decision"&gt;








&lt;!-- &lt;i class="fas fa-link anchor"&gt;&lt;/i&gt; --&gt;
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 576 512"&gt;&lt;use href="#fas-link"&gt;&lt;/use&gt;&lt;/svg&gt;&amp;nbsp;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Configure the Micronaut application to use &lt;strong&gt;&lt;code&gt;runtime(&amp;quot;jetty&amp;quot;)&lt;/code&gt;&lt;/strong&gt; and depend on &lt;strong&gt;&lt;code&gt;micronaut-http-server-jetty&lt;/code&gt;&lt;/strong&gt; as the embedded server for this service.&lt;/p&gt;</description></item><item><title>ADR-004 Enforce modular boundaries with ArchUnit</title><link>https://www.pledger.io/architecture/architecture-decision-records/adr-004-archunit-modular-boundaries/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pledger.io/architecture/architecture-decision-records/adr-004-archunit-modular-boundaries/</guid><description>&lt;h2 id="status" class="heading "&gt;Status&lt;a href="#status" aria-labelledby="status"&gt;








&lt;!-- &lt;i class="fas fa-link anchor"&gt;&lt;/i&gt; --&gt;
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 576 512"&gt;&lt;use href="#fas-link"&gt;&lt;/use&gt;&lt;/svg&gt;&amp;nbsp;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Accepted&lt;/p&gt;





&lt;h2 id="context" class="heading "&gt;Context&lt;a href="#context" aria-labelledby="context"&gt;








&lt;!-- &lt;i class="fas fa-link anchor"&gt;&lt;/i&gt; --&gt;
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 576 512"&gt;&lt;use href="#fas-link"&gt;&lt;/use&gt;&lt;/svg&gt;&amp;nbsp;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;The codebase is a &lt;strong&gt;modular monolith&lt;/strong&gt;: many bounded contexts in one repository.
Without enforcement, package dependencies creep across boundaries (&amp;ldquo;just one import&amp;rdquo;), cycles appear, and refactors become risky.&lt;/p&gt;





&lt;h2 id="decision" class="heading "&gt;Decision&lt;a href="#decision" aria-labelledby="decision"&gt;








&lt;!-- &lt;i class="fas fa-link anchor"&gt;&lt;/i&gt; --&gt;
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 576 512"&gt;&lt;use href="#fas-link"&gt;&lt;/use&gt;&lt;/svg&gt;&amp;nbsp;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Use &lt;strong&gt;ArchUnit&lt;/strong&gt; in &lt;code&gt;ArchitectureTest&lt;/code&gt; to enforce:&lt;/p&gt;</description></item><item><title>ADR-005 Legacy Camunda Flyway migrations without Camunda runtime</title><link>https://www.pledger.io/architecture/architecture-decision-records/adr-005-legacy-camunda-migrations/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://www.pledger.io/architecture/architecture-decision-records/adr-005-legacy-camunda-migrations/</guid><description>&lt;h2 id="status" class="heading "&gt;Status&lt;a href="#status" aria-labelledby="status"&gt;








&lt;!-- &lt;i class="fas fa-link anchor"&gt;&lt;/i&gt; --&gt;
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 576 512"&gt;&lt;use href="#fas-link"&gt;&lt;/use&gt;&lt;/svg&gt;&amp;nbsp;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Accepted&lt;/p&gt;





&lt;h2 id="context" class="heading "&gt;Context&lt;a href="#context" aria-labelledby="context"&gt;








&lt;!-- &lt;i class="fas fa-link anchor"&gt;&lt;/i&gt; --&gt;
 &lt;svg class="svg-inline--fa fas fa-link anchor" fill="currentColor" aria-hidden="true" role="img" viewBox="0 0 576 512"&gt;&lt;use href="#fas-link"&gt;&lt;/use&gt;&lt;/svg&gt;&amp;nbsp;
 &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Older versions of Pledger.io used &lt;strong&gt;Camunda BPM&lt;/strong&gt; for batch import workflows.
The database still contains Camunda-style tables created by historical migrations.
The application no longer embeds Camunda; imports are driven by an in-process &lt;strong&gt;&lt;code&gt;ImportProcessEngineImpl&lt;/code&gt;&lt;/strong&gt; and related domain code under &lt;code&gt;exporter&lt;/code&gt;.&lt;/p&gt;</description></item></channel></rss>