Community
Releases
Release notes for every Bascik version, including new features, bug fixes, and breaking changes. This page is generated from the repository CHANGELOG.md, which follows Keep a Changelog and Semantic Versioning.
1.0.0-rc.13 - 2026-11-11
One addition on top of 1.0.0-rc.12: a stream script can send its output a piece at a time. This candidate ships @bascik/bascik, create-bascik and @bascik/adapter-cloudflare as 1.0.0-rc.13 and @bascik/adapter-netlify as 1.0.0-rc.3. The language server and the VS Code extension are unchanged.
Added
- Stream scripts can yield. A
data-bascik-streamscript written as a generator (export default async function*) sends each value it yields to the browser as soon as it is yielded, in order, where the script tag was. One script can now stream a list row by row from a database cursor, a paged API or several calls, where it used to take one script tag per row. Each yielded value follows the rules for a returned one (a string, anhtmlvalue, or an array of them), has the component's scoped class names applied, and may hold component tags, which are rendered as the value is sent. The placeholder recipes work unchanged: a row that arrives can cover a skeleton row, and content below the list can still paint first. A failure part-way keeps the rows already sent and followsscripts.onServerScriptError;scripts.timeoutcounts only the time the script takes to produce values, not the time the visitor's connection takes to accept them; and when the visitor leaves, the generator is ended so itsfinallyblocks run. A value the generator returns is sent last. Adata-bascik-serverscript may be a generator too: its values are joined before the page is sent. Works on the dev server,bascik --server,@bascik/adapter-cloudflareand@bascik/adapter-netlify. See Yield rows as they arrive. @bascik/bascik/runtime(for adapter authors):ScriptOutputRunner, a job runner that may resolve to an async iterable of chunks, accepted bycomposeBufferedResponse,streamComposedResponseandwrapRunner;invokeLoadedWithDeadlineandinvokeWithDeadlinetakechunks: trueto turn a returned generator into aScriptChunkSource; andscriptChunkOutput,scriptChunkIteratorandcollectScriptJobOutputbuild on it. AScriptJobRunnerthat returns strings keeps working unchanged.@bascik/bascik/runtime(for adapter authors):scriptJobOutputandsettleScriptOutputturn a script's settled result into its output the way the built-in server and both official adapters now do, through one function: printed, stripped of ANSI escapes, scoped to its component, refused when it is not markup, and reported underscripts.onServerScriptError. An adapter passes aScriptOutputPolicywith its own log and failure description instead of re-implementing those rules. See the custom adapter tutorial.
Changed
- A server or stream script that returns a generator object used to be refused as "an object ([object AsyncGenerator])" and leave an empty slot. It is now run as a script that yields. A generator inside a returned array, or yielded without
yield*, is refused with a message that says to delegate withyield*. - A server or stream script that returns a typed array (a
Uint8Array) is refused like any other value that is not markup, with a message that says to decode it. It used to print the byte values as comma-separated numbers. A NodeBufferstill prints its text.
1.0.0-rc.12 - 2026-11-09
The release candidate for 1.0.0: the full pre-launch audit lands here so every site can be tested against it before the stable release. Install it with npm create bascik@rc or @bascik/bascik@rc. This candidate ships @bascik/bascik, create-bascik and @bascik/adapter-cloudflare as 1.0.0-rc.12, @bascik/adapter-netlify as 1.0.0-rc.2, @bascik/language-server as 1.0.0-rc.1, and the VS Code extension as 0.7.0 on the pre-release channel.
Bascik is a build tool for HTML components with automatically scoped CSS and JavaScript and no runtime: you write vanilla HTML, CSS, and JavaScript in one file per component, and bascik --build emits static HTML pages with the component's styles and scripts scoped to each instance. The notes below cover everything since the project started; 1.0.0 will carry the same notes plus whatever the candidate period finds.
Added
- Components: one
.htmlfile per component, used as a custom tag in pages and other components; props throughdata-bascik-prop-*, slots with fallbacks and named slots, attribute inheritance onto the component root, and companion.cssand.tsfiles. - Scoped styles and scripts at build time: class, id, and element selectors are rewritten per component, and the scripts that query them are rewritten to match, covering
@layer,@container,@scope, keyframes, custom properties, CSS nesting,querySelector,getElementById,classList, template literals, and more. The compatibility page lists every supported pattern;preserveopts an element or a selector out. - Scripts that run at build, request, and stream time:
data-bascik-buildfor build-time rendering with a disk cache,data-bascik-serveranddata-bascik-streamfor request-time rendering that expands components in their output,data-bascik-routesfor dynamic routes, API routes, andexecscripts with pre, parallel, and post phases. Scripts are TypeScript by default; Node strips the types. - Development server with live reload over Server-Sent Events, an error overlay, incremental rebuilds that only touch dependent pages, and a worker pool for large sites. Production server over HTTP/1.1 and HTTP/2 with TLS, precompression, caching headers, and body limits, or a plain static
dist/for any host. - Hosting adapters:
@bascik/adapter-cloudflarebuilds a Workers bundle with static assets, and@bascik/adapter-netlifybuilds a Functions v2 deployment; both keep request-time scripts and API routes working, and the custom adapter API covers other hosts. bascik --check, a linter for components, pages, config, and the built output (WHATWG parsing, scoping compatibility rules, API route rules, TypeScript errors with--typescript), backed by@bascik/language-server, which also powers the VS Code extension: diagnostics, completions, hovers, go to definition, and references across components.create-bascik(npm create bascik my-site): a starter site with components, unit tests on Vitest, Playwright end-to-end tests, alintscript, VS Code settings, and templates for Cloudflare and Netlify.- Agent skills for coding assistants, installed by
create-bascikandbascik initor withnpx skills add bascikdev/bascik, plusAGENTS.mdandCLAUDE.mdproject briefs andllms.txton the docs site. @bascik/bascik/html, a dependency-free tagged template for safe HTML in server and build scripts, and@bascik/bascik/configwithdefineConfigfor a typedbascik.config.ts.- Production build options: identifier minification, HTML and CSS minification with a bring-your-own-minifier hook, asset fingerprinting, sitemap and robots generation, base paths, and a build log.
- API routes:
export defaulthandles every method the file has no named export for, so one function can serve a proxy, a webhook, or a mounted router. Named exports still win,OPTIONSandHEADreach the default export, and methods outside the seven supported ones are still refused with405. It works the same in the dev server,bascik --server, and the Cloudflare and Netlify adapters. A route that already had a default export alongside its method exports now sends other methods to it instead of answering405. See One Handler for Every Method. @bascik/language-server:missing-method-handleraccepts an API route whose only handler is a default export.
Changed
- The minimum supported Node.js version is 24.21.0. Earlier release candidates supported Node 22.22; npm 10.9 (bundled with Node 22) cannot install the starter project's dependencies, and Node 24.21 is the first release where
node --checklocates a syntax error in a.jsconfig, whichbascikrelies on to name the line. The floor is the first version proven to work end to end. create-bascik: in the Cloudflare and Netlify templatesnpm run devis the Bascik dev server again (bascik,http://localhost:8080), as in the default template. The host's local runtime moves to its own script,npm run dev:cloudflareornpm run dev:netlify(bascik --target ..., with source watching and browser live reload). Existing projects are not changed; to match, set"dev": "bascik"and add thedev:<host>script. See Cloudflare and Netlify.bascik-configskill: a "Tune build and server performance" table says when to turn onpipeline.workers,assets.symlink,http.precompressandhttp.cacheControl, and which of them do nothing on Cloudflare and Netlify.
Fixed
- The pinned
Server running atlink in the dev server's terminal no longer opens a garbled address. In VS Code's terminal, when a long log line wrapped and its first half scrolled away, the remaining half was read as part of the pinned row, so Cmd/Ctrl+click opened something likehttp://localhost:8080ages/img/photo.webp.