Inspiration

Paul recently bought a Humble Bundle full of O'Rielly books that had audio transcriptions. They would play the books during commutes to gain insight on how to build larger systems. However, it was hard to retain knowledge after arriving to a study point. They wanted a way to recall systems easier, so they decided to build Nova.

What it does

Nova is a voice-guided reading app. Users log in, listen to EPUBs, and say “Hey Nova” to pause, navigate, highlight, or note passages. Gemini interprets smart commands on-device/frontend. Backend stores users/books/notes/highlights and manages EPUB/profile uploads via S3.

How we built it

Main language: Typescript

Frontend:

Package manager: Deno Frontend library: React Native Build tool: Vite Language: TypeScript / TSX Styling: CSS, Tailwind CSS Data fetching: TanStack React Query Validation: Zod

Backend:

  • Package manager: Deno
  • Web framework: Hono
  • Authorization: auth0
  • Validation: Zod
  • ORM: MikroOrm
  • Database: PostgresSql TigerData
  • Object Storage Server: RustSF S3
  • Containerization: Docker
  • Development Environment: Nix
  • Cloud: DigitalOcean Droplets

Challenges we ran into

Frontend: Getting "Hey Nova" to work while the narrator is talking was difficult, since the phone's microphone hears the book too. iOS also limits the microphone when the app is in the background, so only one voice command works outside the app for now. Running on a real iPhone brought issues the simulator never showed, like crashes from missing permissions and uploads that the new Expo networking rejected.

Backend: Initialization of all libraries were difficult to implement.

Accomplishments that we're proud of

Frontend: We are proud that Nova can be controlled completely by voice on a real iPhone, including from the lock screen. Any EPUB can be added from the phone, converted with its cover in under a second, and read aloud offline.

Backend: We are proud to finish the main MVP within time to spare.

What we learned

Frontend: Testing on a real device early matters, because many of our hardest bugs only showed up on the iPhone. We also learned how iOS handles audio, microphone access, and privacy, and how much those rules shape the app's design.

Backend: Better ways to create domain based software, cohesion between different libraries, saving and deploying more things to the cloud, more practice with generic usage between libraries.

What's next for Dodo

Create a social network based around where users can rate books and leave reviews. Install relational graphs for users that want to follow authors. Integrate a cache such as Valkey into the system.

Built With

Share this project:

Updates

Submission history