Aaron’s Presents is a 501(c)(3) nonprofit organization that gives children grades K-8 the opportunity give to the world in the form of community driven projects. Children may apply to the program individually or in groups with their own project ideas to benefit their community. If accepted, the project receives funding from Aaron’s Presents, and is assigned a mentor to provide assistance in carrying out the project.
With nearly 1,400 children in the program and over 850 projects since the organization’s inception in 2014, the challenge of data management became increasingly evident as Aaron’s Presents grew. In Spring of 2019, Aaron’s Presents founder Leah Okimoto contacted me about the issue. Eager to help the organization, I designed and developed a custom data management platform in the following Summer. Though I was concurrently working a software engineering internship, I managed to find enough time after work and on weekends to deploy the solution by the end of August 2019. The platform is now live at projects.aaronspresents.org. I continue to maintain the platform in my free time by fixing bugs and implementing small features for convenience.
Originally, the majority of the organization’s data was stored on various spreadsheets across Google Drive and Airtable. Storing information on such services is convenient since they allow the stored data to be accessed on different platforms (laptops, phones, tablets, ect.) and multiple people can manipulate the data concurrently. However, using a spreadsheet becomes cumbersome if relations between different types of data is to be stored (i.e. trying to map the relationship between a child in one table and their parent/guardian in another). Because I saw a lot of potential in being able to store relationships between the various types of data that were being recorded, I decided to model a relational database that my solution would use to link information together. I decided to use PostgreSQL by preference.
At the time that I was designing the solution, I had a the most of experience working with the Spring framework. However, given a limited time frame for deploying the solution, I wanted to minimize the amount of boilerplate I’d have to implement. I instead opted to use Node.js with Express. Having used Hibernate ORM with Spring apps in the past, I searched for an ORM I could use with Node. After careful consideration, I decided to use Sequelize because it has a lot of builtin functions for manipulating entity data through references to related entities.
Knowing that project mentors travel frequently to meet with participants, I was driven to create a solution that could be handled across a variety of mobile devices. While developing a native mobile application would be ideal for user experience, I stuck with keeping the platform browser based so that the platform could be used from any laptop/desktop. I did however opt for server-sided rendering with mobile use in mind. Pages in the app are rendered using the Pug view engine.