<?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: Ashraf Ahmed</title>
    <description>The latest articles on DEV Community by Ashraf Ahmed (@ashrafahm).</description>
    <link>https://dev.to/ashrafahm</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%2F4164696%2F5a61439d-8b9c-44a6-968e-acac8a81457e.jpeg</url>
      <title>DEV Community: Ashraf Ahmed</title>
      <link>https://dev.to/ashrafahm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ashrafahm"/>
    <language>en</language>
    <item>
      <title>Lumbre: a Día de los Muertos altar that only remembers what you tell it</title>
      <dc:creator>Ashraf Ahmed</dc:creator>
      <pubDate>Sun, 01 Nov 2026 06:25:56 +0000</pubDate>
      <link>https://dev.to/ashrafahm/lumbre-a-dia-de-los-muertos-altar-that-only-remembers-what-you-tell-it-6hc</link>
      <guid>https://dev.to/ashrafahm/lumbre-a-dia-de-los-muertos-altar-that-only-remembers-what-you-tell-it-6hc</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week4-2026-10-26"&gt;Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Lumbre is a small altar for Día de los Muertos. You write the name of someone you want to remember, how you knew them, the years if you know them, one memory, and any food, song, or object that belongs with them.&lt;/p&gt;

&lt;p&gt;An open-weight model writes the line that sits on the altar and a short remembrance. The memory you typed is kept word for word, under "As told." The food, the song, and the object come from the form. A field you leave blank stays blank. The model is told not to invent a date, a relative, or a favorite thing you did not give it.&lt;/p&gt;

&lt;p&gt;I read the week as remembrance rather than a jump scare. Día de los Muertos is the thin place between someone who is gone and the people who still set a place for them. The altar is that place: paper, a candle, marigolds, and only the facts you actually brought.&lt;/p&gt;

&lt;p&gt;You can save the card as a JSON file.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://ashraf01k-lumbre.static.hf.space" rel="noopener noreferrer"&gt;https://ashraf01k-lumbre.static.hf.space&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A card comes back in a few seconds. Use "Try a fictional altar" if you want to see the page before you write a real name. The host allows about two cards a minute.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://github.com/AshrafGalaxy/lumbre" rel="noopener noreferrer"&gt;https://github.com/AshrafGalaxy/lumbre&lt;/a&gt;&lt;/p&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/AshrafGalaxy" rel="noopener noreferrer"&gt;
        AshrafGalaxy
      &lt;/a&gt; / &lt;a href="https://github.com/AshrafGalaxy/lumbre" rel="noopener noreferrer"&gt;
        lumbre
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &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;Lumbre&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Lumbre letters a Día de los Muertos altar card. You write a name, a memory, and only the foods, songs, and objects you actually know. Llama 3.3 70B, an open-weight model, writes the lines on the card. Anything you leave blank stays blank.&lt;/p&gt;
&lt;p&gt;The memory you typed is kept word for word. The offering list is built in code from those fields, so the model cannot add a favorite food you never named.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Why open weights&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Llama 3.3's weights are public. The altar calls that model on a host, so a card comes back in a few seconds and the page does not download hundreds of megabytes. The model id is one constant, so it can be swapped for another open instruct model. A closed API would lock the wording to one vendor.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Architecture&lt;/h2&gt;
&lt;/div&gt;

  &lt;div class="js-render-enrichment-target"&gt;
    &lt;div class="render-plaintext-hidden"&gt;
      &lt;pre&gt;flowchart TD
    visitor[Visitor] --&amp;gt; page[Altar page]
    page --&amp;gt; facts[Altar facts]
    facts --&amp;gt; scribe[Scribe]
    scribe --&amp;gt;&lt;/pre&gt;…&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/AshrafGalaxy/lumbre" 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 public page is static HTML. Pressing "Light the altar" sends the note once to &lt;strong&gt;Llama 3.3 70B Instruct&lt;/strong&gt;, an open-weight model from Meta, through OVHcloud's OpenAI-compatible endpoint. The browser does not download the weights, and the page does not contain an API key.&lt;/p&gt;

