Inspiration
In today's world it is common to be misinformed or misled by information on the web. Fact-checking usually requires manual searching across multiple sources. With Slopify, you can highlight any text on a webpage and trigger an automated fact-check: the extension sends the selection to our backend, performs analysis with generative and verification models, and returns a human-readable risk score, verdict, and supporting claim so you get quick, context-aware verification without leaving the page.
What it does
-Lets users highlight text anywhere in the browser and choose "Fact-check with Slopify" from the context menu. -Sends the selected text (and page URL) to a backend verification service (supports either Google Gemini or an AWS Lambda endpoint). -Normalizes the backend response into a concise report: a numeric Risk Score, a verdict (Accurate / Inaccurate / Unverifiable / etc.), a short summary, per-claim assessments with one-line explanations, and an ordered list of red flags/citations. -Displays results in a compact popup UI with a circular risk meter and clearly labeled metric panels so users can understand trustworthiness at a glance. Persists recent results and settings using the Chrome Storage API for quick re-use and live popup updates.
How we built it
-Chrome Extension (Manifest V3): background service worker and context menu are implemented in background.js, with manifest.json granting scripting, contextMenus, storage, and host permissions. -Frontend popup: HTML/CSS/vanilla JS in popup shows the circular risk score and detailed result sections; UI uses SVG circles for progress and DOM updates driven by popup.js. -Backend: a FastAPI service (app) that calls Google Gemini via the official genai client and returns a strict JSON schema; the code in gemini.py builds a system prompt and extracts JSON responses from model output. -Multi-backend support: the extension can target either a Gemini service or an AWS Lambda verify endpoint (see background.js for endpoint discovery and retry logic). -State & communication: chrome.storage.local is used to store slopifyState and lastResult so the popup and service worker remain synchronized; the popup listens for storage changes to render live updates. Response normalization: background code normalizes different backend payloads (Lambda vs Gemini) into a consistent format for the UI (see normalizeLambdaResponse).
Challenges we ran into
-Learning Chrome Extension architecture (Manifest V3 service workers, scripting.executeScript, permissions model). -Parsing generative model output into strict JSON. -Designing a stable request flow and retries across different backends (Gemini vs AWS Lambda) -Setting up AWS Lambda & integrating with LLM-driven work flow -Resolving merge conflicts while integrating Gemini and AWS Lambda support and ensuring the popup and background stayed in sync.
Accomplishments that we're proud of
-Built an end-to-end flow that converts a highlighted selection into a structured JSON verification request and returns an actionable, user-friendly result. -Implemented support for multiple backend providers (Gemini and AWS Lambda). -Created a compact, informative UI (circular risk meter, claims, red flags) that surfaces model outputs in a readable manner.
What we learned
-How Chrome Extensions work (MV3 service workers, context menus, chrome.storage, popup lifecycle) and how to debug them using Chrome DevTools. Practical techniques for parsing LLM output and enforcing a JSON schema on noisy model responses. -How to build a small web API with FastAPI and securely call LLMs (Google genai) from a backend, also gained experience configuring and calling an AWS Lambda based verify endpoint.
What's next for Slopify
-Expand model support (additional model selection). -Improve UI/UX: richer citations, source links, paginated claim lists, and better error/edge-case messaging. -Cleaning & Refining Backend Structure
Log in or sign up for Devpost to join the conversation.