Announcement

Why We Built Oorian: The Story Behind the Framework

The story of how Oorian came to be, born from frustration with existing Java web frameworks and a vision for something better.

M. WarbleJanuary 8, 20263 min read

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.

Related Articles

Tutorial

Getting Started with Oorian: Your First Java Web Application

December 31, 2025