Project Info
Inspiration
The name Veritas comes from the Roman goddess of truth. I wanted to build an extension that tackles identifying misinformation in all shapes and forms and shows the truth. I took inspiration from Grammarly, the Grammar checking tool that many people have come to love. However, instead of grammar, my tool tackles media information. I specifically chose this thinking that it's a tool that could be highly effective for the people I care about and myself.
What it does
Veritas identifys misleading or false claims in media, cross referencing with reputable sources, and provides a "Trust Score", a score of how trustworthy an article. The program highlights areas with misinformation or with concerning phrasing. The "Trust Score" is measured uupon misinformation, logical fallacies, bias, and more to give you a strong insight of how much to trust what you're reading. The misinformation algorithm inside highlights questionable or wrong sentences, explains why its wrong or provides insight into how it can mislead the reader.
How we built it
Veritas is built upon Next.js and Vercel for the front end, React & Vue for the Extension, and Digital Ocean's database and web service for the backend and processing the misinformation detection api. For authentication we utilized Auth0 for its ease of use and built in google auth. For payment systems I implemented stripe (in sandbox mode). Initially, Veritas was going to use a combination of a predictive model based on a True/Fake news dataset with the help of Gemini, however that solution was not effective. Our program identifys misinformation by using gemini for identifying high impact information, i.e., informational claims that should be fact checked, strong language, and misleading terminology, in addition to a url database lookup to see if the information is from a known biased site. Gemini analyzes the flagged content for: Alongside gemini we implemented two systems for identifying factuality. The system triages each verifiable claim into two routes: Route A: Historical Facts This route applies for articles with no recent keywords (i.e., 'Today,', 'Last Month', etc) and for older publishing dates. Uses Google Fact Check API Searches databases (Snopes, Politifact, FactCheck.org, etc.) Returns: Verified | False | Misleading | Unverified Route B: Recent Facts/Breaking news Indicators: "today", "breaking", "just now", current year mentions Uses Google Custom Search API Searches trusted news sources (Reuters, AP, BBC, NPR, etc.) Cross checks article information with trusted sources. Calculates credibility score based on consensus: 3+ trusted sources = 0.9 (Verified) 2 sources = 0.7 (Moderate) 1 source = 0.4 (Single Source) 0 sources = 0.1 (Unsubstantiated) 3+ trusted sources = 0.9 (Verified) 2 sources = 0.7 (Moderate) 1 source = 0.4 (Single Source) 0 sources = 0.1 (Unsubstantiated) After this stage, the algorithm calculates penalties as such: Penalty Tiers: False claims: -25 points (scaled), label -> "Likely Fake" Misleading: -15 points per claim, label -> "Suspicious" Unsubstantiated: -8 points per claim (warning only) Verified claims: Boost to 80+ if many verified After analysis of the article is completed, the data is cached and stored so reopening the webpage reopens the previously analyzed information. Recalculating everything every time you open the page would have been very annoying and be terrible for the environment. Additionally, as you may have assumed with the inclusion of Auth0 and Stripe, I implemented a payment model to match the type of application you would likely see in the real world. I believed a subscription model fit best for this applciation. However, don't worry about paying if you would like to try this out. I'll leave a discount code valid for a month and 20 articles a day. Just send me a quick email and say hi! :)
Challenges we ran into
During this hackathon I kept a log of the multiple problems I faced when developing this application. Many problems I had no idea I would be a problem. The first major problem I faced was just with the sheer scope of my program. I knew that I wanted to do a chrome extension misinformation ideintification tool, and with it I would need a backend for processing, a front end for web services, and more. I've never built an application with as wide of a scope as this. I think I could definitely say this was full-stack. The second major problem occured with my initial development towards a predictive fake news model and Google Gemini 3 Fast. I had forgotten that AI models usually are a year or more back in training data - these algorithms have no idea what is happening currently. Due to this, any event in an article past mid 2024 would cause the LLM to throw a fit, saying 'Thats fake' to anything past its latest training data. This was especially true when it came to analyzing news articles. When it came to the current sitting president and it being 2026, the LLM would throw an admittedly silly tantrum marking everything relating to it as misinformation. With LLM's being a popular tool in this hackathon (I used Gemini 3 Pro and Claude 4.5 Sonnet quite liberally), I found that a large scale project like this overloaded the chatbots progressively, forcing me to switch my methidology to tackling one part at a time and keeping track of the architecture + problems in a notepad. The predictive model was not that effective either. While it still exists in the current program as a fallback, its only good for giving a general sense of an article being 'Fake'. It definitely doesn't identify false information.
Accomplishments we're proud of
I'm quite proud of how well the extension integrates into chrome and general web browsing. It has identified misinformation, propaganda, and logical fallacies (as well a wording mistake in a BBC news article). Additionally, I'm very happy with the UI+UX Design of this application. I spent much of my time tuning user interactions with this and it payed off. On top of those, I'm somewhat happy with myself for being able to put together all an application with as many services as it has.
What we learned
When working with LLM technology, work modularly, small parts at a time to build up the whole Keep track of your system architecture, spend a lot of time initially building a strong understanding of the program's purpose. Equal time needs to be put into the UI/UX of the application as the backend. Its intimidating to be solo and a first time hackathon participant, but its doable, and I personally learned a lot through being solo. Albeit, next time I definitely do NOT want to be solo again.
What's next
Google Chrome full release Improving the Misinformation algorithm to be faster and more effective at identifying misinformation. Social media implementation to see when someone's posting misinformation. Especially with X, Reddit, and Facebook.
Veritas: Misinformation Detection Platform
A hybrid architecture platform for identifying misinformation and bias in web content.
Architecture
- Extension: Chrome Extension (Manifest V3, React + Vite) -
apps/extension - Web: Next.js Dashboard & API Gateway -
apps/web - ML Core: Python FastAPI Service -
services/ml-core
Getting Started
Prerequisites
- Node.js 18+
- Python 3.10+
- Docker (optional, for ML service)
1. Setup ML Service
cd services/ml-core
pip install -r requirements.txt
uvicorn main:app --reload
# Service runs on http://localhost:8000
2. Setup Web Platform
cd apps/web
cp .env.example .env.local
# Fill in Auth0 credentials in .env.local
npm install
npm run dev
# Web runs on http://localhost:3000
3. Setup Extension
- Build the extension:
cd apps/extension npm install npm run build - Open Chrome -> Extensions (
chrome://extensions/) - Enable "Developer mode"
- Click "Load unpacked" and select
apps/extension/dist
Development
- The Extension communicates with the Web Platform (
localhost:3000) for authentication and analysis proxying. - The Web Platform proxies requests to the ML Service (
localhost:8000).
Environment Variables
See apps/web/.env.example for required keys.
Analysis
View
Metric
- 62
- 6
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- CSSIn code
- FastAPIIn code
- HTMLIn code
- JavaScriptIn code
- Next.jsIn code
- PostgreSQLIn code
- PythonIn code
- ReactIn code
- SQLIn code
- Tailwind CSSIn code
- TypeScriptIn code
- Google GeminiClaimed
- VercelClaimed
11 of 13 appear in the indexed code. 2 claimed on Devpost could not be matched to code, which may simply mean the tool leaves no trace in the repository.
AI coding agents
- Claude CodeCommits
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
496 KB
Source files
88
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
aram-ap/Veritas-Detect
130 files · 992 KB · @ 1e42bb2
Structure
Interface
17 files · 13%Screens, components and styles rendered to the user.
API & routing
13 files · 10%Request entry points: routes, handlers and controllers.
Application logic
46 files · 35%Domain rules, services and shared utilities.
Data & schema
4 files · 3%Schema definitions, migrations and data access.
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- TypeScript37%
- Python29%
- HTML14%
- Markdown11%
- Shell8%
- YAML1%
- Other (3)1%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
apps/web/package.json
npm · 20- @auth0/nextjs-auth0
- @prisma/adapter-pg
- @prisma/client
- next
- pg
- prisma
- react
- react-dom
- recharts
- stripe
- +10 more
apps/extension/package.json
npm · 19- react
- react-dom
- +17 more
services/ml-core/requirements.txt
pypi · 13- fastapi
- google-genai
- httpx
- joblib
- nltk
- numpy
- pandas
- pydantic
- python-dotenv
- python-multipart
- requests
- scikit-learn
- uvicorn[standard]
package.json
npm · 5- @prisma/client
- dotenv
- prisma
- recharts
- +1 more
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
This project’s features have not been analysed yet.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.