Building a Liturgical Calendar App with React Native
A walkthrough of the design decisions, faith motivations, and technical choices behind building a daily liturgical calendar app for Catholic families.
This is the story of a project born from a simple frustration: I couldn't find a liturgical calendar app that was both beautiful and reliable. Most were either outdated, ad-covered, or missing key features like the season display and saints' feast days for the Extraordinary Form.
So I built one. This is a development walkthrough and a reflection on what it means to build software in service of the Church.
The Motivation
Pope Leo XIII declared May 1st as the feast of St. Joseph the Worker specifically to reclaim work — all work, including intellectual and creative work — as an act of dignity and service. Software development, at its best, is no different.
When I started this project, I wrote a simple principle at the top of my notes: Build it as if St. Joseph would use it. That meant: clear, reliable, no unnecessary complexity, and beautiful enough that it honors the things it points to.
What the App Does
The Liturgical Calendar App provides:
- Daily display of the liturgical season, color, and rank of the day
- Feast days from the Roman Calendar (Ordinary Form) with optional Extraordinary Form support
- Saint of the day with a brief biography
- Scripture readings for Mass
- Weekly and monthly views with season color coding
Tech Stack Decisions
React Native with Expo
React Native allowed targeting both iOS and Android from a single codebase. Expo simplified the development workflow significantly. For an app that will be maintained largely alone, reducing platform-specific complexity was critical.
Offline-First Data
Liturgical data doesn't change — the calendar is fixed years in advance. All calendar data is bundled with the app rather than fetched from an API. This means the app works entirely offline, which matters for people at daily Mass in areas with poor connectivity.
// Example: computing the liturgical season from a date
export function getLiturgicalSeason(date: Date): LiturgicalSeason {
const year = date.getFullYear()
const easter = computeEaster(year)
const advent = computeFirstAdvent(year)
if (date < computeChristmas(year - 1)) {
return isInAdvent(date, year - 1) ? 'Advent' : 'OrdinaryTime'
}
if (date >= advent) return 'Advent'
if (isInLent(date, easter)) return 'Lent'
if (isInEaster(date, easter)) return 'Easter'
return 'OrdinaryTime'
}
Color and Design
Liturgical colors — violet, white, red, green, rose — carry real theological meaning. The app uses these colors intentionally throughout the interface. On a violet day, the app breathes purple. On a feast day, it brightens to white and gold.
This is not decoration. Color is catechesis.
Challenges
Easter computation is surprisingly complex. The algorithm (Computus) must correctly handle the relationship between the lunar calendar, the solar calendar, and centuries of ecclesiastical tradition. Getting it right required careful study of the actual Church documents, not just Wikipedia.
Regional calendars add complexity. Different dioceses have their own patron saints and local feast days. The app handles a base Roman Calendar and allows diocese-specific overlays — but mapping every diocese worldwide is an ongoing effort.
The Extraordinary Form follows a different calendar entirely. Supporting both required careful data modeling to keep the two systems cleanly separate while allowing users to switch between them.
What I Learned
Technical projects undertaken for the Church have a way of teaching you things that technical projects undertaken for commerce don't. When you build for prayer, you think more carefully about distraction, about pace, about whether every feature you add actually serves the person using it — or just adds noise.
I removed more features than I added. Every notification, every social feature, every gamification idea was a question: Does this help someone pray? Or does it interrupt them?
Software, at its best, steps out of the way.
Status and Next Steps
The app is currently in active development and available for beta testing. Upcoming features include:
- Full LOTH (Liturgy of the Hours) integration
- Parish-specific calendar imports
- A simple daily reflection tied to the season
If you'd like to contribute — whether code, calendar data, or feedback — reach out through the contact page.
St. Isidore of Seville, patron of the internet, pray for us. St. Joseph the Worker, patron of craftsmen, pray for us.
St. Joseph, patron of workers, pray for us.
May every project we undertake be done with care, skill, and a spirit of service.