&lt;p&gt;The scribe is small on purpose. &lt;code&gt;lumbre/prompts.py&lt;/code&gt; asks for two labeled parts, an inscription and a remembrance. &lt;code&gt;lumbre/altar.py&lt;/code&gt; builds the offering list and the list of gaps from the fields you filled in. The model is not trusted to decide what was brought to the altar.&lt;/p&gt;

&lt;p&gt;Gemma is open-weight too, and the weights are on Hugging Face. I did not use it for the live card. The Hugging Face router can serve Gemma, but this account has no Inference Providers credits, and a free account cannot run a Docker Space to load the weights. The host that answers with no key does not offer a Gemma chat model. Llama 3.3 70B is the open chat model that host does serve, so that is what letters the card. The model id is one constant.&lt;/p&gt;

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

&lt;p&gt;A remembrance should not depend on a closed chat product that can change its model or shut the endpoint down. Llama's weights are public. Lumbre calls that model by name, and the same scribe can point at another open instruct model. The offering list is ordinary code, so a model update cannot quietly add a favorite food. The note is sent for one reply. Lumbre does not keep a database of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Spirit of It
&lt;/h2&gt;

&lt;p&gt;The part that matters is the empty space. A remembrance gets worse if the model invents a song, a Sunday, or a cause of death. Lumbre writes down what you actually said, and leaves the rest quiet.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>ClientRadar: Autonomous Freelance Contract Discovery &amp; AI Proposal Engine</title>
      <dc:creator>Ashraf Ahmed</dc:creator>
      <pubDate>Mon, 19 Oct 2026 06:06:33 +0000</pubDate>
      <link>https://dev.to/ashrafahm/clientradar-autonomous-freelance-contract-discovery-ai-proposal-engine-53dc</link>
      <guid>https://dev.to/ashrafahm/clientradar-autonomous-freelance-contract-discovery-ai-proposal-engine-53dc</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Freelance engineers and boutique consultants spend &lt;strong&gt;10 to 15 hours every week&lt;/strong&gt; manually scanning fragmented job boards, dodging low-rate listings, and writing custom proposals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ClientRadar AI&lt;/strong&gt; is an autonomous contract arbitrage and AI proposal engine that turns this unpaid grind into a &lt;strong&gt;30-second workflow&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Live Multi-Platform Contract Discovery&lt;/strong&gt;: Harnesses real-time contract listings across LinkedIn, ZipRecruiter, Indeed, and direct company boards with dynamic portal deep-links.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dynamic Compensation &amp;amp; Recency Parsing&lt;/strong&gt;: Intelligently extracts true hourly rates (e.g., &lt;code&gt;$75 – $150 / hr&lt;/code&gt;, &lt;code&gt;$170 – $200 / hr&lt;/code&gt;) or computes role-based market estimates instead of showing generic placeholders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Factor Viability &amp;amp; Risk Audit&lt;/strong&gt;: Evaluates contract viability (68–97/100) based on compensation transparency, 1099 vs. W2 terms, scope detail, and flags potential risks (such as unlisted budgets or roles posted over two weeks ago).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-Powered Pitch Synthesis&lt;/strong&gt;: Leverages open-weight &lt;strong&gt;Google Gemma&lt;/strong&gt; to draft structured, bespoke technical outreach proposals across three selectable strategies (&lt;em&gt;Direct Technical&lt;/em&gt;, &lt;em&gt;Fast 48h Turnaround&lt;/em&gt;, &lt;em&gt;Strategic Retainer&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personalized Freelancer Profiles&lt;/strong&gt;: Injects consultant credentials (target rate, portfolio, specialties, name) directly into generated pitches with 1-click Markdown export.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Who Would Pay For It?
&lt;/h3&gt;

