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

@sidestep/dashboard

v0.1.1

Published

SideStep — a fast, local-first dashboard for your Xano workspace. OAuth 2.1 + PKCE via a Node BFF and a React/Vite/Tailwind UI.

Downloads

270

Readme

SideStep Dashboard

Your Xano workspace, on your machine. A fast, local-first dashboard for browsing what's in your workspace, working with your database data, and seeing what your backend is doing — without leaving your laptop or handing your tokens to anyone.

Built with SideStep. Runs entirely on localhost: a small Node backend-for-frontend (BFF) paired with a React + Vite + Tailwind UI. You sign in through Xano's own OAuth 2.1 + PKCE flow; the BFF holds your tokens on local disk and proxies authenticated calls to your instance.

Why SideStep

  • Local-first. No cloud middleman, no third-party server. It's your data, your machine, your Xano instance — end to end over loopback.
  • Secure by default. Tokens stay in the BFF, never in the browser. Loopback binding, DNS-rebind guard, CSRF protection, and one-click token revocation on sign-out (details in Security).
  • Zero config to start. npm install, sign in with Xano, and you're in.
  • Fast. A Vite SPA over a thin local proxy — no round-trips to a hosted console.

Features

Live today

  • Sign in with Xano — hosted OAuth 2.1 + PKCE, pick your instance and workspace at consent.
  • Workspace overview — the connected instance/workspace and identity, plus at-a-glance counts of API groups, APIs (authenticated vs public), and tables.
  • API browser — explore API groups and their endpoints, each showing its HTTP verb and authentication state (public, or which auth table guards it); drill into an endpoint for its inputs and cache settings.
  • Table browser — browse database tables (auth tables flagged), inspect a table's schema and indexes, and page through its row content — read-only.

All object browsing is read-only by design: your SideStep code is the source of truth for structure, so the dashboard inspects the workspace but never edits its APIs, tables, or schema.

On the roadmap

  • Table cell editing — edit row data in place (the one write path planned; structure stays code-owned).
  • Request history — see recent requests to your backend and what happened.

The proxy seam (/api/instance/* → your instance's api:meta/*) is already in place, so these panels plug straight into live workspace data as they land.

Quickstart

npm install
cp .env.example .env      # then edit XANO_MASTER_URL if needed
npm run dev               # Vite on http://127.0.0.1:5173, BFF on http://127.0.0.1:4000

Open http://127.0.0.1:5173 and click Sign in with Xano. You'll be redirected to Xano to sign in and pick an instance; on return you land on the dashboard.

Production single-process mode:

npm run build             # builds the SPA to dist/client
npm start                 # BFF serves the built app + API on http://127.0.0.1:4000

Configuration

Set via environment (see .env.example):

| Variable | Default | Purpose | | --- | --- | --- | | XANO_MASTER_URL | https://app.xano.com | Base origin of the Xano OAuth server. Its /.well-known/oauth-authorization-server document is fetched for the real endpoints. Point at production or a local dev instance. | | APP_PORT | 4000 | Fixed BFF port. The OAuth redirect_uri is registered as http://127.0.0.1:${APP_PORT}/oauth/callback, so changing this forces a re-registration on next launch. | | SIDESTEP_STORE_MODE | file | Credential storage backend. | | SIDESTEP_SESSION_SECRET | random per-process | Secret used to sign the local session cookie. Set it to keep sessions across BFF restarts. | | XANO_OAUTH_SCOPE | offline_access workspace:read workspace:api:read workspace:database:read workspace:content:read | Scopes requested (and registered) for the connection. The read scopes back the object browser (APIs, tables, content). Widening scopes on an existing install needs a fresh client registration — sign out and back in. |

How auth works

  1. On first sign-in the BFF self-registers as a public OAuth client (RFC 7591 Dynamic Client Registration) and stores the minted client_id.
  2. GET /oauth/login builds a PKCE (S256) authorize URL and redirects your browser to Xano's hosted login + consent, where you pick an instance.
  3. Xano redirects back to http://127.0.0.1:${APP_PORT}/oauth/callback; the BFF exchanges the code for tokens (audience = the selected instance), stores them, and issues an opaque session cookie.
  4. The SPA calls the BFF; the BFF attaches the access token and proxies to the instance's meta API (<instance-origin>/api:meta/…), refreshing with rotation as needed. On unrecoverable refresh failure you're prompted to sign in again.

The connected instance/workspace comes from the token's own claims (aud, xano:instance_id, xano:workspace_id, xano:role); your name/email comes from the instance's api:meta/auth/me.

Security

  • Tokens live on disk, by default at ~/.sidestep/credentials.json (dir 0700, file 0600, atomic writes, cross-process locking). The refresh token is long-lived — treat this file as a sensitive credential (it can be read by any process running as you and ends up in home-dir backups). An OS-keychain backend is planned; the store already has a pluggable seam for it.
  • The browser never receives Xano tokens — only the opaque session cookie (HttpOnly, Secure, SameSite=Strict).
  • The BFF binds to loopback only, rejects non-loopback Host headers (DNS-rebind guard), and requires a custom header on state-changing routes (CSRF defense).
  • Sign out revokes the refresh token at Xano (RFC 7009) and deletes the local token material.

Development

npm test         # vitest (server + client)
npm run typecheck
npm run build

Status

Early and moving fast. Signup stays hosted by Xano (never reimplemented here), and the dashboard is single-user for now. Read-only browsing of APIs, tables, and row content is live over the /api/instance/*api:meta/* proxy; table cell editing and request history are next up.