<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Abdelrahman Elaraby</title>
    <description>The latest articles on DEV Community by Abdelrahman Elaraby (@abdelrahman_elaraby_e039b).</description>
    <link>https://dev.to/abdelrahman_elaraby_e039b</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4155255%2Ffa77fd3d-5188-46f2-ac22-02209f78ecfc.jpg</url>
      <title>DEV Community: Abdelrahman Elaraby</title>
      <link>https://dev.to/abdelrahman_elaraby_e039b</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/abdelrahman_elaraby_e039b"/>
    <language>en</language>
    <item>
      <title>Basira: A Private, Offline Document Reader I Built for My Grandmother</title>
      <dc:creator>Abdelrahman Elaraby</dc:creator>
      <pubDate>Sun, 04 Oct 2026 16:19:39 +0000</pubDate>
      <link>https://dev.to/abdelrahman_elaraby_e039b/basira-a-private-offline-document-reader-i-built-for-my-grandmother-5f1a</link>
      <guid>https://dev.to/abdelrahman_elaraby_e039b/basira-a-private-offline-document-reader-i-built-for-my-grandmother-5f1a</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Basira&lt;/strong&gt; (بصيرة, "insight" in Arabic) is a private, offline document reader for people with low vision. You take a photo of a paper, a bill, or a medicine leaflet, and Basira reads it aloud and explains it in simple words. Everything runs on your own computer, with no cloud, no subscription, and no API keys.&lt;/p&gt;

&lt;p&gt;I built it for &lt;strong&gt;my grandmother&lt;/strong&gt;, who has low vision. [Add one real detail here, e.g. "She can no longer read the small print on her medicine boxes, so she has to wait for someone in the family to read them to her," or "Every bill that arrives is a mystery until someone has time to read it."] I wanted her to be able to read her own mail, understand it, and not feel like a burden when she needs to know what a paper says.&lt;/p&gt;

&lt;p&gt;Documents like bills and medicine leaflets are also private and sensitive, which is why I wanted everything to stay on her computer and never go to a cloud service.&lt;/p&gt;

