A TypeScript-first framework for single-page apps. Plain TypeScript: no JSX, no template language, no build configuration. Views are function calls (h.div(...)) that TypeScript type-checks like any other code. In development, each .ts file is served as a module with its types removed; jasno build bundles the application for production.
npm create @jasno my-app
cd my-app
npm install
npm run devimport { component, h, mount, signal } from '@jasno/core';
const Counter = component(function Counter(): Node {
const count = signal(0);
return h.button(
{ type: 'button', onclick: () => count.update((n) => n + 1) },
'Clicked ', count, ' times',
);
});
mount(Counter, document.getElementById('app'));The component body runs once. Passing count (or any function) as a child keeps the text live: jasno calls it again when count changes and updates the text node. Passing count() instead renders only the initial value.
Mistakes that would fail silently in other frameworks are type errors or diagnostics with a fix in the message.
- No build configuration.
jasno devstrips types as it serves, one module per file.jasno buildbundles with Rolldown into hashed chunks, one per lazy view, with source maps, integrity, the CSP,_headersand_redirects. npm packages are imported by name. A stylesheet inassets/that imports tailwindcss is compiled by the project's@tailwindcss/cli. - Checks.
jasno checkruns tsc on the browser and test programs plus jasno's own rules. In development, problems are reported with a code;npm run explain CODEprints the repair guide. - Accessibility built in. The router moves focus to each view's heading; lost focus, unnamed controls and a few other mistakes are reported.
- Testing.
@jasno/core/testingmounts components undernode:testwith happy-dom; the template adds Playwright in Chromium, Firefox and WebKit. - Small. The production runtime with the router is about 16 KB gzipped.
| Command | What it does |
|---|---|
npm run check |
Type-checks the application and tests, and runs jasno's rules |
npm test |
Runs component tests with node:test and happy-dom |
npm run dev |
Starts the development server |
npm run build |
Bundles the application for production into dist/ |
npm run preview |
Serves dist/ as a static host would |
npm run explain CODE |
Prints the repair guide for a diagnostic code |
The package includes its documentation:
AGENTS.md: the guide for coding agents. TheAGENTS.mdof a project made bynpm create @jasnopoints to it.dist/jasno.d.ts: the full API, with a RECIPES block of common patterns.
The design and its decisions are in design/ in the repository.
- Node
>=24.12.0 - TypeScript
~7.0.2 - Browsers: Chrome and Edge 136+, Firefox 138+, Safari 18.4+
jasno/: the runtime, the CLI and their tests (npm test,npm run check,npm run test:browser,npm run test:package,npm run test:template)create-jasno/: thenpm create @jasnotemplate (the@jasno/createpackage)design/: the specification, the agent guide and the public types