Inspiration
I'm a Christian and know that I should be praying more than I do. But with a demanding job and 2 young kids at home, it's easy to get so absorbed in the tasks of daily life that I'll go days without taking time throughout the day to stop and pray. There are a lot of prayer apps out there that have guided prayer audio, but I don't usually have 10+ minutes and a quiet space to take such a long and intentional break. But I do have 30 seconds.
I got the idea for Vesper with my church's small group community. When people would post on GroupMe asking for prayer, the easy thing to do is say "I'll pray for you", but oftentimes I'll say that and never actually stop to do it. We've been intentionally trying to say instead, "I'm praying right now!", and this is the whole idea behind Vesper. Rather than asking you to fit a new habit into your life, I am trying to make it easy to take a short interruption in your day to pray for those who need it.
What it does
Vesper works by making it easy for users to submit a prayer, which then gets matched to another user who will stop and pray for it right then. Users who get matched to a submitted prayer will receive a push notification telling them it's "Time to pray!", and they are encouraged to click it quickly and take just 30 seconds to pray for that request. After they have finished prayer, the submitter will then receive a push notification letting them know that someone just prayed for them, giving validation that a real human stranger just took time out of their day to support them in prayer.
The tendency for prayer apps like this is to either turn everything into a newsfeed of people in your church or in other faith-based organizations, which felt too much like a standard social media app. Vesper intentionally pushes back against becoming just a social media app so users can truly focus on what matters: recognizing our need to depend on the Lord every day, for all things big and small.
How we built it
As an Android developer and longstanding member of the Kotlin community, I decided to take this opportunity to see how far I could push Kotlin and see how well it can stand up to the complex demands of this application. Kotlin is the only programming language used, powering both the frontend Android and iOS apps with Kotlin Multiplatform, and the API server with Ktor, with data models, API endpoint definitions, and other contracts shared among them all.
Additionally, as the maintainer of a small state management library, Ballast, I wanted to see how far I could push its programming model and prove out an effective way to use its principles of Unidirectional Data Flow (UDF) for more than just UI. Ballast powers the state management for each screen in the app, as well as the data layer of the Android and iOS apps, and acts as an interface to Postgres-backed Job Queues and Schedules on the server.
The complete application stack includes:
- Kotlin Multiplatform (Android and iOS)
- Kotlin Ktor (API server)
- Postgresql
- Coolify as the reverse-proxy application server
- AWS EC2
- AWS SES
- Cloudflare DNS
Challenges we ran into
Kotlin works very well on the UI, and for server-side technologies there is a lot that can be done with Java interop, especially if the server is Spring Boot. But I wanted to stick to pure-Kotlin tech as much as possible, and the landscape for peripheral server-side technologies proved to be lacking. There was no standard library for handling things like sending emails, processing job queues, or running tasks on a schedule. But being able to use these specific technologies and having them implemented well in your backend is absolutely crucial for having an app that is reliable, where I don't have to worry that data could get lost because a 3rd-party system went down.
Much of the development effort of Ballast was spent designing the backend system and building these features into Kotlin and Postgres. But while this did take a lot of time to get right, I now have the benefit of an app that processes expensive work in the background and can be proactive in engaging customers with push notifications and emails, without having to spend more money on these kinds of services as the userbase grows.
Accomplishments that we're proud of
I'm very proud of the technical foundation I have laid with Vesper, as it not only makes for a reliable experience for my end-users, but is a platform upon which I will be able to reuse with future projects. I already have 2 or 3 other apps I plan on building over the next couple of years as I work toward a future where I can build a company and become self-employed selling services like this.
But the thing I'm most proud of is how much I have grown beyond just a software developer. By giving myself a clear vision for the functionality and thinking of it in terms of building a proper product, I have gained such an appreciation for the incredible amount of work it takes to start and run a business.
What we learned
While I'm certainly no expert yet, it has helped me understand the importance of thinking through the application from many angles, including the roles of:
- Product Owner: not just building a bunch of features, but constraining the features to build an experience
- Marketing: how to tell the story of the app rather than just describe its features
- Customer support: how to identify and correct issues reported by users
- Business analyst: what data to collect to help me understand the behavior of users
- CEO: how can I convert users into paying customers that may one day allow me to be self-employed
What's next for Vesper
As the father of small children, I don't have a ton of time to focus on Vesper, and could not build everything into it during the Shipaton that I would have liked. But I have gotten some valuable feedback from my beta testers, and have some clear goals I will be building in the product over the next few months, as well as starting a proper marketing campaign for it.
Features
- Additional push notifications and email campaigns to increase engagement of sign-up users. These include things like:
- daily prayer reminders
- a weekly recap with prayer stats
- "Happy Birthday" emails
- long-term guided onboarding. Sending a series of emails and push notifications over the couse of several weeks or months to gently teach users understand how to use the app and remind them to engage with it regularly
- The core functionality is all global and anonymous right now, and I want to add a concept of Prayer Groups so users who already meet in person can have a safe space to submit prayer requests to be seen by others in the group
- Vesper as a SaaS product for churches to handle prayer submissions and pastoral follow-up
Marketing
I have several podcasts and newsletters I plan on connecting with to start prompting Vesper in full. Up until now, I have only tested it with friends and family, and have not done any external marketing. But now that I've validated that the core technology works, and have identified the gaps that still need to be filled, I am getting close to a point where I could do a full, paid marketing campaign.
Built With
- claude
- compose
- coolify
- kotlin
- postgresql