Every framework has a story. Oorian's began over a decade ago, born from frustration with the existing options for building Java web applications and a vision for something better.
The Problem We Faced
In the early 2010s, we were building iGradePlus, a comprehensive SaaS platform for educational grading and administration. We evaluated every major Java web framework available:
- Vaadin: Promising, but locked us into their component library with expensive licensing
- ZK: Required learning ZUML, a proprietary templating language
- GWT: Complex compilation step, difficult debugging
- JSF: Verbose, slow, frustrating developer experience
None of them offered what we wanted: the ability to write pure Java code while leveraging the best JavaScript UI libraries available.
The Vision: Wrap, Don't Reinvent
The JavaScript ecosystem had incredible UI components—AG Grid for data tables, Highcharts for visualization, FullCalendar for scheduling. These libraries were maintained by specialists who focused exclusively on making them excellent.
Why should we use inferior versions just because we wanted to write Java? The answer: we shouldn't have to.
Oorian was built on a simple principle: wrap the best JavaScript libraries instead of building mediocre alternatives. Let the specialists handle the complex UI rendering while we handle the server-side logic in type-safe, debuggable Java.
Key Design Decisions
1. Flexible Communication
Not every page needs WebSocket. Not every interaction requires real-time updates. We designed Oorian to let developers choose the right communication mode per page:
// Simple form - AJAX is perfect
@Page(value = "/contact", communication = Communication.AJAX)
public class ContactPage extends HtmlPage { }
// Dashboard with live updates - use SSE
@Page(value = "/dashboard", communication = Communication.SSE)
public class DashboardPage extends HtmlPage { }
// Collaborative editor - full WebSocket
@Page(value = "/editor", communication = Communication.WEBSOCKET)
public class EditorPage extends HtmlPage { }
2. JDK-Style Events
If you've used Swing or JavaFX, you already know Oorian's event model. No new patterns to learn:
button.registerListener(this, MouseClickedEvent.class);
textField.registerListener(this, InputChangeEvent.class);
grid.registerListener(this, RowSelectedEvent.class);
3. Consistent Wrapper Conventions
Every wrapper library follows the same patterns. Learn how to use one, and you can use them all. Configuration is always through Java methods. Events always work the same way. Data binding follows consistent conventions.
Battle-Tested in Production
Oorian isn't a weekend project or an academic exercise. It powers iGradePlus—a commercial SaaS application with:
- 500,000+ lines of code
- Hundreds of pages
- 10+ years of production use
- Thousands of daily users
Every feature has been refined through real-world usage. Every edge case has been encountered and handled.
Why Now?
After years of internal development, we're preparing to share Oorian with the broader Java community. We believe there are many developers who share our frustrations and would benefit from our approach.
Oorian is coming soon. We can't wait to see what you build with it.