<?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: techtech</title>
    <description>The latest articles on DEV Community by techtech (@techtech).</description>
    <link>https://dev.to/techtech</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1110585%2F6025dd24-0eb3-4de9-96f7-8a600fdc0bfb.jpeg</url>
      <title>DEV Community: techtech</title>
      <link>https://dev.to/techtech</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/techtech"/>
    <language>en</language>
    <item>
      <title>Bento.me is Gone, so I Built My Own (For Free)</title>
      <dc:creator>techtech</dc:creator>
      <pubDate>Thu, 05 Mar 2026 15:26:37 +0000</pubDate>
      <link>https://dev.to/techtech/bentome-is-gone-so-i-built-my-own-for-free-12n1</link>
      <guid>https://dev.to/techtech/bentome-is-gone-so-i-built-my-own-for-free-12n1</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F191c3gn2k8lnfn81424t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F191c3gn2k8lnfn81424t.png" alt=" " width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F64e9t2p9tsexet8jp9yg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F64e9t2p9tsexet8jp9yg.png" alt=" " width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check it out on &lt;a href="https://www.producthunt.com/products/linkbase-2?launch=linkbase-3" rel="noopener noreferrer"&gt;ProductHunt!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you've ever relied on Linktree, Bento.me, or any other link-in-bio platform, you probably know the frustration: limited customization on the free plan, features locked behind a paywall, and sometimes — the service just goes down.&lt;/p&gt;

&lt;p&gt;That's exactly why I built &lt;strong&gt;&lt;a href="https://links.xn--schchner-2za.de/" rel="noopener noreferrer"&gt;Linkbase&lt;/a&gt;&lt;/strong&gt; — a fully open-source, self-hostable link-in-bio platform. And here's the kicker: &lt;strong&gt;everything is free, forever&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Linkbase?
&lt;/h2&gt;

&lt;p&gt;Linkbase is a modern link-in-bio platform that gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A beautiful &lt;strong&gt;bento grid&lt;/strong&gt; profile page with drag-and-drop editing&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;built-in blog&lt;/strong&gt; — write and publish articles directly on your profile&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Short link creation&lt;/strong&gt; with real-time click tracking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI theme generator&lt;/strong&gt; — describe a vibe, get a color scheme&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Detailed analytics&lt;/strong&gt; — see which links and pages perform best&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Social embeds&lt;/strong&gt; for YouTube, Spotify, GitHub, Instagram, and more&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;QR code cards&lt;/strong&gt;, testimonial widgets, FAQ blocks&lt;/li&gt;
&lt;li&gt;Full &lt;strong&gt;design control&lt;/strong&gt;: fonts, gradients, borders, corner radii — everything&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All of this, at &lt;strong&gt;$0&lt;/strong&gt;. No credit card required.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who is it for?
&lt;/h2&gt;

&lt;p&gt;Anyone who wants a single link to represent everything they do online:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Developers sharing their GitHub projects and blog&lt;/li&gt;
&lt;li&gt;Creators linking their YouTube, Spotify, and social profiles&lt;/li&gt;
&lt;li&gt;Freelancers using it as a digital business card&lt;/li&gt;
&lt;li&gt;Anyone who was burned by a third-party bio-link tool going down&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Linkbase vs. the Competition
&lt;/h2&gt;

&lt;p&gt;Here's a quick comparison of what you get for free:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Linkbase&lt;/th&gt;
&lt;th&gt;Others (free tier)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Unlimited links &amp;amp; pages&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Built-in blog&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Short link tracking&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Social embeds&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI theme generator&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bento grid layout&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Paid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Free forever&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$5–24/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Try it Out
&lt;/h2&gt;

&lt;p&gt;➡️ &lt;strong&gt;&lt;a href="https://links.xn--schchner-2za.de/" rel="noopener noreferrer"&gt;links.schächner.de&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sign up in seconds — just your email, no credit card. Build your page, add your links, write a blog post, and share one link everywhere.&lt;/p&gt;

&lt;p&gt;Linkbase is still being actively developed, and early users directly shape the roadmap. If you have feature requests or feedback, drop them in the comments — I read everything.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with a focus on performance, privacy, and full user control. Self-hosting documentation coming soon.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>linktree</category>
      <category>bio</category>
    </item>
    <item>
      <title>Bento.me and Linktree alternative!
Check it out!</title>
      <dc:creator>techtech</dc:creator>
      <pubDate>Mon, 23 Feb 2026 18:16:52 +0000</pubDate>
      <link>https://dev.to/techtech/bentome-and-linktree-alternativecheck-it-out-4ni4</link>
      <guid>https://dev.to/techtech/bentome-and-linktree-alternativecheck-it-out-4ni4</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/techtech/bentome-is-down-so-i-built-my-own-3d08" class="crayons-story__hidden-navigation-link"&gt;Bento.me is down, so I built my own&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/techtech" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1110585%2F6025dd24-0eb3-4de9-96f7-8a600fdc0bfb.jpeg" alt="techtech profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/techtech" class="crayons-story__secondary fw-medium m:hidden"&gt;
              techtech
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                techtech
                
              
              &lt;div id="story-author-preview-content-3274895" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/techtech" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1110585%2F6025dd24-0eb3-4de9-96f7-8a600fdc0bfb.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;techtech&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/techtech/bentome-is-down-so-i-built-my-own-3d08" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Feb 23&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/techtech/bentome-is-down-so-i-built-my-own-3d08" id="article-link-3274895"&gt;
          Bento.me is down, so I built my own
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/website"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;website&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/linktree"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;linktree&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/bio"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;bio&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/techtech/bentome-is-down-so-i-built-my-own-3d08#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              4&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;




</description>
      <category>website</category>
      <category>linktree</category>
      <category>bio</category>
    </item>
    <item>
      <title>Bento.me is down, so I built my own</title>
      <dc:creator>techtech</dc:creator>
      <pubDate>Mon, 23 Feb 2026 18:14:03 +0000</pubDate>
      <link>https://dev.to/techtech/bentome-is-down-so-i-built-my-own-3d08</link>
      <guid>https://dev.to/techtech/bentome-is-down-so-i-built-my-own-3d08</guid>
      <description>&lt;p&gt;Bento.me, a really nice link-in-bio tool, has been gone for a while now. So I created one myself using AI!&lt;/p&gt;

&lt;p&gt;I wanted something that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I fully control&lt;/li&gt;
&lt;li&gt;Looks actually good&lt;/li&gt;
&lt;li&gt;has many personalization options&lt;/li&gt;
&lt;li&gt;Is fast and lightweight&lt;/li&gt;
&lt;li&gt;Has room to grow (blog, analytics, embeds...)&lt;/li&gt;
&lt;li&gt;Not just optimized for mobile devices&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Introducing Linkbase
&lt;/h2&gt;

&lt;p&gt;So I built &lt;strong&gt;&lt;a href="https://links.xn--schchner-2za.de/" rel="noopener noreferrer"&gt;Linkbase&lt;/a&gt;&lt;/strong&gt; — a vibrant, customizable link-in-bio platform that lives at our own domain.&lt;/p&gt;

&lt;p&gt;Here's what it offers right now:&lt;/p&gt;

&lt;h3&gt;
  
  
  Full Design Control
&lt;/h3&gt;

&lt;p&gt;Forget boring templates. With Linkbase you can fine-tune colors, backgrounds, borders, corner radiuses — basically every visual aspect of your profile page. It's your page, it should look like &lt;em&gt;you&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Integrated Blog
&lt;/h3&gt;

&lt;p&gt;This was a big one for me. Instead of linking out to a separate blog platform, Linkbase comes with a built-in blog. Write articles, share updates, connect with your audience — all from one place, under your own brand.&lt;/p&gt;

&lt;h3&gt;
  
  
  All Your Content in One Place
&lt;/h3&gt;

&lt;p&gt;Link to your socials, embed a Spotify track, feature another creator's profile. Linkbase is meant to be your central hub for everything you do online.&lt;/p&gt;

&lt;h3&gt;
  
  
  Analytics (Coming Soon)
&lt;/h3&gt;

