Everything you need to annotate any page

A complete toolkit — from the annotation engine to React bindings and storage adapters.

Drop Pins Anywhere

Click any point on rendered HTML to place an annotation.

Scroll Sync

Comment pins stay aligned with content.

Adapter Pattern

Bring your own backend.

Zero Dependencies

`@washi-ui/core` has zero framework dependencies.

Headless Hooks

Use useWashi for full UI control. Render your own UI.

Fully Typed

Typed end-to-end with TypeScript.

Get started in minutes

Three packages, one unified API. Drop Washi into any project.

import { useMemo } from 'react'
import { WashiProvider, WashiFrame, WashiUI } from '@washi-ui/react'
import { LocalStorageAdapter } from '@washi-ui/adapters'

export default function App() {
  const adapter = useMemo(
    () => new LocalStorageAdapter('my-page'),
    [],
  );

  return (
    <WashiProvider adapter={adapter}>
      <WashiFrame
        src="/content.html"
        style={{ width: '100%', height: '100vh', border: 'none' }}
      />
      <WashiUI position="bottom-right" />
    </WashiProvider>
  );
}

Three focused packages

Install only what you need. Each package is independently versioned and published.

@washi-ui/core

Framework-agnostic annotation engine. Zero dependencies.

npm i @washi-ui/core
@washi-ui/react

React hooks and components. WashiProvider, WashiFrame, WashiUI.

npm i @washi-ui/react
@washi-ui/adapters

Built-in localStorage and in-memory adapters.

npm i @washi-ui/adapters

Get started with Washi UI today

Open source, MIT licensed, ready to use in production.