Meta-Data Driven
Define your tables, fields, and relationships declaratively. Your schema becomes your application with automatic CRUD, validation, and UI generation.
Enterprise features built-in, not bolted-on. The open-source Java framework that eliminates 80% of boilerplate while giving you full code ownership.
Stop rebuilding the same enterprise features for every project. qqq provides production-ready capabilities from day one.
Define your tables, fields, and relationships declaratively. Your schema becomes your application with automatic CRUD, validation, and UI generation.
OIDC, SAML, OAuth2, and custom auth providers. Integrate with Auth0, Okta, Azure AD, or roll your own - all with zero code.
Every action logged automatically. Who changed what, when, and why. Built for SOC2, HIPAA, and enterprise compliance requirements.
Connect to PostgreSQL, MySQL, MongoDB, REST APIs, S3, and more. Query across multiple data sources with a unified API.
Visual workflow designer for approvals, notifications, and automations. Schedule jobs, trigger events, add human-in-the-loop.
Fine-grained permissions at table, field, and record level. Declarative security that's auditable and maintainable.
Production-ready admin interface from your schema. Search, filter, bulk edit, export - all ready without writing frontend code.
Auto-generated REST APIs with OpenAPI documentation. GraphQL support coming soon. Build headless or use the included UI.
Built-in reporting engine with export capabilities. Create dashboards, schedule reports, and visualize your data.
Define your data model once. Get CRUD, APIs, UI, auth, and audit logging automatically.
public class OrderTable implements TableMetaDataProducer { public QTableMetaData produce(QInstance qInstance) { return new QTableMetaData() .withName("order") .withFields(List.of( new QFieldMetaData("id", INTEGER) .withIsPrimaryKey(true), new QFieldMetaData("customerId", INTEGER) .withIsRequired(true), new QFieldMetaData("orderDate", DATE_TIME), new QFieldMetaData("status", STRING) .withPossibleValues("orderStatus"), new QFieldMetaData("total", DECIMAL) )) .withAuditRules(AuditLevel.RECORD); } }
That's it. You now have CRUD, REST API, Admin UI, audit logs, permissions, and validation.
qInstance.withAuthentication(
new QAuthenticationMetaData()
.withType(QAuthenticationType.OAUTH2)
.withOAuth2Provider("auth0")
);One configuration. Full OAuth2/OIDC support.
new QPermission()
.withName("sales")
.withTablePermissions(List.of(
new QTablePermission()
.withTableName("order")
.withAllowInsert(true)
.withAllowUpdate(true)
));Declarative RBAC. Field-level control available.
new QProcessMetaData()
.withName("approveOrder")
.withSteps(List.of(
new ValidateStep(),
new UpdateStatusStep(),
new NotifyCustomerStep()
));Chain steps together. Add approvals, automations.
qqq's layered architecture keeps your code clean while providing powerful capabilities at every level.
Auto-generated Admin UI or your custom frontend
Auto-generated REST endpoints with OpenAPI docs
Actions, processes, validation, auth, audit
Your schema definitions drive everything above
Pluggable data sources and integrations
Tables, fields, relationships
Auth, validation, audit happen automatically
REST endpoints with docs, ready to use
Production admin UI from your schema
qqq includes enterprise features that other frameworks require plugins, libraries, or custom code to achieve.
| Feature | qqq | Spring Boot | Ruby on Rails | Django |
|---|---|---|---|---|
| CRUD Operations | Automatic from schema | Manual: Entity + Repository + Service + Controller | Scaffolding + customization | Admin auto, API manual |
| Admin UI | Auto-generated, production-ready | Build yourself or add library | Gems like ActiveAdmin | Django Admin (basic) |
| REST API | Auto-generated with OpenAPI | Manual controllers + Swagger | Manual or rails-api | DRF (separate library) |
| Authentication | Built-in, declarative config | Spring Security (complex) | Devise gem | django-allauth |
| Audit Logging | Built-in, automatic | Hibernate Envers or custom | PaperTrail gem | django-auditlog |
| RBAC Permissions | Built-in, field-level | Manual or Spring ACL | CanCanCan/Pundit gems | django-guardian |
| Multi-tenancy | Built-in support | Custom implementation | Apartment gem | django-tenants |
| Time to First CRUD | Minutes | Hours | 30 minutes | 30 minutes |
Build in days what takes weeks with traditional frameworks. Focus on business logic, not boilerplate.
Auth, audit, RBAC, multi-tenancy built-in. No plugin hunting or integration headaches.
It's just Java. Escape hatches everywhere. No lock-in, no magic you can't understand.