https://github.com/thefrontside/freedom
Freedom (free DOM) — a general-purpose abstract component tree built on Effection structured concurrency
https://github.com/thefrontside/freedom
Last synced: 17 days ago
JSON representation
Freedom (free DOM) — a general-purpose abstract component tree built on Effection structured concurrency
- Host: GitHub
- URL: https://github.com/thefrontside/freedom
- Owner: thefrontside
- Created: 2026-04-13T17:45:12.000Z (3 months ago)
- Default Branch: main
- Last Pushed: 2026-04-28T01:16:09.000Z (2 months ago)
- Last Synced: 2026-05-15T03:46:59.125Z (about 2 months ago)
- Language: TypeScript
- Size: 122 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- Agents: AGENTS.md
Awesome Lists containing this project
README
# Freedom
A general-purpose abstract component tree built on
[Effection](https://frontside.com/effection) structured concurrency. Freedom
("free DOM") maintains a tree of long-lived, stateful component nodes where each
node is an Effection resource with a scope, a JSON-like property bag, and
ordered children. It is designed to accept a firehose of events of any type
through a single synchronous `dispatch()` entry point, and emit change
notifications on an output stream for renderers to consume.
## Specs
- [Freedom Specification](specs/freedom-spec.md)
- [Freedom Conformance Test Plan](specs/freedom-test-plan.md)
## Extension Modules
Freedom is extensible through extension modules — operations installed by the
root component that add capabilities to the tree using Freedom's context APIs.
Extensions use middleware interception, scoped evaluation, and the property bag
to layer behavior without modifying the core.
### Focus
The [Focus extension](specs/freedom-focus-spec.md) tracks which node in the tree
is currently receiving input. Focus state is observable as a regular node
property (`node.props.focused`), and the focus chain is derived from the tree by
depth-first traversal. See the [research summary](research/focus.md) for
background on focus management across UI paradigms.
Install focus in the root component:
```ts
function* app(): Operation {
yield* useFocus();
// ... rest of app
}
```