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
Maintainers
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
- Quickstart (HTML / WordPress / Squarespace / anyone)
- Display options
- Styling (CSS)
- Self-hosting the JS file
- Using as a Node / bundler library
- API reference
- What's the Thelemic calendar?
- Development
- Prior art
- License
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):
- Edit the page/post/widget where you want the date.
- Click + to add a block, then choose Custom HTML.
- Paste the two lines above.
- Publish or update.
WordPress (classic editor / widget area):
- Go to Appearance → Widgets (or edit a post in HTML mode).
- Add a Custom HTML widget.
- Paste the two lines.
- Save.
Squarespace:
- Edit the page, click Add Block → Code.
- Ensure the block is set to HTML (not Markdown).
- Paste the two lines.
- Save.
Wix:
- Add an Embed → Custom Embeds → Embed HTML.
- Paste the two lines.
- 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:
- Download the JS file: https://cdn.jsdelivr.net/npm/thelematime — save it as
thelematime.min.jsin a folder your website can serve (e.g./js/). - 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 thelematimeimport { 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 JavaScriptDate. Defaults tonew 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 checkSource 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 languagesAccuracy
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.
