Synastry recipe

Compare two synthetic natal charts with explicit input and time policies.

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

Read this page as Markdown

Compare validated charts

Calculate both charts, then pass them to synastry. The result compares their bodies and gives the package's inter-chart aspects and balance summary. Both examples are synthetic and have known UTC times.

import { natalChart, synastry } from '@zodiacs/engine';
const first = natalChart({
  utc: '2000-01-01T12:00:00Z', latitude: 51.4779,
  longitude: -0.0015, houseSystem: 'whole',
});
const second = natalChart({
  utc: '2000-06-21T12:00:00Z', latitude: -33.8688,
  longitude: 151.2093, houseSystem: 'whole',
});
console.log(synastry(first, second));

Share deliberately

Comparing charts needs two sets of input. Keep calculation local by default, and obtain a person's permission before sharing their chart or input. Preserve each chart's flags rather than turning uncertain positions into certain claims.

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