https://github.com/bigskysoftware/the-fixi-project
The Fixi Project
https://github.com/bigskysoftware/the-fixi-project
Last synced: about 2 months ago
JSON representation
The Fixi Project
- Host: GitHub
- URL: https://github.com/bigskysoftware/the-fixi-project
- Owner: bigskysoftware
- Created: 2026-04-25T17:16:57.000Z (about 2 months ago)
- Default Branch: master
- Last Pushed: 2026-04-26T02:25:04.000Z (about 2 months ago)
- Last Synced: 2026-04-26T05:02:34.119Z (about 2 months ago)
- Language: JavaScript
- Homepage: https://fixiproject.org
- Size: 85.9 KB
- Stars: 4
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# 🚲 The Fixi Project
[The Fixi Project](https://fixiproject.org) is a collection of five small web libraries based on other libraries we work
on.
Each library in The Fixi Project is constrained to have an *unminified, uncompressed* source size smaller
than the excellent [Preact](https://preactjs.org) library's [min.gz'd size](https://bundlephobia.com/package/preact)
(~ 4.7kb).
## The Libraries
The five libraries each provide independent bits of functionality, but are designed to compose well. You can mix and
match them as you see fit.
### 🚲 `fixi.js` - supercharged HTML
`fixi.js` is the original and main library in this collection. It is based on [htmx](https://htmx.org) and, like htmx,
makes it possible to issue HTTP requests from elements in response to events.
Here is a fixi-powered button:
```html
Like
```
This button will issue an HTTP POSt to `/like` when it is clicked and will replace itself with whatever HTML content the
server responds with. This simple concept is a surprisingly powerful way to build web applications.
You can read more about how fixi works on its [homepage](https://github.com/bigskysoftware/fixi).
### 🥊 `moxi.js` - inline scripting & simple reactivity
`moxi.js` adds inline scripting and DOM-based reactivity. It is based on [hyperscript](https://hyperscript.org) and lets
you put behavior directly on elements via `on-*` attributes, plus a `live` attribute that re-runs whenever the page
changes.
Here is a moxi-powered button:
```html
Click me
```
This button disables itself and updates its text when clicked, without a separate `` block. Each `on-*` handler
is compiled into an async function with access to helpers like `q()` (a proxy over a set of matched elements), `trigger()`,
`wait()`, and `debounce()`.
You can read more about how moxi works on its [homepage](https://github.com/bigskysoftware/moxi).
### 📡 `ssexi.js` - streaming HTML & events
`ssexi.js` is a companion library for fixi that
adds [Server-Sent Events](https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events) support. It is inspired
by [htmx's SSE extension](https://github.com/bigskysoftware/htmx/blob/four/src/ext/hx-sse.js): whenever a fixi
response comes back with `Content-Type: text/event-stream`, ssexi takes over the swap loop and streams each message into
the target as it arrives.
Here is an ssexi-powered log:
```html
<button fx-action="/events" fx-swap="beforeend" fx-target="#log">
Start
</button>
<div id="log"></div>
```
When `/events` responds with an SSE stream, each `data:` line is appended to `#log`. Messages with a named `event:`
field fire DOM events (`fx:sse:<name>`) instead of swapping, which gives you a clean seam for JavaScript hooks like
progress or "done" signals.
You can read more about how ssexi works on its [homepage](https://github.com/bigskysoftware/ssexi).
### ♻️ `paxi.js` - DOM patching (morphing)
`paxi.js` adds a `morph` swap strategy to fixi. It is based on [idiomorph](https://github.com/bigskysoftware/idiomorph)
and patches an existing subtree into the shape of a new one in place, matching elements by id rather than replacing them
wholesale.
Here is a paxi-powered swap:
```html
<button fx-action="/counter" fx-swap="morph" fx-target="#count">
Increment
</button>
<span id="count">0</span>
```
When the server responds with an updated `<span id="count">1</span>`, paxi morphs the existing span instead of replacing
the node. The practical upshot is that focus, selection, input state, and event listeners survive a swap. It also allows
you to use CSS transitions.
You can read more about how paxi works on its [homepage](https://github.com/bigskysoftware/paxi).
### 🐕 `rexi.js` - an ergonomic `fetch()` wrapper
`rexi.js` is a small fluent wrapper around `fetch()`, inspired by [hyperscript's
`fetch` command](https://hyperscript.org/commands/fetch/). It handles the usual boring parts of calling an HTTP endpoint
from JavaScript: serializing a form or a plain object as a body, throwing on non-2xx responses, decoding the result, and
aborting on demand.
Here is a rexi-powered POST:
```js
let user = await post('/users', {name: 'carson'}).json()
```
rexi serializes the object as a JSON body, throws if the server returns an error status, and decodes the JSON response
for you. It also accepts `FormData`, `URLSearchParams`, or a form `Element` directly as the body, so it slots neatly
into moxi handlers and fixi-driven pages.
You can read more about how rexi works on its [homepage](https://github.com/bigskysoftware/rexi).
## 🧰 `the-fixi-project.js`
All five libraries are also published as a single pre-concatenated, minified, and brotli-compressed bundle under the [
`the-fixi-project`](https://www.npmjs.com/package/the-fixi-project) npm package:
```html
<script src="https://cdn.jsdelivr.net/npm/the-fixi-project/dist/the-fixi-project.min.js">
```
The entire fixi project comes in at ~4.4kb when brotli-compressed.
## Developing
From a fresh checkout of this repo:
```bash
npm install # installs playwright + terser (dev-only)
npm run clone # clones each sub-project repo into its directory
npm test # runs the full test suite across all libraries (headless)
npm run build # builds the all-in-one bundle into dist/
npm run serve # serves the project over http://localhost:8000
```
`npm test` accepts a subset of project names, so `npm test rexi paxi` runs only those two.
## License
BSD-0 (Zero-Clause BSD) across all libraries.