We will be undergoing planned maintenance on Oct 7th 6:00AM UTC / Oct 7th 2:00AM ET

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

Share this project:

Updates

Submission history