Why is the Feast of the Annunciation moved to April 8 this year?

The Feast of the Annunciation of The Lord is normally celebrated on 25 March. This day is exactly nine months before the celebration of Christmas, which occurs on December 25. In the past, most feasts that had the rank of solemnity were considered a holy day of obligation, requiring all Catholics to attend Mass on that day. The Annunciation still remains a solemnity, but is no longer a holy day of obligation.

March 25 will occasionally fall during Holy Week, which means, in the Western Church, that the liturgical celebration is suppressed. Whenever this occurs, the liturgical observance is moved to the next available week day that is not a solemnity.

Since the week following Easter is considered “a week of solemnities,” the Annunciation gets pushed back even further.

This year, 2024, the Annunciation is moved from March 25 all the way to Monday, April 8. This means that all the liturgical readings and prayers for the solemnity of the Annunciation are used on April 8, even though it is not March 25.

Nonetheless, despite this change of dates, it does not diminish the importance of the event that we commemorate, as linking to what we are celebrating this Easter, it was all made possible by the acceptance of Mary of her crucial role in being the Mother of our God and Saviour, Jesus Christ.


Some of you may ask what is the difference between a solemnity, a feast and a memorial.

A solemnity in the liturgical year is a feast day of the highest rank celebrating a mystery of faith such as the Trinity, an event in the life of Jesus, the Blessed Virgin Mary, or important saints. The observance begins with the vigil on the evening before the actual date of the feast. On these days, both the Gloria and the Creed are recited. Along with the Annunciation, other examples of solemnities include the Solemnity of St. Joseph (March 19), the Solemnity of the Sacred Heart of Jesus (Friday after the Feast of Corpus Christi), and the Solemnity of St. Peter and St. Paul (June 29).

Feast days in the liturgical year are second importance and assigned one date out of the year for each and every canonized saint. The saints are remembered on their individual feast days with special mention, prayers, and possibly a scripture reading. On these days, the Gloria is recited but not the Creed.

Next in line are memorials, which are classified as either obligatory or optional.  Memorials commemorate a saint or saints.  Obligatory memorials must be observed whereas optional memorials do not have to be observed. Only the memorials of those saints who are of “universal significance” are observed by the whole Church and marked in the general liturgical calendar.

Like we’ve seen with the feast of the Annunciation this year, at times we may have more than one celebration and hence we have the order of precedence. The basic rule of thumb is this: 

  • Sundays, other Solemnities, Holy Week, and the Octave of Easter always take precedence. 
  • These are followed by Feasts, weekdays of Advent (December 17-24), days within the Octave of Christmas, weekdays of Lent, obligatory memorials, optional memorials, weekdays of Advent (through December 16), other weekdays of the Christmas Season, other weekdays of the Easter Season, and weekdays in Ordinary Time.

This sequence is definitely a bit confusing, and that is why the Bishop’s Committee on the Liturgy of the National Conference of Catholic Bishops publishes an annual Ordo which outlines the proper celebrations and their particulars throughout the liturgical year.

Wishing you all a Happy Feast!

How to Navigate Tough Times

One of my all time favourite quotes is “When the going gets tough, the tough get going!” We have two options when we are in the midst of challenging situations, one is to play a victim, cry and complain about our situation and the other is to figure out what’s the best way to move ahead, how to grow, how to be a student – learn on the best path forward.

Whether it’s personal struggles, academic pressure, or external circumstances like economic downturns or global crises, maintaining resilience and staying proactive are key to navigating these difficult periods without succumbing to a victim mentality.

Here are some strategies to help you be a student and not a victim during hard times:

Maintain a Positive Mindset: Your mindset plays a crucial role in how you perceive and respond to challenges. Cultivate a positive outlook by focusing on what you can control rather than dwelling on what you can’t. Embrace a growth mindset, understanding that setbacks are opportunities for learning and growth.

Set Realistic Goals: Break down your academic and personal goals into smaller, manageable tasks. By setting realistic goals, you can maintain a sense of accomplishment and progress even during tough times. Celebrate your achievements, no matter how small they may seem.

Stay Organized: Create a schedule or to-do list to prioritize your tasks and manage your time effectively. Organizing your workload can alleviate feelings of overwhelm and help you stay on track with your responsibilities. Remember to include time for self-care and relaxation to prevent burnout.

