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

@use-chrome-ai/react

v0.1.2

Published

React hooks for Chrome's built-in AI (Gemini Nano), built on use-chrome-ai. Headless — bring your own UI.

Downloads

333

Readme

@use-chrome-ai/react

React hooks for Chrome's built-in AI. Build streaming, on-device AI features with Gemini Nano in Chrome, without API keys, server calls, or a UI framework on top of React.

Live demo: Smart Tooltip, Chat, and Summarizer. Open it in desktop Chrome with built-in AI enabled.

Why Install It

@use-chrome-ai/react is the quickest way to add Chrome built-in AI to a React app:

  • One hook gives you a complete streaming chat loop.
  • Model availability, download progress, aborts, and errors are exposed as React state.
  • The package is headless, so you keep your own design system.
  • The framework-agnostic use-chrome-ai core is re-exported for prompt, summarizer, writer, rewriter, translator, proofreader, and language detector controllers.

Install

npm i @use-chrome-ai/react

react is a peer dependency (>=18).

One-Hook Chat

This is the main selling point: a working Chrome AI chat experience from one hook. The hook owns input state, streams assistant replies into messages, exposes stop(), and tells you when Chrome needs the model download button.

import { useChat } from "@use-chrome-ai/react";

export function Chat() {
  const { messages, input, setInput, send, stop, isStreaming, error, model } =
    useChat({
      system: "You are a concise, friendly assistant.",
    });

  if (model.isUnavailable) {
    return <p>Built-in AI is not available in this browser.</p>;
  }

  if (!model.isChecking && model.availability === "downloadable") {
    return (
      <button type="button" onClick={() => void model.download()}>
        Enable on-device AI
      </button>
    );
  }

  if (model.isDownloading) {
    return <progress value={model.progress} max={1} />;
  }

  return (
    <form
      onSubmit={(event) => {
        event.preventDefault();
        void send();
      }}
    >
      {messages.map((message, index) => (
        <p key={index}>
          <strong>{message.role}:</strong> {message.content}
        </p>
      ))}

      <input
        value={input}
        onChange={(event) => setInput(event.target.value)}
        disabled={isStreaming || !model.isReady}
      />

      {isStreaming ? (
        <button type="button" onClick={stop}>
          Stop
        </button>
      ) : (
        <button type="submit" disabled={!input.trim() || !model.isReady}>
          Send
        </button>
      )}

      {error && <p role="alert">{error.message}</p>}
    </form>
  );
}

For the fuller styled version, see the React chat demo source.

What You Get

The React adapter wraps the browser APIs in small, predictable hooks:

| Hook | Use it for | | --- | --- | | useChat() | Multi-turn streaming chat | | usePrompt() | One-off Prompt API calls | | useSummarizer() | Summaries, key points, and TLDR flows | | useWriter() | Drafting new text | | useRewriter() | Changing tone, length, or style | | useTranslator() | Browser-backed translation | | useProofreader() | Proofreading and correction suggestions | | useLanguageDetector() | Language detection | | useModelStatus() | Binding any core controller to React state | | useAiController() | Escape hatch for custom core controller usage |

Hooks do not reject during normal UI use. They update error, keep model current, and expose a stop function when the underlying API supports aborting.

Links