&lt;p&gt;Deep insights into your audience are on the roadmap — which links get the most clicks, what content resonates, and more.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;p&gt;It's a modern web app with a focus on performance and a clean developer experience. Everything is hosted under my own domain (&lt;code&gt;links.schächner.de&lt;/code&gt;), which means I'm in full control of availability and data. I also used Firebase Studio for vibe coding.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Out
&lt;/h2&gt;

&lt;p&gt;➡️ &lt;a href="https://links.xn--schchner-2za.de/" rel="noopener noreferrer"&gt;links.schächner.de&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;I built this because I was frustrated with the status quo. If you've had similar experiences with third-party link-in-bio tools going down or locking features behind paywalls, I'd love to hear your thoughts in the comments.&lt;/p&gt;

&lt;p&gt;And if you try Linkbase, let me know what you think!&lt;/p&gt;

</description>
      <category>website</category>
      <category>linktree</category>
      <category>bio</category>
    </item>
    <item>
      <title>😮‍💨 I created my own face recognition system</title>
      <dc:creator>techtech</dc:creator>
      <pubDate>Mon, 29 Sep 2025 16:38:12 +0000</pubDate>
      <link>https://dev.to/techtech/face-recognition-system-that-actually-works-453e</link>
      <guid>https://dev.to/techtech/face-recognition-system-that-actually-works-453e</guid>
      <description>&lt;h2&gt;
  
  
  Building a Privacy-First Face Recognition System That Actually Works 🔍
&lt;/h2&gt;

&lt;p&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/SchBenedikt" rel="noopener noreferrer"&gt;
        SchBenedikt
      &lt;/a&gt; / &lt;a href="https://github.com/SchBenedikt/face" rel="noopener noreferrer"&gt;
        face
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Local face detection + recognition (Pimeyes alternative)
    &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;🔍 Advanced Face Recognition Search System&lt;/h1&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/95f633cfa8a77653c67127646f57ad6c0d683abd10bab8a345fb4c01754a6aa0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707974686f6e2d76332e31312b2d626c75652e737667"&gt;&lt;img src="https://camo.githubusercontent.com/95f633cfa8a77653c67127646f57ad6c0d683abd10bab8a345fb4c01754a6aa0/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f707974686f6e2d76332e31312b2d626c75652e737667" alt="Python"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/c1bc7faf8cb85104323d76916703517d3f3e46042d3524e18a3834191bbd4431/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f73747265616d6c69742d312e33322b2d7265642e737667"&gt;&lt;img src="https://camo.githubusercontent.com/c1bc7faf8cb85104323d76916703517d3f3e46042d3524e18a3834191bbd4431/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f73747265616d6c69742d312e33322b2d7265642e737667" alt="Streamlit"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/8bb50fd2278f18fc326bf71f6e88ca8f884f72f179d3e555e20ed30157190d0d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d677265656e2e737667"&gt;&lt;img src="https://camo.githubusercontent.com/8bb50fd2278f18fc326bf71f6e88ca8f884f72f179d3e555e20ed30157190d0d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d677265656e2e737667" alt="License"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/020aa4014c85918ed0f4b5fa68585d80e97bfead755f7019b73e03310c8ae254/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f53636842656e6564696b742f666163652e737667"&gt;&lt;img src="https://camo.githubusercontent.com/020aa4014c85918ed0f4b5fa68585d80e97bfead755f7019b73e03310c8ae254/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f53636842656e6564696b742f666163652e737667" alt="Issues"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;🚀 State-of-the-art facial recognition system with intelligent search, quality filtering, and advanced analytics&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/SchBenedikt/face#documentation" rel="noopener noreferrer"&gt;📖 Documentation&lt;/a&gt; • &lt;a href="https://github.com/SchBenedikt/face#quick-start" rel="noopener noreferrer"&gt;⚡ Quick Start&lt;/a&gt; • &lt;a href="https://github.com/SchBenedikt/face#features" rel="noopener noreferrer"&gt;🎯 Features&lt;/a&gt; • &lt;a href="https://github.com/SchBenedikt/face#-ai-models--technical-deep-dive" rel="noopener noreferrer"&gt;🧠 AI Models&lt;/a&gt; • &lt;a href="https://github.com/SchBenedikt/face#installation" rel="noopener noreferrer"&gt;🛠️ Installation&lt;/a&gt; • &lt;a href="https://github.com/SchBenedikt/face#contributing" rel="noopener noreferrer"&gt;🤝 Contributing&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📚 Table of Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/SchBenedikt/face#-quick-start" rel="noopener noreferrer"&gt;🚀 Quick Start&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SchBenedikt/face#-what-makes-this-special" rel="noopener noreferrer"&gt;🌟 What Makes This Special?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SchBenedikt/face#-key-features" rel="noopener noreferrer"&gt;🎯 Key Features&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SchBenedikt/face#-ai-models--technical-deep-dive" rel="noopener noreferrer"&gt;🧠 AI Models &amp;amp; Technical Deep Dive&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SchBenedikt/face#%EF%B8%8F-architecture" rel="noopener noreferrer"&gt;🏗️ Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SchBenedikt/face#%EF%B8%8F-installation" rel="noopener noreferrer"&gt;🛠️ Installation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SchBenedikt/face#-data-processing-workflow" rel="noopener noreferrer"&gt;📥 Data Processing Workflow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SchBenedikt/face#-use-cases" rel="noopener noreferrer"&gt;🎯 Use Cases&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SchBenedikt/face#%EF%B8%8F-important-considerations" rel="noopener noreferrer"&gt;⚠️ Important Considerations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/SchBenedikt/face#-contributing" rel="noopener noreferrer"&gt;🤝 Contributing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🚀 Quick Start&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Clone the repository&lt;/span&gt;
git clone https://github.com/SchBenedikt/face.git
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; face

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Install dependencies&lt;/span&gt;
pip install -r requirements.txt

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Set up the environment&lt;/span&gt;
python setup_env.py

&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; Launch the web interface&lt;/span&gt;
streamlit run app.py&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;🎉 That's it!&lt;/strong&gt; Open your browser to &lt;code&gt;http://localhost:8501&lt;/code&gt; and start exploring.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🌟 What Makes This Special?&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;This isn't just another face recognition tool. It's a &lt;strong&gt;comprehensive facial intelligence platform&lt;/strong&gt; that combines cutting-edge AI with practical usability:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🧠 Multi-Model AI&lt;/strong&gt;…&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/SchBenedikt/face" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;&lt;em&gt;How I created a face recognition system that processes locally and respects user privacy&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 The Problem with Current Face Recognition
&lt;/h2&gt;

&lt;p&gt;Most face recognition systems today have three major issues:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Privacy concerns&lt;/strong&gt; - your photos go to the cloud&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Black box algorithms&lt;/strong&gt; - you can't see how they work&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limited accuracy&lt;/strong&gt; - especially on diverse datasets&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After working with computer vision for several years, I decided to build something different: a &lt;strong&gt;completely local, transparent, and highly accurate&lt;/strong&gt; face recognition system.&lt;/p&gt;

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

&lt;p&gt;Meet the &lt;strong&gt;Advanced Face Recognition Search System&lt;/strong&gt; - a comprehensive facial intelligence platform that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧠 Uses &lt;strong&gt;multi-model AI ensembles&lt;/strong&gt; for 99%+ accuracy&lt;/li&gt;
&lt;li&gt;🔒 Processes everything &lt;strong&gt;locally&lt;/strong&gt; (GDPR compliant)&lt;/li&gt;
&lt;li&gt;⚡ Handles &lt;strong&gt;thousands of images&lt;/strong&gt; with optimized batch processing&lt;/li&gt;
&lt;li&gt;🎯 Includes &lt;strong&gt;smart quality filtering&lt;/strong&gt; to eliminate false positives&lt;/li&gt;
&lt;li&gt;📊 Provides &lt;strong&gt;rich analytics&lt;/strong&gt; (age, gender, emotion, ethnicity)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔬 The Technical Deep Dive
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Multi-Model Ensemble Architecture
&lt;/h3&gt;

&lt;p&gt;Instead of relying on a single model, I implemented an ensemble approach using four state-of-the-art models:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Python Implementation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;FaceRecognitionEngine&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# Ensemble of 4 Deep Learning models
&lt;/span&gt;        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Facenet512&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ArcFace&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;VGG-Face&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Facenet&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ensemble_weights&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_calculate_dynamic_weights&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;detection_backends&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;opencv&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mtcnn&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;retinaface&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;extract_ensemble_embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;face_location&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Extract embeddings using all models and fuse them intelligently&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
        &lt;span class="n"&gt;embeddings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;

        &lt;span class="c1"&gt;# Extract embeddings from each model
