A TypeScript UI framework built around reactive signals, with packages for rendering, routing, and server-side applications. I built it to explore how much of an application can share one reactive model across the browser and server.
Status: experimental, version 0.1.0. Start with the core below. Packages in this monorepo have different levels of completeness; the small verified example is not a claim that every integration is ready for production.
With Node.js 24 or newer, this example runs directly from a fresh checkout without installing dependencies:
git clone https://github.com/PhilipJohnBasile/philjs.git
cd philjs
node examples/signals-demo.mjsIt uses the actual signals implementation to calculate an order total. Changing the quantity updates the total; batching a price and quantity change triggers one effect update; disposing the effect stops its subscription. The example checks those behaviors before printing:
Initial total: $20
Three items: $60
Batched price + quantity update: $60
Effect disposed; derived total still updates: $40
Signals, memoization, batching, and disposal checks passed.
The Core demo workflow runs the same command. It covers this source-based example, not a full framework build or browser compatibility matrix.
| Area | Source | What it explores |
|---|---|---|
| Reactivity | Core | Signals, derived values, effects, batching, and cleanup |
| Rendering | JSX runtime, SSR | Browser rendering and HTML generation |
| Navigation | Router | Application routing |
| Applications | Todo example, demo app | Larger examples that require the workspace toolchain |
| Systems work | Rust packages | Rust-side framework experiments |
The monorepo uses Node.js 24+ and pnpm 9.15.4, as declared in package.json.
pnpm install --frozen-lockfile
pnpm --filter @philjs/core test
pnpm --filter @philjs/core buildThese are the package's development commands. The dependency-free demo above is the smallest entry point; see CONTRIBUTING.md for the wider development workflow and verification notes for the checks exercised in the latest documentation refresh.
The core tracks which computations read each signal. Updates notify those computations, memos compute derived values lazily, and explicit cleanup controls subscription lifetime. That makes dependency tracking and update behavior visible in a relatively small implementation.
The surrounding packages are experiments in applying that model to more of an application. Their presence in the repository does not imply a shared maturity level. Check an individual package's code, tests, and example before depending on it.
Documentation · Examples · Change log · Issues
MIT.