**Version: 0.16.1**
Objects present themselves. You write HTML templates.
This is not your grandfather's web framework. Traditional frameworks build UIs from pages, routes, and components. ui-engine builds UIs from objects that present themselves—a Contact renders as a detail view, a list row, an editor, or a dropdown option depending on context. Same object, different presentations.
Contact object → presents as:
├── Contact.DEFAULT.html (full detail view)
├── Contact.list-item.html (compact row)
└── Contact.option.html (dropdown option)
No frontend JavaScript. No API layers. No state management. Objects ARE the state.
-- Backend: domain objects + presenters
Contact = {type = "Contact"}
function Contact:fullName()
return self.firstName .. " " .. self.lastName
end
ContactPresenter = {type = "ContactPresenter"}
function ContactPresenter:delete()
app:removeContact(self.contact)
end<!-- Frontend: just HTML templates with bindings -->
<input ui-value="firstName">
<span ui-value="fullName()"></span>
<button ui-action="save()">Save</button>Modify objects directly. UI updates automatically. No plumbing required.
./build/ui-engine-demo --port 8000 --dir demoOpen http://localhost:8000 to see the Contact Manager demo.
See demo/README.md for details.
- USAGE.md — Complete guide: bindings, events, path properties, ViewList, namespaces
- TRADEOFFS.md — When to use ui-engine vs traditional web architecture
- demo/ — Working examples (Contact Manager, Simple Adder)
- Declarative bindings —
ui-value,ui-action,ui-view,ui-html,ui-attr-*,ui-class-* - Automatic change detection — no observer pattern, no boilerplate
- Hot-reloading — edit backend code or templates, see changes instantly (state preserved)
- ViewList — automatic presenter wrapping for collections
- Namespace system — multiple views per type (list-item, detail, etc.)
- Desktop applications — Electron-style apps without the complexity
- Internal tools — Admin panels, dashboards, dev tools
- Kiosk/embedded UIs — Local displays, point-of-sale, industrial HMI
- Rapid prototyping — Get from idea to working UI in minutes
The reactive WebSocket architecture assumes low latency between client and server, making it ideal for local or LAN deployments rather than internet-scale web apps.
Embedded Lua backend for the frictionless project. The architecture supports other backends (Go, proxied external programs) but Lua is the priority.