&lt;/span&gt;        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;model_name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;models&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_extract_single_embedding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;face_location&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;model_name&lt;/span&gt;
                &lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;embedding&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;model_name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;embedding&lt;/span&gt;
            &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Model &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;model_name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; failed: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Adaptive weighted fusion based on image quality
&lt;/span&gt;        &lt;span class="n"&gt;quality_metrics&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_analyze_image_quality&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;adaptive_weights&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_calculate_adaptive_weights&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;quality_metrics&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;embeddings&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;_weighted_ensemble_fusion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;adaptive_weights&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Why This Ensemble Approach Works
&lt;/h3&gt;

&lt;p&gt;Each model has different strengths:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FaceNet512&lt;/strong&gt;: Excellent for high-quality frontal faces&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ArcFace&lt;/strong&gt;: Superior performance on profile views and varying poses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VGG-Face&lt;/strong&gt;: Robust against lighting variations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FaceNet&lt;/strong&gt;: Fast processing for real-time applications&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Advanced Similarity Calculation
&lt;/h3&gt;

&lt;p&gt;Instead of simple cosine similarity, I implemented a multi-metric approach:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-Metric Similarity Function:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_calculate_comprehensive_similarity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;embedding1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;embedding2&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Multi-metric similarity calculation with 4 different algorithms&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Normalize embeddings
&lt;/span&gt;    &lt;span class="n"&gt;emb1_norm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;embedding1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embedding1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;1e-8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;emb2_norm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;embedding2&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;embedding2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;1e-8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Calculate multiple similarity metrics
&lt;/span&gt;    &lt;span class="n"&gt;cosine_sim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emb1_norm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;emb2_norm&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;euclidean_sim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;linalg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;norm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emb1_norm&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;emb2_norm&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;manhattan_sim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emb1_norm&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;emb2_norm&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emb1_norm&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Correlation similarity
&lt;/span&gt;    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;correlation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;corrcoef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;emb1_norm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;emb2_norm&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;corr_sim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;correlation&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isnan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;correlation&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;corr_sim&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;

    &lt;span class="c1"&gt;# Weighted fusion of all metrics
&lt;/span&gt;    &lt;span class="n"&gt;weights&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cosine&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.45&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;euclidean&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;correlation&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.15&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;manhattan&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.15&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;primary_similarity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;cosine_sim&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;weights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;cosine&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="n"&gt;euclidean_sim&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;weights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;euclidean&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="n"&gt;corr_sim&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;weights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;correlation&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;
        &lt;span class="n"&gt;manhattan_sim&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;weights&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;manhattan&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;primary_similarity&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;primary_similarity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;confidence_score&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;std&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="n"&gt;cosine_sim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;euclidean_sim&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;corr_sim&lt;/span&gt;
        &lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🎨 The User Experience
&lt;/h2&gt;

&lt;p&gt;I built the interface using &lt;strong&gt;Streamlit&lt;/strong&gt; to make it accessible to non-technical users. The system currently works with &lt;strong&gt;static images only&lt;/strong&gt; (JPG, PNG, BMP, WEBP formats) - no video processing capabilities yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Smart Face Detection
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Image Upload and Processing:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;analyze_uploaded_image_for_faces&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;uploaded_file&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_results&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;similarity_threshold&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Analyze uploaded image and detect faces with quality assessment&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;spinner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🔍 Analyzing image and detecting faces...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="c1"&gt;# Load and preprocess image
&lt;/span&gt;            &lt;span class="n"&gt;query_image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;load_and_preprocess_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;temp_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="c1"&gt;# Multi-backend face detection for robustness
&lt;/span&gt;            &lt;span class="n"&gt;face_locations&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;face_engine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;detect_faces&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query_image&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;face_locations&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;warning&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
                ❌ **No faces detected!** 

                **Tips for better results:**
                - Use an image with clearly visible face
                - Ensure the face is well-lit
                - Avoid images that are too small (minimum: 30x30 pixels per face)
                &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt;

            &lt;span class="c1"&gt;# Store results for face selection
&lt;/span&gt;            &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;session_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;detected_faces&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;image&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;query_image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;face_locations&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;face_locations&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;max_results&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;max_results&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;similarity_threshold&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;similarity_threshold&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;

            &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;success&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✅ &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;face_locations&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; face(s) detected!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;st&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;❌ Error analyzing image: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Quality-Based Filtering
&lt;/h3&gt;

&lt;p&gt;One of the biggest challenges in face recognition is dealing with poor-quality images. I implemented comprehensive quality assessment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;assess_image_quality&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;image&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;face_location&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    \&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Comprehensive image quality assessment&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;
    face_crop = self._extract_face_region(image, face_location)

    quality_scores = {}

    # Sharpness analysis using Laplacian variance
    gray = cv2.cvtColor(face_crop, cv2.COLOR_BGR2GRAY)
    laplacian_var = cv2.Laplacian(gray, cv2.CV_64F).var()
    quality_scores[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;sharpness&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;] = min(laplacian_var / 500.0, 1.0)

    # Contrast measurement
    contrast = gray.std()
    quality_scores[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;contrast&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;] = min(contrast / 64.0, 1.0)

    # Face size relative to image
    face_height = face_location[2] - face_location[0]
    face_width = face_location[1] - face_location[3]
    face_area = face_height * face_width
    quality_scores[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;size&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;] = min(face_area / 2500, 1.0)  # Optimal at 50x50+

    # Overall quality score
    overall_quality = np.mean(list(quality_scores.values()))

    return {
        &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;individual_scores&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;: quality_scores,
        &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;overall_quality&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;: overall_quality,
        &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;is_high_quality&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;: overall_quality &amp;gt; 0.6
    }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📊 Performance Overview
&lt;/h2&gt;

&lt;p&gt;The system shows promising results in testing environments:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Processing Capabilities:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Image Processing&lt;/strong&gt;: Handles JPG, PNG, BMP, and WEBP formats&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch Processing&lt;/strong&gt;: Can process multiple images sequentially &lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database Storage&lt;/strong&gt;: Uses ChromaDB for vector storage and retrieval&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search Performance&lt;/strong&gt;: Sub-second similarity search for moderate datasets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory Efficiency&lt;/strong&gt;: Optimized for typical desktop/laptop hardware&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Quality Factors:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Performance&lt;/strong&gt;: High-quality frontal faces with good lighting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Moderate Performance&lt;/strong&gt;: Profile views and varying poses&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Challenging Conditions&lt;/strong&gt;: Poor lighting and low resolution images&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardware Dependent&lt;/strong&gt;: Performance varies significantly with available RAM and CPU&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔒 Privacy-First Design
&lt;/h2&gt;

&lt;p&gt;Privacy was a core design principle from day one:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Local-Only Processing
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# No external API calls - everything runs locally
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;process_face_recognition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image_path&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;All processing happens on user&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;s machine&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Load models locally (downloaded once)
&lt;/span&gt;    &lt;span class="n"&gt;face_engine&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FaceRecognitionEngine&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="c1"&gt;# Process image without any network requests
&lt;/span&gt;    &lt;span class="n"&gt;faces&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;face_engine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;detect_faces&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cv2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;imread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image_path&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;embeddings&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;face_engine&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;extract_embeddings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;image_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;faces&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# Store in local database only
&lt;/span&gt;    &lt;span class="n"&gt;vector_store&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_faces&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;embeddings&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
        &lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;image_path&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;image_path&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;faces&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. GDPR Compliance Features
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PrivacyComplianceManager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    \&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\"\"&lt;/span&gt;&lt;span class="s"&gt;Built-in GDPR compliance tools&lt;/span&gt;&lt;span class="se"&gt;\"\"\"&lt;/span&gt;&lt;span class="s"&gt;

    def exercise_right_of_erasure(self, data_subject_id):
        &lt;/span&gt;&lt;span class="se"&gt;\"\"\"&lt;/span&gt;&lt;span class="s"&gt;Complete data deletion on request&lt;/span&gt;&lt;span class="se"&gt;\"\"\"&lt;/span&gt;&lt;span class="s"&gt;
        # Remove from vector database
        deleted_faces = self._delete_face_embeddings(data_subject_id)

        # Remove from metadata
        deleted_metadata = self._delete_metadata(data_subject_id)

        # Secure memory wipe
        self._secure_memory_wipe(data_subject_id)

        return {
            &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;status&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;completed&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;,
            &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;items_deleted&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;: deleted_faces + deleted_metadata
        }
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🚀 Real-World Applications
&lt;/h2&gt;

