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

@hanzo/observe-native

v0.1.0

Published

Native + desktop binding for @hanzo/observe. Instruments @hanzo/gui (Tamagui) / React Native presses and inputs, and bridges Tauri desktop, so native and desktop emit the SAME canonical Events as the web — through @hanzo/event to the ONE front door (POST

Readme

@hanzo/observe-native

Native + desktop binding for @hanzo/observe. Makes @hanzo/gui (Tamagui) / React Native apps and Tauri desktop emit the same canonical Events as the web — same semantic hierarchy, same privacy gate, same ONE front door (POST /v1/event via @hanzo/event).

Native has no DOM to walk, so the semantic hierarchy is composed from explicit per-element meta and the surrounding ObserveScope stack — the native equivalent of the web's DOM ancestry, auto-derived from the React tree.

Tamagui / React Native

import { createAnalytics } from '@hanzo/event'
import { ObserveProvider, ObserveScope, useObserve } from '@hanzo/observe-native'

function App() {
  return (
    <ObserveProvider client={createAnalytics({ product: 'app' })}>
      <ObserveScope name="Dashboard">
        <ObserveScope name="UserCard">
          <UserCard />
        </ObserveScope>
      </ObserveScope>
    </ObserveProvider>
  )
}

function UserCard() {
  const o = useObserve()
  return (
    <>
      <Button onPress={o.press('SaveButton', save)} />          {/* Dashboard/UserCard/SaveButton */}
      <Input onChangeText={o.changeText('email', setEmail)} />  {/* value redacted */}
    </>
  )
}

press wraps onPress, changeText wraps onChangeText (RN/Tamagui props) — the interaction is captured, then your handler runs. o.event(name) and o.screen(name) cover custom events and screen views. useEventStream() gives the live rolling window for session playback, same as the web.

Tauri desktop

A Tauri window is a webview, so the DOM lives — bindTauri runs the @hanzo/observe DOM engine to capture the in-webview UI exactly like the web, and forwards Tauri's native window/app events. The /tauri entry is React-free:

import { createAnalytics } from '@hanzo/event'
import { bindTauri } from '@hanzo/observe-native/tauri'

const bridge = bindTauri(createAnalytics({ product: 'desktop' }))
// … later
bridge.stop()

@tauri-apps/api is an optional peer loaded at runtime; calling bindTauri outside a Tauri runtime is safe (the native bridge no-ops, DOM capture still runs in any webview).

Privacy

Identical policy to the web, via the shared @hanzo/observe primitives: input values are withheld by default, sensitive fields (password / email / card / …) are always redacted, and everything is fail-soft. Pass redaction={{ … }} on ObserveProvider (or bindTauri) to tune it.

Same wire, everywhere

A native tap and a web click produce the identical event shape ($click, $el, $path, $component, $value, …) because both go through the one wireProps projection in @hanzo/observe. One vocabulary across web, mobile, and desktop.

License

BSD-3-Clause © Hanzo AI