MARS: Chatbot using Power Virtual Agent

Power Virtual Agents (PVA) has been popping up in conversations for a few months now and I’ve always been meaning to try it out. We have an ongoing proposal for developing a chatbot. And once again PVA was mentioned. This was the perfect time to try it out. I set myself a target of completing this in half a day! I’ll let you know at the end if I managed or no! ;)

First a very brief intro to Power Virtual Agents (PVA). It is a user-friendly, no-code/low-code platform developed by Microsoft that empowers organizations to create and deploy AI-powered chatbots and virtual agents without the need for extensive coding or technical expertise. These virtual agents can be used to automate a wide range of customer service, support, and business processes, enhancing customer engagement and operational efficiency. A few key things before we go ahead

  • PVAs seamlessly integrate with Power Apps, Power Automate, Power BI which allows you to connect your virtual agent to various data sources, automate processes, and gain insights from your chatbot interactions.
  • PVA offers a library of pre-built templates and content, making it easier to get started with common use cases like customer support, appointment scheduling, FAQs, and more.
  • You can deploy your Power Virtual Agent on various channels, including websites, Microsoft Teams, Facebook, Slack, and more. This multi-channel support ensures that your virtual agent can reach customers on their preferred platforms.
  • Power Virtual Agents adheres to industry standards and offers features like authentication, authorization, and data protection to ensure that your chatbot interactions are secure and compliant with relevant regulations.
  • PVA is designed to scale with your organization’s needs. Whether you need a simple FAQ chatbot or a complex virtual agent handling intricate processes, Power Virtual Agents can accommodate your requirements.

The Usecase

Well what bot do I build? For the last few months our CX Studio has been doing assessments for clients and one piece of the mobile section is summarising the concerns/issues from the feedback on the App Store and Play Store. We’ve been doing this manually, using Chat GPT to summarise the reviews. I finally got down to automating it last week by developing a Lambda which would fetch reviews and summarise it using Open AI services. 

So for my bot I thought why not use this endpoint to make it easy for us to get our mobile app summaries on Teams and that is how MARS was born! MARS is Mobile App Review Summariser (MARS!) :)

I have developed chatbots on Dialogflow, Azure’s QNA Maker, RASA to name a few and since I heard that the Power platform is very intuitive and designed for non-techies, I decided to explore it on my own without following any tutorial. On signing up, I created my first bot and saw a few pre-filled topics, entities. 

I started off with my new topic, gave it a name and added a few phrases.

I was quickly able to add a few nodes to collect details I needed. 

The next interesting bit was calling my API. Here is where PVA has the ability to add flows from Power Automate. This again was a new platform for me. I went ahead and was able to add my Store Reviews flow where I added the HTTP action, parsed my response and returned the two keys my bot needed. Here is where I needed help with parsing the response, had to visit our dear friend StackOverflow for assistance! :)

Once I was ready, I published my bot and there were a host of channels which I could configure. Below is a recording of a cool demo site that PVA provides and a screenshot on Teams. The bot is for reviews of our company iOS OnTheGo app on the App Store

Takeaways:

  • The PVA interface is intuitive, it wasn’t too difficult to quickly setup my conversation flow
  • Integrating with Power Automate was the one step that took some time to figure out
  • And yes, I was able to finish this in half a day as planned, but that’s only because I had my API ready! :)

There is still a lot more to explore in terms of security, navigating between topics, handing off flows to live agents and much more. Yes, the bot I developed is very very basic, but our team will definitely be using it and we will be building on this in the coming weeks. 

If you’ve made it so far thank you! Happy to hear your experience with PVA or if you plan to try it out? Let me know in the comments below! :)

CSS Nesting

When we use a CSS preprocessor like Sass or Less, we can nest a CSS style rule within another rule to write clean and understandable code. This nesting rule is now supported in native CSS. Before nesting, every selector needed to be explicitly declared, separately from one another. This leads to repetition, stylesheet bulk and a scattered authoring experience.