&lt;p&gt;The system has been tested in several scenarios:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Photo Organization&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Process 10,000+ family photos in under 30 minutes&lt;/li&gt;
&lt;li&gt;Automatically group photos by person&lt;/li&gt;
&lt;li&gt;Find specific people across years of photos&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Historical Research&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Digitize and organize historical photo collections&lt;/li&gt;
&lt;li&gt;Track individuals across different time periods&lt;/li&gt;
&lt;li&gt;Genealogical research applications&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Content Creation&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Organize media assets for video production&lt;/li&gt;
&lt;li&gt;Find specific shots of people in large footage collections&lt;/li&gt;
&lt;li&gt;Automated tagging for media libraries&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🛠️ How to Get Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Quick Setup (5 minutes)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Clone the repository&lt;/span&gt;
git clone https://github.com/SchBenedikt/face.git
&lt;span class="nb"&gt;cd &lt;/span&gt;face

&lt;span class="c"&gt;# 2. Create virtual environment&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv myenv
&lt;span class="nb"&gt;source &lt;/span&gt;myenv/bin/activate  &lt;span class="c"&gt;# On Windows: myenv\\Scripts\\activate&lt;/span&gt;

&lt;span class="c"&gt;# 3. Install dependencies&lt;/span&gt;
pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt

&lt;span class="c"&gt;# 4. Initialize the system&lt;/span&gt;
python setup_env.py

&lt;span class="c"&gt;# 5. Launch the web interface&lt;/span&gt;
streamlit run app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  First Use
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Upload Test Images&lt;/strong&gt;: Add some photos to the &lt;code&gt;data/images&lt;/code&gt; folder&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Process Images&lt;/strong&gt;: Use the batch processing feature to analyze all images&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search Faces&lt;/strong&gt;: Upload a photo and find similar faces instantly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explore Analytics&lt;/strong&gt;: Try the facial analysis features&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🔬 Technical Challenges Solved
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Memory Optimization for Large Datasets&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Working with 75,000+ face embeddings required careful memory management:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;batch_process_images&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;image_paths&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;batch_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    \&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\"\"&lt;/span&gt;&lt;span class="s"&gt;Memory-efficient batch processing&lt;/span&gt;&lt;span class="se"&gt;\"\"\"&lt;/span&gt;&lt;span class="s"&gt;
    for i in range(0, len(image_paths), batch_size):
        batch = image_paths[i:i + batch_size]

        # Process batch
        batch_results = []
        for image_path in batch:
            faces = self._process_single_image(image_path)
            batch_results.extend(faces)

        # Store batch results
        self.vector_store.add_batch(batch_results)

        # Clear memory
        gc.collect()

        yield len(batch_results)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. &lt;strong&gt;Cross-Platform Compatibility&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Ensuring the system works on Windows, macOS, and Linux:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;setup_cross_platform_dependencies&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    \&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\"\"&lt;/span&gt;&lt;span class="s"&gt;Handle platform-specific requirements&lt;/span&gt;&lt;span class="se"&gt;\"\"\"&lt;/span&gt;&lt;span class="s"&gt;
    if platform.system() == &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;Windows&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;:
        # Windows-specific dlib installation
        install_windows_dlib()
    elif platform.system() == &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;Darwin&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;:  # macOS
        # macOS-specific optimizations
        setup_macos_accelerate()
    else:  # Linux
        # Linux-specific CUDA setup
        setup_linux_cuda()
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📈 What's Next?
&lt;/h2&gt;

&lt;p&gt;I'm working on several exciting features:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Real-Time Processing&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Live camera integration&lt;/li&gt;
&lt;li&gt;Real-time face tracking&lt;/li&gt;
&lt;li&gt;Instant similarity search&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Mobile Applications&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;iOS/Android apps with local processing&lt;/li&gt;
&lt;li&gt;Cross-device synchronization&lt;/li&gt;
&lt;li&gt;Mobile-optimized models&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Advanced Analytics&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Emotion tracking over time&lt;/li&gt;
&lt;li&gt;Age progression analysis&lt;/li&gt;
&lt;li&gt;Demographic insights with bias detection&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🤝 Join the Community
&lt;/h2&gt;

&lt;p&gt;This project is completely open source, and I'd love your contributions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🌟 Star the repo&lt;/strong&gt; if you find it useful&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🐛 Report issues&lt;/strong&gt; to help improve the system&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;💡 Suggest features&lt;/strong&gt; for future development&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🔧 Submit PRs&lt;/strong&gt; to contribute code&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ways to Contribute
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Code Contributions&lt;/strong&gt;: New features, bug fixes, optimizations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: Tutorials, examples, translations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Testing&lt;/strong&gt;: Try it with your datasets and report results&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feedback&lt;/strong&gt;: Share your use cases and experiences&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🎯 Key Takeaways
&lt;/h2&gt;

&lt;p&gt;Building this face recognition system taught me several important lessons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Ensemble methods&lt;/strong&gt; significantly improve accuracy over single models&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy-first design&lt;/strong&gt; doesn't have to compromise functionality&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quality assessment&lt;/strong&gt; is crucial for production systems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User experience&lt;/strong&gt; matters as much as technical performance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open source&lt;/strong&gt; accelerates innovation and builds trust&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  📚 Resources &amp;amp; Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository&lt;/strong&gt;: &lt;a href="https://github.com/SchBenedikt/face" rel="noopener noreferrer"&gt;SchBenedikt/face&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Have you built similar systems? What challenges did you face? Share your experiences in the comments below!&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;This article was written by AI&lt;/p&gt;

