No bundler
Your files are plain ES modules loaded through an import map. Edit a file, reload the page, and you see the change. What you write is what you ship.
JOPS (the package is called jops-core) is a lightweight single-page-application framework for developers who think in classes and native-mobile patterns. It is built on native ES modules and runs directly in the browser.
No Webpack. No Babel. No compiler. Just <script type="module"> and a browser.
Modern front-end stacks ask you to adopt a build toolchain before you write your first screen. JOPS drops that toolchain and keeps the part that makes large apps manageable: a structured, class-based architecture.
No bundler
Your files are plain ES modules loaded through an import map. Edit a file, reload the page, and you see the change. What you write is what you ship.
Object-oriented views
Every screen and component is a class that extends View. Inheritance, composition and encapsulation work the way they do in Java, C#, Kotlin or Swift.
Android-style lifecycle
The framework calls onLayout(), onResume(), onPause() and onBackPressed() at the moments you expect from Android development.
HTML layouts
Layouts are plain HTML files or layout template strings. Views are nested declaratively with tags like <MyView jops src="…">, with no element registration.
A short taste of what a view looks like:
import { View, layout } from "jops-core";
export default class Greeting extends View { constructor() { super(); this.layout = layout` <section> <h2 id="title"></h2> <button jops-event-bind onclick="onHello">Say hello</button> </section> `; this.inflate(); }
onLayout() { // the layout is in the DOM this.get("title").set("Welcome to JOPS"); }
onHello() { this.get("title").set("Hello!"); }}The layout tag escapes every value you interpolate, so data from users or the network is safe by default. You opt out explicitly with raw() for trusted HTML.
JOPS is made for teams who want a structured front end without the npm/Webpack/Babel overhead:
How JOPS compares to other frameworks that care about simplicity or structure:
| No bundler | OOP classes | Declarative view nesting | No element registration | |
|---|---|---|---|---|
| JOPS | ✅ | ✅ | ✅ | ✅ |
| Lit | ✅ | ✅ | ⚠️ Web Components only | ❌ |
| Stimulus | ✅ | ✅ | ❌ | ✅ |
| Alpine.js | ✅ | ❌ | ❌ | ✅ |
| Angular | ❌ | ✅ | ✅ | ✅ |
| Svelte | ❌ (compiler) | ✅ | ✅ | ✅ |
JOPS is not a replacement for React. React and Next.js keep their strengths: Server Components, data loading, routing and a large ecosystem. Modern React is built around function components and hooks, which is a proven model of its own.
JOPS offers a different choice for teams that think in classes, and the two can live in the same code base. A JOPS SPA can run inside a Next.js page, next to your React pages, with Next.js as its backend: the JOPS app calls Next.js Route Handlers with fetch(). Next.js owns the path (/quotes), JOPS owns the hash (/quotes#details). The jops-core/nextjs package entry provides the JopsApp React component that connects them.
The jops-core package contains:
View, the base class for every screen and component, with get() for element access and addSubView() for composition.layout and raw(), the template tag for escaped HTML layouts.Router, with flat hash routes declared in HTML, stacked views with navigate(), animations and a screens mode.Store, a singleton for shared data, and EventBus, a pub/sub channel.mount() and unmount() for running an app inside another page.Thread, a Web Worker base class.npx jops-core) that scaffolds projects from templates, updates the library and builds for production.