&lt;p&gt;Independent software engineers, technical consultants, and boutique agency founders who currently pay $50–$150/month for lead scraping tools. ClientRadar delivers a private, open-source alternative that finds high-intent remote contracts and drafts winning proposals instantly.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Live Deployed App&lt;/strong&gt;: &lt;a href="https://clientradar.streamlit.app/" rel="noopener noreferrer"&gt;https://clientradar.streamlit.app/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repository&lt;/strong&gt;: &lt;a href="https://github.com/AshrafGalaxy/ClientRadar" rel="noopener noreferrer"&gt;https://github.com/AshrafGalaxy/ClientRadar&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to Run Locally
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/AshrafGalaxy/ClientRadar.git
&lt;span class="nb"&gt;cd &lt;/span&gt;ClientRadar
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
.&lt;span class="se"&gt;\.&lt;/span&gt;venv&lt;span class="se"&gt;\S&lt;/span&gt;cripts&lt;span class="se"&gt;\a&lt;/span&gt;ctivate   &lt;span class="c"&gt;# On Windows (or source .venv/bin/activate on Linux/Mac)&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
streamlit run app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Open &lt;code&gt;http://localhost:8501&lt;/code&gt; in your browser. Configure your API keys (&lt;code&gt;SERPAPI_API_KEY&lt;/code&gt; and &lt;code&gt;HUGGINGFACE_TOKEN&lt;/code&gt;) in a &lt;code&gt;.env&lt;/code&gt; file or use the built-in demo engine.&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/AshrafGalaxy" rel="noopener noreferrer"&gt;
        AshrafGalaxy
      &lt;/a&gt; / &lt;a href="https://github.com/AshrafGalaxy/ClientRadar" rel="noopener noreferrer"&gt;
        ClientRadar
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Autonomous freelance lead-arbitrage engine
    &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;🎯 ClientRadar AI&lt;/h1&gt;