</description>
      <category>ai</category>
      <category>deeplearning</category>
      <category>python</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>I created my own AI search engine</title>
      <dc:creator>techtech</dc:creator>
      <pubDate>Wed, 23 Apr 2025 20:06:24 +0000</pubDate>
      <link>https://dev.to/techtech/ich-habe-meine-eigene-ki-suchmaschine-erstellt-c12</link>
      <guid>https://dev.to/techtech/ich-habe-meine-eigene-ki-suchmaschine-erstellt-c12</guid>
      <description>&lt;h2&gt;
  
  
  Hello everyone 👋
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3sjggdhcbmodat4lilzc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3sjggdhcbmodat4lilzc.png" alt=" "&gt;&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/SchBenedikt" rel="noopener noreferrer"&gt;
        SchBenedikt
      &lt;/a&gt; / &lt;a href="https://github.com/SchBenedikt/search-engine" rel="noopener noreferrer"&gt;
        search-engine
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      AI search 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;🚀 Search Engine&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;The matching search engine to my &lt;a href="https://github.com/SchBenedikt/web-crawler" rel="noopener noreferrer"&gt;web crawler&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/137323528/433053588-88c0138a-77c5-440e-a1ce-ae4f583843a5.jpeg?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDg2NzIsIm5iZiI6MTc3NDY0ODM3MiwicGF0aCI6Ii8xMzczMjM1MjgvNDMzMDUzNTg4LTg4YzAxMzhhLTc3YzUtNDQwZS1hMWNlLWFlNGY1ODM4NDNhNS5qcGVnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDMyNyUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAzMjdUMjE1MjUyWiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9YzIyOTY3MTNmNTkyYWI5MjE0OGNkOGFkOWIxYjNmZjk0MTViN2FjMTA4NTE5OTI1YWJmOGY2NjU4ZjRkNmIzZiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.xz6q5_NDs6by3oCt2JVINGuAoisS5vPA_Jpnp1OL7ic"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F137323528%2F433053588-88c0138a-77c5-440e-a1ce-ae4f583843a5.jpeg%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDg2NzIsIm5iZiI6MTc3NDY0ODM3MiwicGF0aCI6Ii8xMzczMjM1MjgvNDMzMDUzNTg4LTg4YzAxMzhhLTc3YzUtNDQwZS1hMWNlLWFlNGY1ODM4NDNhNS5qcGVnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QUtJQVZDT0RZTFNBNTNQUUs0WkElMkYyMDI2MDMyNyUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNjAzMjdUMjE1MjUyWiZYLUFtei1FeHBpcmVzPTMwMCZYLUFtei1TaWduYXR1cmU9YzIyOTY3MTNmNTkyYWI5MjE0OGNkOGFkOWIxYjNmZjk0MTViN2FjMTA4NTE5OTI1YWJmOGY2NjU4ZjRkNmIzZiZYLUFtei1TaWduZWRIZWFkZXJzPWhvc3QifQ.xz6q5_NDs6by3oCt2JVINGuAoisS5vPA_Jpnp1OL7ic" alt="Search · 4 31pm · 04-12"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;✨ Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;🌐 &lt;strong&gt;Modern 3D Interactive Landing Page&lt;/strong&gt; with full-screen visualizations that dynamically adapt to different screen sizes&lt;/li&gt;
&lt;li&gt;🤖 &lt;strong&gt;AI-Powered Answers&lt;/strong&gt; providing instant responses with verified sources&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;Knowledge Panels&lt;/strong&gt; displaying relevant information from Wikipedia and trusted sources&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;Smart Search&lt;/strong&gt; with real-time search speed display&lt;/li&gt;
&lt;li&gt;📝 &lt;strong&gt;Website Summaries&lt;/strong&gt; generated by AI to save reading time&lt;/li&gt;
&lt;li&gt;🔍 &lt;strong&gt;Google Integration&lt;/strong&gt; for comprehensive search results&lt;/li&gt;
&lt;li&gt;🌙 &lt;strong&gt;Dark Mode Support&lt;/strong&gt; for comfortable viewing in all lighting conditions&lt;/li&gt;
&lt;li&gt;📱 &lt;strong&gt;Responsive Design&lt;/strong&gt; optimized for all devices&lt;/li&gt;
&lt;li&gt;🗄️ &lt;strong&gt;MongoDB Backend&lt;/strong&gt; for efficient data operations&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;📄 Detailed Feature Overview&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/137323528/433053602-b70ec5c0-a7ea-4c12-8618-42e6ee9afc5a.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDg2NzIsIm5iZiI6MTc3NDY0ODM3MiwicGF0aCI6Ii8xMzczMjM1MjgvNDMzMDUzNjAyLWI3MGVjNWMwLWE3ZWEtNGMxMi04NjE4LTQyZTZlZTlhZmM1YS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMzI3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDMyN1QyMTUyNTJaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0yMTczNTNiMWRmYmZhZjExOWNkZGQ1ODViMzBiM2NhZjBjZGU1MDc5NWUyZDJhYWUxYjYxZWFlNzc5OGExMWYyJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.ZXT1mL_1eFOT7CJzf1P4wg6l3YWOpo0VPWONxyUfpq0"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F137323528%2F433053602-b70ec5c0-a7ea-4c12-8618-42e6ee9afc5a.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDg2NzIsIm5iZiI6MTc3NDY0ODM3MiwicGF0aCI6Ii8xMzczMjM1MjgvNDMzMDUzNjAyLWI3MGVjNWMwLWE3ZWEtNGMxMi04NjE4LTQyZTZlZTlhZmM1YS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMzI3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDMyN1QyMTUyNTJaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0yMTczNTNiMWRmYmZhZjExOWNkZGQ1ODViMzBiM2NhZjBjZGU1MDc5NWUyZDJhYWUxYjYxZWFlNzc5OGExMWYyJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.ZXT1mL_1eFOT7CJzf1P4wg6l3YWOpo0VPWONxyUfpq0" alt="Capture-2025-04-12-163138"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;🌐 Modern 3D Landing Page&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;The search engine features a stunning 3D visualization on the landing page created with Three.js. The visualization creates an immersive experience with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🖱️ Dynamic node connections that respond to mouse movements&lt;/li&gt;
&lt;li&gt;📱 Responsive design that works across devices&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;🤖 AI-Powered Features&lt;/h3&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/SchBenedikt/search-engine" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Today, I’d like to introduce you to my AI-powered search engine. It’s &lt;strong&gt;completely free&lt;/strong&gt;, available on GitHub, and can be &lt;strong&gt;self-hosted&lt;/strong&gt;. There are tons of awesome features, which I’ll list below:&lt;/p&gt;




&lt;h2&gt;
  
  
  🤖 AI Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🧠 AI Search Summary
&lt;/h3&gt;

&lt;p&gt;Every time you search, an AI-generated summary is created to give you a quick overview of the topic.&lt;/p&gt;

&lt;h3&gt;
  
  
  💬 AI Website Chat
&lt;/h3&gt;

&lt;p&gt;For every search result—whether from a local database or Google—the content of the website is fetched, and you can &lt;strong&gt;chat with it directly&lt;/strong&gt;, since the AI has access to its content.&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F17vi6tkcy1zq09gm47p4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F17vi6tkcy1zq09gm47p4.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🖱️ Hover Summary
&lt;/h3&gt;

&lt;p&gt;Hover over a search result to get a short summary of the website content—similar to the Arc Browser experience.&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4zrnpr8gd9ul9mr0dlu8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4zrnpr8gd9ul9mr0dlu8.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 Search Results
&lt;/h2&gt;

&lt;p&gt;Search results can come either from a &lt;strong&gt;local database using a web crawler&lt;/strong&gt; or from &lt;strong&gt;Google’s Custom Search Engine&lt;/strong&gt; (those are highlighted in blue).&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6udnstxp6elyxrk0bs58.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6udnstxp6elyxrk0bs58.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks to the Google integration, a &lt;strong&gt;sidebar&lt;/strong&gt; provides keyword suggestions—just like in Google!&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frr4g2oct1plh4lm2sr3a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frr4g2oct1plh4lm2sr3a.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  📚 Sidebar Features
&lt;/h2&gt;

&lt;p&gt;The sidebar offers several helpful features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔁 &lt;strong&gt;Suggested keywords&lt;/strong&gt; to expand your search&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📘 &lt;strong&gt;Wikipedia preview&lt;/strong&gt; if a matching article is found&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgw23m7livq0lhkmee7b4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgw23m7livq0lhkmee7b4.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;💡 &lt;strong&gt;Stack Overflow integration&lt;/strong&gt; makes it super easy for developers to look up problems and solutions directly&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmjnmd93a49ordja6xy0u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmjnmd93a49ordja6xy0u.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🧑‍💻 &lt;strong&gt;GitHub integration&lt;/strong&gt; shows company or user profiles, including the latest 3 updated repositories&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwbmzph9jp5osz24hjfgw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwbmzph9jp5osz24hjfgw.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⭐ Special Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  🌤️ Weather
&lt;/h3&gt;

&lt;p&gt;If you search for the weather, a weather overview will appear &lt;em&gt;before&lt;/em&gt; the AI summary—complete with real-time data (the AI also has internet access).&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9fuchcv1dhc4l13xzno1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9fuchcv1dhc4l13xzno1.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  💰 Crypto Prices
&lt;/h3&gt;

&lt;p&gt;Crypto prices are shown in a similar way to the weather results—&lt;strong&gt;right at the top&lt;/strong&gt;, for quick access.&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3wgc1g9yo7ic6zh4zm09.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3wgc1g9yo7ic6zh4zm09.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;How do you like my search engine?&lt;br&gt;&lt;br&gt;
I’d love to hear your feedback, comments, and reactions! 💬✨&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>python</category>
    </item>
    <item>
      <title>macOS AI Agent</title>
      <dc:creator>techtech</dc:creator>
      <pubDate>Wed, 09 Apr 2025 18:53:02 +0000</pubDate>
      <link>https://dev.to/techtech/macos-ai-agent-3k5g</link>
      <guid>https://dev.to/techtech/macos-ai-agent-3k5g</guid>
      <description>&lt;h1&gt;
  
  
  Building a Gemini AI Assistant for macOS
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkbqmc7vxgip1zagfod6u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkbqmc7vxgip1zagfod6u.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I created the first macOS AI-powered Agent:&lt;/p&gt;