Seek Support: Don’t hesitate to reach out for help when you need it. Whether it’s academic support from teachers or counselors, emotional support from friends and family, or seeking out resources in your community, know that you’re not alone. Asking for help is a sign of strength, not weakness.

Practice Self-Care: Take care of your physical, emotional, and mental well-being. Get enough sleep, eat healthily, exercise regularly, and engage in activities that bring you joy and relaxation. Practicing self-care is essential for maintaining resilience and managing stress during challenging times.

Adapt and Be Flexible: Hard times often require us to adapt to new circumstances and be flexible in our approach. Be open to change and willing to adjust your plans as needed. Embrace innovation and creativity in finding solutions to problems that arise.

Focus on Solutions: Instead of dwelling on the problems you encounter, focus on finding solutions. Adopt a problem-solving mindset and approach challenges with a sense of determination and resourcefulness. Remember that setbacks are temporary, and you have the ability to overcome them.

Practice Gratitude: Cultivate an attitude of gratitude by reflecting on the things you’re thankful for, even in difficult times. Focusing on the positive aspects of your life can help shift your perspective and foster resilience in the face of adversity.

Stay Informed but Limit Exposure: While it’s important to stay informed about current events and developments, be mindful of how much negative news and information you consume. Limit your exposure to sources of stress and anxiety, and prioritize activities that promote positivity and well-being.

Believe in Yourself: Above all, believe in your abilities and strengths. Trust that you have the resilience and determination to overcome challenges and succeed in your academic endeavors. By maintaining faith in yourself and your potential, you can rise above adversity and thrive as a student, even during the hardest of times.


Remember that you have the strength and determination to weather any storm, and by embodying these principles, you can transform adversity into opportunities for learning and personal growth. So, embrace the journey, believe in yourself, and know that you have the power to be a student who thrives, not just survives, during hard times.


Just recently I came across this video which is apt for this reflection where Robin Van Persie shares his experience with his son.

My Unforgettable Experience at Ed Sheeran’s Concert

Attending an Ed Sheeran concert live is an experience unlike any other. From the moment you step into the venue, there’s an electrifying energy in the air, buzzing with anticipation and excitement. As fans gather from all walks of life, united by their love for Sheeran’s music, you can feel a sense of camaraderie and connection that transcends boundaries.

Calum Scott performed before Ed came on stage :)

The stage is set, lights dimmed, as the 8 minute countdown begins. The crowd erupts into cheers as Ed Sheeran steps onto the stage, armed with just his guitar and loop pedal. There’s something incredibly intimate about witnessing him perform live, stripped down to the essence of his artistry. With nothing but his voice and his guitar, Sheeran captivates the audience from the first chord, drawing them into his world with each heartfelt lyric and soulful melody.

One of the most striking aspects of an Ed Sheeran concert is his sheer talent as a performer. Watching him effortlessly loop and layer intricate guitar riffs, beatboxing, and harmonies to create a rich tapestry of sound is nothing short of mesmerizing. His raw talent and genuine passion for music shine through in every note, leaving the audience in awe of his musical prowess.

But beyond his technical skill, what truly sets an Ed Sheeran concert apart is the emotional depth and authenticity of his performance. Each song feels like a personal confession, a glimpse into Sheeran’s own experiences and emotions. Whether he’s singing about love, heartbreak, or the trials of life, there’s a raw honesty to his music that resonates deeply with listeners, creating an emotional connection that transcends the boundaries of the concert hall.

As the night unfolds, the crowd becomes a chorus of voices, singing along to every word, their voices blending with Sheeran’s in perfect harmony. There’s a sense of unity and shared experience that permeates the air, as strangers become friends, bonded by their mutual love for Sheeran’s music.

And then, just like that, the concert draws to a close, leaving the audience craving more. But as they spill out into the night, hearts full and spirits lifted, they carry with them the memories of an unforgettable experience. For those fortunate enough to have attended an Ed Sheeran concert live, it’s not just a night of music—it’s a moment frozen in time, a reminder of the power of music to inspire, uplift, and unite us all.


Here are some of the clips I managed to capture, it definitely doesn’t do justice to the experience, but I hope you enjoy it! :)

