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

@repliql/repliql

v0.1.0

Published

Offline-first cache and local database extension for URQL

Downloads

193

Readme

@repliql/repliql

Offline-first cache and local database extension for URQL

@repliql/repliql is a URQL exchange that replaces document-cache or normalized cache solutions with a SQLite-backed, offline-first cache. Queries are resolved locally against a ReactiveKysely database, mutations can be optimistic and replayed against the network, and live results re-emit as the underlying data changes.

Install

npm install @repliql/repliql @urql/core kysely wonka
# or
bun add @repliql/repliql @urql/core kysely wonka

@urql/core, kysely, and wonka are required peer dependencies.

Use cases

  • Large datasets you want to query and filter locally
  • Offline support with data persistence
  • Auto-suggest, auto-completion against cached data
  • Data shared between tabs / windows
  • Apps like calendars, mail clients, project management tools

Exchanges

repliqlExchange

The main exchange. Resolves queries from a local SQLite database, persists results from the network, runs optimistic mutations, and re-emits operations whose result is invalidated by row changes.

import { repliqlExchange } from '@repliql/repliql'
import { ReactiveKysely } from '@repliql/reactive-kysely'
import { Client, fetchExchange } from '@urql/core'

const kysely = new ReactiveKysely({
  dialect: /* SQLite dialect */,
  createCallbackFunction: (name, cb) => { /* register SQLite UDF */ },
})

const client = new Client({
  url: '/graphql',
  exchanges: [
    repliqlExchange({
      kysely,
      resolvers: {
        Query: {
          itemById: (_parent, { id }) => ({ __typename: 'Item', id }),
        },
        Mutation: {
          updateItem: async (_parent, { input }, ctx) => {
            return ctx.patchEntity({ __typename: 'Item', ...input })
          },
        },
      },
    }),
    fetchExchange,
  ],
})

Key behaviors:

  • Local resolution — operations are executed against the cache via field/mutation resolvers. Resolvers receive a context with entityByRef, queryById, filterEntityPointers, and (for mutations) patchEntity.
  • Live updates — the exchange tracks which entities/queries each operation visits; when a row update touches a tracked entity or query, the operation is re-executed with cache-only.
  • Network fallback — cache misses, errored local results, and cache-and-network / network-only policies are forwarded to the next exchange. Successful network results are persisted back to the database.
  • Optimistic mutationspatchEntity writes optimistic entities into the cache and a background MutationsProcessor reconciles them with the server response.

fastCacheExchange

In-memory result registry keyed by URQL operation key. Returns the last seen result synchronously for repeat queries while the slower normalized cache catches up. Use it in tabs for synchronous results while authoritative query is running asynchronously in SQLite.

import { fastCacheExchange } from '@repliql/repliql'

fastCacheExchange({ eviction: { strategy: 'delayed', delayMs: 60_000 } })

coldStartExchange

Persists query results to OPFS so the next page load can answer queries before the database is ready.

import { coldStartExchange } from '@repliql/repliql'

coldStartExchange({
  directory: 'repliql-cold-start',
  flushDelayMs: 2_000,
  sweepDelayMs: 120_000,
})

Recommended exchange order

exchanges: [
  fastCacheExchange({ eviction: { strategy: 'delayed', delayMs: 60_000 } }),
  coldStartExchange(),
  repliqlExchange({ kysely, resolvers }),
  fetchExchange,
]

Status

Early development. The public API is experimental and may change between minor versions.

License

MIT