npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@nativefragments/core

v0.8.0

Published

Explicit HTML routing, fragments, and streaming for fast web applications.

Downloads

335

Readme

Native Fragments Core

Native Fragments is a small framework for fast, explicit HTML applications on Cloudflare Workers. Core provides server HTML, routing, fragments, streaming, actions, API routes, browser navigation, and Web Worker RPC.

  • Website: https://nativefragments.org
  • Docs: https://docs.nativefragments.org

Create an application:

npm create @nativefragments/app@latest my-app
cd my-app
npm run dev

Or install core into an existing Worker:

npm i @nativefragments/core

Server

import { fragment, html, redirect, route } from "@nativefragments/core/server";
import { createCloudflareHandler } from "@nativefragments/core/cloudflare";

const summary = fragment("summary", {
  loading: () => html`<p>Loading…</p>`,
  error: () => html`<p role="status">Unavailable.</p>`,
  render: async ({ signal }) => html`<p>${await loadSummary({ signal })}</p>`,
});

const routes = [
  route("/", {
    meta: () => ({ title: "Dashboard" }),
    render: (context) => html`
      <h1>Dashboard</h1>
      ${context.defer(summary)}
    `,
    fragments: [summary],
  }),
  route("/todos", {
    action: async ({ request }) => {
      await addTodo(await request.formData());
      return redirect("/todos", 303);
    },
    render: renderTodos,
  }),
];

export default createCloudflareHandler({ routes, shell });

html escapes interpolated values by default. Use raw() only for trusted HTML that has already been validated.

Route headers override the HTML defaults, except Vary: its fields are combined with the framework's document, slot, and protocol selectors. A route can add Vary: Accept-Language without making cached fragments interchangeable with full documents. Vary: * is preserved.

Browser router

import { startRouter } from "@nativefragments/core/client/router.js";

const lifetime = new AbortController();
const router = startRouter({
  prefetch: "intent",
  signal: lifetime.signal,
});

await router.navigate("/reports");
await router.prefetch("/settings");
router.invalidate("/reports");

The router upgrades real anchors and opted-in GET forms. It preserves direct navigation as the fallback, handles history and metadata, supports concurrent named targets, and reveals streamed deferred fragments as frames arrive.

Router and server negotiate X-NativeFragments-Protocol: 2. Missing or unknown versions receive completed buffered fragment HTML, keeping stale tabs safe.

Cached HTML is shared across URL anchors; each navigation keeps its own hash. An already-aborted navigation or prefetch signal rejects with no frame delivery. Invalidating a fragment prevents its pending request from repopulating the cache.

Lifecycle events bubble from the target:

navigation-start → navigation-swap → fragment-reveal* → navigation-complete
navigation-start → navigation-abort | navigation-error

Event names are prefixed with nativefragments:.

Lit components

Lit integration is intentionally separate from core:

npm i @nativefragments/lit lit
import { renderLit } from "@nativefragments/lit/server";
import { html } from "lit";
import "../../client/components/app-card.js";

export const card = () => renderLit(html`<app-card>Ready</app-card>`);
// client/index.js
import "@nativefragments/lit/client";
import "./components/app-card.js";

The adapter pins Lit's evolving SSR packages and keeps that integration out of core and application components.

Web Workers

// client/search-worker.js
import { exposeWorker } from "@nativefragments/core/client/worker.js";
exposeWorker({ search });
import { createWorkerClient } from "@nativefragments/core/client/worker.js";
const worker = createWorkerClient("/build/search-worker.js");
const results = await worker.call("search", { query: "html" });

Tooling policy

Native Fragments has no framework compiler. The scaffold uses esbuild to resolve package imports and create browser and Worker bundles, then Wrangler runs or deploys the Worker. Source remains standards-based ESM, Lit, Web Components, and native Web APIs.

See docs/api-reference.md for generated API details.

Navigation, authentication and streaming guarantees

See the 0.8 migration guide for request preparation, bounded cache policy, cookie-preserving redirects, navigation ownership, streaming lifetimes, no-JavaScript fallbacks, and the HTML trust boundary.