.nesting {
  color: green;
}
​
.nesting > .is {
  color: red;
}
​
.nesting > .is > .awesome {
  color: blue;
}

After nesting, selectors can be continued and related style rules to it can be grouped within

.nesting {
  color: green;
​
  > .is {
    color: red;
​
    > .awesome {
      color: blue;
    }
  }
}

Pretty cool right?

Nesting helps developers by reducing the need to repeat selectors while also co-locating style rules for related elements. It can also help styles match the HTML they target. If the .nesting component in the previous example was removed from the project, you could delete the entire group instead of searching files for related selector instances.

Nesting can help with:

  • Organization
  • Reducing file size
  • Refactoring

CSS nesting allows you to define styles for an element within the context of another selector.

.parent {
  color: blue;
​
  .child {
    color: red;
  }
}

In this example, the .child class selector is nested within the .parent class selector. This means that the nested .child selector will only apply to elements that are children of elements with a .parent class.

This example could alternatively be written using the & symbol, to explicitly signify where the parent class should be placed. Nesting classes without & will always result in descendant selectors. Use the & symbol to change that result.

.parent {
  color: blue;
​
  & .child {
    color: red;
  }
}

Nesting @media

It can be very distracting, confusing, maddening to move to a different area of the stylesheet to find media query conditions that modify a selector and its styles. That distraction is gone with the ability to nest the conditions right inside the context.

For syntax convenience, if the nested media query is only modifying the styles for the current selector context, then a minimal syntax can be used.

.card {
  font-size: 1rem;
​
  @media (width >= 1024px) {
    font-size: 1.25rem;
  }
}

All examples up to this point have continued or appended to a previous context. You can completely change or rearrange the context if needed.

The & symbol represents a reference to a selector object (not a string) and can be placed anywhere in a nested selector. It can even be placed multiple times. The example below may not be the best, but I am sure there are certain scenarios where this will be handy!

.card {
  .featured & {
    /* .featured .card */
  }
}
​
.card {
  .featured & & & {
    /* .featured .card .card .card */
  }
}

Now for a few quirks, invalid nesting examples

HTML elements currently require the & symbol in front or being wrapped with :is().

.card {
  h1 {
    /* 🛑 h1 does not start with a symbol */
  }
}
​
.card {
  & h1 {
    /* ✅ now h1 starts with a symbol */
  }
​
  /* or */
​
  :is(h1) {
    /* ✅ now h1 starts with a symbol */
  }
}

Many CSS class naming conventions count on nesting being able to concatenate or append selectors as if they were strings. This does not work in CSS nesting as the selectors are not strings, they’re object references.

.card {
  &--header {
    /* is not equal to ".card--header" */
  }
}

CSS Nesting is only at version 1. Version 2 will introduce more syntactic sugar and potentially fewer rules to memorize. There’s a lot of demand for the parsing of nesting to not be limited as well!

Nesting is a big enhancement to the CSS language. Right?

WWDC 2023: TipKit

It may be a little surprising that Swift did not have a tip framework upto now! WWDC 2023 announced the release of a new iOS framework called TipKit!

So what is TipKit all about? The goal of TipKit is to make it as easy as possible for developers to display short contextual information that highlights or explains a feature of their app.

To give you a better idea, here are 3 exemples of how these little UI tooltips look like:

For all of us who have been asked to implement tooltips, I’m sure the announcement of TipKit came with a feeling of relief, because you’ve probably experienced how surprisingly challenging that task can be!

There are mostly two reasons why implementing tooltips without the support of a first-party framework is challenging:

First, displaying the tooltips in a way that works across all the combinations of languages and screen sizes without breaking your UI is not easy.

And then, you also want to make sure that you trigger the tooltips at the right time, so that you don’t overwhelm your users. And the business logic behind this tend to get complex really fast.