GitOps Workflow – Simplified Visual Guide

GitOps brought a shift in how software and infrastructure are managed with Git as the central hub for managing and automating the entire lifecycle of applications and infrastructure.

Here’s a simplified visual guide (from my favourite blog, bytebytego)

It’s built on the principles of version control, collaboration, and continuous integration and deployment (CI/CD). 

Key features include: 

  1. Version Control and Collaboration: 
    Centralizing code, configurations, and infrastructure in Git for control and collaboration. 
  2. Declarative System: 
    Describing the system’s desired state for easier version control. 
  3. Automated Delivery: 
    Automating deployment through Git-triggered processes, closely integrated with CI/CD pipelines. 
  4. Immutable Infrastructure: 
    Making changes via Git instead of directly in the live environment to prevent inconsistencies. 
  5. Observability and Feedback: 
    Monitoring systems in real-time to align the actual state with Git’s declared state. 
  6. Security and Compliance: 
    Tracking changes in Git for security and compliance, with role-based access for added control.

Over to you: Do you see GitOps’ declarative approach speeding up your deployments?

Duck or Eagle?

I was at the airport when a taxi driver approached.

The first thing I noticed in the taxi was a sentence, that I read: Duck or Eagle? You decide!

The second thing I noticed was a clean & shiny cab, the driver well dressed, white shirt & pressed pants, with a tie.

The taxi driver got out, opened the door for me & said: “I am John, your chauffeur.While I keep your luggage, I would like you to read on this card what my mission is.”

On the card was written: John’s Mission: Take my customers to their destination quickly, safely & economically, offering a friendly environment.

I was impressed!

The cab’s interior was equally clean.

John asked me:
“Would you like a coffee?”

Playing with him I said:
“No! I prefer a juice.”

Immediately he replied: “No problem. I have a thermos with regular juice & also diet, as well as water” he also told me: “If you’d like to read, I have today’s paper & some magazines as well.”

When the cab started, John told me: “These are the radio stations I have & this is the repertoire they play.”

As if that wasn’t enough, John asked me if the air conditioning temperature was good.

Then he told me the best route to my destination & whether I wanted to talk to him or whether he preferred that I not be interrupted.

I asked:”Do you always serve your customers like this?”

“No!” He replied. “Not always.
Only in the last two years.
My first years as a taxi driver I spent most of my time complaining like other taxi drivers.
One day I heard a doctor specializing in personal development.
He wrote a book called Who You Are Makes a Difference.
He said: If you get up in the morning expecting to have a bad day, you will!
Don’t be a DUCK! Be an EAGLE!

The ducks only make noise & complain, the eagles soar above the group.

I was all the time making noise & complaining. So I decided to change my attitudes & be an eagle.

I looked at the other taxis & drivers. Dirty taxis, unfriendly drivers & unhappy customers.

I decided to make some changes. Since my customers responded well, I made a few more changes.

In my first year as an eagle, I doubled my income. This year, I already quadrupled.

You were lucky to take my taxi today. I’m no longer at the taxi stand. My clients make reservations on my cell phone or text me. If I can’t answer, I can get a reliable “Eagle” taxi driver friend to do the job.”

John was different. He offered a limousine service in a regular taxi.
John the taxi driver, decided to stop making a noise & complain as ducks do & started to fly over the group, as eagles do.

It doesn’t matter if you work in an office, maintenance, teacher, civil servant, politician, executive, employee or a professional or a taxi driver! How do you behave? Are you dedicated to making a noise & complaining? Or rising above the rest?

Remember: THE DECISION IS YOURS! This key only opens from the inside!

AND EACH TIME YOU HAVE LESS TIME TO CHANGE!

Love your Priests

According to recent studies… many priests quit each year. They don’t quit because they have a lack of faith in God. They don’t quit because they don’t believe in the calling God has placed on their life. Most don’t even quit because of financial reasons.

Priests quit because they are overwhelmed with mental exhaustion.

Until you’re a priest, you’ll never fully understand what it’s like to carry spiritual burdens for people. Getting up in the middle of night, praying for your family of faith. Awakened in the middle of night with someone on your heart. Overwhelmed with concern by a persons absence or distance.

