This is a submission for the GitHub Finish-Up-A-Thon Challenge
What I Built
The AI Sentiment Dashboard reads a sentence and shows the feeling behind each part of it, down to the exact words. You type a message, hit Analyze, and it splits the text into clauses, scores each one, and highlights which parts are positive, negative, or neutral. A line like "the food was amazing but the service was painfully slow" comes back as Mixed, with the praise in green and the complaint in red.
It started as a group project for my Artificial Intelligence course (CAP 4630) at Florida Atlantic University. The model side was the fun part, since reading sentiment clause by clause is a real step up from stamping one label on a whole sentence, but it stalled the way course projects do once the grade lands. It only ran on my laptop, the results were a plain wall of text, and the README still described a model we had already swapped out. Finishing it had been nagging at me for a while, so this challenge was the push to actually do it.
Demo
Live app: https://ai-sentiment-dashboard.netlify.app
Code: https://github.com/MatthewOscar/AI-Sentiment-Dashboard-/tree/finish-up-a-thon
The Mixed examples are the best place to start. Click one and watch the two clauses light up in different colors.
Heads up: the API runs on a free Hugging Face Space that sleeps after a couple of days idle. The first load after a quiet stretch takes about 30 to 60 seconds to wake the model, and the app shows a "waking up" state while it does. It is instant after that.
![]()
GIF Demo: https://dev-to-uploads.s3.amazonaws.com/uploads/articles/87omyuwz78d61c4doed3.gif
On a phone the layout stacks and the donuts become compact bars:
The Comeback Story
Here is the honest before. The entire result was a list of text lines:
The repo even had a "Future Improvements" list that named the two things we never got to: a word-level explainability view, and a real deployment. I made that list the plan, checked off both boxes, and then kept going.
What changed:
- In-text highlighting. The sentence is re-rendered with each clause colored by its sentiment, so you can see which words drove the result. Hovering a chart entry lights up its phrase in the text, and hovering a phrase lights up its chart entry.
- A real dashboard. An animated confidence gauge for the overall read, plus a per-clause probability breakdown shown as donut charts on desktop and stacked bars on mobile, laid out in a side rail next to the highlighted text. The visuals are hand-built SVG, so the bundle stays small and the styling matches the theme.
- It is actually deployed. The React app runs on Netlify and the Python model API runs on a Hugging Face Docker Space, wired together with an environment variable.
- Honest internals. The backend was loading a heavy spaCy transformer pipeline just to split sentences, so I swapped it for the small model and cut the cold start and memory hard. I fixed a bug where a neutral result always reported zero percent confidence, and added proper loading, empty, and error states with retry.
- Polish that adds up. A cached local history you can reopen instantly without re-calling the model, shareable links that carry the analyzed text in the URL, a backend status indicator, accessibility (keyboard submit, ARIA labels, and shape glyphs so meaning never rides on color alone), and light and dark themes that follow the system setting.
A small example of the kind of thing that was quietly wrong: a neutral result used to show zero percent confidence. Before and after:
| Before | After |
|---|---|
![]() |
![]() |
My Experience with GitHub Copilot
Copilot earned its keep on the unglamorous parts of the rebuild. The fiddliest piece was mapping each model result back onto the original sentence so the right words light up, including the case where a clause comes back with a leading "but" attached. Copilot helped me work through that matching logic fast. It also sped up the SVG math behind the gauge and the donut segments, and getting the Dockerfile right so the model weights bake into the image at build time instead of downloading on the first request.
I still owned the decisions that shaped the result: dropping the heavy spaCy model, choosing hand-built SVG over a chart library to keep things lean, reporting neutral when the model was unsure, and framing the before-and-after. It sped up the grunt work so I could spend my time on the design and the architecture.
Revived and shipped solo by Matthew Wyatt. It began as a group course project at FAU, and the original team is credited in the repo README.
Thanks for reading. If you try it, start with a Mixed example.





Top comments (0)