&lt;p&gt;Here is how Basira helps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Capture:&lt;/strong&gt; she uploads or photographs a document&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read:&lt;/strong&gt; OCR turns the image into text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explain:&lt;/strong&gt; a small local AI model rewrites it in simple language and highlights amounts, dates, deadlines, and what she needs to do&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Speak:&lt;/strong&gt; a local neural voice reads the original text or the simplified explanation aloud&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It works in &lt;strong&gt;Arabic and English&lt;/strong&gt;, has a very large-text, high-contrast interface, and lets her choose between the &lt;strong&gt;exact original text&lt;/strong&gt; and a &lt;strong&gt;simple explanation&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://drive.google.com/file/d/1m0cCmfTIbDJIFtRY_ezC6SslruRhPIjK/view?usp=sharing" rel="noopener noreferrer"&gt;https://drive.google.com/file/d/1m0cCmfTIbDJIFtRY_ezC6SslruRhPIjK/view?usp=sharing&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basira runs locally by design, so there is no hosted demo link. Setup instructions are in the repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/aelaraby6" rel="noopener noreferrer"&gt;
        aelaraby6
      &lt;/a&gt; / &lt;a href="https://github.com/aelaraby6/Basira" rel="noopener noreferrer"&gt;
        Basira
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Offline document-to-speech reader for Arabic and English powered by Tesseract, Ollama, and Piper TTS
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Basira&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;A private, offline document reader for people with low vision.&lt;/strong&gt;
Take a photo of a paper, bill, or medicine leaflet. Basira reads it aloud and explains it in simple words, all on your own computer, with no cloud and no subscription.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Table of Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/aelaraby6/Basira#1-what-basira-does" rel="noopener noreferrer"&gt;What Basira Does&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aelaraby6/Basira#2-why-open-source" rel="noopener noreferrer"&gt;Why Open Source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aelaraby6/Basira#3-how-it-works" rel="noopener noreferrer"&gt;How It Works&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aelaraby6/Basira#4-tech-stack" rel="noopener noreferrer"&gt;Tech Stack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aelaraby6/Basira#5-requirements" rel="noopener noreferrer"&gt;Requirements&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aelaraby6/Basira#6-step-by-step-setup" rel="noopener noreferrer"&gt;Step-by-Step Setup&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aelaraby6/Basira#7-project-structure" rel="noopener noreferrer"&gt;Project Structure&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aelaraby6/Basira#8-run-it" rel="noopener noreferrer"&gt;Run It&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aelaraby6/Basira#9-use-it-from-a-phone" rel="noopener noreferrer"&gt;Use It From a Phone&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aelaraby6/Basira#10-troubleshooting" rel="noopener noreferrer"&gt;Troubleshooting&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aelaraby6/Basira#11-safety-notes" rel="noopener noreferrer"&gt;Safety Notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aelaraby6/Basira#12-future-ideas" rel="noopener noreferrer"&gt;Future Ideas&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aelaraby6/Basira#13-license" rel="noopener noreferrer"&gt;License&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;1. What Basira Does&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;What happens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1. Capture&lt;/td&gt;
&lt;td&gt;The user uploads or photographs a document.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2. Read&lt;/td&gt;
&lt;td&gt;OCR (text recognition) turns the image into text.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3. Explain&lt;/td&gt;
&lt;td&gt;A small local AI model rewrites the text in simple, clear language and highlights key information: amounts, dates, deadlines, and required actions.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4. Speak&lt;/td&gt;
&lt;td&gt;A local text-to-speech voice reads the text or explanation aloud.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Main features&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Works in &lt;strong&gt;Arabic and English&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Very &lt;strong&gt;large text and high-contrast&lt;/strong&gt; interface&lt;/li&gt;
&lt;li&gt;Option…&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/aelaraby6/Basira" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;The whole pipeline is open source and runs locally:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Language&lt;/td&gt;
&lt;td&gt;Python 3.10+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Web interface&lt;/td&gt;
&lt;td&gt;Gradio&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OCR&lt;/td&gt;
&lt;td&gt;Tesseract (&lt;code&gt;pytesseract&lt;/code&gt;), with Arabic and English data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Image cleanup&lt;/td&gt;
&lt;td&gt;Pillow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local AI model&lt;/td&gt;
&lt;td&gt;Ollama running &lt;code&gt;qwen2.5:3b&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Text to speech&lt;/td&gt;
&lt;td&gt;Piper (&lt;code&gt;piper-tts&lt;/code&gt;), voices &lt;code&gt;en_US-lessac-medium&lt;/code&gt; and &lt;code&gt;ar_JO-kareem-medium&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The flow is: &lt;strong&gt;photo → Tesseract → local LLM via Ollama → Piper → audio + text&lt;/strong&gt;, wrapped in a Gradio UI.&lt;/p&gt;

&lt;p&gt;The code is split into small modules so each part can be swapped independently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;services/ocr.py&lt;/code&gt;: image preprocessing and OCR&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;services/llm.py&lt;/code&gt;: prompts and explanation through Ollama&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;services/tts.py&lt;/code&gt;: voice synthesis and caching&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;core/processor.py&lt;/code&gt;: the pipeline that connects them&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ui/app_ui.py&lt;/code&gt;: the accessible interface&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It needs about 8 GB of RAM (16 GB recommended) and no GPU. Since Gradio serves the UI over the local network, my grandmother can also open it on her phone, take a photo with the camera, and hear the result.&lt;/p&gt;

&lt;p&gt;[Optional: mention one real challenge you hit, e.g. Arabic OCR quality on blurry photos, getting the LLM to give short, simple explanations in Arabic, or choosing the right 3B model. Judges like honest details.]&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Bills, medical papers, and ID documents are some of the most sensitive things a person owns. A closed cloud API would mean sending those private documents to someone else's servers, paying per page, and needing a stable internet connection. For many people, that is a dealbreaker.&lt;/p&gt;

&lt;p&gt;Open-weight models and open-source tools made it possible to build something that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keeps every document on the user's device&lt;/strong&gt;, so nothing leaves the computer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works offline&lt;/strong&gt; after the initial setup&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Is free forever&lt;/strong&gt;, with no subscriptions or rate limits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supports Arabic properly&lt;/strong&gt;, with a modular design where the model, voice, or OCR language can be changed without rewriting anything&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most of all, open tools let me shape Basira around one specific person. I could tune the prompts to explain things the way my grandmother needs, in simple Arabic and without overwhelming detail, something no generic closed product would do for her.&lt;/p&gt;

&lt;p&gt;Accessibility tools should not depend on a company's pricing or an internet connection.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hacktoberfest</category>
      <category>opensource</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
