Node quickstart

Compute a synthetic chart in a Node process with the published package.

Engine 1.0.0: On npm. Archive identity and release status.

Read this page as Markdown

Install and run

Use an ESM project. Create package.json with npm init -y, then install the package with the command below in that directory. Save this example as chart.mjs and run node chart.mjs.

The package supports Node 20.19 or later in the 20 series, and Node 22.7 or newer. Earlier releases cannot load the astronomy dependency's ESM in the required way.

import { natalChart } from '@zodiacs/engine';
const chart = natalChart({
  utc: '2000-01-01T12:00:00Z',
  latitude: 51.4779,
  longitude: -0.0015,
  houseSystem: 'whole',
});
console.log(chart.bodies.map(({ body, lon }) => ({ body, lon })));

Choose your inputs

The instant and coordinates here are synthetic. The package calculates locally; this example makes no HTTP request. Resolve civil time explicitly before passing a UTC instant. Unknown birth time requires a different input policy; do not treat noon as a known birth time.

Install the release

npm install @zodiacs/engine@1.0.0

npm's 1.0.0 tarball is byte-identical to the archive the engine repository carries. To install those bytes from the carrier, with their digest checked before npm sees them, run this in the project's directory instead:

( set -eu
# POSIX shell — macOS, Linux or WSL. Not PowerShell. It runs in a subshell, so
# a failure stops the install without closing your terminal.
BASE=$(pwd)
FILE='zodiacs-engine-1.0.0.tgz'
# Run it in your project's directory. Without a package.json here, npm would
# install into the nearest parent directory that has one.
if test ! -f package.json; then
  echo "Stop: there is no package.json here. Run this in your project's directory, or create one first with: npm init -y" >&2
  exit 1
fi
if test -e "$FILE" || test -L "$FILE"; then
  echo "Stop: $FILE already exists here. Move or delete it, then run this again." >&2
  exit 1
fi
# A download that fails verification is removed, so the guard above does not
# then block the retry. Once npm takes over the archive stays: npm reports its
# own failures, and the file is what you would retry with.
trap 'status=$?; if test "$status" -ne 0; then rm -f "$BASE/$FILE"; fi; exit $status' EXIT

curl --disable --fail --silent --show-error --location --proto '=https' --max-time 120 \
  'https://raw.githubusercontent.com/zodiacs-org/engine/38d31854e5716454921b6ce8a211788a0984328e/artifacts/zodiacs-engine-1.0.0.tgz' -o "$FILE"

node --input-type=module <<'JS'
import { readFileSync } from 'node:fs';
import { createHash } from 'node:crypto';
const file = 'zodiacs-engine-1.0.0.tgz';
const expected = 'c4d3754de899fb98882331e6d7b9ce3ce77fb2072baeb002aa0ef8c77b0ab0f6';
const bytes = readFileSync(file);
const actual = createHash('sha256').update(bytes).digest('hex');
if (actual !== expected) {
  console.error(`Stop: this is not the published archive.\n  expected ${expected}\n  got      ${actual}`);
  console.error('Nothing was installed.');
  process.exit(1);
}
console.log(`Archive verified: ${actual}`);
JS

trap - EXIT
npm install --ignore-scripts "./$FILE"
echo "Installed @zodiacs/engine@1.0.0 from the verified archive."
)

References