As you can guess, the reason why many iOS developers got excited by the announcement of TipKit is because it nicely solves both of these issues So let’s have a look at how it looks like in the code!

This is the simplest implementation of a Tip: you just need to provide a title and a message. If you want, you can also add an image, typically an icon, through the property asset.

struct FavoriteTip: Tip {
    var title: Text {
        Text("Save as a Favorite")
    }
​
    var message: Text {
        Text("Your favorite pattern always appears at the top of the list")
    }
​
    var asset: Image {
        Image(systemName: "star")
    }
}
Output of above code

It’s also possible to display images in the title or the message, because SwiftUI allows you to inline an Image inside a Text!

If needed, you can even configure some actions that your user will be able to trigger:

var actions: [Action] {
  [
    Tip.Action(
      id: "learn-more",
      title: "Learn More"
    )
  ]
}

And once your Tip is configured, you can display it either by embedding it inside a TipView and adding this new view to your view hierarchy. But you can also have your Tip be displayed in a popover that points towards one of your UI element:

So we’ve seen how TipKit helps you display tooltips on your UI, now let’s see how it manages the logic of when to show the tips 

First, you have control over the frequency at which tips will be shown to your users:

// One tip per day
TipsCenter.shared.configure {
    DisplayFrequency(.daily)
}
​
// One tip per hour
TipsCenter.shared.configure {
    DisplayFrequency(.hourly)
}
​
// Custom configuration
let fiveDays: TimeInterval = 5 * 24 * 60 * 60
TipsCenter.shared.configure {
    DisplayFrequency(fiveDays)
}
​
// No frequence control. Show all tips as soon as eligible
TipsCenter.shared.configure {
    DisplayFrequency(.immediate)
}

You can also define rules that will govern how each individual Tip will be displayed.

TipKit supports two kind of rules.

First, you have rules that are based on that current state of your app.

This allows you, for instance, to specify that a Tip should be displayed only when your user is already logged in. And then you have rules based on events being triggered. So if your app already implements analytics, it then becomes very easy to reuse your existing analytics events to configure your Tip!

var rules: Predicate<RuleInput...> {
    // User is logged in
    #Rule(Self.$isLoggedIn) { $0 == true }
    
    // User has viewed a pattern at least 3 times
    #Rule(Self.patternDetailView) { $0.count >= 3 }
}

That’s it, I think I have covered the basics as an introduction to TipKit. If you want to go further, you can check out both the WWDC Session “Make features discoverable with TipKit” or the framework’s documentation.

St. Clare of Assisi

Clare of Assisi was born in 1193 as Chiara di Favarone di Offreduccio belonging to one of the most important noble families in Assisi. During her youth, she got extremely fascinated by St Francis. When Chiara was 18 years old, she renounced marriage and a life of wealth and social prestige, fled to the monastery of the Franciscan brothers just outside Assisi in 1212, and became a nun. She became the first female companion of St Francis and lived as ascetically as him. After the death of St Francis, she became the heart of Franciscan spirituality. Clare was so devoted and dedicated to Francis that she was often referred to as “alter Franciscus,” or another Francis. 

Clare of Assisi was the first woman in the history of the church to write a rule of order. A contemplative nun who, for more than thirty years, successfully resisted popes and cardinals in a matter of the heart, yet retained their respect and admiration.

Following Francis’ death, Clare continued to promote her order, fighting off every attempt from each pope trying to impose a rule on her order that would water down their “radical commitment to corporate poverty.”

In 1224, an army of rough soldiers from Frederick II came to attack Assisi. Although very sick, Clare went out to meet them with the Blessed Sacrament on her hands. She had the Blessed Sacrament placed at the wall where the enemies could see it. Then on her knees, she begged God to save the Sisters. Clare is often pictured carrying a monstrance or pyx, to commemorate this time.

