Stop building the same app twice
Build real backoffice apps without a frontend
Define your app once in Java.
Mateu renders the UI, wires interactions, and connects everything to your backend.
No HTML. No CSS. No JavaScript.
No duplicated models. No API glue. No sync issues.

π§ Understand the model
Mateu is simple β once you understand the model.
π Understand the Mateu mental model β
One model. Full app.
With Mateu, you define:
- state
- actions
- behavior
- relationships
- navigation
- layout
- validation
- UI reactions
Everything else is generated.
π Build something real
π Build a full backoffice in 10 minutes β
See how Mateu is used to build a real admin app with:
- forms
- validation
- CRUD
- relationships
- navigation
- browser feedback
This is a real app


Youβre not wiring components.
Youβre not syncing frontend and backend.
Youβre just defining your application.
Write this
@UI("")
public class Home {
@ReadOnly
int count = 0;
@Button
Runnable increment = () -> count++;
}
And get a working UI
No templates. No controllers. No frontend layer.
A real CRUD
@NotEmpty
String name;
@ForeignKey(search = PermissionIdOptionsSupplier.class, label = PermissionIdLabelSupplier.class)
@Stereotype(FieldStereotype.checkbox)
List<String> permissions;
@Button
public Message save() {
return new Message("Saved successfully");
}
Mateu handles:
- rendering
- validation in the browser
- option loading
- interaction
- user feedback
Navigation is your object model
@Menu
MasterDataMenu masterData;
Menus, routing, and structure come from your classes.
One shell. Many services.
Each microservice can expose its own UI.
Compose them with RemoteMenu:
- independent deployment
- unified navigation
- no frontend integration layer
Built for
- internal tools
- admin panels
- microservice backoffices
- CRUD-heavy systems
Why Mateu
- β‘ Less code
- π§ One mental model
- π₯ No frontend bugs
- π§© No duplication
- π Distributed-ready
Stop building the same app twice.
Define it once.
π Try the live demo
π Build a backoffice
π Read the docs
Built by developers who got tired of writing useless code.