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

thelematime

v0.1.0

Published

Pure client-side Thelemic date/time library. Drop-in JS embed for displaying the current date in the Thelemic calendar (sun and moon positions, docosade year).

Downloads

51

Readme

ThelemaTime

A pure-client-side JavaScript library that displays the current date and time in the Thelemic calendar — Sun and Moon positions in the tropical zodiac, Latin planetary day of the week, and the Thelemic year in docosades (22-year cycles based on the Tarot's Major Arcana), starting from the Vernal Equinox of 1904 EV.

Example output:

☉ in 1° Tauri : ☽ in 26° Geminorum : dies Martis : Anno Vxii A.L.

No server to run, no API key, no backend. Just drop a <script> tag into any webpage.

Table of contents

Why this exists

Thelemic date servers have a history of going unmaintained — each generation of practitioners has had to build a new one when the previous maintainer disappears. ThelemaTime breaks that cycle by running entirely in the visitor's browser, with no server to maintain. It's a single JavaScript file published to npm and mirrored on public CDNs. If every CDN ever vanished, it's still just a file — anyone can copy it to their own web server.

Quickstart

Add these two lines anywhere in your page's HTML:

<span class="date93"></span>
<script src="https://cdn.jsdelivr.net/npm/thelematime"></script>

That's it. The <span> gets filled in with the current Thelemic date when the page loads.

Where to put this in WordPress, Squarespace, Wix, etc.

Most website builders let you add "custom HTML" or an "embed" / "HTML block" to a page or sidebar. Paste those two lines into that block. Concretely:

WordPress (block editor, a.k.a. Gutenberg):

  1. Edit the page/post/widget where you want the date.
  2. Click + to add a block, then choose Custom HTML.
  3. Paste the two lines above.
  4. Publish or update.

WordPress (classic editor / widget area):

  1. Go to Appearance → Widgets (or edit a post in HTML mode).
  2. Add a Custom HTML widget.
  3. Paste the two lines.
  4. Save.

Squarespace:

  1. Edit the page, click Add Block → Code.
  2. Ensure the block is set to HTML (not Markdown).
  3. Paste the two lines.
  4. Save.

Wix:

  1. Add an Embed → Custom Embeds → Embed HTML.
  2. Paste the two lines.
  3. Update.

Plain HTML site: Just paste the two lines into your HTML file.

Note: You only need to load the <script src=...> line once per page. You can have as many <span class="date93"> elements as you want on the same page — e.g. one in the header and one in the footer.

Display options

Control what's shown by adding data-* attributes to the span. All attributes are optional.

Language / format

<!-- Latin (default): "☉ in 1° Tauri : ☽ in 26° Geminorum : dies Martis : Anno Vxii A.L." -->
<span class="date93"></span>

<!-- English: "Sun in 1° Taurus : Moon in 26° Gemini : Tuesday : Year Vxii of the Aeon" -->
<span class="date93" data-lang="english"></span>

<!-- Pure symbols: "☉ in 1° ♉ : ☽ in 26° ♊ : ♂ : Vxii" -->
<span class="date93" data-lang="symbol"></span>

<!-- ASCII-safe (no special characters): "Sol in 1 deg Tauri : Luna in 26 deg Geminorum : dies Martis : Anno Vxii A.L." -->
<span class="date93" data-lang="poor-latin"></span>

Year suffix (A.L. vs æræ legis)

<!-- Default: "Anno Vxii A.L." -->
<span class="date93"></span>

<!-- Era Legis long form: "Anno Vxii æræ legis" -->
<span class="date93" data-year-suffix="era-legis"></span>

<!-- No suffix: "Anno Vxii" -->
<span class="date93" data-year-suffix="none"></span>

Hide parts of the output

<!-- Hide the weekday -->
<span class="date93" data-show-dow="false"></span>

<!-- Hide degrees (show only the zodiac sign) -->
<span class="date93" data-show-deg="false"></span>

<!-- Hide the year -->
<span class="date93" data-show-year="false"></span>

Custom separator

<!-- Use " | " instead of " : " between segments -->
<span class="date93" data-separator=" | "></span>

<!-- Line breaks -->
<span class="date93" data-separator=" · "></span>

Specific timezone for weekday

By default, the weekday is derived from the visitor's local time. To force a specific zone:

<span class="date93" data-tz="America/Los_Angeles"></span>
<span class="date93" data-tz="Europe/London"></span>
<span class="date93" data-tz="UTC"></span>

Use IANA timezone names.

Show a specific historic date

Great for dating blog posts or ritual records. Pass an ISO 8601 timestamp:

<!-- Crowley's reception of Liber AL, April 8 1904 -->
<span class="date93" data-evdate="1904-04-08T12:00:00Z"></span>

<!-- Fixed date + English -->
<span class="date93" data-lang="english" data-evdate="1947-12-01T00:00:00Z"></span>

Combining options

All attributes stack:

<span class="date93"
      data-lang="english"
      data-show-dow="false"
      data-separator=" · "
      data-tz="America/New_York">
</span>

Styling with CSS

The span is a normal inline element, so every normal CSS technique works. Style it like any other text on your page.

Change the color

<span class="date93" style="color: #8B0000;"></span>

Or in a stylesheet:

.date93 {
  color: goldenrod;
  font-family: Georgia, "Times New Roman", serif;
  font-style: italic;
  font-size: 1.1em;
  letter-spacing: 0.02em;
}

Make it a block with its own box

.date93 {
  display: block;
  text-align: center;
  padding: 0.5em 1em;
  background: #111;
  color: #f5deb3;
  border: 1px solid #333;
  border-radius: 4px;
}

Apply styles only to specific spans

Give different spans their own classes:

<span class="date93 header-date"></span>
<span class="date93 footer-date"></span>

<style>
  .header-date { font-size: 1.5em; color: #8B0000; }
  .footer-date { font-size: 0.8em; color: #888; }
</style>

Color the unicode glyphs differently from the text

The sun (☉), moon (☽), and zodiac symbols are just text characters — CSS can't target them individually unless you use data-lang="symbol" mode and wrap in extra markup. For most styling needs, changing the whole .date93 color is enough.

Self-hosting the JS file

If you don't want to depend on jsDelivr / unpkg:

  1. Download the JS file: https://cdn.jsdelivr.net/npm/thelematime — save it as thelematime.min.js in a folder your website can serve (e.g. /js/).
  2. Change the script tag to point at your copy:
<span class="date93"></span>
<script src="/js/thelematime.min.js"></script>

The file is ~41 KB (about 15 KB gzipped). One file, no other dependencies.

Pinning a specific version

If you want guaranteed stability, pin a version:

<script src="https://cdn.jsdelivr.net/npm/[email protected]"></script>

Without a version, you always get the latest published release.

Using as a Node / bundler library

npm install thelematime
import { compute, format } from "thelematime";

const td = compute(new Date());
console.log(format(td));
// "☉ in 1° Tauri : ☽ in 26° Geminorum : dies Martis : Anno Vxii A.L."

// Get structured data:
console.log(td.sun);
// { sign: { latin: 'Tauri', english: 'Taurus', glyph: '♉' }, degree: 1, longitude: 31.398 }

console.log(td.moon);
// { sign: { latin: 'Geminorum', english: 'Gemini', glyph: '♊' }, degree: 26, longitude: 86.961 }

console.log(td.weekday);
// { latin: 'dies Martis', english: 'Tuesday', glyph: '♂' }

console.log(td.year);
// {
//   docosade: 5,
//   yearInDocosade: 12,
//   yearsSinceEpoch: 122,
//   yearStart: 2026-03-20T14:45:36.044Z,
//   yearEnd: 2027-03-20T20:24:XX.XXXZ
// }

CommonJS (older Node projects)

const { compute, format } = require("thelematime");

TypeScript

Types are bundled:

import { compute, format, type ThelemicDate, type FormatOptions } from "thelematime";

API reference

compute(date?: Date, opts?: ComputeOptions): ThelemicDate

Compute the Thelemic-calendar state for a given moment (defaults to now).

  • date — any JavaScript Date. Defaults to new Date().
  • opts.timeZone — IANA timezone string used to derive the day of the week. Defaults to the runtime's local zone.

Returns a ThelemicDate:

interface ThelemicDate {
  date: Date;
  sun:     { sign: Sign; degree: number; longitude: number };
  moon:    { sign: Sign; degree: number; longitude: number };
  weekday: { latin: string; english: string; glyph: string };
  year: {
    yearsSinceEpoch: number;  // 0 = 1904-1905
    docosade:        number;  // 0, 1, 2, ...
    yearInDocosade:  number;  // 0 through 21
    yearStart:       Date;    // most recent March equinox (UTC)
    yearEnd:         Date;    // next March equinox (UTC)
  };
}

format(td: ThelemicDate, opts?: FormatOptions): string

Render a ThelemicDate as a display string.

interface FormatOptions {
  lang?:         "latin" | "english" | "symbol" | "poor-latin"; // default "latin"
  yearSuffix?:   "a.l." | "era-legis" | "none";                  // default "a.l."
  showDegree?:   boolean; // default true
  showWeekday?:  boolean; // default true
  showYear?:     boolean; // default true
  separator?:    string;  // default " : "
}

formatYear(docosade: number, yearInDocosade: number): string

Just the Roman-numeral year portion, e.g. "Vxii", "IV0", "0xi", "0".

render(element: Element): void / renderAll(): void

(Browser only.) Manually re-render one or all <span class="date93"> elements — useful if you inject new markup into the page after initial load.

<script src="https://cdn.jsdelivr.net/npm/thelematime"></script>
<script>
  // Re-render after your SPA navigates:
  ThelemaTime.renderAll();
</script>

What's the Thelemic calendar?

A brief primer:

  • The calendar begins at the Vernal Equinox of 1904 EV — the "Equinox of the Gods," which Aleister Crowley proclaimed as the beginning of the New Aeon.

  • Each Thelemic year rolls over on the March equinox (not January 1, not April 8). ThelemaTime computes the exact astronomical moment each year.

  • Years are grouped into docosades — 22-year cycles named after the 22 Major Arcana of the Tarot.

  • The year is written as two Roman numerals: uppercase for the docosade, lowercase for the year within it. For example, An. Vxii means docosade V (the fifth 22-year cycle, spanning March 2014 through March 2036), year xii within it (the 13th year, 0-indexed — corresponding to March 2026 through March 2027 EV).

  • The suffix A.L. is short for Anno Legis, "in the year of the Law." A longer form, æræ legis ("of the Era of the Law"), is also used.

  • Sun and Moon positions are given in the tropical zodiac using Latin sign names in the genitive case: Arietis, Tauri, Geminorum, Cancri, Leonis, Virginis, Librae, Scorpii, Sagittarii, Capricorni, Aquarii, Piscium.

  • Days of the week are given in their Latin planetary form:

    | Latin | Planet | English | | ---------------- | -------- | --------- | | dies Solis | ☉ Sun | Sunday | | dies Lunae | ☽ Moon | Monday | | dies Martis | ♂ Mars | Tuesday | | dies Mercurii | ☿ Mercury| Wednesday | | dies Iovis | ♃ Jupiter| Thursday | | dies Veneris | ♀ Venus | Friday | | dies Saturni | ♄ Saturn | Saturday |

Development

git clone https://github.com/sacha-builds/thelematime.git
cd thelematime
npm install

npm run build      # Builds dist/thelematime.min.js (IIFE), .mjs (ESM), .cjs (CJS)
npm test           # Runs 20 tests
npm run typecheck  # TypeScript check

Source is in src/, compiled output in dist/. Tests are in test/.

Project structure

src/
  index.ts        # Public Node/bundler API (compute, format, types)
  browser.ts      # Browser entry: auto-renders <span class="date93">
  year.ts         # Epoch and docosade math (vernal-equinox rollover)
  astronomy.ts    # Sun/Moon ecliptic positions (via astronomy-engine)
  zodiac.ts       # Zodiac sign table (Latin, English, glyphs)
  weekday.ts      # Latin planetary weekday table
  roman.ts        # Roman numeral conversion
  format.ts       # Output formatters for all languages

Accuracy

Astronomical calculations use astronomy-engine, which is MIT-licensed, pure JavaScript (no native dependencies), and accurate to arc-seconds for Sun/Moon positions within a thousand years of the present.

The vernal equinox each year is computed as the exact moment the Sun's apparent tropical ecliptic longitude crosses 0°, not a fixed calendar date.

Prior art and acknowledgements

This project stands on the shoulders of previous Thelemic date implementations. Most notably:

  • Era Legis by Brother Clay Fouts — the de facto standard, used by OTO USA's calendar. ThelemaTime is a clean-sheet re-implementation, not derived from any existing Thelemic date server's source code. The <span class="date93"> embed convention is honored deliberately so that sites currently using Era Legis can migrate by changing one URL.
  • LAShTAL Time Server — an older server with slightly different Latinisms (ablative "Sole" / "Luna" instead of nominative sun/moon glyphs).
  • newAeonDate — public-domain multi-language stubs, unmaintained since 2013.
  • thelemic-date (PyPI) — a Python library.

If you've contributed to or maintained a Thelemic date tool and want to be credited here, open a PR.

License

MIT. See LICENSE. Use it, fork it, self-host it, ship it in a proprietary app — whatever serves the Work.

Love is the law, love under will.

93 93/93.