&lt;p&gt;Meet the &lt;strong&gt;AI-Agent&lt;/strong&gt;, a native macOS application that integrates with Google's Gemini AI to provide a seamless assistant experience. This project is open-source, and we encourage you to test it, modify it, and contribute to its development.&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/SchBenedikt" rel="noopener noreferrer"&gt;
        SchBenedikt
      &lt;/a&gt; / &lt;a href="https://github.com/SchBenedikt/ai-agent" rel="noopener noreferrer"&gt;
        ai-agent
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Testing macOS AI Agent with Google Gemini Live Web API
    &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;Gemini Assistant macOS App&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A native macOS application that connects to Google's Gemini AI. The app automatically accesses your camera and microphone to provide a seamless AI assistant experience
&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/137323528/431448595-8fa117b0-f19a-4aca-a684-619789f2af1d.png?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDg1MDgsIm5iZiI6MTc3NDY0ODIwOCwicGF0aCI6Ii8xMzczMjM1MjgvNDMxNDQ4NTk1LThmYTExN2IwLWYxOWEtNGFjYS1hNjg0LTYxOTc4OWYyYWYxZC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMzI3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDMyN1QyMTUwMDhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1iZmRhNzU0Mjg2ZWZhYTIyOWY2NzcyZTAwMzAyZjlhZjA2MzQ4YTkwMDEyZTAwMjlmOGJkZTc1NTQ3N2EyMmFiJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.Kg3UVC_yMkNNfiyZsfZ4Y37mb9Nael_6pkFwp4vk7bk"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F137323528%2F431448595-8fa117b0-f19a-4aca-a684-619789f2af1d.png%3Fjwt%3DeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzQ2NDg1MDgsIm5iZiI6MTc3NDY0ODIwOCwicGF0aCI6Ii8xMzczMjM1MjgvNDMxNDQ4NTk1LThmYTExN2IwLWYxOWEtNGFjYS1hNjg0LTYxOTc4OWYyYWYxZC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjYwMzI3JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI2MDMyN1QyMTUwMDhaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1iZmRhNzU0Mjg2ZWZhYTIyOWY2NzcyZTAwMzAyZjlhZjA2MzQ4YTkwMDEyZTAwMjlmOGJkZTc1NTQ3N2EyMmFiJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.Kg3UVC_yMkNNfiyZsfZ4Y37mb9Nael_6pkFwp4vk7bk" alt="image"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Audio input through your microphone&lt;/li&gt;
&lt;li&gt;Visual context through your camera&lt;/li&gt;
&lt;li&gt;Text responses displayed in the app&lt;/li&gt;
&lt;li&gt;Audio responses played through your speakers&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Setup&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Prerequisites&lt;/h3&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Python 3.8+&lt;/li&gt;
&lt;li&gt;A Google Gemini API key&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Installation&lt;/h3&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Install the required dependencies:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;pip install google-generativeai opencv-python pyaudio pillow mss PyQt5 pynput python-dotenv pyinstaller
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Set your Gemini API key as an environment variable (optional):&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;export GEMINI_API_KEY="your-api-key-here"
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If not set as an environment variable, the app will ask for it on startup.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Building the macOS App&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;There are two ways to build the app:&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;Method 1: Using PyInstaller (Recommended)&lt;/h4&gt;

&lt;/div&gt;
&lt;p&gt;PyInstaller creates a more reliable standalone application that better handles dependencies:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Make sure PyInstaller is installed:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;pip install pyinstaller
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the build process:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;
&lt;pre class="notranslate"&gt;&lt;code&gt;# First clean any previous builds&lt;/code&gt;&lt;/pre&gt;…&lt;/div&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/SchBenedikt/ai-agent" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  What is AI-Agent?
&lt;/h2&gt;

&lt;p&gt;The Gemini Assistant is a macOS application designed to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Capture audio input through your microphone.&lt;/li&gt;
&lt;li&gt;Use your camera for visual context.&lt;/li&gt;
&lt;li&gt;Provide AI-powered responses via text.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The app leverages Google's Gemini AI for natural language understanding and response generation, making it a powerful tool for productivity and interaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Audio Input&lt;/strong&gt;: Speak to the assistant using your microphone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Visual Context&lt;/strong&gt;: The app uses your camera to gather additional context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Text Responses&lt;/strong&gt;: Get responses displayed in the app&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Customizable&lt;/strong&gt;: Modify the code to add new features or improve existing ones&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;The application is built using Python and integrates several libraries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PyQt5&lt;/strong&gt;: For the user interface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenCV&lt;/strong&gt;: For camera access and visual processing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PyAudio&lt;/strong&gt;: For capturing and playing audio.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Generative AI&lt;/strong&gt;: For natural language processing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python-dotenv&lt;/strong&gt;: For managing environment variables.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The app uses a &lt;code&gt;.env&lt;/code&gt; file to store your Google Gemini API key securely. If the file doesn't exist, the app will create one for you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.8 or higher&lt;/li&gt;
&lt;li&gt;A &lt;a href="https://aistudio.google.com/apikey" rel="noopener noreferrer"&gt;Google Gemini API key&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Clone the repository:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   git clone https://github.com/SchBenedikt/ai-agent.git
   &lt;span class="nb"&gt;cd &lt;/span&gt;ai-agent
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Install the required dependencies:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Set your Gemini API key in the &lt;code&gt;.env&lt;/code&gt; file:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"GEMINI_API_KEY=your-api-key"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Running the App
&lt;/h3&gt;

&lt;p&gt;To run the app directly without building:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Building the App
&lt;/h3&gt;

&lt;p&gt;You can build a standalone macOS application using PyInstaller:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pyinstaller gemini.spec
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The app will be created in the &lt;code&gt;dist&lt;/code&gt; folder as &lt;code&gt;Gemini Assistant.app&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contributing
&lt;/h2&gt;

&lt;p&gt;We welcome contributions! Here are some ways you can help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Test the App&lt;/strong&gt;: Run the app and report any issues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improve the Code&lt;/strong&gt;: Add new features or optimize existing ones.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation&lt;/strong&gt;: Help us improve the documentation.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Feedback
&lt;/h2&gt;

&lt;p&gt;We'd love to hear your thoughts! Share your feedback, suggestions, or issues in the &lt;a href="https://github.com/SchBenedikt/ai-agent" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The Gemini Assistant is a powerful example of how AI can be integrated into everyday applications.&lt;/p&gt;

&lt;p&gt;I hope you find this project as useful and enjoyable as it is!&lt;/p&gt;

&lt;p&gt;Thanks for reading,&lt;br&gt;
techtech&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>programming</category>
      <category>python</category>
    </item>
    <item>
      <title>What do you think?</title>
      <dc:creator>techtech</dc:creator>
      <pubDate>Wed, 19 Feb 2025 15:12:01 +0000</pubDate>
      <link>https://dev.to/techtech/what-do-you-think-42l3</link>
      <guid>https://dev.to/techtech/what-do-you-think-42l3</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/techtech" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1110585%2F6025dd24-0eb3-4de9-96f7-8a600fdc0bfb.jpeg" alt="techtech"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/techtech/i-created-my-own-search-engine-41m3" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;I created my own search engine&lt;/h2&gt;
      &lt;h3&gt;techtech ・ Feb 19&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#python&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mongodb&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#bootstrap&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>python</category>
      <category>mongodb</category>
      <category>bootstrap</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>techtech</dc:creator>
      <pubDate>Wed, 19 Feb 2025 15:11:28 +0000</pubDate>
      <link>https://dev.to/techtech/-3mld</link>
      <guid>https://dev.to/techtech/-3mld</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/techtech" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1110585%2F6025dd24-0eb3-4de9-96f7-8a600fdc0bfb.jpeg" alt="techtech"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/techtech/i-created-my-own-search-engine-41m3" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;I created my own search engine&lt;/h2&gt;
      &lt;h3&gt;techtech ・ Feb 19&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#python&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mongodb&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#bootstrap&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>python</category>
      <category>mongodb</category>
      <category>bootstrap</category>
    </item>
    <item>
      <title>I created my own search engine</title>
      <dc:creator>techtech</dc:creator>
      <pubDate>Wed, 19 Feb 2025 15:07:11 +0000</pubDate>
      <link>https://dev.to/techtech/i-created-my-own-search-engine-41m3</link>
      <guid>https://dev.to/techtech/i-created-my-own-search-engine-41m3</guid>
      <description>&lt;p&gt;Hello everyone,&lt;/p&gt;

