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

astralmanach

v0.2.1

Published

Created for Florian Rosinski's art project Un art voulu voyant (uavv.fr). The sky of an instant: civil time and time zones, sky events, ISS passes, fireballs, a ready-to-draw celestial vault, and plain-language summaries. No secrets, no disk, never throws

Downloads

552

Readme

astralmanach

The sky of an instant, as data. Give it a date, an hour and a place: it tells you what the sky held — the Moon and its phase, the planets you could see and where, the eclipses, oppositions and meteor showers of the day, the passes of the International Space Station, the fireballs that hit the atmosphere — and hands you a star map ready to draw, with the constellation figures and their names.

Created for Un art voulu voyant, the art project of Florian Rosinski. It computes the sky of Observations, the project's printable sheet of the sky; it was then published on its own, under the MIT licence.

npm CI types node license

It is the engine of the Astralmanach tools (a birth chart, a day's sky, a "celestial certificate" of a date), released on its own. ESM, typed, no build step needed on your side.

npm install astralmanach

See it in use

  • astralmanach.eu — three tools written with the library: a birth chart (Thème), a day's sky and archives (Ciel), and a "celestial certificate" that puts a date and a place into sentences (Certificat). Each source is credited with its licence on the Sources page.
  • uavv.fr/observations — where it was born: Observations, a tool of the art project Un art voulu voyant by Florian Rosinski, composes a printable A4 sheet of the sky of a date, an hour and a place. The star map, the Moon and the planets on that sheet come from this library.

Try it without installing

The site serves a read-only HTTP API on the same engine: no account, no key, CORS open. Documentation · OpenAPI 3.1 · Swagger UI · Postman collection · which keys and sign-ups you need to run it yourself.

curl "https://astralmanach.eu/api/run?query=jpl.horizons&date=2026-09-30&time=21:00&lat=48.8566&lon=2.3522&place=Paris&ptz=Europe%2FParis"

Where it comes from

astralmanach started inside that project: the sheet needed the Moon, the planets, the stars that were up, the eclipses and the ISS passes, in shapes ready to draw. That computation became an engine of its own — civil time and IANA zones, sky events, the celestial vault, plain-language summaries — released here under the MIT licence so the tools above are just uses of the same package.

What it does that the others don't

There are excellent astronomy libraries in JavaScript. astralmanach does not replace them — it builds on them and answers the question they leave to you: what did the sky look like, here, at that moment, in words and in shapes?

| | d3-celestial | astronomy-engine | satellite.js | astralmanach | |---|---|---|---|---| | What it is | An interactive star-map renderer (D3, in the browser) | Low-level ephemerides (positions, rise/set, searches) | The SGP4 orbit propagator | A "sky of an instant" layer: data you can show, print or say | | Civil date + hour + IANA time zone in, the instant out | — | UTC only | UTC only | ✓ (makeContext, DST-safe) | | Star map | ✓ drawn for you, tied to D3 and the DOM | — | — | ✓ as plain data: projected stars, constellation lines and labels, planets, horizon — draw it in SVG, canvas, PDF, on the server | | The day's events (eclipses seen from a place, oppositions, conjunctions, greatest elongations, transits, supermoons, equinoxes, meteor showers) | — | the search primitives | — | ✓ found and described (skyEvents) | | Visible ISS passes from a place | — | — | the propagator | ✓ TLE fetched, passes computed, visibility judged (issPasses) | | Fireballs (NASA/JPL CNEOS) | — | — | — | ✓ fetched and normalised (fireballs) | | A one-line summary of a day's sky | — | — | — | ✓ Moon, Sun rise/set, naked-eye planets (skyRecap) | | Network access with an injected key, cache and User-Agent; keys redacted everywhere; never throws | — | no network | no network | ✓ (runQuery, fetchProvider) |

Under the hood: positions come from astronomy-engine (Don Cross, MIT), orbits from satellite.js (MIT), and the stars, constellation figures and names from d3-celestial (Olaf Frohn, BSD-3-Clause) — credited below.

Quick start

A day's sky, in one sentence

import { skyRecap } from "astralmanach";

const r = skyRecap({ date: "2026-09-30", time: "21:00", place: { name: "Paris", lat: 48.8566, lon: 2.3522, tz: "Europe/Paris" } });
console.log(r.headline); // the Moon, the Sun, what you could see with the naked eye

A star map, as data

import { skyAt, skyMap } from "astralmanach/voute";

// The Sun, the Moon and the planets as seen from Paris that evening (altitude, azimuth, magnitude)…
const sky = skyAt(new Date("2026-09-30T19:00:00Z"), { name: "Paris", lat: 48.8566, lon: 2.3522 });
// …and the stars brighter than magnitude 4, the constellation figures and their names, projected into a unit disc
// (stereographic or orthographic): draw them in SVG, on a canvas, in a PDF.
const map = skyMap(sky, { maxMag: 4, projection: "stereo" });

The day's events, the ISS, the fireballs

import { makeContext, runQuery, skyEvents, issPasses, fireballs } from "astralmanach";

const ctx = makeContext({ date: "2013-02-15", tz: "Asia/Yekaterinburg", place: { name: "Chelyabinsk", lat: 55.16, lon: 61.4 } });
const opts = { key: process.env.NASA_API_KEY ?? "DEMO_KEY", userAgent: "my-site/1.0 ([email protected])" };

for (const q of [skyEvents, issPasses, fireballs]) {
  const r = await runQuery(q, ctx, opts); // never throws: r.status is "ok" | "empty" | "error" | "timeout" | "out-of-coverage"
  console.log(q.id, r.status, r.cards.map((c) => c.title));
}

Results are cards (event, image, table, text…): small typed records with a title, facts, links and a time, ready to render. skyEvents needs no network; issPasses reads CelesTrak's current elements and refuses dates more than six days away from them (an old orbit would be wrong); fireballs reads NASA/JPL's CNEOS API.

Modules

| Import | What's inside | |---|---| | astralmanach | The most used functions and types, re-exported | | astralmanach/time | Civil dates, IANA time zones, the instant of a local date and hour (makeContext, zonedToUtc, formatLocal) | | astralmanach/voute | The celestial vault: skyAt (Sun, Moon, planets, altitude and azimuth), skyMap, projectAltAz, moonPhaseName, equationOfTime | | astralmanach/sky-recap | skyRecap: a day's sky in a sentence | | astralmanach/queries/astro-evenements | skyEvents, SHOWERS (the IMO meteor-shower table) | | astralmanach/queries/celestrak-iss | issPasses | | astralmanach/queries/jpl-fireball | fireballs | | astralmanach/run, astralmanach/fetcher | runQuery, fetchProvider: coverage, bounded concurrency, one retry on 429/503, key redaction, an optional cache you provide | | astralmanach/cards, astralmanach/queries/types | The card and query types, to write your own sources | | astralmanach/data/celestial/*.json | The raw star, line and name catalogues |

Design

  • No secrets, no disk. The library never reads .env, process.env or files. Your key, your User-Agent and your cache ({ read(url), write(entry) }) are passed in. Keys are redacted from every URL and every raw response it returns.
  • Never throws. An unknown response shape gives []; a failing provider gives a result with status: "error" and a message. Your page always renders.
  • Pure where it can be. Everything that can be computed is computed locally and synchronously (skyEvents, skyAt, skyMap, skyRecap); only the ISS and the fireballs go to the network.
  • Civil time done right. Dates are local to the place, through IANA zones, including daylight saving time; without an hour, the instant is local noon.
  • Geocentric positions (the Moon to the arcminute against JPL Horizons); topocentric altitude and azimuth for what is visible from a place.
  • Labels are in French today (card titles, facts, summaries). The data (numbers, instants, positions) is language-free; translations are welcome.

Data and credits

  • Stars, constellation lines and names: d3-celestial, © 2015 Olaf Frohn, BSD-3-Clause — data/celestial/LICENSE-d3-celestial.txt.
  • Meteor showers: the International Meteor Organization's working list, to the day.
  • ISS orbital elements: CelesTrak (please respect its usage guidelines: cache, don't hammer).
  • Fireballs: NASA/JPL CNEOS API.
  • Ephemerides: astronomy-engine (MIT); orbits: satellite.js (MIT).

Development

npm install
npm run check   # typecheck, lint, tests, build
npm run smoke   # imports the built package the way a user would
node examples/carte-svg.mjs   # redraws the star map above (after npm run build)

Releases: bump the version and the changelog, tag vX.Y.Z, push the tag — CI publishes to npm with provenance. See CONTRIBUTING.md.

En français

astralmanach donne le ciel d'un instant : une date, une heure, un lieu, et il dit ce que le ciel portait — la Lune et sa phase, les planètes visibles et où les chercher, les éclipses, oppositions et pluies d'étoiles du jour, les passages de la Station spatiale, les bolides entrés dans l'atmosphère — avec une carte du ciel prête à dessiner, ses constellations et leurs noms. Il s'appuie sur astronomy-engine, satellite.js et les catalogues de d3-celestial ; il ne lit ni fichier ni secret, et ne lève jamais d'exception. Les libellés sont en français.

License

MIT © 2026 Ismaël Rodmacq. The bundled catalogues keep their own licence (BSD-3-Clause, see above).