- Project
- The Churchill Library, a Ruby on Rails app to catalogue family's books and provide interaction with via LLM
- Tech Stack
- Ruby on Rails, Hotwire, TailwindCSS, TBD vector database, and TBD LLM API though interested in AWS Bedrock
- Goals
- Functional, publicly available app by September; full RAG integration with LLM chat by year-end
I am excited to start a new side project!
settin’ the stage
I started a graduate program in Computer Science from Franklin University at the beginning of the year. While the initial prerequisite class on basic data structures & algorithms in Java was not that inspiring, my recent class on “advanced data structures & algorithms” - recursion, trees, heaps, graphs, sorting - has renewed my excitement in programming for fun again. Furthermore, I’ve been acting as the technical lead for a generative AI chat application at work. Although we mostly inherited the code from a contracting company, it’s been exciting having the opportunity to own the platform.
Instead of just implementing another chat app, I wanted to create an application that interacts with an LLM using RAG with data I actually care about. Given that my whole family are avid readers - even my toddler has amassed quite a large collection of books, often with duplicates - I had the idea to create a web app to help catalogue these books for my data source.
the deets
As for the tech stack, here are my thoughts around why I am going to use Ruby on Rails styled with TailwindCSS and using Hotwire for a dynamic UI:
- I use Java for my coursework and C#/.Net with React for the app at work — I chose to steer clear of these in my side project to help broaden my experiences.
- I’ve always wanted to dive deeper into Ruby on Rails, or RoR, as it’s known for its simplicity and convention-over-configuration philosophy. Moreover, Root Insurance built up its product using the framework so I figure if it can handle that kind of load, it’s a shoe-in for my app.
- Hotwire provides SPA-like functionality, speeding up page changes and providing partial page updates, while actually being reliant on the backend for server-side rendering. Given this was created to work with RoR, this is a nice replacement for React.
- The only crossover to work is my choice of TailwindCSS - I don’t think I need to explain myself here.
- Heroku will be how I deploy my app as I remember it being tightly integrated with Rails apps.
- I’ll be using a GitHub Actions workflow to ensure my app has continuous integration and deployment.
- Although I started out planning with GitHub Projects, I’ve decided to use a Trello board to track my work as it is actually useful through the iOS app.
Although I have the desire to get it with this app, here are my realistic goals given my limited spare time:
- I will have a nicely designed, functional website that is publicly available and provides an enjoyable user experience for browsing our collection of books.
- A stretch goal will be to have a vector database chosen and an
Active Job
pipeline for embedding books by September as well.- “Don’t build another effin’ chatbot — Web Dev Challenge S1E1, from Learn With Jason, introduced me to Astra DB as an option for doing the whole shebang but I plan to also check out what Heroku has to offer.
- By year-end I want to have RAG fully integrated into the app as a “virtual librarian”.
- Even though OpenAI is the obvious choice, given ChatGPT has been my LLM tool of choice, I want to challenge myself to look at other options. Specifically, I am interested in seeing what it would take to set something up in AWS Bedrock. As for the integration, I will either look into just using a WebSocket via
ActionCable
or research more about “server-side events”, an alternative one-way HTTP-based mechanism to stream data.
- Even though OpenAI is the obvious choice, given ChatGPT has been my LLM tool of choice, I want to challenge myself to look at other options. Specifically, I am interested in seeing what it would take to set something up in AWS Bedrock. As for the integration, I will either look into just using a WebSocket via