Clare died on 11 August 1253. Pope Innocent IV who happened to be staying in his palace at the friars’ monastery in Assisi, officiated the funeral. He knew her very well and was convinced of her sanctity. At Pope Innocent’s request, the canonization process for Clare began immediately, and two years later in 1255, Pope Alexander IV canonized Clare as Saint Clare of Assisi.

St. Clare was designated as the patron saint of television in 1958 by Pope Pius XII, because when St. Clare was very ill, she could not attend mass and was reportedly able to see and hear it on the wall in her room.

She is also the patroness of eye disease, goldsmiths, and laundry.

SwiftUI: ContentUnavailableView

SwiftUI was introduced by Apple at WWDC 2019 as a modern and declarative user interface framework for building apps across all Apple platforms. SwiftUI represented a significant shift in the way developers create user interfaces compared to the traditional UIKit or AppKit frameworks. SwiftUI was designed to make app development faster, easier, and more intuitive by providing a clear and concise syntax for describing UI layouts and behaviors. Swift UI keeps getting better and better with every WWDC!

In iOS 17, SwiftUI got a new view dedicated to presenting an empty state of your app, ContentUnavailableView.

This is what ContentUnavailableView look like out of the box.

When should we use ContentUnavailableView

As you might be able to guess from the name, ContentUnavailableView is meant to use when a view’s content can’t be displayed.

This can happen for many reasons, such as a network error, a list without items, or a search that returns no result.


How to use ContentUnavailableView

There are many ways we can use ContentUnavailableView. I will categorize them into three groups.

  1. Built-in unavailable views
  2. Custom unavailable views
  3. Unavailable views with actions

Built-in unavailable views

As discussed in the last section, ContentUnavailableView can be used in many circumstances where the view’s content isn’t available. But, a search that yielded no result is the only scenario Apple supported out of the box. In iOS 17, ContentUnavailableView has only one built-in static variablesearch.

You can quickly present an unavailable view that conveys an empty search result view using ContentUnavailableView.search.

struct ContentView: View {
    var body: some View {
        ContentUnavailableView.search
    }
}

With a simple line of code, you will get a magnifying glass image, a “No results” label, and a description of how to get a proper search result.

ContentUnavailableView.search

You also have another option to create an empty search view with a provided search query.

struct ContentView: View {
    var body: some View {
        ContentUnavailableView
            .search(text: "Kenrick")
    }
}
An empty search view with a search query

Custom unavailable views

If you want to use ContentUnavailableView for view other than search, you can easily do that with other initializers that accept:

  1. Label
  2. Image
  3. Description

In the following example, we create an empty view for a network error.

ContentUnavailableView(
    "No Internet",
    systemImage: "wifi.exclamationmark",
    description: Text("Try checking the network cables, modem, and router or reconnecting to Wi-Fi.")
)
A custom unavailable view.

Unavailable views with Actions

The last way of creating an unavailable view is the most flexible one.

init(
    @ViewBuilder label: () -> Label,
    @ViewBuilder description: () -> Description = { EmptyView() },
    @ViewBuilder actions: () -> Actions = { EmptyView() }
)

You can inject three @ViewBuilder that populate an unavailable view.

  1. label, which use for the title and image.
  2. description, which use for content.
  3. actions, which you can use to provide extra actions.

As you can see, we got an extra parameter, actions, which you can use to provide an action for your empty view, e.g., action buttons.

In the following example, we provide an action button that will direct users to another view.

ContentUnavailableView {
    Label("Empty Bookmarks", systemImage: "bookmark")
} description: {
    Text("Explore a great movie and bookmark the one you love to enjoy later.")
} actions: {
    Button("Browse Movies") {
        // Go to the movie list.
    }
    .buttonStyle(.borderedProminent)
}
An unavailable view with a button.

Benefit of ContentUnavailableView

While you can achieve the same thing using VStack and Text, ContentUnavailableView can save you some development time for this boring and repetitive task.

Apart from standard and consistency, ContentUnavailableView also ensures it looks great across platforms.

