TreasureBoat turns your database model into a running web application — a model-driven ORM, rule-based UI, and reusable components. Proven WebObjects ideas, rebuilt for modern Java, with first-class IntelliJ tooling.
// Bind a component to your objects with KVC — // no glue code, no boilerplate. Name: TBString { value = product.name; } Price: TBString { value = product.price; formatter = app.currency; } Category: TBHyperlink { string = product.category.name; action = showCategory; }
Describe your data and your rules — TreasureBoat wires the rest. The pieces are small, composable, and have worked in production for decades.
A model-driven ORM. Define entities, attributes and relationships in .eomodeld — no annotations, no XML wrangling. Your objects just have the data.
List, edit and query pages are generated from your model and a handful of rules — then customized only where you need to. Describe the screen once, reuse it everywhere.
Reusable UI as an .wo folder — HTML template + bindings + API. Compose screens from your own components, themed and localized.
Bind anything to anything by name. product.category.name resolves through your object graph — the backbone of data binding and rules.
Ship in every language from day one. .lproj folders keep strings and resources per-locale; entity and attribute names localize too.
Java 21, Maven builds, Docker deployment, self-contained .woa bundles. Old-school productivity, current-day toolchain.
Prefer annotations? MDC builds your .eomodeld straight from annotated Java classes — code-first modeling, right alongside the visual editor.
Server-driven native clients. Your models and rules drive iOS, macOS and beyond — one backend, many surfaces, no per-platform rewrite.
Works with your database. First-class adaptors for PostgreSQL, MySQL/MariaDB, Oracle, MS SQL, DB2, FrontBase, H2, Derby and more — swap without touching your model.
You describe what the app is — the entities and the rules that display them. TreasureBoat handles the how. Flip through a model, a rule, and a component — right down to inline $keypath bindings that drop live values straight into your markup.
// Product entity — model, not annotations entity Product { attribute name : String (columnName="NAME") attribute price : BigDecimal relationship category -> Category (toOne) relationship reviews -> Review (toMany) }
// One Sangria rule → a whole screen, model-aware 100 : (task = 'list' AND EN = 'Product') => DPK = ("name", ":price:", "category", "reviews.@count") 100 : PK = 'price' => d2wType = "currency"
<!-- Product.html — mix HTML with live values inline --> <div class="card ${product.onSale ? 'sale' : ''}"> <h2><tb:str value="$product.name" /></h2> <p class="price"> <tb:str value="Only $product.price today." /> </p> </div>
TreasureBoat isn't just a framework — it's a development experience. Visual editors for your models, components, rules, localization and navigation, plus generators that scaffold the boilerplate. The IDE works with the framework, not around it.
Edit entities, attributes, relationships and fetch specs visually — no hand-editing plists.
Maven builds produce self-contained .woa bundles. Ship a lightweight deploy jar or an all-in embedded bundle, front it with Apache or nginx, and keep an eye on it with the built-in monitor and task daemon.
$ mvn clean package tb:legacy-build BUILD SUCCESS → AppGWare-1.0-20260802.woa · self-contained, ready to deploy
Spin up a TreasureBoat project in IntelliJ, point it at a database, and watch a working web app take shape from your model.