๐Ÿ—“๏ธ Litcal Demo

Liturgical Calendar Resolver

Compare how this date is resolved across all available calendars

๐Ÿ“ Data Structure โ€” What You Need to Configure

To create a custom liturgical celebration (diocese, religious order, etc.), you need to provide the following fields. These fields will be stored in JSON files and eventually in your database.

๐ŸŽฏ Celebration

Complete definition of a liturgical celebration

id string REQUIRED
Unique identifier in snake_case format (same as Romcal). You'll use this ID to fetch translated texts.
Example: "james_apostle", "our_lady_of_guadalupe"
rank Rank REQUIRED
Liturgical rank of the celebration. Determines its importance.
Values: "SOLEMNITY", "FEAST", "MEMORIAL", "OPTIONAL_MEMORIAL", "SUNDAY", "WEEKDAY"
precedence Precedence REQUIRED
Liturgical precedence according to UNLY ยง59. Defines which celebration "wins" when there's a conflict.
Values: "GENERAL_SOLEMNITY_3", "GENERAL_FEAST_7", "PROPER_FEAST_PRINCIPAL_PATRON_OF_DIOCESE_8A", "GENERAL_MEMORIAL_10", etc.
See full precedence list โ†’
colors Color[] REQUIRED
Array of liturgical colors for this celebration (can have multiple).
Values: ["RED"], ["WHITE"], ["GREEN"], ["PURPLE"], ["ROSE"], ["BLACK"], ["GOLD"]
Multiple example: ["WHITE", "GOLD"]
isHolyDayOfObligation boolean REQUIRED
Is it a holy day of obligation? (required Mass attendance)
Values: true | false
isOptional boolean REQUIRED
Is it optional to celebrate? (e.g., optional memorials)
Values: true | false
metadata object OPTIONAL
Additional custom data. You can store whatever you need here.
Example: { "romcalName": "Saint James", "periods": ["CHRISTMAS"] }

๐Ÿ† Precedence Values

Liturgical precedence order (from highest to lowest priority)

TRIDUUM_1 โ€” Paschal Triduum
PROPER_OF_TIME_SOLEMNITY_2 โ€” Solemnities of the Proper of Time
PRIVILEGED_SUNDAY_2 โ€” Privileged Sundays
ASH_WEDNESDAY_2 โ€” Ash Wednesday
WEEKDAY_OF_HOLY_WEEK_2 โ€” Weekdays of Holy Week
WEEKDAY_OF_EASTER_OCTAVE_2 โ€” Days of the Easter Octave
GENERAL_SOLEMNITY_3 โ€” Solemnities of the General Calendar
PROPER_SOLEMNITY_PRINCIPAL_PATRON_4A โ€” Solemnity of the Principal Patron
PROPER_SOLEMNITY_DEDICATION_OF_THE_OWN_CHURCH_4B โ€” Dedication of the Cathedral/Own Church
GENERAL_LORD_FEAST_5 โ€” Feasts of the Lord in the General Calendar
UNPRIVILEGED_SUNDAY_6 โ€” Sundays of Ordinary Time
GENERAL_FEAST_7 โ€” Feasts of the General Calendar
PROPER_FEAST_PRINCIPAL_PATRON_OF_DIOCESE_8A โ€” Feast of the Principal Patron of the Diocese
PROPER_FEAST_DEDICATION_OF_CATHEDRAL_8B โ€” Dedication of the Cathedral
PROPER_FEAST_PRINCIPAL_PATRON_OF_REGION_8C โ€” Principal Patron of the Region
GENERAL_MEMORIAL_10 โ€” Memorials of the General Calendar
PROPER_MEMORIAL_11B โ€” Proper Memorials
OPTIONAL_MEMORIAL_12 โ€” Optional Memorials
WEEKDAY_13 โ€” Weekdays of Ordinary Time

๐Ÿ“‹ CalendarRule

Defines how to add/modify/suppress a celebration in the calendar

id string REQUIRED
Unique rule ID
calendarId string REQUIRED
Which calendar this belongs to
Example: "spain", "diocese-madrid", "order-dominicans"
action RuleAction REQUIRED
What to do with the celebration
Values: "ADD" (add new), "REPLACE" (elevate rank/modify), "SUPPRESS" (remove), "TRANSFER" (move to another date)
celebration Partial<Celebration> REQUIRED
The celebration data (see structure above). For REPLACE actions, only include fields to modify.
dateRule DateRule REQUIRED
Rule that defines when the celebration occurs
{ "type": "fixed", "month": 7, "day": 25 } โ€” Fixed date (July 25)
{ "type": "easter-relative", "addDays": 39 } โ€” Relative to Easter (Ascension)

โœ… Complete JSON Example

{
  "id": "spain-santiago-apostle-solemnity",
  "calendarId": "spain",
  "action": "REPLACE",
  "targetCelebrationId": "james_apostle",
  "celebration": {
    "id": "james_apostle",
    "rank": "SOLEMNITY",
    "precedence": "PROPER_SOLEMNITY_PRINCIPAL_PATRON_4A",
    "colors": ["RED"],
    "isHolyDayOfObligation": true,
    "isOptional": false,
    "metadata": {
      "romcalName": "Saint James, Apostle"
    }
  },
  "dateRule": {
    "type": "fixed",
    "month": 7,
    "day": 25
  }
}