The Story ofNotaire
From a Java Swing university project in 2014 to a modern, AI-accelerated microservices platform— a decade of evolution, one commit at a time.
Project History
A Decade of Evolution
From dormant Swing monolith to AI-accelerated microservices — every commit tells a story.
The Origin
University Project
A Java Swing monolith born as a university notarial management system. Direct DB access, JDBC queries embedded in UI event handlers, tightly coupled business logic.
Years of Silence
Project Paused
The project entered a long dormancy. Real-world complexity exceeded the scope of an academic exercise. The code slept, but the vision remained.
The Renaissance
Modern Reboot
A decade later, the project was reborn. Java 21, Spring Boot 3.2.9, Docker, PostgreSQL. The monolith began its transformation into a proper microservices architecture.
API & Frontend
Next.js Migration
REST API layer solidified. The Swing GUI was retired, replaced by a modern Next.js 15 + React 19 + TypeScript frontend with a proper design system.
AI Acceleration
Claude Code Integration
AI-assisted development became the primary workflow. 226 commits in two months. Tests, E2E coverage, security audits, observability—all accelerated by Claude AI agents.
Production Ready
Observability & Security
Grafana dashboards, Prometheus alerts, Loki log aggregation, SonarQube quality gates. A 2014 university project became a production-grade platform.
Tech Evolution
Three Generations
The same business domain, reimagined through each era of software engineering.
// 2014 — Everything in one place
class NotaireForm extends JFrame {
private Connection conn;
void saveDocument() {
// Direct SQL from event handler
PreparedStatement ps = conn.prepareStatement(
"INSERT INTO escrituras VALUES(?,?,?)"
);
ps.setString(1, txtNombre.getText());
// business logic tangled in UI
}
}// 2025 — Clean separation
@RestController
@RequestMapping("/api/v1/escrituras")
public class EscrituraController {
@Autowired
EscrituraService service;
@PostMapping
public ResponseEntity<DtoEscritura> create(
@RequestBody @Valid DtoEscritura dto) {
return ResponseEntity.ok(service.save(dto));
}
}// 2026 — AI-accelerated development
// Claude AI generates tests, reviews code,
// writes E2E tests, updates documentation
const tramite = await page.getByRole(
'link', { name: 'Nuevo Trámite' }
);
await expect(tramite).toBeVisible();
await tramite.click();
// 500+ Playwright E2E tests
// 80% JaCoCo coverage enforced
// Grafana + Loki observabilityThe AI Era
Built with Artificial Intelligence
In 2026, Claude AI became the primary co-developer. Not just autocomplete— full workflow automation: TDD, code review, documentation, E2E testing, and security audits.
AI-Driven TDD
Claude AI writes failing tests first, implements to pass them, then refactors. Enforced by mandatory workflow rules.
Playwright E2E
500+ automated end-to-end tests covering every user flow, form, and edge case. Every PR requires passing E2E coverage.
Full Observability
Prometheus metrics, Grafana dashboards, Loki log aggregation, and SonarQube quality gates. Production-grade from day one.
Security-First
OWASP Top 10 guides, JWT authentication, SQL injection prevention, Trivy vulnerability scanning in CI/CD.
Living Documentation
78 use cases, 95 functional requirements, ADRs for every major decision. Documentation updated with every PR.
Accelerated Delivery
226 commits in 2 months with AI assistance. What took years of manual work now happens in sprints.
AI Arsenal
The AI Tools That Built It
Four AI tools, one codebase. Each played a different role in accelerating from idea to production.
Primary AI agent — TDD, code review, E2E tests, docs, architecture decisions
Terminal-native AI coding agent, integrated directly into the shell workflow
VS Code inline completions, chat, and PR summaries for rapid in-editor development
Command-line Gemini access for research, alternative perspectives, and cross-validation
System Architecture
Modern Microservices
From a single Java Swing file to a multi-layer containerized platform.
All layers run in Docker containers. One command to start everything.
Infrastructure
DevSecOps Platform
10 containerized services. Two Docker Compose stacks. One command to run everything. From a university project with no infrastructure to a full observability platform.
:8888DevSecOps Hub — single-page dashboard linking every service
:3000React 19 + TypeScript UI. Notarial forms, dashboards, audit trail
:8080REST API + Swagger UI. JWT auth, JasperReports, audit aspect
:5432Primary database. Managed by Flyway migrations + init-db scripts
:5050Database management UI for schema inspection and query execution
:9090Scrapes Spring Boot Actuator + PostgreSQL exporter every 10–15 s
:30014 custom dashboards: backend, postgres, logs, auth. Real-time alerts
:3100Structured JSON log aggregation via Logback LogstashEncoder
:9000SAST, code smells, coverage gating. Community Edition, auto-provisioned
:9187Translates pg_stat_* to Prometheus metrics for Grafana's DB dashboard
🚀 Start Everything
$ bash scripts/start.shApp stack (Backend + Postgres + pgAdmin)
$ bash scripts/start-infra.shInfra stack (Prometheus + Grafana + Loki + SonarQube)
$ bash scripts/start-all.shEverything at once
🔔 Active Alert Rules
Trivia
Fun Facts
Numbers and moments that make this project unique.
3 Years of Sleep
The project was dormant from mid-2015 to late 2018. Not a single commit. Then life happened, then AI happened.
226 commits in 60 days
March–April 2026: the most intense development sprint. AI agents wrote tests, reviewed code, and updated docs continuously.
159 / 159 PRs Merged
100% PR merge rate. Every single pull request made it in — thanks to mandatory TDD, E2E coverage, and automated quality gates.
545 Markdown Files
Documentation grew from zero to 545 .md files. Use cases, ADRs, guides, runbooks, API references — all kept in sync by AI.
Java 1.6 → Java 21
15 major Java versions. From brittle Swing event handlers to records, sealed classes, and virtual threads.
Zero Tests → 80% Coverage
The original project had no tests at all. Today, JaCoCo enforces an 80% coverage ratchet and CI fails if it drops.
Battle Scars
Major Challenges
Real production incidents and architectural hurdles that shaped how the project works today.
Schema Dual-Source Drift
Docker builds from init-db/*.sql but Flyway runs db/migration/V*.sql. Hibernate entities can drift from both. Caused recurring 500 errors until an integration test guard was added.
Legacy JPA Controllers
The original monolith had massive JpaController classes (not REST controllers!) with Hibernate sessions and EntityManager leaks directly from the Swing era. Still being migrated to Spring Data repos.
Hibernate Proxy & Jackson
@JsonIgnore silently fails on Hibernate proxy subclasses, causing infinite recursion in JSON serialization. Fix: use Maps/DTOs, never serialize JPA entities directly.
131 Issues Missing Use Cases
Workflow rule: every GitHub issue must reference a Use Case (CU-XX). After auditing all 233 open issues, 131 were missing this link. Batch-fixed via gh CLI scripting.
Quality Metrics
Test Coverage Dashboard
Real-time coverage metrics across backend, frontend, E2E, and API layers. Updated on every merge to main.
📊 Coverage by Test Type
Backend Testing
- Unit Tests (JUnit 5)130 classes
- Integration Tests (H2 DB)H2 + Pg
- JaCoCo Enforcement28% floor
- Target Coverage80%
Frontend Testing
- Component Tests (React)3+ suites
- E2E Tests (Playwright)28 suites
- E2E Test Cases163 tests
- API Tests (Bruno)86 tests
By The Numbers
A Decade of Progress
Every metric tells a story. From zero to production-grade in the AI era.