Inspiration
In today’s world, American news consumption feels more polarized than ever—and research consistently shows that perceived media bias erodes trust and drives echo chambers. Polao is our answer: a place to line up multiple perspectives side-by-side, compare coverage, surface bias signals, and help people form their own informed opinion. “Polao” (rice!) is about balanced portions: a daily, nutritious news diet.
What it does
Clusters a story and surfaces Left / Center / Right coverage in one view.
Computes a Bias Support Meter (average lean across sources).
Generates a neutral summary plus counter-bias summaries (“what you’d think if you only read left/right”).
Framing Lens toggle: highlights loaded language and rewrites headlines neutrally.
AI Copilot: chat over just the clustered articles (RAG) with citations.
Daily newsletter: a balanced digest with L/C/R links and the bias meter.
Auth: secure login, role-based gates for admin tools, and user preferences.
How we built it
Frontend: Next.js (App Router) + Tailwind; responsive, accessible UI. Landing page, cluster view, framing highlighter, newsletter preview.
Data & NLP: Ingestion from News APIs → normalize → de-dup by title/domain cosine.
Embeddings:Google Gemini text embeddings for high-recall semantic search and topic features (big-dataset friendly).
Bias detector: BERT Transformer classifier (HF) for article-level stance/bias; final score = 0.6 * source_prior + 0.4 * BERT_stance.
Clustering: Gemini embeddings → K-Means (mini-batch for scale) to form story clusters across large corpora.
Summaries & Chatbot: Gemini API (prompt-grounded to the cluster) returns neutral + counter-bias summaries and powers the RAG chatbot; all answers must cite 2–3 URLs from the cluster.
Framing Lens: lexicon + POS patterns to highlight emotive/hedge/blame language; optional headline “neutralizer” rewrite check with NLI.
Storage & Jobs: Supabase/Firestore; CRON workers for ingest/cluster/newsletter; cached hot topics.
Auth Auth0 Universal Login with passkey/biometric support, email verification, and RBAC for admin features.
Challenges we ran into
Learning ML from scratch: We had zero ML background. Figuring out embeddings, BERT, evaluation—and training our own bias/stance model—was the steepest curve.
Big, clean dataset: Finding a large, relevant corpus and cleaning/de-duping/labeling it took time but was crucial for accuracy.
Clustering + event grouping: Getting stable K-Means clusters and pulling all articles for the same event/topic meant diving deep into multiple API docs and lots of tuning.
First-time Auth0 with MFA/biometrics: Our first Auth0 integration—wiring Universal Login, MFA, and passkeys—was tricky but now solid.
Accomplishments that we're proud of
Shipped our own model overnight: We built and trained a bias/stance model in one night, hitting strong accuracy on our training set after rapid iteration and cleanup.
Actionable bias signal, not just labels: We combined Gemini embeddings + BERT stance with source priors to turn bias into an explainable score (left/center/right) with citations—so users see why an article leans a certain way.
A working Gemini-powered pipeline (embeddings + chatbot + summaries) that scales to large article sets.
What we learned
We learned to start simple and scale: Gemini embeddings + K-Means gave us fast, reliable clustering, and layering a BERT stance model with source priors added the nuance needed to reflect bias realistically. Along the way, we discovered that data hygiene beats tricks—cleaning, de-duping, and labeling a large corpus improved accuracy more than any fancy tweak. We also saw that great ML still needs great plumbing: rate limits, caching, and background jobs mattered just as much as the models for a smooth UX. Most importantly, building and training our own model—end to end—taught us how to balance practicality with rigor under tight time pressure.
What's next for Polao
Personalized Feed: Set topics and a target bias mix; your feed auto-adapts with fresh, diverse sources.
Save Posts: One-click save for articles/clusters, organize with folders/labels
Geo lens: map coverage by region and bias; multilingual expansion.
Mobile + offline digest and a lightweight public research API for stance/framing signals.
Built With
- auth0
- bert
- embedding
- gemini
- google-cloud
- huggingface
- machine-learning
- news-api
- nextjs
- python
- pytorch




Log in or sign up for Devpost to join the conversation.