Here is an example of ContentUnavailableView on Apple Watch where ContentUnavailableView will automatically hide an image to save some space.

Apple Watch

Hope this article helped you understanding how we can leverage ContentUnavailableView in SwiftUI! :)

Liturgical Colors

Liturgical colors within Christian liturgy signify different seasons and times of the year. Each season has its own mood, meaning, and type of prayer. Each color has its own meaning and feeling, and can be seen worn or hung throughout the church during specific times of year. They help to visually express the different liturgical seasons and feasts, aiding in the overall experience of worship and reflection. They serve as a visual reminder of the specific themes and moods associated with each season or feast.

Good Things Take Time

In a fast-paced and instant gratification-driven world, the phrase “good things take time” may sound like a cliché. However, this timeless saying holds profound wisdom and teaches us an invaluable lesson about the nature of success and fulfillment. Whether it’s personal growth, professional achievements, or the pursuit of our dreams, the journey towards greatness demands patience, perseverance, and a steadfast belief in the power of time.

Firstly, the realization that good things take time encourages us to set realistic expectations. Overnight successes are rare and often the result of years of hard work, dedication, and resilience behind the scenes. Understanding this truth allows us to avoid the trap of seeking shortcuts or instant results. Instead, we can focus on building a strong foundation for our aspirations and taking consistent steps towards our goals.

Moreover, the journey of waiting for good things to unfold instills valuable life lessons. Patience teaches us to appreciate the present and savor each moment of the process. It offers an opportunity for self-reflection, growth, and a deeper understanding of ourselves and our desires. Along the way, we learn to embrace challenges and setbacks as stepping stones rather than barriers.

Success built on a solid foundation tends to be sustainable and long-lasting. Just like nurturing a plant from a tiny seed, investing time and effort into our endeavors allows us to cultivate skills, knowledge, and experiences that withstand the test of time. Rushing through the process may yield short-term gains, but they are often superficial and lack depth.

Embracing the principle that good things take time also cultivates resilience and perseverance. It requires us to keep pushing forward, even when faced with adversity or moments of doubt. When we encounter obstacles along the journey, we are reminded that progress is not always linear, and setbacks are a natural part of growth. The ability to stay committed and resilient in the face of challenges is a defining trait of those who achieve remarkable success.

Moreover, the process of waiting and working towards our goals allows us to savor the joy of anticipation. It fuels our passion and commitment, keeping us driven and focused on our aspirations. The anticipation of success can be a powerful motivator, encouraging us to put in the effort and dedication necessary to reach our objectives.

Lastly, good things taking time teaches us to celebrate progress rather than solely focusing on the end result. Each step forward, no matter how small, is a reason for celebration. Recognizing and appreciating the progress we make fuels our motivation and reinforces the belief that we are moving in the right direction.

In a world that often values instant results, embracing the journey and allowing success to unfold organically can be a transformative experience. Through patience, we gain wisdom, resilience, and a deeper appreciation for the process of growth. So, let us remind ourselves that as we work towards our goals and dreams, it is in the journey itself that we find the true essence of success and fulfillment.


I recall this funny story related to this topic:

A turkey was chatting with a bull. “I would love to be able to get to the top of that tree,” sighed the turkey, “but I haven’t got the energy.”

“Well, why don’t you nibble on some of my droppings?”replied the bull. “They’re packed with nutrients.”

The turkey pecked at a lump of dung and found that it actually gave him enough strength to reach the first branch of the tree. The next day, after eating some more dung, he reached the second branch. Finally, after a fortnight, there he was proudly perched at the top of the tree.

Soon, though, the turkey was promptly spotted by a farmer, who shot the turkey out of the tree.

Moral Of The Story: Bullshit might get you to the top, but it won’t keep you there.

Inspiring Change When Voices Go Unheard

