I have a neighbor whom I've worried about on occasion, but much more so now that COVID-19 is upon us. She is 80 years old and, while still very independent and able to do most everything she wants, is quite vulnerable to this pandemic. I also found out she doesn't have the Internet, or even a computer. Or a smart phone. Or a phone that can text! She just has a landline phone.
It made me realize that there are probably a lot of people out there who need help, but don't have the ability to reach out and ask for help as easily. Of course, hopefully most of those folks can call on family or other trusted people nearby, but if not, they need some other way to ask for help that isn't an immediate emergency, but are very much needed nonetheless (getting groceries or prescriptions, having something delivered across town, etc.).
After seeing the announcement for this hackathon, I dug through the Twilio APIs looking for some inspiration and came up with this idea after looking through the Voice documentation.
The project is called "I Need Help", and it is a Node-powered web app that allows people to simply make a phone call to a number, and a bot asks them what they need help with. It only asks for the person to introduce themselves and state their needs, it doesn't ask for any other personal details. The caller's request is recorded, then published on the "I Need Help" website (with their direct consent, of course. If they don't agree to the terms, the call will end and the interaction isn't recorded).
Once the recording is on the website, a registered and logged-in user can assign that need to themselves. This user, which I've been calling a "helper", can call the person in need via an anonymous number (to protect the person-in-need's phone number), and the person in need can also reach out to the helper with their own anonymous number. They can call each other with those same numbers as long as the task is in progress (similar to an Uber driver/rider interaction).
When a task is in progress, a helper can either mark the task as complete if they successfully helped the person or they can put it back in the queue to allow someone else to help. Also, I made the design decision to only allow one task to be worked on at a time, for both technical reasons and to help the helpers avoid taking on more than they can handle. Each person who needs help should get their undivided attention. Also, the person who calls in a request can only request one thing at a time per number, until that task is resolved.
There is a very basic stats page that the signed-in user can look at to see how needs they have fulfilled, so that they are more motivated to continue.
I started building the app on April 8th. I didn't formally plan it too much, I just started writing code and playing with Twilio's API immediately. I'm organizing my work just using Github's issue tracker with the project repo. As of right now, the app seems pretty stable but could probably use more features. As you'll see if you look at the commit history, I worked on it pretty heavily for 10 days then took a break before cleaning it up for final submission.
The app is built using Adonis (a NodeJS framework), MySQL (or any relational database compatible with Knex.js), Mithril, and Bootstrap. There are even some websockets in there! I wanted to stick with a stack I'm comfortable with, since I've never used Twilio's API before and didn't want to spend too much time learning too many different things at once. I also didn't want to spend much time fussing with front-end build tools, so all the scripts, assets, and other dependencies are just CDN'd onto the pages.
The websockets are used to update the front-page in real-time with the most up-to-date tasks so that users don't have to constantly refresh the page to see new tasks they can help with. And, when tasks are marked as in-progress or completed, they're removed from that page so no one else can accidentally claim the task.
I'm using two features of Twilio right now; the Programmable Voice API to handle the initial phone call and recording, and the Proxy service to make phone numbers anonymous.
You can find the repository here, with setup instructions so you can host your own instance:
Also, I'm looking at other people's submissions and am very impressed. There are a lot of brilliant, creative devs out there. Great job!