Why I built Uxie

tldr because studying with PDFs shouldn't feel like a torture :)


Uxie is a free and open-source pdf reader with note-taking, annotations, collaboration, AI features (chat, flashcard generation with AI feedback), text-to-speech, OCR, and more. You can try it out or check the code.

Picture this: new sem just started, and you're already drowning in PDFs. Lectures, assignments, scanned notes, random textbook pages, all dumped into random folders. Then come the quizzes, midsems, endsems, with the same topic over and over again. You know you'll need proper notes later. So what do you do? Highlight some text, screenshot a few diagrams, copy-paste them into an app like Notion, then hope future-you can find it all during finals. It (kinda) works, but everything feels scattered. Notes are disconnected from the source, and organisation is just vibes at that point.

This started bothering me back in my first year. I really wanted a better way to study. I'm someone obsessed with finding the right tool for every little task (if you're curious, here's my whole setup). I tried every PDF reader app I could find. The closest I got to what I wanted was Highlights. Clean UI, worked really well. But a lot of useful features were behind a paywall, and most of the other decent web / electron apps used a library called react-pdf, which has this really annoying bug (super cool lib except for this 1 issue).


In apps using the react pdf library (left), if you try to extend a text selection and move slightly outside the current paragraph, it selects all text on that page, this doesn’t happen in uxie (right).

I really wanted to build a better one, but having zero coding experience, I figured someone else would eventually do it. But the thought never left me. A couple of years later, I had picked up full-stack dev, built a few apps, done a few internships. Around then, my uni launched a hackathon event called BuildSchool, a 10-week program where students pitch ideas, 10 teams get selected, and it ends with a big demo day.


Fun fact: we'd placed third in BuildSchool the year before with an app called Mentora.

It felt like the perfect chance, with chatgpt and gen-ai exploding everywhere, I knew I could build something more than just a PDF reader. I'd already seen apps that only did flashcards, or just AI chat, or only PDF annotations, and they were all doing really well. So I thought, why not combine all of that into one clean, nice experience? We pitched the idea, a PDF reader with annotations, note-taking and AI features, and got selected.

We called it Uxie, named after the knowledge pokémon. (credit to Theo for the idea of naming side projects after pokémons. idk a thing about pokémon, but i love this way of naming things haha)

About a week after getting selected, our university held a separate event, a 24-hour hackathon. One of the problem statements was vaguely close to what we had in mind for uxie. Not the same, but close enough to take a shot. We knew it probably would hurt our chances of winning the hackathon, but figured it was a good excuse to start building. So we went for it.

24 hours later, we built a decent product, it was rough, the UI was super basic, we skipped things like optimistic updates (highlighting text took a few seconds to reflect). But it worked. And somehow, we actually placed second! The judges really liked the idea, even with how clunky the product was.

That was all the validation we needed. If people liked it in that state, we knew we were onto something. We grinded so hard, we spent the next few weeks building out a much better version, fixed a ton of stuff, added features, and the mid-demo day program went really well.

But the final demo day didn't go as well as we hoped. Bunch of AI provider issues, we hit all sorts of rate limits, had to show pre-recorded demos. We placed second, which was cool, but it hurt. We knew the product deserved better.


Demo video we made for the event (ps: this has changed a lot since then)

I absolutely loved the product and wanted to keep improving it. I would literally be using Uxie to read something, get an idea, and i'd immediately go build it. It was super chaotic, but fun. Life got busy for a while, but a few months later I came back to the project and started fixing all the rough edges.

I added flashcard generation with AI feedback, built a text-to-speech feature that highlights the current sentence as it reads (easily the most time I've spent on a single feature, but super happy with how it turned out, still has a few issues. source code for that part if you're curious), added PDF background colors for readability, and kept polishing things bit by bit.

All of this was built by me, with very little help from ai (just copilot completions, ughh things were so much better when it was just that). Lately though (post opus-4.5), I've been shipping a ton of new features on uxie, mostly with ai doing the heavy lifting and me reprompting / making minor edits / getting it to output the way i want, with a lot of swearing at the llms (surprisingly effective). Shipped ai powered text-to-speech models running locally on webgpu w much better voice quality, bionic reading mode, rsvp reading mode, and a bunch of other stuff.

I also have this habit where I keep clicking on lines while I'm reading, and a lot of times they’re links, taking me to some other URL or a different section of the PDF, and I completely lose my flow. So I built a toggleable setting (entirely with ai) that disables links in the pdf completely. Tiny thing, but it saved me a surprising amount of time.

When it comes to building things, there's one quote I absolutely live by:


To make a product people love, you have to obsessively use it yourself. Deeply, properly, every single day.

I live by that. I’ve had tons of ideas in the past and even worked on a few, but nothing really stuck. This did, because it’s a problem i (and many people i know) keep facing.

That’s also where I feel a bit stuck now. I can’t, for the life of me, come up with a new idea I care about as much. I’ve been thinking about building a single all in one app for little things I personally want, (a 1 second everyday thing like this, a place where i can share url or large text blobs and it'd generate speech, fully offline with PWA maybe?, might even add this to uxie, might improve seo rankings too, gosh i need a proper domain first).

And I've also been thinking of a "speech helper" tool, like tts but reverse (kinda), it'd highlight a word, use local speech-to-text models, and only move forward when the user says it correctly, helping users with reading / pronunciations. Not sure if this is possible at a decent pace using just webgpu though. I Might even move uxie to a desktop app, everything local. storage, highlights, embeddings, llms would be really fun.

And now that LLMs are actually really good (never thought I’d ever say this out loud haha), all of this feels weirdly possible. Or maybe I should just keep improving Uxie, or grind DSA and chill for a bit haha.

Anyways, today Uxie has 500+ active users (& around 200 stars on GitHub) and is easily the best thing I’ve built. It is fully open-source and free for anyone to use. What started off as a random itch I couldn't ignore somehow turned into something that actually helps people learn better.

Funny how that works.

See all posts