In a world where opinions clash and ideas often meet resistance, the power of planting a seed, both metaphorically and literally, emerges as a testament to the indomitable human spirit. When people are closed off to listening, the act of planting a seed represents a profound metaphor for initiating positive change and sowing the seeds of transformation. There’s incredible power of planting seeds even in the face of opposition and skepticism.

Persistence in the Face of Opposition
When people are not open to listening, it can be disheartening to have one’s ideas or beliefs rejected. However, the power of planting a seed lies in the unwavering persistence of the individual. Just like a determined gardener who sows seeds despite adverse weather or poor soil conditions, individuals with a vision for positive change persistently advocate for their cause. We understand that change does not happen overnight but is a gradual process that requires patience and consistency.

Setting an Example
Planting a seed sets an example for others to follow. Actions often speak louder than words, and when we actively work towards our vision despite facing resistance, we become living examples of resilience and determination. This, in turn, can inspire others to reconsider their stance and embrace change.

Nurturing Growth in Unconventional Ways
The power of planting a seed lies in the potential for growth even in the most unexpected circumstances. Just as a tiny seed can sprout through a crack in concrete, ideas can take root in the minds of individuals who were once unreceptive. By sowing seeds of change, individuals initiate a ripple effect that can gradually penetrate even the most stubborn barriers.

Creating a Safe Space for Dialogue
Planting a seed allows us to create a safe space for dialogue and open communication. Rather than forcing ideas upon others, we see encourage discussion and understanding. This fosters an environment where opposing perspectives can be heard, leading to a more comprehensive exchange of ideas and the potential for mutual growth.

Cultivating Empathy and Understanding
When people are not open to listening, it often indicates a lack of empathy or understanding. We look to step into the shoes of others and appreciate different viewpoints. The act of nurturing growth teaches us the value of patience and compassion, making us more receptive to diverse perspectives.

Long-Term Impact
The power of planting a seed lies in its potential for long-term impact. Ideas, like seeds, can take time to germinate, but once they do, they have the capacity to grow and influence generations to come. By planting seeds today, individuals can create a lasting legacy of positive change for the future.

The power of planting a seed transcends the barriers of resistance and skepticism. It symbolizes resilience, persistence, and the belief in the potential for growth, even in challenging circumstances. By setting an example, fostering dialogue, and cultivating empathy, individuals can inspire positive change and sow the seeds of transformation in the hearts and minds of others. Let us recognize the power we hold in our hands to plant seeds of hope, for they have the potential to blossom into a better world for all.

Deeds Supersedes Prayers?

When I saw this quote on Facebook, the first thought that came to mind was “Contemplatives in Action”, a phrase that embodies the creative tension between a Jesuit’s full embrace of concrete action and their attentiveness to where God may call them next. Prayer has long been considered a powerful and essential practice in various cultures and religions, providing comfort and solace to millions. While prayer undoubtedly holds significance, the true essence of humanity lies in the act of helping others.

Prayer is a deeply personal and spiritual practice that can instill hope, guidance, and strength in individuals during challenging times. It serves as a source of inspiration, encouraging people to seek inner peace and connect with a higher power. Indeed, prayer can be a valuable tool in navigating life’s uncertainties, but it cannot be the sole means of addressing the struggles of others.

While prayers offer emotional support, helping others through tangible actions creates a more profound and meaningful impact. Kindness, empathy, and compassion in action can lift the burden of suffering from individuals in need. Whether it’s extending a helping hand to the homeless, volunteering at a local charity, or lending a listening ear to a friend in distress, helping others cultivates a sense of community and solidarity that transcends words.

Engaging in social causes can definitely be emotionally taxing, leading to burnout and compassion fatigue. And hence “contemplatives” combat these challenges by regularly retreating into introspection, recharging their emotional resilience, and fostering self-care. By maintaining a balance between inner reflection and external involvement, they are better equipped to sustain their commitment to service in the long run.