Your mind continually occupied with the presentation of the upcoming Sunday message – how to preach it, what to teach on, how do we apply it? Getting critiqued on a continual basis.

Being told you need to do better or that some areas of the church simply need to be better.
priests invest their whole life into people and yet people will turn their backs on their priests at the first sign of a storm, usually without a conversation. Priests stand in the middle of disputes.
priests stand in the middle of gossip.
Priests council broken marriages.
Priests comfort those who have suffered loss. Priests navigate the waters of imperfect people with a desire to see each one thrive in their faith.

They long for spiritual breakthroughs. Your Priests craves the very best for you. All of this, while trying to battle their own flesh and grow in their own relationship with God.
Priests see the posts.
Priests hear the whispers.
Priests endure the negativity.
Priests are continually caring for the sheep while fending off the wolves.
Priests pour out and pour out – rarely being poured into.

What keeps a Priest going? YOU!

You – the person who is genuinely hungry.
You – the person who worships with passion and freedom.
You – the teenager who is striving to be a follower of Jesus.
You – the single mom who understands the beauty of the hope found in Christ.
You – the one who walks through the door for the first time because you’re in search of peace, hope, and community.

Pray for your Priests. Serve with your Priest.
Talk with your Priest. Encourage your Priest.
They are human. They need You more than you think!

What doesn’t kill you makes you stronger?

My dad and I once had a disagreement over him using the adage
“What doesn’t kill you makes you stronger.”

I said, “That’s just not true. Sometimes what doesn’t kill you leaves you brittle and injured or traumatized.”

He stopped and thought about that for a while. He came back later, and said, “It’s like wood glue.”

He pointed to my bookshelf, which he helped me salvage a while ago.

He said, Do you remember how I explained that, once we used the wood glue on them, the shelves would actually be stronger than they were before they broke?”

I did.

“But before we used the wood glue, those shelves were broken. They couldn’t hold up shit. If you had put books on them, they would have collapsed. And that wood glue had to set awhile. If we put anything on them too early, they would have collapsed just the same as if we’d never fixed them at all. You’ve got to give these things time to set.”

It sounded like a pretty good metaphor to me, but one thing I did pick up on was that whatever broke those shelves, that’s not the thing that made them stronger. That just broke them. It was being fixed that made them stronger. It was the glue.

So my dad and I agreed, what doesn’t kill you doesn’t actually make you stronger, but healing does. And If you feel like healing hasn’t made you stronger than you were before, you’re probably not done healing. You’ve got to give these things time to set.

Modern CSS Upgrades (Part 2)

We continue our journey through the transformative world of modern CSS upgrades!

color-scheme

You may be familiar with the prefers-color-scheme media query to customize dark and light themes. The CSS property color-scheme is an opt-in to adapting browser UI elements including form controls, scrollbars, and CSS system colors. The adaptation asks the browser to render those items with either a light or dark scheme, and the property allows defining a preference order.

If you’re enabling adapting your entire application, set the following on the :root, which says to preference a dark theme (or flip the order to preference a light theme). 

:root {
color-scheme: dark light;
}

You can also define color-scheme on individual elements, such as adjusting form controls within an element with a dark background for improved contrast.

.dark-background {
color-scheme: dark;
}

accent-color

I’m sure that at some point you’ve wanted to change the color of checkboxes or radio buttons. What you’ve been looking for is accent-color!

With this property, you can modify the :checked appearance of radio buttons and checkboxes and the filled-in state for both the progress element and range input. The browser’s default focus “halo” may also be adjusted if you do not have another override.

:root {
accent-color: mediumvioletred;
}

Consider adding both accent-color and color-scheme to your baseline application styles for a quick win toward custom theme management.


width: fit-content

One of my favorite CSS hidden gems is the use of fit-content to “shrink wrap” an element to its contents.

Whereas you may have used an inline display value such as display: inline-block to reduce an element’s width to the content size, an upgrade to width: fit-content will achieve the same effect. The advantage of width: fit-content is that it leaves the display value available, thereby not changing the position of the element in the layout unless you adjust that as well. The computed box size will adjust to the dimensions created by fit-content.

Let’s see how it works

.fit-content {
width: fit-content;
}

overscroll-behavior

