Project Info
Inspiration
I was doing an application last week when one of the questions about diversity prompted me into thinking about how we take things for more than just granted. It struck me that blind people aren't able to interact with the internet (shop on e-commerce websites, research to learn, play video games, social media - the list is quite endless). I then asked my dad, who works in the computer-science industry, about whether the visually impaired and blind are able to contribute to their likeness in the workforce when I realized how far off the scales were tipped. Assil Eye Institute If I were in their shoes, then I would immediately build such a software to be connected like and with everyone else, but in their case I would be blind so I wouldn't be able to, luckily I'm not so I know the right thing to do would be to build a software for them. Also, I realized that for people like me who are quite lazy or would like parts of their browser processes being automated (like telling it to reserve my tennis court from 5-6 PM rather than doing it myself), an AI browser might also sound quite valuable. Rather more of a business market "want" than a "need", I think regardless it's novelty in the market and it's usefulness for a customer segment (did a bit of customer discovery as well reaching out to centers and found out directly from people that they are very much look forward to it) makes this idea worth venturing about this hackathon in CalHacks.
What it does
It's the same as your regular web browser application (Chrome, Safari, Brave, etc) in the way you surf the web, but in addition, you can do so freely while being blind-folded. Well, how does that work? Also, controlled by text and/or speech input (pressing the space bar for over a second starts a recording and leaving it ends the recording), any user's instructions are followed by the browser. When a user lands on a page, a quick summary of the page is read including the nav bar components, etc so the user can navigate and explore the web just like any other person. A user can ask the browser to click on any element/part of the page and also fill in information on the page via true NLP. They can also open/close tabs, search using the search engine, ask questions (variant of RAG approach taken) over the current page, save the page locally/print the page, and so many other tasks that the current set of agents have to offer. Every time something new is displayed on the browser (ex. going to a different page) they are notified so they can take judgements.
How we built it
Using the PyQt5 Browser Development framework, I started my code by building a browser. I organized my prompt engineering agentic framework using Fetch AI's agentic system. For prompting questions with images/text I used Gemini's models. I also used Gemini's bounding box model for detecting where to proceed next on the page. This was not too accurate, so I coupled it with my algorithm I wrote where I take the html code of a website and parsed it down to the important segments (removing PII and unnecessary contents) in order to save tokens and decide based on html where to move next as a backup. After much testing, I settled on Groq for the decision-making segments of the LLM chain for its speed. I also used it for the STT part where the user has the option to speak in our application. The TTS part was handled by DeepGram and other voice agent integrations. Building requires testing and I tested this by imitating a blind person by being blind. One such successful testing included making accounts on websites I have never visited before.
Challenges we ran into
Parsing the HTML took one of the longest parts due to its implicit complexity. Event listeners attached to elements across the DOM tree. Event listeners on images like a hamburger icon which has no text so a mapping is needed. These multiple edge cases had to be considered before reaching the threshold where it was doing perfect on every website as it is doing now. Another challenge I ran into was fine-tuning. The accuracy of this model was at around 60% and it was a hard and enduring work to get it to around 95% where it is currently at right now.
Accomplishments we're proud of
Controlling the browser by "having a 2-street conversation" with it simply blows my mind and really changes the way one surfs the web. It's really fun and really useful at the same time.
What we learned
How to build your own browser. How to fine tune the boundary box model with Gemini through prompt engineering to extract high accurate insights. Learned documentation for multiple voice agent companies that were integrated.
What's next
Perfecting the software model and finding ways to even further reduce token consumption in order to push this into the market as soon as possible. Also, building "background tabs" a feature I didn't have time to finish but essentially you can give a tab a task (ex. find the part on the wikipedia page that talks about fourier transform or find the contact page for X, Y, Z company) and the tab does the task in the background and comes back up when finished.
Browse Blind
World's First AI Browser for the blind
https://github.com/user-attachments/assets/8da2bcda-75d1-4843-b967-2b974fdcdbd8
HomePage URL
Website at browseblind.co
Code Base
- Frontend code on root level
- Backend folder has desktop application source code
Analysis
View
Metric
- 16
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
- HTMLIn code
- PythonIn code
- Google GeminiClaimed
2 of 3 appear in the indexed code. 1 claimed on Devpost could not be matched to code, which may simply mean the tool leaves no trace in the repository.
AI coding agents
No AI coding agent signals were found in this repository.
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
55 KB
Source files
30
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
RoyceAroc/browseblind
44 files · 2.1 MB · @ d6af835
Structure
Interface
1 file · 2%Screens, components and styles rendered to the user.
Application logic
11 files · 25%Domain rules, services and shared utilities.
Data & schema
18 files · 41%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
- Python90%
- HTML8%
- Markdown1%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
backend/pyproject.toml
pypi · 10- beautifulsoup4
- google-generativeai
- groq
- keyboard
- pillow
- pygame
- pyinstaller
- pyqt5
- pyqtwebengine
- uagents
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.
Feature verification
Agentic multi-agent decision framework (Fetch.ai uAgents)Verified
Prompt engineering agentic framework organized using Fetch AI's agentic system
Claimed on Devposthigh confidencebackend/src/agents/main.py:12— create_agents wires up a set of uAgents-based decision/browser/inner agentsbackend/src/main.py:18— Imports Agent/Bureau/Context from uagents package and runs a Bureau of agents
Ask questions over the current page (RAG-style)Verified
Ask questions (variant of RAG approach taken) over the current page
Claimed on readmemedium confidencebackend/src/agents/models/decision_agents/question_agent.py:12— Feeds parsed page HTML plus screenshot plus user question into Gemini to answer, i.e. grounding an LLM answer in retrieved page content
Click on any element via natural languageVerified
A user can ask the browser to click on any element/part of the page via NLP
Claimed on readmehigh confidencebackend/src/main.py:215— in_page_extraction uses Gemini bounding-box detection plus xpath matching (with an HTML-parsing Groq backup) to locate the target element, then dispatches to click_agentbackend/src/main.py:403— click_option dispatches a real MouseEvent/.click() on the resolved xpath element
DeepGram for text-to-speech (TTS)Verified
The TTS part was handled by DeepGram and other voice agent integrations
Claimed on Devposthigh confidencebackend/src/llms/deepgram.py:5— Calls Deepgram's /v1/speak TTS endpoint and writes resulting audio.mp3backend/src/voice_model.py:8— play_sound() invokes deepgram.make_audio then plays the resulting mp3 via pygame — used throughout the agents to voice responses
Desktop application source code in backend folderVerified
Backend folder has desktop application source code
Claimed on readmehigh confidencebackend/src/main.py:1— backend/src contains the full PyQt5 desktop browser application and agent pipeline
Desktop browser built with PyQt5Verified
A functioning web browser built using PyQt5's QWebEngineView, with tabs, URL bar, navigation
Claimed on readmehigh confidencebackend/src/main.py:66— BrowserTab class wraps QWebEngineView with url bar, and Browser(QMainWindow) manages QTabWidget tabs
Fill in form fields via natural languageVerified
A user can ask the browser to fill in information on the page via true NLP
Claimed on readmehigh confidencebackend/src/main.py:460— text_option sets element.value on the resolved xpath element using data extracted from the user's instructionbackend/src/agents/models/decision_agents/processing_agent.py:28— Groq prompt extracts action:'input' and the data to fill from the user's command
Gemini bounding-box model for click-target detectionVerified
Used Gemini's bounding box model for detecting where to proceed next on the page
Claimed on Devposthigh confidencebackend/src/main.py:275— Prompt explicitly asks Gemini to 'Return a bounding box' [ymin,xmin,ymax,xmax] for the target element, then maps it to page coordinates
Gemini for text/image promptingVerified
For prompting questions with images/text used Gemini's models
Claimed on Devposthigh confidencebackend/src/llms/gemini.py:6— Uses google.generativeai GenerativeModel('gemini-1.5-flash') to generate content from image+prompt
Go back/forward and reloadVerified
Other tasks the agents offer, including page navigation controls
Claimed on readmehigh confidencebackend/src/main.py:635— reload_current_tab/go_back/go_forward implemented on QWebEngineViewbackend/src/agents/models/browser_agents/go_back.py:1— go_back agent wired into the agent bureau
Groq for decision-making LLM chainVerified
Settled on Groq for the decision-making segments of the LLM chain for its speed
Claimed on Devposthigh confidencebackend/src/llms/groq.py:11— run_groq used for llama3-8b-8192 chat completionsbackend/src/agents/models/decision_agents/processing_agent.py:36— processing_agent (task routing) calls run_groq to decide which downstream agent handles the command
Groq for speech-to-text (STT)Verified
Also used Groq for the STT part where the user has the option to speak
Claimed on Devposthigh confidencebackend/src/llms/groq.py:25— run_groq_stt uses whisper-large-v3-turbo via Groq's audio.transcriptions APIbackend/src/main.py:775— Recorded audio is passed to run_groq_stt and the transcription becomes the input command
HTML-parsing backup algorithm for element targetingVerified
Coupled bounding-box detection with an algorithm parsing HTML into important segments (removing PII/unnecessary content) as backup
Claimed on Devposthigh confidencebackend/src/utils/html_parser.py:18— get_new_html walks the DOM with BeautifulSoup, tagging clickable/input elements with IDs and xpaths for the LLM backup decision pathbackend/src/main.py:247— backup() function feeds parsed HTML into Groq to select an element ID when the bounding-box approach returns ambiguous results
Marketing/landing frontend at repo rootVerified
Frontend code on root level
Claimed on readmehigh confidenceindex.html:1— Root-level index.html is a Bootstrap-based marketing landing page for 'Browse Blind | AI Browser'
Multi-agent intent routing (search/browse/click/input/summarize/read/question)Verified
Any user's instructions are followed by the browser across the current set of agents
Claimed on readmehigh confidencebackend/src/agents/models/decision_agents/processing_agent.py:20— Groq-driven classifier routes a command to question_agent, inner_agent (click/input), browser_agent, onload_agent (summarize), or read_page_agentbackend/src/agents/models/decision_agents/browser_agent.py:20— Second-tier Groq classifier further routes to search_engine, url_engine, close_tab, go_back, go_forward, reload_page, print_page agents
Open/close tabsVerified
User can open/close tabs via commands
Claimed on readmehigh confidencebackend/src/agents/models/browser_agents/close_tab.py:1— Dedicated close_tab agent wired to browser.close_tabbackend/src/main.py:654— close_tab() removes current tab widget from QTabWidget
Page summary read aloud on load / navigationVerified
When a user lands on a page, a quick summary including nav bar components is read so the user can navigate; notified every time something new is displayed
Claimed on readmehigh confidencebackend/src/agents/models/decision_agents/onload_agent.py:13— Prompts Gemini for a 1-2 sentence summary of the screenshot as if speaking to a blind user, explicitly calling out navbar components, then calls play_sound(response)backend/src/main.py:110— web_view.loadFinished is connected to run_onload_script, so summary fires automatically on every page load
Save page locally / print pageVerified
Save the page locally / print the page
Claimed on readmehigh confidencebackend/src/main.py:673— print_page() calls web_view.page().printToPdf and writes the PDF to a downloads directorybackend/src/agents/models/browser_agents/print_page.py:1— Dedicated print_page agent exists in the agent roster
Search engine integrationVerified
User can search using the search engine via voice/text command
Claimed on readmehigh confidencebackend/src/agents/models/browser_agents/search_engine.py:10— search_engine agent emits a signal connected to browser.search_enginebackend/src/main.py:640— search_engine() opens a new tab navigated to a Google search query URL
Text-input command controlVerified
Browser controlled via text input as well as speech
Claimed on readmehigh confidencebackend/src/main.py:585— input_field QLineEdit with returnPressed wired to send_input_to_python which dispatches the typed command to the agent pipeline
Visit a specific URL / company website via NLPVerified
Go to a url or company website via command
Claimed on readmehigh confidencebackend/src/agents/models/decision_agents/browser_agent.py:27— Groq prompt option [2] converts a company/entity mention into a URL, dispatched to url_engine agentbackend/src/agents/models/browser_agents/url_engine.py:10— url_engine agent navigates the browser to the resolved URL
Voice input via spacebar hold-to-recordVerified
Pressing space bar for over a second starts a recording; releasing ends it, feeding user speech as instructions
Claimed on readmehigh confidencebackend/src/main.py:787— on_spacebar_press tracks hold duration >0.5s to toggle recording state; keyboard_listener starts/stops AudioRecorder accordinglybackend/src/main.py:775— stop_recording calls run_groq_stt on the recorded wav and injects the transcription into the input field, triggering the same command pipeline as typed text
'Background tabs' — assign a task to a tab that runs in the backgroundClaimed only
Building 'background tabs' — give a tab a task and it completes it in the background — explicitly described as unfinished/future work
Claimed on Devposthigh confidenceLive product website at browseblind.coBlocked
Website at browseblind.co
Claimed on readmelow confidence
An AI agent derived these features from the project’s Devpost page and readme, then searched the code for each one. Verified features are backed by cited code; claimed-only features had no supporting code, which is not by itself proof a feature is missing.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.