{"_id":"@aulunarcana/ephemeris","_rev":"8-2808ecfadfe5ed65e0a77ceab5cf88fc","name":"@aulunarcana/ephemeris","dist-tags":{"latest":"1.1.1"},"versions":{"0.1.0":{"name":"@aulunarcana/ephemeris","version":"0.1.0","license":"SEE LICENSE IN LICENSE","_id":"@aulunarcana/ephemeris@0.1.0","maintainers":[{"name":"aulun","email":"wesley@aulun.ai"}],"homepage":"https://github.com/AuLunArcana/ephemeris#readme","bugs":{"url":"https://github.com/AuLunArcana/ephemeris/issues"},"dist":{"shasum":"83fd793b6ff47f85cd4b2c9d7951350360973703","tarball":"https://registry.npmjs.org/@aulunarcana/ephemeris/-/ephemeris-0.1.0.tgz","fileCount":11,"integrity":"sha512-7JIsBpf+Ybx7B5hOdyCu7lZKs0W82Yj87HFCkNPReQAxXlZWSmHd7SVZ/jBkL6XoPPq1RbBO9kFA/E64z62f1Q==","signatures":[{"sig":"MEUCIQC7gdGPSfev8JrIzDWf0Lm1zcu5M3pXfLljxdRePEt8VwIgNSNfbJrxvnnL1BJDEnsZwY8pop/+eTm+IPapUv7B64Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13252587},"main":"index.mjs","type":"module","types":"index.d.ts","engines":{"node":">=18"},"gitHead":"1e2a1442a2241c02c2415115031e38409b168cb7","scripts":{"test":"node test/smoke.mjs","prepack":"cd .. && wasm-pack build --target nodejs --release --out-dir js/pkg && node -e \"fs.rmSync('js/pkg/.gitignore',{force:true})\""},"_npmUser":{"name":"aulun","email":"wesley@aulun.ai"},"repository":{"url":"git+https://github.com/AuLunArcana/ephemeris.git","type":"git"},"_npmVersion":"10.9.8","description":"AuLun Ephemeris: NASA-grade astronomical ephemeris and chart engine (WASM). Free for non-commercial use; commercial licenses available.","directories":{},"_nodeVersion":"22.23.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ephemeris_0.1.0_1783877663501_0.1074096695712421","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@aulunarcana/ephemeris","version":"0.1.1","license":"SEE LICENSE IN LICENSE","_id":"@aulunarcana/ephemeris@0.1.1","maintainers":[{"name":"aulun","email":"wesley@aulun.ai"}],"homepage":"https://github.com/AuLunArcana/ephemeris#readme","bugs":{"url":"https://github.com/AuLunArcana/ephemeris/issues"},"dist":{"shasum":"b23050d8a6147348f484010be10d4a51fbc914ff","tarball":"https://registry.npmjs.org/@aulunarcana/ephemeris/-/ephemeris-0.1.1.tgz","fileCount":11,"integrity":"sha512-61PukQGQOzl3Pki9l/HtWimhEU3xVjzijL/kTRodkVuB5ShuIS4m0wyF6K6HQCr0LsmO891QA0RBHfrjChBRWA==","signatures":[{"sig":"MEUCIFtmNdqzcl7sUht7IkhD9lija/WXtQOVdEzoyrgiU+D3AiEA27dUzjZVkh+6on7Tr2HSmCt8x8kgYsnR3s/9jzqTShs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13253251},"main":"index.mjs","type":"module","types":"index.d.ts","engines":{"node":">=18"},"gitHead":"033e86df2ef262048cbfbd204cfcf5c054c57462","scripts":{"test":"node test/smoke.mjs","prepack":"cd .. && wasm-pack build --target nodejs --release --out-dir js/pkg && node -e \"fs.rmSync('js/pkg/.gitignore',{force:true})\""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d5b59572-3071-4063-9dc1-a88becf47fd1"}},"repository":{"url":"git+https://github.com/AuLunArcana/ephemeris.git","type":"git"},"_npmVersion":"12.0.1","description":"AuLun Ephemeris: NASA-grade astronomical ephemeris and chart engine (WASM). Free for non-commercial use; commercial licenses available.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ephemeris_0.1.1_1783884193840_0.8847381301115036","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@aulunarcana/ephemeris","version":"0.2.0","license":"SEE LICENSE IN LICENSE","_id":"@aulunarcana/ephemeris@0.2.0","maintainers":[{"name":"aulun","email":"wesley@aulun.ai"}],"homepage":"https://github.com/AuLunArcana/ephemeris#readme","bugs":{"url":"https://github.com/AuLunArcana/ephemeris/issues"},"dist":{"shasum":"5f42259a3567d0cfa0119f095aa4c6db7a3ffd94","tarball":"https://registry.npmjs.org/@aulunarcana/ephemeris/-/ephemeris-0.2.0.tgz","fileCount":11,"integrity":"sha512-CS7pYCuh+i4CIClsNkg3UXIUuFMUo8fVOEouotYeTeZNeToRbpRuEcViHGbEX6xAq/KV8bj/K1qTvSBSAMP6SQ==","signatures":[{"sig":"MEUCIHCTmrXsCwwRneEn/mp2PXu74kYqa3XYH5Lao0IyEMRuAiEA4yyrPpdG6PHFV7I/ccJPpk5iv095y33pYpsVIvjrweU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13365929},"main":"index.mjs","type":"module","types":"index.d.ts","engines":{"node":">=18"},"gitHead":"27c7b36745e1f9f644f1242441bc707eef880e53","scripts":{"test":"node test/smoke.mjs","prepack":"cd .. && wasm-pack build --target nodejs --release --out-dir js/pkg && node -e \"fs.rmSync('js/pkg/.gitignore',{force:true})\""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d5b59572-3071-4063-9dc1-a88becf47fd1"}},"repository":{"url":"git+https://github.com/AuLunArcana/ephemeris.git","type":"git"},"_npmVersion":"12.0.1","description":"AuLun Ephemeris: NASA-grade astronomical ephemeris and chart engine (WASM). Free for non-commercial use; commercial licenses available.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ephemeris_0.2.0_1784015361755_0.46830637457303026","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@aulunarcana/ephemeris","version":"0.2.1","license":"SEE LICENSE IN LICENSE","_id":"@aulunarcana/ephemeris@0.2.1","maintainers":[{"name":"aulun","email":"wesley@aulun.ai"}],"homepage":"https://github.com/AuLunArcana/ephemeris#readme","bugs":{"url":"https://github.com/AuLunArcana/ephemeris/issues"},"dist":{"shasum":"64673fc0343ddf29d165ef5c111072088b9ff3c8","tarball":"https://registry.npmjs.org/@aulunarcana/ephemeris/-/ephemeris-0.2.1.tgz","fileCount":11,"integrity":"sha512-Yf0uvFrHB9kydflNwGalWa3T/0DbXUCykceRpQITEq9cB6x721K7XlcwN0unL1cjMtov8V3p5NAAHh43ZQn7rA==","signatures":[{"sig":"MEUCIEWPXNwuRPfvUjI7KXKK6uZPYW8uUeV+kbeTLydwlSN8AiEAwqSzP9JCgNtLkFsgKDFl+eqtdLzh11G/ibnwq1m2FOQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13369869},"main":"index.mjs","type":"module","types":"index.d.ts","engines":{"node":">=18"},"gitHead":"c6f0891c795b1a6ff7137f225c7748cdeff851cd","scripts":{"test":"node test/smoke.mjs","prepack":"cd .. && wasm-pack build --target nodejs --release --out-dir js/pkg && node -e \"fs.rmSync('js/pkg/.gitignore',{force:true})\""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d5b59572-3071-4063-9dc1-a88becf47fd1"}},"repository":{"url":"git+https://github.com/AuLunArcana/ephemeris.git","type":"git"},"_npmVersion":"12.0.1","description":"AuLun Ephemeris: NASA-grade astronomical ephemeris and chart engine (WASM). Free for non-commercial use; commercial licenses available.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ephemeris_0.2.1_1784034298124_0.6773132521102643","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@aulunarcana/ephemeris","version":"0.2.2","keywords":["ephemeris","astrology","astronomy","natal-chart","birth-chart","wasm","webassembly","rust","jpl-horizons","planetary-positions","houses","sidereal","vedic-astrology","transits"],"license":"SEE LICENSE IN LICENSE","_id":"@aulunarcana/ephemeris@0.2.2","maintainers":[{"name":"aulun","email":"wesley@aulun.ai"}],"homepage":"https://aulun.ai/aulun-ephemeris","bugs":{"url":"https://github.com/AuLunArcana/ephemeris/issues"},"dist":{"shasum":"fbde68a1eccc58f8cd74a42e1dd011a433bc1eb5","tarball":"https://registry.npmjs.org/@aulunarcana/ephemeris/-/ephemeris-0.2.2.tgz","fileCount":11,"integrity":"sha512-BsPJROOl2teGwHBLDrh79ruMIaykY2Wc70L+07CLHX6HNcqQ0bhMLOiSlTrvxhePvnmfR6NSth7xuucO4iiIGQ==","signatures":[{"sig":"MEUCIQDPFqHomNI92T/bYFDjeBijKWS42Wi73BT2CRFsH3407wIgaiTI14FjwLTOjtb2zFk2Z1yoet6N7PzkgsEfVZsYgv0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13370187},"main":"index.mjs","type":"module","types":"index.d.ts","engines":{"node":">=18"},"gitHead":"a153ed231fbd9fcd5f432791ab9f0506284f9949","scripts":{"test":"node test/smoke.mjs","prepack":"cd .. && wasm-pack build --target nodejs --release --out-dir js/pkg && node -e \"fs.rmSync('js/pkg/.gitignore',{force:true})\""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d5b59572-3071-4063-9dc1-a88becf47fd1"}},"repository":{"url":"git+https://github.com/AuLunArcana/ephemeris.git","type":"git"},"_npmVersion":"12.0.1","description":"AuLun Ephemeris: NASA-grade astronomical ephemeris and chart engine (WASM). Free for non-commercial use; commercial licenses available.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ephemeris_0.2.2_1784040288075_0.2475029699355873","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@aulunarcana/ephemeris","version":"0.2.3","keywords":["ephemeris","astrology","astronomy","natal-chart","birth-chart","wasm","webassembly","rust","jpl-horizons","planetary-positions","houses","sidereal","vedic-astrology","transits"],"license":"SEE LICENSE IN LICENSE","_id":"@aulunarcana/ephemeris@0.2.3","maintainers":[{"name":"aulun","email":"wesley@aulun.ai"}],"homepage":"https://aulun.ai/aulun-ephemeris","bugs":{"url":"https://github.com/AuLunArcana/ephemeris/issues"},"dist":{"shasum":"537bc8946048d955efd02ec9a8146b7a35085199","tarball":"https://registry.npmjs.org/@aulunarcana/ephemeris/-/ephemeris-0.2.3.tgz","fileCount":12,"integrity":"sha512-uy48ldmB0dKHQiXPAyjrNpPmvFqnwYFxLmdfyYamnpqk6wnfirUJkxC0cH9PaaZ4hhECNlLzLGeOhOZlNa3wxw==","signatures":[{"sig":"MEYCIQDENgU6GObYp/loBKW6EU2Evv2sTo82ZVx4BlH6qPftTAIhAJlmmsYx9tficB0VfYrb1CTzkI38THnYph1pD6AhmOOJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":13374796},"main":"index.mjs","type":"module","types":"index.d.ts","engines":{"node":">=18"},"gitHead":"555a161569ae8335e731d53ac89b01b6e0e2320a","scripts":{"test":"node test/smoke.mjs","prepack":"cd .. && wasm-pack build --target nodejs --release --out-dir js/pkg && node -e \"fs.rmSync('js/pkg/.gitignore',{force:true})\" && node -e \"fs.copyFileSync('../../CHANGELOG.md','js/CHANGELOG.md')\""},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d5b59572-3071-4063-9dc1-a88becf47fd1"}},"repository":{"url":"git+https://github.com/AuLunArcana/ephemeris.git","type":"git"},"_npmVersion":"12.0.1","description":"AuLun Ephemeris: NASA-grade astronomical ephemeris and chart engine (WASM). Free for non-commercial use; commercial licenses available.","directories":{},"_nodeVersion":"24.18.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ephemeris_0.2.3_1784041365461_0.6434961640019599","host":"s3://npm-registry-packages-npm-production"}},"1.1.0":{"name":"@aulunarcana/ephemeris","version":"1.1.0","keywords":["ephemeris","astrology","astronomy","natal-chart","birth-chart","wasm","webassembly","rust","jpl-horizons","planetary-positions","houses","sidereal","vedic-astrology","transits"],"license":"SEE LICENSE IN LICENSE","_id":"@aulunarcana/ephemeris@1.1.0","maintainers":[{"name":"aulun","email":"wesley@aulun.ai"}],"homepage":"https://aulun.ai/aulun-ephemeris","bugs":{"url":"https://github.com/AuLunArcana/ephemeris/issues"},"dist":{"shasum":"0f462ad5230336cd9384bab794bb68a2b43e110c","tarball":"https://registry.npmjs.org/@aulunarcana/ephemeris/-/ephemeris-1.1.0.tgz","fileCount":11,"integrity":"sha512-D1gJyoMYALZUjupp9TrSf/xXdchKARYqunIoWepiEL1hhiw2/5RAScK+Nh3AYLhABKq7da2J6KwOYUtm3tdofA==","signatures":[{"sig":"MEUCIEPStmKoKeZYKdR677Htwn6XrtCKlChebeZqnxn3p7h7AiEA94HmtDycVR9ujsLcArpUAfFlwLnRGMZ97qh9b/H9ysI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":77728707},"main":"index.mjs","type":"module","types":"index.d.ts","engines":{"node":">=18"},"gitHead":"8e6dce3eac2ee19d567e8c582f6da54774ca1740","scripts":{"test":"node test/smoke.mjs","prepack":"node scripts/build-wasm.mjs"},"_npmUser":{"name":"aulun","email":"wesley@aulun.ai"},"repository":{"url":"git+https://github.com/AuLunArcana/ephemeris.git","type":"git"},"_npmVersion":"11.13.0","description":"AuLun Ephemeris: NASA-grade astronomical ephemeris and chart engine (WASM). Free for non-commercial use; commercial licenses available.","directories":{},"_nodeVersion":"24.16.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/ephemeris_1.1.0_1784513496371_0.8920851774075054","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@aulunarcana/ephemeris","version":"1.1.1","description":"AuLun Ephemeris: NASA-grade astronomical ephemeris and chart engine (WASM). Free for non-commercial use; free attribution-based commercial licenses on request.","type":"module","repository":{"type":"git","url":"git+https://github.com/AuLunArcana/ephemeris.git"},"homepage":"https://aulun.ai/aulun-ephemeris","keywords":["ephemeris","astrology","astronomy","natal-chart","birth-chart","wasm","webassembly","rust","jpl-horizons","planetary-positions","houses","sidereal","vedic-astrology","transits"],"license":"SEE LICENSE IN LICENSE","main":"index.mjs","types":"index.d.ts","scripts":{"prepack":"node scripts/build-wasm.mjs","test":"node test/smoke.mjs"},"engines":{"node":">=18"},"gitHead":"35385fadb36dcb53aea7ac73790ba007b4bd4a22","_id":"@aulunarcana/ephemeris@1.1.1","bugs":{"url":"https://github.com/AuLunArcana/ephemeris/issues"},"_nodeVersion":"24.16.0","_npmVersion":"11.13.0","dist":{"integrity":"sha512-IpN/k357kK9gTqKt7NRJfUPCge+qw2lsP1zIRZGF7ScAGYpf+9u67GBDQP7PiWTITX0cV95JE/whTK+LtiCxgg==","shasum":"d489d0666ab2dda945fb3ddbd32424e439b6b7db","tarball":"https://registry.npmjs.org/@aulunarcana/ephemeris/-/ephemeris-1.1.1.tgz","fileCount":11,"unpackedSize":77729024,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIGKoL/WOwI55FhwWhRi5LjL3QufccBN212huJ/MKooGqAiEAl7do67yZOqzJxbnJL4on4e11MvB658OdheeZ6xcyJoo="}]},"_npmUser":{"name":"aulun","email":"wesley@aulun.ai"},"directories":{},"maintainers":[{"name":"aulun","email":"wesley@aulun.ai"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/ephemeris_1.1.1_1784650295053_0.4670343287049443"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-12T17:34:23.386Z","modified":"2026-07-21T16:11:36.004Z","0.1.0":"2026-07-12T17:34:23.770Z","0.1.1":"2026-07-12T19:23:14.120Z","0.2.0":"2026-07-14T07:49:21.964Z","0.2.1":"2026-07-14T13:04:58.332Z","0.2.2":"2026-07-14T14:44:48.332Z","0.2.3":"2026-07-14T15:02:45.753Z","1.1.0":"2026-07-20T02:11:37.084Z","1.1.1":"2026-07-21T16:11:35.828Z"},"bugs":{"url":"https://github.com/AuLunArcana/ephemeris/issues"},"license":"SEE LICENSE IN LICENSE","homepage":"https://aulun.ai/aulun-ephemeris","keywords":["ephemeris","astrology","astronomy","natal-chart","birth-chart","wasm","webassembly","rust","jpl-horizons","planetary-positions","houses","sidereal","vedic-astrology","transits"],"repository":{"type":"git","url":"git+https://github.com/AuLunArcana/ephemeris.git"},"description":"AuLun Ephemeris: NASA-grade astronomical ephemeris and chart engine (WASM). Free for non-commercial use; free attribution-based commercial licenses on request.","maintainers":[{"name":"aulun","email":"wesley@aulun.ai"}],"readme":"# @aulunarcana/ephemeris\n\n**Build professional astrology software without relying on external\nAPIs or GPL-licensed ephemerides.**\n\nAuLun Ephemeris is a production-grade astronomical engine for Node.js,\nwith a Rust core and WebAssembly bindings. One call computes a\ncomplete natal chart — bodies, eleven house systems, tropical and\nsidereal zodiacs, aspects, and pattern detection — plus standalone\ntransit, equatorial, and heliocentric position APIs. Exact-DE441/\nType-21-source-only for all 27 supported bodies across the full public\n1900–2100 range — no analytic fallback theory of any kind. Certified\nagainst independent CSPICE ground truth. The end-to-end civil-time\ncertification (the full public API path, civil time in, position out —\nwhat the release certification's pass/fail gate actually measures)\nreaches a median of 1.83e-8″ across all 27 bodies (median of each\nbody's own median residual vs. independent CSPICE); on the pooled\nprimary metric across all 27 bodies × 265 post-1972 epochs, the mean is\n4.306e-7″ and the max is 2.025e-5″: **26 bodies clear the original,\nunmodified 10 microarcsecond gate; the Moon clears its own\nseparately-justified 30 microarcsecond threshold** (the automated\nrelease gate passes for all 27 bodies; the Moon's wider threshold is\ntraced to CSPICE's own civil-time conversion floor, not an engine\ndefect; see `ACCURACY.md` in the source repository for the full\nper-body table and methodology). This is not a separate \"exact-TDB\"\nmeasurement (the engine evaluated directly at a precise TDB instant\nwith no civil-time round-trip) — no committed benchmark in this project\ncurrently produces that. **Free for non-commercial use**; free\nattribution-based commercial licenses on request (see License below).\n\n## Install\n\n```bash\nnpm install @aulunarcana/ephemeris\n```\n\nNode 18+. Self-contained — all ephemeris data is embedded, including\nall 17 Type-21 minor-body containers and all 9 DE441-Chebyshev bodies,\nso no manual table loading is ever required. The compiled `.wasm`\nbinary measures **~78 MB** (down from ~86.3 MB after VSOP87/ELP-MPP02\nand their embedded data were removed entirely — the engine is now\nexact-source-only for every body; see CHANGELOG.md).\n\n## Quick start — tropical zodiac, Placidus houses\n\n```js\nimport { Ephemeris, degreesToRadians, radiansToDegrees } from \"@aulunarcana/ephemeris\";\n\nconst engine = new Ephemeris(); // parses embedded data once — construct once, reuse\n\nconst chart = engine.computeChart(\n  { year: 1990, month: 6, day: 15, hour: 21, minute: 30 }, // local civil time\n  \"America/Los_Angeles\",                                   // IANA timezone\n  { latitudeRad: degreesToRadians(34.05), longitudeRad: degreesToRadians(-118.24) },\n  { houseSystem: \"placidus\" },                             // tropical is the default zodiac\n);\n\nradiansToDegrees(chart.ascendantRad);      // Ascendant\nchart.bodies.sun.longitudeRad;             // apparent ecliptic longitude\nchart.bodies.moon.longitudeRateRadPerDay;  // negative = retrograde\nchart.houses.cuspsRad;                     // the 12 Placidus cusps\nchart.aspects;                             // aspects with applying/separating\nchart.patterns;                            // grand trines, T-squares, …\n```\n\nAll angles are radians; convert with `radiansToDegrees` /\n`degreesToRadians`. The full result shape is in `index.d.ts`\n(`Chart`).\n\n## Deploying — Next.js, React, bundlers\n\nThe published build targets **Node** (`wasm-pack --target nodejs`) and\nloads its WASM binary at import time through\n`createRequire(\"./pkg/ephemeris_wasm.js\")` — a dynamic require that\nbundlers and file tracers cannot follow statically. Plain `node`\nscripts and servers need nothing special. Anything that **bundles or\ntraces** your server code does:\n\n### Next.js / Vercel\n\nMark the package as a server external:\n\n```ts\n// next.config.ts\nconst config: NextConfig = {\n  serverExternalPackages: [\"@aulunarcana/ephemeris\"],\n};\n```\n\nWithout it, `next build` succeeds but production functions crash at\nmodule load with `MODULE_NOT_FOUND`: the bundler inlines `index.mjs`\nwhile the `pkg/` WASM files it requires are left behind, and output\nfile tracing cannot see the dynamic require either.\n`serverExternalPackages` keeps the package un-bundled, so the require\nresolves against the real `node_modules` directory and the tracer\ncopies the whole package into the deployed function.\n\nTwo notes from a real production incident with this package:\n\n- `outputFileTracingIncludes` alone is **not** a reliable substitute —\n  it can verify clean locally *and on a preview deployment* and still\n  fail in production functions. Use `serverExternalPackages`.\n- The failure is at module load, after a green build. When you first\n  deploy, request one route that actually computes a chart before\n  calling it done.\n\nImport the package only in server code — route handlers, Server\nComponents, server actions, crons — on the Node runtime. It cannot run\nunder `export const runtime = \"edge\"`.\n\n### React\n\nThe package does not run in the browser: browser bundlers (webpack,\nVite, esbuild) cannot bundle its Node-target WASM loading. Compute on\nthe server and hand React plain data — chart output is JSON-serializable\nand crosses the server→client boundary as-is:\n\n```tsx\n// app/chart/page.tsx — Server Component\nimport { Ephemeris, degreesToRadians } from \"@aulunarcana/ephemeris\";\n\nexport default async function ChartPage() {\n  const eph = new Ephemeris();\n  const chart = eph.computeChart(\n    { year: 1990, month: 6, day: 15, hour: 21, minute: 30 },\n    \"America/Los_Angeles\",\n    { latitudeRad: degreesToRadians(34.05), longitudeRad: degreesToRadians(-118.24) },\n    { houseSystem: \"placidus\" },\n  );\n  return <ChartView chart={chart} />; // client component receives plain data\n}\n```\n\nThe same shape applies to any SPA: put the ephemeris behind an API\nroute and fetch the JSON. An in-browser build (`--target web`) is not\ncurrently published — open an issue if your use case needs one.\n\n### Other Node-side bundlers\n\nSame rule, same reason — keep the package external:\n\n- **Vite SSR:** `ssr: { external: [\"@aulunarcana/ephemeris\"] }`\n- **esbuild:** `external: [\"@aulunarcana/ephemeris\"]`\n- **webpack (server):** `externals: { \"@aulunarcana/ephemeris\": \"commonjs @aulunarcana/ephemeris\" }`\n\n## What a chart contains\n\n- **Bodies** (`chart.bodies`): `sun`, `moon`, `mercury`, `venus`,\n  `mars`, `jupiter`, `saturn`, `uranus`, `neptune`, `pluto`,\n  `chiron` — each with apparent ecliptic longitude, latitude,\n  distance, and daily motion (negative = retrograde).\n- **Angles and houses**: Ascendant, Midheaven, 12 house cusps, plus\n  `vertexRad` and `eastPointRad` (the prime-vertical angles — see\n  below).\n- **Lunar points**: mean and true North/South Node and Lilith.\n- **Hermetic lots**: Fortune, Spirit, Eros, Necessity, Courage,\n  Victory, Nemesis (day/night sect handled via `isDayChart`).\n- **Aspects**: major and minor aspects with orb, exact angle, and\n  applying/separating; plus detected patterns (grand trine,\n  T-square, …). Orbs are configurable — see **Orb policy** below.\n\n## Vertex and East Point\n\nBeside the Ascendant and Midheaven, every timed chart carries the two\nprime-vertical angles:\n\n- `chart.vertexRad` — the Vertex (western prime-vertical/ecliptic\n  intersection). `null` at the equator, where the prime vertical\n  degenerates.\n- `chart.eastPointRad` — the East Point (Equatorial Ascendant).\n  Singularity-free, always present.\n\nBoth are radians, tropical true-ecliptic-of-date, like `ascendantRad`.\n\n## House systems\n\nPass one of these as `houseSystem` (default: `\"placidus\"`):\n\n| Value | System |\n|---|---|\n| `\"placidus\"` | Placidus |\n| `\"koch\"` | Koch |\n| `\"whole_sign\"` | Whole Sign |\n| `\"equal\"` | Equal |\n| `\"porphyry\"` | Porphyry |\n| `\"regiomontanus\"` | Regiomontanus |\n| `\"campanus\"` | Campanus |\n| `\"alcabitius\"` | Alcabitius |\n| `\"topocentric\"` | Topocentric (Polich–Page) |\n| `\"morinus\"` | Morinus |\n| `\"meridian\"` | Meridian (Axial) |\n\n## Zodiac: tropical and sidereal (Vedic)\n\nEvery chart is computed in the **tropical** zodiac. To also get\nsidereal values, pass an `ayanamsa`:\n\n| Value | Tradition |\n|---|---|\n| `\"lahiri\"` | Vedic / Jyotish standard (Chitrapaksha) |\n| `\"fagan_bradley\"` | Western sidereal |\n| `\"krishnamurti\"` | Krishnamurti Paddhati (KP) |\n| `\"raman\"` | B. V. Raman |\n| `\"true_chitrapaksha\"` | True Spica pinned at 0° Libra exactly |\n\n`true_chitrapaksha` and `lahiri` are both true-Spica-anchored in this\nengine and return identical values — this crate's `lahiri` is the\ntrue/Chitrapaksha variant, not the mean-precession construction some\nreference software uses under that name.\n\n```js\nconst vedic = engine.computeChart(civil, zone, observer, {\n  houseSystem: \"whole_sign\",\n  ayanamsa: \"lahiri\",\n});\nvedic.bodies.moon.siderealLongitudeRad; // sidereal position\nvedic.siderealHouses.cuspsRad;          // sidereal cusps\nvedic.ayanamsaRad;                      // the ayanamsa applied\n```\n\nSidereal output is additive — the tropical fields are always present.\n\n### Custom ayanamsa\n\nFor a sidereal zero point not in the table, pass `ayanamsaCustom`\ninstead of `ayanamsa` — a linear model in **degrees**: `valueAtT0Deg`\nat Julian date `t0JdTt` (TT), advancing at `ratePerCenturyDeg` per\nJulian century. It takes precedence over `ayanamsa` and reports\n`ayanamsaName === \"custom\"`.\n\n```js\nconst custom = engine.computeChart(civil, zone, observer, {\n  ayanamsaCustom: {\n    t0JdTt: 2451545.0,      // J2000.0 (TT)\n    valueAtT0Deg: 23.85,    // ayanamsa at t0\n    ratePerCenturyDeg: 1.4, // ≈ precession rate\n  },\n});\n```\n\n## Orb policy\n\nBy default, aspects use fixed per-aspect orbs (conjunction 8°, sextile\n6°, square/trine 7°, opposition 8°, minors 3°). Pass an `orbPolicy` to\nchoose a different scheme. Every field is optional and in **degrees**;\nomitting `orbPolicy` keeps the defaults exactly.\n\n| Field | Meaning |\n|---|---|\n| `resolution` | `\"perAspect\"` (default, fixed per-aspect orbs), `\"moietySum\"` (moiety(a)+moiety(b), + luminary bonus, on majors; flat orb on minors), or `\"moietyMax\"` (wider of the two body moieties on majors; per-aspect orb on minors) |\n| `moietiesDeg` | Per-body moiety (half-orb), e.g. `{ sun: 4.5, moon: 4.5 }` |\n| `defaultMoietyDeg` | Moiety for bodies not in `moietiesDeg` |\n| `luminaries` | Bodies earning the luminary bonus (`moietySum`) |\n| `luminaryBonusDeg` | Extra orb on a major leg touching a luminary |\n| `minorFlatOrbDeg` | Flat orb for minor aspects under `moietySum` |\n| `majorAspects` | Which aspect names count as \"major\" |\n| `basesDeg` | Per-aspect base-orb overrides, e.g. `{ conjunction: 10 }` |\n\n```js\nconst chart = engine.computeChart(civil, zone, observer, {\n  orbPolicy: {\n    resolution: \"moietySum\",\n    moietiesDeg: { sun: 4.5, moon: 4.5, mercury: 3.5 },\n    defaultMoietyDeg: 3.5,\n    luminaries: [\"sun\", \"moon\"],\n    luminaryBonusDeg: 1.0,\n    minorFlatOrbDeg: 1.5,\n  },\n});\n```\n\nThe policy governs both `chart.aspects` and the patterns built from\nthem. `AspectHit.orbRad` reports the resolved allowance actually used.\n\n## Extended patterns\n\nPass `extendedPatterns: true` to also populate `chart.patternsExtended`\nwith the full eleven-figure set — the four default figures (grand\ntrine, t_square, grand_cross, yod) plus **kite**, **stellium**, **minor\ngrand trine**, **mystic rectangle**, **grand sextile**, **thor's\nhammer**, and **cradle** — computed over the bodies, the angles, and\nthe true node. This is additive: `chart.patterns` (the default four\nfigures) is unchanged.\n\nA larger figure absorbs the smaller figures its own geometry forces,\nreporting them in `subsumed` instead of duplicating them at the top\nlevel: a grand_cross absorbs its constituent t_squares, a kite absorbs\nthe grand_trine it extends (and any minor_grand_trine it also\ncontains), and a grand_sextile absorbs both constituent grand_trines\nplus every kite/mystic_rectangle/cradle its hexagon forces among its\nown six bodies.\n\n```js\nconst chart = engine.computeChart(civil, zone, observer, {\n  extendedPatterns: true,\n});\nfor (const p of chart.patternsExtended) {\n  p.pattern;   // \"kite\" | \"stellium\" | \"minor_grand_trine\" | \"mystic_rectangle\" | \"grand_sextile\" | \"thors_hammer\" | \"cradle\" | …\n  p.bodies;    // members, apex-first where a figure has an apex\n  p.apex;      // focal point (t_square/yod/minor_grand_trine/thors_hammer) or null\n  p.sign;      // zodiac sign for a stellium, else null\n  p.maxOrbRad; // loosest leg / widest spread, radians\n  p.subsumed;  // patterns absorbed by this one (see above), else []\n}\n```\n\n## Topocentric (diurnal parallax) positions\n\nBy default every body position is **geocentric** — computed as seen\nfrom Earth's center, the standard convention for natal charts. Pass\n`topocentric: true` to instead correct every body for diurnal parallax\nand diurnal aberration: the observer's actual position on Earth's\nsurface (their real latitude/longitude/height, and the velocity from\nEarth's own rotation carrying them around that center), not just\nEarth's center.\n\n```js\nconst chart = engine.computeChart(civil, zone, observer, {\n  topocentric: true,\n});\n```\n\nThis is a real accuracy refinement, not a cosmetic one. The Moon is\nclose enough that the observer's exact spot on Earth's surface shifts\nits apparent position by up to **~1 degree** depending on the Moon's\naltitude and the observer's latitude — geocentric charts always ignore\nthis. The effect is much smaller for the planets (arcseconds, since\nthey're vastly farther away) but still real. For precise natal work —\nespecially anything Moon-sensitive, like an exact angle, a\nvoid-of-course check, or a lunar aspect near exactness — topocentric\npositions are the more physically correct choice.\n\n`topocentric` defaults to `false`, so omitting it reproduces every\nprior version's output byte-for-byte; enabling it changes `longitudeRad`\n/ `latitudeRad` / `distanceAu` / `longitudeRateRadPerDay` for every body\n(derived quantities such as houses, aspects, and patterns follow from\nthose topocentric longitudes in turn). `usedDeTable` is unaffected by\n`topocentric`: it reports `true` for every successfully resolved body\n(the engine is exact-source-only -- there is no other source it could\nreport), independent of whether the topocentric correction was layered\non top.\n\n## Chiron and extended minor bodies (Type-21)\n\nChiron and sixteen further extended minor bodies — `ceres`, `pallas`,\n`juno`, `vesta`, `eris`, `sedna`, `haumea`, `makemake`, `quaoar`,\n`orcus`, `varuna`, `ixion`, `gonggong`, `pholus`, `nessus`, `chariklo`\n— are each extracted from their own SPK Type-21 kernel into this\nproject's `AULNMD1` container format, byte-preserved with no\nrefitting (see `python/NOTICE.md` for full provenance and the\nrepresentation-fidelity figure).\n\n**All 17 ship embedded by default** — no loader call, no manual table\nmanagement of any kind. Chiron is a standard chart body and appears in\n`chart.bodies.chiron` automatically, with no need to list it; the other\n16 are opt-in via `includeMinorBodies`. Request any of them like any\nother body:\n\n```js\nconst chart = engine.computeChart(civil, zone, observer, {\n  includeMinorBodies: [\"ceres\", \"eris\"],\n});\nchart.bodies.ceres.longitudeRad;\nchart.bodies.chiron.longitudeRad; // present without being listed\n```\n\nNone of the 17 has a fallback theory of any kind, so accuracy is always\nType-21-grade with zero setup. A request outside the public range\n(1900–2100 TDB) throws `EphemerisRangeError` for the whole chart before\nany body is computed; `chart.outOfRange` is retained on the response\nfor source compatibility but is always empty -- every body ships\nembedded, so within the public range every request either fully\nsucceeds or fully throws, with no per-body degrade.\n\n## DE441 exact-Chebyshev tables (all nine public bodies embedded by default)\n\nNine bodies have a DE441 exact-Chebyshev container: Sun, Mercury,\nVenus, Mars, Jupiter, Saturn, Uranus, Neptune, and Pluto. **All nine\nship with their DE441 containers embedded by default** — no manual\ntable loading of any kind is needed to get any of them at DE441-grade\naccuracy in-range. This also applies to Earth itself: Earth's own\ngeocentric position is composed atomically from two further embedded\nDE441 containers (the Earth-Moon Barycenter and Earth-relative-to-EMB\n— see below), so the whole chart pipeline is exact-DE441 in-range, not\njust the nine explicitly named target bodies.\n\n- **Across the full public range (1900-01-01 to 2100-01-01 TDB), every\n  one of the nine is DE441-exact by default** — the sole source, with\n  no fallback theory of any kind — with accuracy bit-exact to DE441's\n  own Chebyshev coefficients (see the representation-fidelity paragraph\n  below). `chart.bodies.<name>.usedDeTable` reports `true` for every\n  successfully resolved body.\n- **A request outside the public range throws `EphemerisRangeError`**\n  for the whole chart, atomically, before any body is computed — there\n  is no VSOP87 or other lower-precision series this engine falls back\n  to for historical or far-future dates.\n- **Pluto's heliocentric surface has an extra requirement:** DE441\n  heliocentric output for Pluto also requires the DE441 Sun container\n  (also embedded by default, so this is always satisfied in practice).\n- **Earth's own position** is likewise exact DE441 across the same\n  public range — composed from the embedded Earth-Moon Barycenter and\n  Earth-relative-to-EMB containers, the sole source, no fallback. This\n  applies identically to the geocentric, apparent equatorial, and\n  topocentric computation modes. Earth's containers are always-embedded,\n  internal-only compositions, never\n  independently addressable.\n\nEvery one of the nine bodies' embedded containers is identity-\nvalidated (NAIF ID, degree, segment layout, coverage) against its own\nexpected specification at construction time — a checksum-valid\ncontainer for the wrong body can never be silently accepted under any\nname.\n\nThe containers' own representation fidelity to DE441 is bit-exact\n(float64 roundoff only, worst-case ~7e-11 arcsec across all nine\nbodies — DE441's own SPK Type-2 Chebyshev coefficients, extracted\nbyte-for-byte with no re-fitting; Uranus/Neptune/Pluto measured at\n6.892e-11 / 5.281e-11 / 5.532e-11 arcsec worst-case respectively). That\nreplaces the previous cubic-Hermite table format's per-body\ninterpolation error, which ranged up to 2.2e-3\" worst-case for Mercury\n(Uranus/Neptune's older Hermite-table pipeline reached, at worst, the\nreference-convention floor of ~0.25\" over the benchmark grid — see\n`python/NOTICE.md`'s historical-record section). This is a\nrepresentation-fidelity improvement only — it does not touch the\n~0.042\" ecliptic-frame-convention bias documented in\n`python/NOTICE.md`, this engine's existing TT-as-TDB time\napproximation, or Pluto's separately-documented ~0.08\"\nbarycenter-vs-body-center convention. The geocentric/equatorial\npipeline's Earth position is itself exact DE441 across the full public\nrange (composed from the embedded EMB and Earth-relative-to-EMB\ncontainers), the sole source, with no fallback of any kind.\n\n```js\nconst chart = engine.computeChart(civil, zone, observer, options);\nchart.bodies.mercury.usedDeTable; // always true for a successfully resolved body\n```\n\nThe AULNCH1 container files themselves (`sun_chebyshev.bin`,\n`mercury_chebyshev.bin`, `venus_chebyshev.bin`, `mars_chebyshev.bin`,\n`jupiter_chebyshev.bin`, `saturn_chebyshev.bin`, `uranus_chebyshev.bin`,\n`neptune_chebyshev.bin`, `pluto_chebyshev.bin`, plus Earth's own\n`emb_chebyshev.bin` and `earth_relative_to_emb_chebyshev.bin`) are not\nindependently addressable at runtime — all are embedded unconditionally\nin the WASM build (`python/data/outer_planets/` in the project's source\nrepository is where they're vendored from, for reference only).\n\n## Fast path: positions only\n\nFor transit scans and anything else that samples a few bodies across\nmany instants, `computeBodies` returns just the requested bodies'\napparent positions and daily rates — identical numbers to the full\nchart, at a fraction of the cost (a full chart computes houses,\nnodes, lots, aspects, and patterns you may not need):\n\n```js\nconst { bodies } = engine.computeBodies(\n  { year: 2026, month: 1, day: 1, hour: 12, minute: 0 }, // UTC fields\n  [\"jupiter\", \"saturn\", \"mars\"],\n);\nbodies.jupiter.longitudeRad;            // apparent ecliptic longitude\nbodies.jupiter.longitudeRateRadPerDay;  // analytic rate (negative = retrograde)\n```\n\n## Equatorial and heliocentric positions\n\nTwo more position surfaces re-express the same apparent pipeline in\nother frames. Both take resolved UTC fields plus a body list, and route\nuranus/neptune/pluto through the DE441 tables just like the chart.\n\n**Equatorial** — apparent RA/Dec of date plus astrometric ICRF/J2000:\n\n```js\nconst eq = engine.computeEquatorial(\n  { year: 2026, month: 1, day: 1, hour: 12, minute: 0 },\n  [\"mars\", \"uranus\"],\n);\neq.bodies.mars.ofDate.rightAscensionRad; // apparent RA, equinox of date\neq.bodies.mars.ofDate.declinationRad;    // apparent Dec of date\neq.bodies.mars.j2000.rightAscensionRad;  // astrometric ICRF/J2000 RA\n```\n\n**Heliocentric** — geometric ecliptic-of-date longitude, latitude, and\nradius. Defined only for Sun-orbiting bodies: requesting the Sun, Moon,\nor a lunar node/Lilith throws.\n\n```js\nconst helio = engine.computeHeliocentric(\n  { year: 2026, month: 1, day: 1, hour: 12, minute: 0 },\n  [\"jupiter\", \"uranus\"],\n);\nhelio.bodies.jupiter.longitudeRad; // heliocentric ecliptic longitude\nhelio.bodies.jupiter.radiusAu;     // heliocentric distance\n```\n\nFor both, `outOfRange` is retained on the response for source\ncompatibility but is always empty in this package -- every table these\nmethods can route through ships embedded, with no manual loading step\nthat could ever leave one absent.\n\n## Time handling\n\n`computeChart` takes naive civil time plus an IANA zone and resolves\nDST correctly:\n\n- Ambiguous local times (DST fall-back) throw\n  `AmbiguousLocalTimeError` unless you pass `fold` (`0` = earlier\n  instant, `1` = later).\n- Nonexistent local times (spring-forward gap) always throw\n  `NonexistentLocalTimeError`.\n\nIf you already have UTC, use\n`engine.computeChartUtc(utc, observer, options)` and skip timezone\nresolution entirely.\n\n## Accuracy\n\nApparent positions are computed from exact JPL DE441/Type-21\nstate vectors (no lower-precision series of any kind) with full\nIAU 2000A/2006 precession-nutation, light-time, and relativistic\naberration.\n\nTwo independent validations exist, measuring two different quantities:\n\n1. **Astrometric geocentric ICRF/J2000 position vs independent CSPICE\n   ground truth** (NAIF's own reference toolkit). The end-to-end\n   civil-time certification (the full public API path, civil time in,\n   position out — what the release certification's pass/fail gate\n   actually measures) reaches a median of 1.83e-8″ across all 27 bodies\n   (median of each body's own median residual vs. independent CSPICE);\n   on the pooled primary metric across all 27 bodies × 265 post-1972\n   epochs, the mean is 4.306e-7″ and the max is 2.025e-5″ — 26 bodies\n   clear the original, unmodified 10-microarcsecond gate, and the Moon\n   clears its own separately-justified 30-microarcsecond threshold, so\n   the automated gate passes for all 27 bodies (the Moon's wider\n   threshold is traced to CSPICE's own civil-time conversion floor, not\n   an engine defect). This is not a separate \"exact-TDB\" measurement\n   (the engine evaluated directly at a precise TDB instant with no\n   civil-time round-trip) — no committed benchmark in this project\n   currently produces that. This isolates\n   pure ephemeris-representation and light-time-pipeline error (no\n   nutation/aberration/ayanamsa convention on either side). See\n   `ACCURACY.md` in the source repository for the full per-body table,\n   methodology, and scope.\n2. **Apparent (of-date) ecliptic longitude vs JPL Horizons**, below —\n   this is the astrology-facing quantity, which additionally exercises\n   nutation, obliquity, and stellar aberration, so it is validated\n   separately rather than folded into the CSPICE comparison above.\n\nFor a third comparison — this engine vs. Swiss Ephemeris, both measured\nagainst the same independent CSPICE ground truth, with an honest\nper-body coverage disclosure of exactly which bodies have genuine\nfile-backed Swiss Ephemeris data available — see the \"Swiss Ephemeris\nmedian-accuracy comparison\" section of `ACCURACY.md` in the source\nrepository.\n\n## License\n\nProprietary, and free to use. **Non-commercial use** (personal,\neducational, research) is free of charge with no conditions — just\ninstall and go. **Commercial use requires a license, and standard\ncommercial licenses are free**: contact us, tell us what you're\nbuilding, and the standard terms are simply visible attribution —\n\"Powered by AuLun Ephemeris\", placed where your users can see it (an\nabout page, settings screen, chart footer, or your docs), linked to\nhttps://aulun.ai/aulun-ephemeris where links are supported. Full\nterms in the LICENSE shipped with this package; attribution-free or\nbespoke terms (source access, escrow) by agreement. Contact:\nhttps://github.com/AuLunArcana.\n\n## Changelog\n\nSee `CHANGELOG.md`, included in this package.\n\n© 2026 AuLun Arcana LLC. All rights reserved.\n","readmeFilename":"README.md"}