&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;Autonomous freelance lead-arbitrage engine powered by &lt;strong&gt;SerpApi&lt;/strong&gt; and &lt;strong&gt;Google Gemma 2&lt;/strong&gt;.&lt;br&gt;
Built for the Hacktoberfest open source AI challenge.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/AshrafGalaxy/ClientRadar/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/08cef40a9105b6526ca22088bc514fbfdbc9aac1ddbf8d4e6c750e3a88a44dca/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d626c75652e737667" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://streamlit.io" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/a1de0818282c6f7dac4053a4426f7a1135ba4f2aa2016712240414cba67b2358/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f53747265616d6c69742d312e33352b2d4646344234422e737667" alt="Streamlit"&gt;&lt;/a&gt;
&lt;a href="https://serpapi.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/2e72b8dd2f1bc8059a25f63467d9e9839c2770829757ee2283c021ec30f47daa/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f536572704170692d476f6f676c652532304a6f62732d3030433835332e737667" alt="SerpApi"&gt;&lt;/a&gt;
&lt;a href="https://huggingface.co/google/gemma-2-2b-it" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/3953b31525d2246625560c9fb65b91890f3e004331e5bf87647a2d9d02889ec2/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f476f6f676c652d47656d6d61253230322d2d32422d2d49542d3432383546342e737667" alt="Gemma 2"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;💡 Overview&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Freelancers and boutique technical consultants spend 10-15 hours every week scanning job boards, filtering low-budget listings, and drafting custom outreach pitches.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ClientRadar AI&lt;/strong&gt; turns this manual grind into an autonomous, 30-second pipeline:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Live Discovery &amp;amp; Deep-Linking&lt;/strong&gt;: Leverages &lt;strong&gt;SerpApi's&lt;/strong&gt; &lt;code&gt;google_jobs&lt;/code&gt; engine to harvest fresh, high-ticket tech contracts across LinkedIn, Indeed, ZipRecruiter, and company portals in real time with direct application deep-links.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-Tier Viability &amp;amp; Risk Scoring&lt;/strong&gt;: Google's open-weight &lt;strong&gt;Gemma 2&lt;/strong&gt; (&lt;code&gt;google/gemma-2-2b-it&lt;/code&gt;) parses the job description, evaluates Scope Clarity (35 pts), Budget Alignment (35 pts), and Timeline Realism (30 pts), while auditing for scope-creep or equity-only red flags.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom Outreach Pitch Studio&lt;/strong&gt;: Gemma 2 crafts tailored proposals with selectable pitch strategies (&lt;em&gt;Direct Technical&lt;/em&gt;, &lt;em&gt;Fast 48h Turnaround&lt;/em&gt;, or &lt;em&gt;Strategic Retainer&lt;/em&gt;…&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/AshrafGalaxy/ClientRadar" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Repository: &lt;a href="https://github.com/AshrafGalaxy/ClientRadar" rel="noopener noreferrer"&gt;https://github.com/AshrafGalaxy/ClientRadar&lt;/a&gt;&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Core Framework &amp;amp; UI&lt;/strong&gt;: Built with &lt;strong&gt;Python 3.11&lt;/strong&gt; and &lt;strong&gt;Streamlit&lt;/strong&gt;, featuring a bespoke responsive interface with SVG icon systems, dark/light theme switching, and segmented preview controls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open-Source AI Model&lt;/strong&gt;: Powered by Google's open-weight model &lt;strong&gt;Gemma (&lt;code&gt;google/gemma-3-4b-it&lt;/code&gt; / &lt;code&gt;google/gemma-2-2b-it&lt;/code&gt;)&lt;/strong&gt; via the Hugging Face Serverless Router for structured viability audits and technical proposal generation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-Time Job Harvesting&lt;/strong&gt;: Integrated with the &lt;strong&gt;SerpApi Google Jobs Engine&lt;/strong&gt; to harvest real-time job listings, parsing direct apply portals (e.g., generating direct &lt;code&gt;Apply on LinkedIn ↗&lt;/code&gt; and &lt;code&gt;Apply on ZipRecruiter ↗&lt;/code&gt; buttons).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heuristic Viability Engine&lt;/strong&gt;: Custom Python parsing pipeline extracting hourly compensation brackets, work-from-home eligibility, and risk signals before synthesizing client outreach.&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Open-source and open-weight models like &lt;strong&gt;Google Gemma&lt;/strong&gt; democratize high-grade AI for independent developers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Eliminating Vendor Lock-in &amp;amp; Unpredictable API Costs&lt;/strong&gt;: Proprietary closed APIs enforce restrictive usage caps and unpredictable meter billing. Open-weights allow developers to run inference locally or via serverless endpoints without recurring commercial tolls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Privacy for Client Communications&lt;/strong&gt;: Client pitches, client names, hourly terms, and confidential project proposals never have to be stored or trained on by closed third-party providers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;True Customizability&lt;/strong&gt;: Developers have full transparency into model prompts, system architectures, and fine-tuning pipelines.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;ClientRadar was built and optimized using &lt;strong&gt;Google Antigravity&lt;/strong&gt;, leveraging agentic pair programming to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implement resilient IPv4 network adapters overcoming Windows IPv6 connection resets on external cloud APIs.&lt;/li&gt;
&lt;li&gt;Design dynamic SerpApi data parsers for compensation brackets and multi-platform action buttons.&lt;/li&gt;
&lt;li&gt;Build the dual-view proposal studio (Rendered Pitch vs. Editable Markdown) with 1-click export.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  My First User
&lt;/h2&gt;

&lt;p&gt;During initial testing with independent backend contractors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The tool scanned live remote listings and surfaced a &lt;strong&gt;$170 – $200 / hr&lt;/strong&gt; Python contract on Turing via LinkedIn/ZipRecruiter.&lt;/li&gt;
&lt;li&gt;In less than &lt;strong&gt;15 seconds&lt;/strong&gt;, ClientRadar evaluated the scope viability at &lt;strong&gt;97/100&lt;/strong&gt;, verified clear tech alignment (Python, Async, Distributed Systems), and generated a tailored 3-paragraph outreach pitch ready to submit.&lt;/li&gt;
&lt;li&gt;The tester praised the direct platform action buttons (&lt;code&gt;Apply on LinkedIn ↗&lt;/code&gt;) and the ability to personalize commercial rates and GitHub portfolio links in the sidebar.&lt;/li&gt;
&lt;/ul&gt;




</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>gemma</category>
      <category>hacktoberfest</category>
    </item>
  </channel>
</rss>