Contemplation allows us to renew our active lives (work, play, relationships) so that all we do does not become mindless action. Then the cycle repeats. Your activity leads you again into a time of stopping, resting, reflecting, and then returning to activity with greater zeal and purpose. Being a contemplative in action means that your active life feeds your contemplative life and your contemplative life informs your active life. That is what contemplation in action means, and the cycle never ends.

I had written an article previously on a similar topic which ended with a question:

Are you ready to join the CIA? (Contemplatives in Action)

St. Alphonsus Liguori

Saint Alphonsus Liguori was a very special saint who lived in Italy during the 18th century. He was a bishop, a writer, and a founder of a religious order called the Redemptorists.

Key facts:

  • Bishop, Doctor of the Church
  • Patron Saint of Arthritis, Confessors, Moralists
  • Former Lawyer
  • Ordained near the age of 30 years old
  • Founder of the Redemptorists Order
  • Composer
  • Musician
  • Poet
  • Author
  • Scholastic philosopher, and theologian
  • Died at the age of 90 on August 1, 1787
  • Beatified on 15 September 1816 by Pope Pius VII 
  • Canonized on 26 May 1839 by Pope Gregory XVI
  • Proclaimed ‘Doctor of the Church’ in 1871

Saint Alphonsus Liguori was born in 1696 and became a priest at a young age. He dedicated his life to serving God and helping people grow closer to Him. He was known for his deep love for Jesus and his devotion to the Blessed Virgin Mary.

He was the eldest of seven children of Giuseppe Liguori, a naval officer and Captain of the Royal Galleys. Liguori learned to ride and fence but was never a good shot because of poor eyesight. Myopia and chronic asthma precluded a military career so his father had him educated in the legal profession. He was taught by tutors before entering the University of Naples, where he graduated with doctorates in civil and canon law at 16. He remarked later that he was so small at the time that he was almost buried in his doctor’s gown and that all the spectators laughed. 

He became a successful lawyer. He was thinking of leaving the profession and wrote to someone, “My friend, our profession is too full of difficulties and dangers; we lead an unhappy life and run risk of dying an unhappy death”. At 27, after having lost an important case, the first he had lost in eight years of practising law, he made a firm resolution to leave the profession of law. Moreover, he heard an interior voice saying: “Leave the world, and give yourself to me.”

In 1723, he decided to offer himself as a novice to the Oratory of St. Philip Neri with the intention of becoming a priest. His father opposed the plan, but after two months (and with his Oratorian confessor’s permission), he and his father compromised: he would study for the priesthood, but not as an Oratorian, and would live at home. He was ordained on 21 December 1726, at the age of 30. He lived his first years as a priest with the homeless and the marginalized youth of Naples. He became very popular because of his plain and simple preaching. He said: “I have never preached a sermon which the poorest old woman in the congregation could not understand”. He founded the Evening Chapels, which were managed by the young people themselves. The chapels were centres of prayer and piety, preaching, community, social activities, and education. At the time of his death, there were 72, with over 10,000 active participants. His sermons were very effective at converting those who had been alienated from their faith.

On 9 November 1732, he founded the Congregation of the Most Holy Redeemer, when Sister Maria Celeste Crostarosa told him that it had been revealed to her that he was the one that God had chosen to found the congregation. He founded the congregation with the charism of preaching popular missions in the city and the countryside. Its goal was to teach and preach in the slums of cities and other poor places.

A gifted musician and composer, he wrote many popular hymns and taught them to the people in parish missions. Liguori was consecrated Bishop of Sant’Agata dei Goti in 1762. He tried to refuse the appointment by using his age and infirmities as arguments against his consecration. He wrote sermons, books, and articles to encourage devotion to the Blessed Sacrament and the Blessed Virgin Mary. 

In May 1775 he resigned as Bishop due to his health. He continued to live with the Redemptorist community in Pagani, Italy, where he died on 1 August 1787. He was beatified on 15 September 1816 by Pope Pius VII and canonized on 26 May 1839 by Pope Gregory XVI.