&lt;p&gt;I'm excited to share some new features and improvements in my custom search engine project. This search engine is designed to work seamlessly with my web crawler, providing efficient and accurate search results. Let's dive into the latest updates!&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyd3a10hjzvmhc8c38vt7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyd3a10hjzvmhc8c38vt7.png" alt="Image description" width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/aminnairi"&gt;@aminnairi&lt;/a&gt; has already asked why I don't use a NoSQL database. The software and the web crawler now use mongoDB as a noSQL database, which leads to faster search results.&lt;/p&gt;

&lt;p&gt;The AI ​​is still from Llama, now llama-3.3-70b.&lt;br&gt;
In the search results, you can right-click to display a preview of the website. In addition, the favicons are only loaded when all search results have been successfully loaded. These are stored locally temporarily so that they do not have to be retrieved again each time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkox15wp7qbbmnoxpu9xn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkox15wp7qbbmnoxpu9xn.png" alt="Image description" width="800" height="504"&gt;&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://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/SchBenedikt" rel="noopener noreferrer"&gt;
        SchBenedikt
      &lt;/a&gt; / &lt;a href="https://github.com/SchBenedikt/search-engine" rel="noopener noreferrer"&gt;
        search-engine
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The matching search engine to my web crawler.
    &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;search-engine&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;The matching search engine to my &lt;a href="https://github.com/SchBenedikt/web-crawler" rel="noopener noreferrer"&gt;web crawler&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Docker image is currently not working
&lt;a href="https://hub.docker.com/r/schbenedikt/search" rel="nofollow noopener noreferrer"&gt;https://hub.docker.com/r/schbenedikt/search&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Display of the search speed.&lt;/li&gt;
&lt;li&gt;Ask AI for help.&lt;/li&gt;
&lt;li&gt;Uses MongoDB for database operations.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Docker Instructions&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Building the Docker Image&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;To build the Docker image, run the following command in the root directory of the repository:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;docker build -t ghcr.io/schbenedikt/search-engine:latest &lt;span class="pl-c1"&gt;.&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Running the Docker Container&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;To run the Docker container, use the following command:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;docker run -p 5560:5560 ghcr.io/schbenedikt/search-engine:latest&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;This will start the Flask application using Gunicorn as the WSGI server, and it will be accessible at &lt;code&gt;http://localhost:5560&lt;/code&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Pulling the Docker Image&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;The Docker image is publicly accessible. To pull the Docker image from GitHub Container Registry, use the following command:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;docker pull ghcr.io/schbenedikt/search-engine:latest&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Note&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Ensure that the &lt;code&gt;tags&lt;/code&gt; field in the GitHub Actions workflow is correctly set to &lt;code&gt;ghcr.io/schbenedikt/search-engine:latest&lt;/code&gt; to avoid multiple packages.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Running with Docker Compose&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;To run…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/SchBenedikt/search-engine" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The databases can now be managed via the settings page. There is now also the option to add multiple databases at the same time. When a search is made, the system checks whether there are websites that are saved multiple times so that the same website is not displayed multiple times.&lt;/p&gt;

&lt;p&gt;This brings us to the filter functions:&lt;br&gt;
The meta data is used to retrieve the various website types, which can then be used to filter. However, since there may be a "website" type and a "website" type, these can be combined into a "all websites" type.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/SchBenedikt" rel="noopener noreferrer"&gt;
        SchBenedikt
      &lt;/a&gt; / &lt;a href="https://github.com/SchBenedikt/web-crawler" rel="noopener noreferrer"&gt;
        web-crawler
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A simple web crawler using Python that stores the metadata of each web page in a database.
    &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;web-crawler&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A simple web crawler using Python that stores the metadata and main content of each web page in a database.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Purpose and Functionality&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;The web crawler is designed to crawl web pages starting from a base URL, extract metadata such as title, description, image, locale, type, and main content, and store this information in a MongoDB database. The crawler can handle multiple levels of depth and respects the &lt;code&gt;robots.txt&lt;/code&gt; rules of the websites it visits.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Dependencies&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;The project requires the following dependencies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;requests&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;beautifulsoup4&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pymongo&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can install the dependencies using the following command:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;pip install -r requirements.txt&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Setting Up and Running the Web Crawler&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Clone the repository:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/schBenedikt/web-crawler.git
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; web-crawler&lt;/pre&gt;

&lt;/div&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Install the dependencies:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;pip install -r requirements.txt&lt;/pre&gt;

&lt;/div&gt;
&lt;ol start="3"&gt;
&lt;li&gt;
&lt;p&gt;Ensure that MongoDB is running on your local machine. The web crawler connects to MongoDB at &lt;code&gt;localhost:27017&lt;/code&gt; and uses a database named &lt;code&gt;search_engine&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the web crawler:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;python&lt;/pre&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/SchBenedikt/web-crawler" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Instrument Sans is now used as the default font and there is also a dark mode that is automatically activated when the system is also in dark mode.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fobk7u92f8nb3toues4wn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fobk7u92f8nb3toues4wn.png" alt="Image description" width="800" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fllukhewlnldw8lkv5qpd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fllukhewlnldw8lkv5qpd.png" alt="Image description" width="800" height="527"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What do you think of the project?&lt;br&gt;
Feel free to write it in the comments!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>python</category>
      <category>mongodb</category>
      <category>bootstrap</category>
    </item>
    <item>
      <title>🔊 New Open Source Podcast</title>
      <dc:creator>techtech</dc:creator>
      <pubDate>Mon, 10 Feb 2025 17:43:00 +0000</pubDate>
      <link>https://dev.to/techtech/new-open-source-podcast-47d3</link>
      <guid>https://dev.to/techtech/new-open-source-podcast-47d3</guid>
      <description>&lt;p&gt;&lt;iframe src="https://open.spotify.com/embed/show/5w1DQX1cWCnFDrL4Qew4PD" width="100%" height="232px"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Hello dev.to community!&lt;/p&gt;

&lt;p&gt;Finally a new post from me.&lt;br&gt;
I would just like to introduce "my" podcast ("Open Source Software") here.&lt;br&gt;
What? Another new podcast?&lt;br&gt;
Yes. And this time it's very special: This podcast was generated solely by an AI. And the result? Pretty impressive.&lt;br&gt;
The first episode is generally just about what open source actually is. But you all know that already.&lt;/p&gt;

&lt;p&gt;In the next episodes I want to go into a little more detail about trends or general news in the development &amp;amp; open source scene.&lt;/p&gt;

&lt;p&gt;But how often do you want new episodes?&lt;/p&gt;

&lt;p&gt;Feel free to write your opinion about the podcast in the comments!&lt;/p&gt;

&lt;p&gt;I would also be happy if you listen to the podcast and share it!&lt;/p&gt;

&lt;p&gt;Thank you very much and have fun!&lt;/p&gt;

</description>
      <category>podcast</category>
      <category>opensource</category>
      <category>techtalks</category>
    </item>
    <item>
      <title>I created my own search engine</title>
      <dc:creator>techtech</dc:creator>
      <pubDate>Sun, 09 Jun 2024 06:42:44 +0000</pubDate>
      <link>https://dev.to/techtech/i-created-my-own-search-engine-go4</link>
      <guid>https://dev.to/techtech/i-created-my-own-search-engine-go4</guid>
      <description>&lt;h2&gt;
  
  
  NEW POST:
&lt;/h2&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/techtech" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1110585%2F6025dd24-0eb3-4de9-96f7-8a600fdc0bfb.jpeg" alt="techtech"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/techtech/i-created-my-own-search-engine-41m3" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;I created my own search engine&lt;/h2&gt;
      &lt;h3&gt;techtech ・ Feb 19&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#python&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#mongodb&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#bootstrap&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;





&lt;p&gt;I have created my own search engine and I'll tell you how it works.&lt;/p&gt;

