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

@earthos/plugin-satellites

v0.2.1

Published

EarthOS satellites layer: CelesTrak GP catalog propagated with SGP4 in workers (Starlink, ISS, GPS, active catalog)

Readme

@earthos/plugin-satellites

Live satellite constellations for EarthOS: the CelesTrak GP catalog (Starlink, ISS and stations, GPS, OneWeb, GEO belt, weather satellites, science missions, or the entire active catalog) propagated with SGP4 in a worker pool and rendered as a single GPU-extrapolated points draw call. Tested with 15,000+ objects at 60 FPS.

Install

pnpm add @earthos/plugin-satellites

Single-instance peer dependencies, provided by the host app: @earthos/globe, @react-three/fiber (v9), react (v19), and three (>=0.170).

Usage

import { Earth, Layer } from 'earthos';

<Earth>
  <Layer manifest={() => import('@earthos/plugin-satellites')} settings={{ group: 'starlink' }} />
</Earth>;

How it works

  • provider.ts polls CelesTrak GP JSON every 2 hours (stale-while-revalidate, IndexedDB persistence, 72 h max age: old elements still propagate fine offline).
  • propagate.worker.ts owns a static shard of up to 5,000 satrecs. On request it runs the satellite.js sgp4 fast path and transfers an interleaved position+velocity Float32Array back.
  • renderer.tsx feeds batches into ExtrapolatedPointsLayer (from @earthos/globe): the vertex shader extrapolates p + v·dt - ½μp/|p|³·dt² per frame, so the main thread pays one uniform write per frame. Shards refresh when their batch is ~15 sim-seconds old.
  • Click picking runs the same extrapolation math on the CPU, so hits match pixels.
  • Selecting a satellite draws its full orbit (193 SGP4 samples over ±½ period) and exposes live altitude/speed/position to the inspector; the follow camera tracks it via the globe tracker registry.
  • The GP element sets carry no ownership, so country of registry is joined best-effort from CelesTrak SATCAT (OWNER) by NORAD id: one extra request per group, cached with the catalog, silently skipped when a custom endpoint/proxy is set or SATCAT is unreachable.

Settings

| Key | Default | Notes | | --------------- | ----------- | -------------------------------------------------------------- | | dataSource | celestrak | celestrak (grouped catalog) or tleapi (popular satellites) | | group | starlink | CelesTrak GP group | | exclude | (blank) | comma-separated name terms to hide, e.g. starlink | | pointSize | 3 px | sprite size | | color | #E3B34D | gold point color (distinct from other layers) | | showOrbit | true | orbit line for the selection | | maxSatellites | 15000 | catalog cap | | endpoint | (blank) | proxy override; blank fetches CelesTrak directly |

Hiding a constellation

The active group is roughly 80% Starlink, so everything else is buried under it. Set exclude to see the rest:

settings: { group: 'active', exclude: 'starlink' }   // everything except Starlink
settings: { group: 'active', exclude: 'starlink, oneweb' }

Terms are matched case-insensitively as substrings of OBJECT_NAME. Filtering runs before the catalog is sharded into the SGP4 workers, so hidden objects cost no propagation, and it re-derives from the catalog already in memory, so changing the filter is instant and never refetches the group.

Data source

CelesTrak GP element sets, courtesy of T.S. Kelso. Please respect their usage guidelines; the default 2-hour refresh with jitter stays well within them. CelesTrak serves Access-Control-Allow-Origin: *, so browsers fetch it directly. When it is unreachable (rate-limited or cloud-blocked networks), the provider automatically degrades to the popularity-sorted TLE API, which can also be selected explicitly via dataSource: 'tleapi'.

See docs/PLUGIN_GUIDE.md for the layer contract.

Part of EarthOS. MIT licensed.