The default behavior of contained scroll regions – areas with limited dimensions where overflow is allowed to be scrolled – is that when the scroll runs out in the element, the scroll interaction passes to the background page. This can be can be pretty frustrating for your users.

Use of overscroll-behavior: contain will isolate the scrolling to the contained region, preventing continuing the scroll by moving it to the parent page once the scroll boundary is reached. This is useful in contexts such as a sidebar of navigation links, which may have an independent scroll from the main page content, which may be a long article or documentation page.

.sidebar, .article {
overscroll-behavior: contain;
}

text-wrap

One of the newest properties (as of 2023) is text-wrap, which has two values that solve the type-setting problem of unbalanced lines. This includes preventing “orphans,” which describes a lonely word sitting by itself in the last text line.

The first available value is balance, which has a goal of evening out the number of characters per line of text.

There is a limitation of six lines of wrapped text, so the technique is best used on headlines or other shorter text passages. Limiting the scope of application also helps limit the impact on page rendering speed.

:is(h1, h2, h3, h4, .text-balance) {
text-wrap: balance;

/* For demonstration */
max-inline-size: 25ch;
}

The other value of pretty specifically addresses preventing orphans and can be more broadly applied. The algorithm behind pretty will evaluate the last four lines in a text block to work out adjustments as needed to ensure the last line has two or more words.

p {
text-wrap: pretty;

/* For demonstration */
max-inline-size: 35ch;
}

Hope this helps you! Have I missed anything? Let me know in the comments below :)

Modern CSS Upgrades (Part 1)

In the ever-evolving landscape of web development, the language of design undergoes constant refinement. CSS, the style sheet language that breathes life into the digital realm, is no exception. Sometimes, improving your CSS just takes a one-line upgrade or enhancement! Learn about 10 properties to start incorporating into your projects, and enjoy reducing technical debt, removing JavaScript, and scoring easy wins for user experience. Fasten your seatbelts as we embark on a journey through the transformative world of modern CSS upgrades!

aspect-ratio

As of September 2021, the aspect-ratio property is stable in evergreen browsers and is the only property needed to define an aspect ratio. For an HD video, you can just use aspect-ratio: 16/9. For a perfect square, only aspect-ratio: 1 is required since the implied second value is also 1 .

.aspect-ratio-hd {
aspect-ratio: 16/9;
}

.aspect-ratio-square {
aspect-ratio: 1;
}

An applied aspect-ratio is forgiving and will allow content to take precedence. This means that when content would cause the element to exceed the ratio in at least one dimension, the element will still grow or change shape to accommodate the content. To prevent or control this behavior, you can add additional dimension properties, like max-width, which may be necessary to avoid expanding out of a flex or grid container.

/* Applied to the flexbox children which have a size constraint from their parent */
.aspect-ratio-square {
aspect-ratio: 1;
}

object-fit

The use of object-fit causes an img or other replaced element to act as the container for its contents and have the contents adopt resizing behavior similar to background-size.

While there are a few values available for object-fit, the following are the ones you’re most likely to use:

  • cover – the image resizes to cover the element, and maintains its aspect-ratio so that the content is not distorted
  • scale-down – the image resizes (if needed) within the element so that it is fully visible without being clipped and maintains its aspect-ratio, which may lead to extra space (”letterboxing”) around the image if the element has a different rendered aspect-ratio

In either case, object-fit is an excellent property pairing with aspect-ratio to ensure images are not distorted when you apply a custom aspect ratio. Let’s look at an example

.image {
object-fit: cover;
aspect-ratio: 1;

/* Optional: constrain image size */
max-block-size: 250px;
}

margin-inline

One of many logical properties, margin-inline functions as a shorthand for setting the inline (left and right in horizontal writing modes) margin.

The replacement here is simple:

/* Before */
margin-left: auto;
margin-right: auto;

/* After */
margin-inline: auto;

text-underline-offset

The use of text-underline-offset allows you to control the distance between the text baseline and the underline. You can use this offset to clear descenders as well as improve legibility, particularly when links are grouped in close proximity, such as a bulleted list of links.

This upgrade may replace older hacks like a border or pseudo-element, or even a gradient background

a {
text-underline-offset: 0.25em;
}

outline-offset