&lt;p&gt;First of all, I created my own web crawler. It runs on Python and stores various meta data in a mysql database.&lt;br&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://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/SchBenedikt" rel="noopener noreferrer"&gt;
        SchBenedikt
      &lt;/a&gt; / &lt;a href="https://github.com/SchBenedikt/web-crawler" rel="noopener noreferrer"&gt;
        web-crawler
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A simple web crawler using Python that stores the metadata of each web page in a database.
    &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;web-crawler&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A simple web crawler using Python that stores the metadata and main content of each web page in a database.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Purpose and Functionality&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;The web crawler is designed to crawl web pages starting from a base URL, extract metadata such as title, description, image, locale, type, and main content, and store this information in a MongoDB database. The crawler can handle multiple levels of depth and respects the &lt;code&gt;robots.txt&lt;/code&gt; rules of the websites it visits.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Dependencies&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;The project requires the following dependencies:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;requests&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;beautifulsoup4&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pymongo&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;You can install the dependencies using the following command:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;pip install -r requirements.txt&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Setting Up and Running the Web Crawler&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Clone the repository:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/schBenedikt/web-crawler.git
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; web-crawler&lt;/pre&gt;

&lt;/div&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Install the dependencies:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;pip install -r requirements.txt&lt;/pre&gt;

&lt;/div&gt;
&lt;ol start="3"&gt;
&lt;li&gt;
&lt;p&gt;Ensure that MongoDB is running on your local machine. The web crawler connects to MongoDB at &lt;code&gt;localhost:27017&lt;/code&gt; and uses a database named &lt;code&gt;search_engine&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Run the web crawler:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;python&lt;/pre&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/SchBenedikt/web-crawler" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The search engine, which I created with Bootstrap, then retrieves the results from mySQL. The bottom right always shows how long the query took.&lt;br&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://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/SchBenedikt" rel="noopener noreferrer"&gt;
        SchBenedikt
      &lt;/a&gt; / &lt;a href="https://github.com/SchBenedikt/search-engine" rel="noopener noreferrer"&gt;
        search-engine
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The matching search engine to my web crawler.
    &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;search-engine&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;The matching search engine to my &lt;a href="https://github.com/SchBenedikt/web-crawler" rel="noopener noreferrer"&gt;web crawler&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Docker image is currently not working
&lt;a href="https://hub.docker.com/r/schbenedikt/search" rel="nofollow noopener noreferrer"&gt;https://hub.docker.com/r/schbenedikt/search&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Display of the search speed.&lt;/li&gt;
&lt;li&gt;Ask AI for help.&lt;/li&gt;
&lt;li&gt;Uses MongoDB for database operations.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Docker Instructions&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Building the Docker Image&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;To build the Docker image, run the following command in the root directory of the repository:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;docker build -t ghcr.io/schbenedikt/search-engine:latest &lt;span class="pl-c1"&gt;.&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Running the Docker Container&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;To run the Docker container, use the following command:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;docker run -p 5560:5560 ghcr.io/schbenedikt/search-engine:latest&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;This will start the Flask application using Gunicorn as the WSGI server, and it will be accessible at &lt;code&gt;http://localhost:5560&lt;/code&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Pulling the Docker Image&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;The Docker image is publicly accessible. To pull the Docker image from GitHub Container Registry, use the following command:&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;docker pull ghcr.io/schbenedikt/search-engine:latest&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Note&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;Ensure that the &lt;code&gt;tags&lt;/code&gt; field in the GitHub Actions workflow is correctly set to &lt;code&gt;ghcr.io/schbenedikt/search-engine:latest&lt;/code&gt; to avoid multiple packages.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Running with Docker Compose&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;To run…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/SchBenedikt/search-engine" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Please note that no robots.txt files are currently taken into account, which is why you cannot simply crawl every page.&lt;/p&gt;

&lt;p&gt;What do you think of the project?&lt;/p&gt;

&lt;p&gt;Feel free to write it in the comments!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbcdnl4eu8gd73mh9lu3q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbcdnl4eu8gd73mh9lu3q.png" alt="Image description" width="800" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9pxbr1md18yoqdxole7o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9pxbr1md18yoqdxole7o.png" alt="Image description" width="800" height="294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyxm7qefbadstms4svf11.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyxm7qefbadstms4svf11.png" alt="Image description" width="800" height="285"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>bootstrap</category>
      <category>python</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to install Ghost CMS</title>
      <dc:creator>techtech</dc:creator>
      <pubDate>Wed, 06 Sep 2023 06:47:12 +0000</pubDate>
      <link>https://dev.to/technology-schaechner/how-to-install-ghost-cms-32if</link>
      <guid>https://dev.to/technology-schaechner/how-to-install-ghost-cms-32if</guid>
      <description>&lt;p&gt;Ghost is a modern content management system - this means that you can host websites with it just like with WordPress. However, since it was only founded in 2013, you can imagine that there are not that many plugins &amp;amp; themes here. But for some themes you have to dig deep into your pocket and sometimes pay more than 100 euros for it.&lt;br&gt;
Today we show you how you can easily install this with one command via Docker.&lt;/p&gt;



&lt;p&gt;We would appreciate a like :heart and a comment!&lt;br&gt;
Feel free to visit our Ghost page and register for exclusive newsletters to find out everything!&lt;br&gt;
(&lt;a href="//self-hosted.sch%C3%A4chner.de"&gt;self-hosted.schächner.de&lt;/a&gt;)&lt;/p&gt;



&lt;p&gt;But to do that, you first need Docker and then Docker-Compose.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update
sudo apt upgrade
sudo apt install docker.io
sudo apt install docker-compose

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then we have to create a docker-compose.yml file – no matter where.sudo nano docker-compose.yml&lt;/p&gt;

&lt;p&gt;This contains the following content. Note that the password and username should be changed for security reasons - the port can remain the same.&lt;br&gt;
But what you have to change are the mail settings with which you then send e-mails.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;3.1'&lt;/span&gt;

&lt;span class="na"&gt;services&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

  &lt;span class="na"&gt;ghost&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ghost:latest&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
    &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;8089:2368&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

      &lt;span class="na"&gt;database__client&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql&lt;/span&gt;
      &lt;span class="na"&gt;database__connection__host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;db&lt;/span&gt;
      &lt;span class="na"&gt;database__connection__user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;root&lt;/span&gt;
      &lt;span class="na"&gt;database__connection__password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Schächner&amp;amp;Tech&lt;/span&gt;
      &lt;span class="na"&gt;database__connection__database&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ghost&lt;/span&gt;
      &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;http://localhost&lt;/span&gt;
      &lt;span class="na"&gt;mail__from&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;'Schächner'&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;lt;server@schächner.de&amp;gt;"&lt;/span&gt;
      &lt;span class="na"&gt;mail__transport&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SMTP"&lt;/span&gt;
      &lt;span class="na"&gt;mail__options__host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;smtp.strato.de"&lt;/span&gt;
      &lt;span class="na"&gt;mail__options__port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;587&lt;/span&gt;
      &lt;span class="na"&gt;mail__options__auth__user&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-mail"&lt;/span&gt;
      &lt;span class="na"&gt;mail__options__auth__pass&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-password"&lt;/span&gt;

  &lt;span class="na"&gt;db&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mysql:8.0&lt;/span&gt;
    &lt;span class="na"&gt;restart&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;always&lt;/span&gt;
    &lt;span class="na"&gt;environment&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Schächner&amp;amp;Tech&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After saving that with ctrl+o and exiting with ctrl+x, we need our actual command:&lt;br&gt;
&lt;code&gt;sudo docker-compose up -d&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That all starts the container.&lt;br&gt;
If we now wait about 2 minutes and then open our IP address, then you have to specify the port after the IP address:&lt;br&gt;
&lt;code&gt;XXX.XXX.XXX.XX:8089&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The website should be visible here.&lt;br&gt;
To still be able to access it as an admin, you have to go to the following URL:&lt;br&gt;
&lt;code&gt;XXX.XXX.XXX.XX:8089/ghost&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Here you create an admin account with which you can then write posts.&lt;br&gt;
Do you have any questions, suggestions or requests?&lt;br&gt;
Feel free to write everything in the comments!&lt;br&gt;
Best regards and see you next time!&lt;/p&gt;

</description>
      <category>cms</category>
      <category>tutorial</category>
      <category>beginners</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
