✦ Quatrion Portal
⚠️ ALPHA VERSION — Under active development. APIs may change without backward compatibility.
An automatic, metadata-driven admin UI generated from annotated JPA entities. Zero frontend code. Zero per-entity React components.
@Entity @Table(name = "customer")
@PortalEntity(label = "Customer", module = "CRM", icon = "users", order = 1)
class Customer {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long = 0
@Column(length = 100, nullable = false)
@PortalField(label = "Name", order = 1, required = true,
renderer = RendererType.TEXT, filterType = FilterType.CONTAINS)
var name: String = ""
}
// ↑ That's it. Table, form, filters, search — all generated automatically.How it works
Annotate your JPA entity
Add @PortalEntity, @PortalField and other annotations to your Kotlin/JPA class.
Register in AppModuleConfig
ModuleDef(name = "CRM", label = "CRM", icon = "users", order = 1,
defaultEntity = Customer::class.java,
entities = listOf(EntityRef(entityClass = Customer::class.java, order = 1))
)Start the application
The backend exposes /api/portal/metadata, the frontend generates a full CRUD UI.
Key features
| Feature | Status |
|---|---|
| Auto-generated CRUD tables | ✅ Available |
| Auto-generated forms with validation | ✅ Available |
| Column filters & global search | ✅ Available |
| Module / sidebar navigation | ✅ Available |
| Keycloak OIDC authentication | ✅ Available |
Role-based field/action security (@PortalSecurity) | ✅ Available |
Custom action buttons (@PortalAction) | ✅ Available |
Relation lookups (@PortalRelation, @PortalLookup) | ✅ Available |
Conditional field rules (@PortalDependency) | ✅ Available |
| Soft delete & audit log | ✅ Available |
| CSV / Excel export | 🔄 In progress |
| Multi-tenant support | 🔄 Planned |
Tech stack
| Layer | Technology |
|---|---|
| Backend | Quarkus 3.23 + Kotlin 2.2 + Hibernate Reactive |
| Frontend | Next.js 16 + React 19 + TanStack Table/Query + Shadcn/UI |
| Auth | Keycloak 25 (OIDC / JWT) |
| Database | PostgreSQL 16 |
| Delivery | Docker / Docker Compose |
Quick start
The frontend is delivered as a pre-built Docker image: ghcr.io/mderkowski82/quatrion-portal-frontend:latest
You don’t write a single line of React — just annotate your backend entities.
Last updated on