We’ve been using different hacks including box-shadow or perhaps a pseudo-element to supply a custom outline when you wanted distance between the element and outline on focus?

The long-available outline-offset property may be one you missed, and it enables pushing the outline away from the element with a positive value or pulling it into the element with a negative value.

In the example below, the gray solid line is the element border, and the blue dashed line is the outline being positioned via outline-offset.

.outline-offset {
outline: 2px dashed blue;
outline-offset: var(--outline-offset, .5em);
}

One key point is that outlines are not computed as part of the element’s box size, so increasing the distance will not increase the amount of space an element occupies. This is similar to how box-shadow is rendered without impacting the element size as well.


Stay tuned for part 2!

Say Hello to NLUX

Conversational AI has taken off, and chatbots powered by large language models (LLMs) like ChatGPT are becoming a must-have for many apps and websites. At Brillio, we already have kicked-off many engagements on conversational AI. As a web developer, you want a simple way to build a great chat interface backed by these incredible LLMs. That’s where NLUX comes in.

NLUX is an open-source React and Vanilla JS library that makes it easy to integrate LLMs like ChatGPT into your app and create natural conversational experiences for your users. With NLUX, you get:

  • Build AI Chat Interfaces In Minutes – High quality conversational AI interfaces with just a few lines of code.
  • React Components & Hooks – <AiChat /> for UI and useAdapter hook for easy integration.
  • Flexible LLM Adapters – ChatGPT HuggingFace and an API to Create Your Own Adapter for any LLM.
  • Bot and User Personas – Customize the bot and user personas with names, images, and descriptions.
  • Streaming LLM Output – Streamed the chat response to the UI as it’s being generated.
  • Syntax Highlighting – Color code snippets in the response. Copy And Paste code into your editor.
  • Personalized Conversation – Provide context using system messages, and instruct the LLM how to behave.
  • Customizable Theme – Easily customize the look and feel of the chat interface using CSS variables.
  • Zero Dependencies – Lightweight codebase, with zero-dependencies except for LLM front-end libraries.

What I liked is the flexibility to develop custom streaming or promise adapters. For example, let’s say an enterprise doesn’t use the public OpenAI large language model, but they want to use a custom model that’s hosted in their own servers. They can actually build and customize their own models, but they still can use NLUX to connect to those models. They need to build a custom adapter for their own model and API.

Developers can personalize their chatbot with natural language queues and a few lines of code to give the conversation a bit of personality. They can also instruct the bot to be serious, funny, modest or confident.

NLUX is also currently building an adapter for LangChain, along with support for server-side rendering. Voice chat is also on the roadmap for the library. They also have plans to expand NLUX to support Angular, React Native and possibly Preact.

Let’s see how easy it is to get up and runningn with NLUX. 

To get started, you can check out the React JS NPM package here or the Vanilla JS NPM package here. Both NPM packages have detailed documentation and examples on how to use them.

I’ll use the react package. To install:

npm install @nlux/react @nlux/openai-react

Then include <AiChat /> in your React app to get started.

Use the useAdapter hook to configure an adapter for your LLM.

import {AiChat} from '@nlux/react';
import {useAdapter} from '@nlux/openai-react';

const App = () => {
const gptAdapter = useAdapter({
apiKey: 'YOUR_OPEN_AI_API_KEY',
// 👇 Instruct ChatGPT how to behave, customize your bot's personality! (optional)
systemMessage:
'Give sound, tailored financial advice. Explain concepts simply. When unsure, ask questions. ' +
'Only recommend legal, ethical practices. Be friendly. Write concise answers under 5 sentences.'
});

return (
<AiChat
adapter={gptAdapter}
promptBoxOptions={{
placeholder: 'How can I help you today?'
}}
/>
);
}

To customize the look and feel of the bot you need include a theme CSS file into your HTML page.

The recommended way for React developers is to install @nlux/themes

npm install @nlux/themes

Then import the theme CSS file into your app or component as follows:

import '@nlux/themes/custom.css';

With NLUX, you can optionally define a bot persona and a user persona. Here is an example

Source: nlux documentation

Pretty cool right? So if you’re looking to add an AI assistant or chatbot to your app, look no further than NLUX. Its simplicity, customizability, and focus on performance makes it the perfect choice.