<?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: Erick Christian</title>
    <description>The latest articles on DEV Community by Erick Christian (@ericc).</description>
    <link>https://dev.to/ericc</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%2F488896%2F76260d6e-a60b-4263-a057-99031093f759.jpeg</url>
      <title>DEV Community: Erick Christian</title>
      <link>https://dev.to/ericc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ericc"/>
    <language>en</language>
    <item>
      <title>I turned GitHub Copilot into OpenAI API compatible provider</title>
      <dc:creator>Erick Christian</dc:creator>
      <pubDate>Thu, 06 Feb 2025 08:44:08 +0000</pubDate>
      <link>https://dev.to/ericc/i-turned-github-copilot-into-openai-api-compatible-provider-1fb8</link>
      <guid>https://dev.to/ericc/i-turned-github-copilot-into-openai-api-compatible-provider-1fb8</guid>
      <description>&lt;p&gt;TL;DR:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I built &lt;code&gt;npx copilot-api&lt;/code&gt; (&lt;a href="https://github.com/ericc-ch/copilot-api" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;) to use GitHub Copilot as OpenAI compatible provider&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here's me using it with KoboldAI (ignore the password, you don't actually need it)&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%2Fvsfzmal9mbje2wt0by04.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%2Fvsfzmal9mbje2wt0by04.png" alt="KoboldAI settings" width="800" height="450"&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%2F97ej74x71h1379opeenw.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%2F97ej74x71h1379opeenw.png" alt="KoboldAI response" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;So there I was, messing around with GitHub Copilot on the web. I am familiar with web development so I got kinda curious how the API is structured. If only I can expose an OpenAI compatible chat completion endpoint...&lt;/p&gt;

&lt;p&gt;I opened up the DevTools and immediately noticed that GitHub had completely abstracted away the OpenAI chat completion endpoint. Duh, of course they did! They're not gonna let us mess around with it that easily.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Spark
&lt;/h2&gt;

&lt;p&gt;Then something interesting happened. I was watching Cassidy Williams on Twitch (she was talking about GitHub Copilot competition on dev.to). She showed off Copilot custom instructions. My mind immediately went: "WAIT A MINUTE... how is VSCode actually sending these custom instructions???"&lt;/p&gt;

&lt;p&gt;(Sorry, the recording is gone now)&lt;/p&gt;

&lt;h2&gt;
  
  
  Down the Rabbit Hole
&lt;/h2&gt;

&lt;p&gt;Being a web dev, I'm used to just opening DevTools and calling it a day. But this was different - I needed to capture system-wide network requests. So how should I do it?&lt;/p&gt;

&lt;p&gt;First stop: &lt;a href="https://gitlab.com/wireshark/wireshark" rel="noopener noreferrer"&gt;Wireshark&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;I heard people using it to capture network or packets or something similar to that. Sounds promising. I tried it for like 30 minutes and... NOPE. Turns out Wireshark can't capture HTTPS requests. At this moment I realized what the S in HTTPS stands for. Secure.&lt;/p&gt;

&lt;p&gt;What I wanted to do was basically Man in the Middle attack. No no for HTTPS.&lt;/p&gt;

&lt;p&gt;HOLD ON. Man in the middle... THAT'S IT!&lt;/p&gt;

&lt;p&gt;Enter &lt;a href="https://github.com/mitmproxy/mitmproxy" rel="noopener noreferrer"&gt;mitmproxy&lt;/a&gt; - this beautiful Python program can act as a proxy and logs all network requests. It even comes with a devtool like web UI. Just what I needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Authentication Nightmare
&lt;/h2&gt;

&lt;p&gt;My first brilliant idea to make the whole thing automatic was to launch both the proxy and VSCode as Node.js child processes, then parse mitmproxy's output to get the authentication token.&lt;/p&gt;

&lt;p&gt;It was not, in fact, brilliant.&lt;/p&gt;

&lt;p&gt;I asked my friend to try the projecstandard github auth tokent and it was a mess. He didn't have mitmproxy installed. He didn't really know how to setup a proxy. There was also the whole thing where VSCode won't make any request because the proxy certificate wasn't valid or something.&lt;/p&gt;

&lt;p&gt;After that spectacular failure, I did some digging and discovered VSCode was just using stock &lt;a href="https://github.blog/engineering/platform-security/behind-githubs-new-authentication-token-formats" rel="noopener noreferrer"&gt;standard github auth token&lt;/a&gt;. Specifically, VSCode uses &lt;code&gt;gho_xxx&lt;/code&gt; token, which is the type of token used for OAuth apps.&lt;/p&gt;

&lt;p&gt;Only after that then the &lt;code&gt;gho&lt;/code&gt; token is used for getting the actual Copilot Chat completion token. Sounds complicated? Yeah because it is.&lt;/p&gt;

&lt;p&gt;After finding that out, of course the next idea that came to my mind was "create a custom oauth app, get user token, get copilot token, bada bing bada boom we're cookin"&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;404 Not Found
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;WHAT THE HELL GITHUB??? YOU LIAR! THE ENDPOINT DOES EXIST. DONT GIVE ME THAT CODE.&lt;/p&gt;

&lt;p&gt;Turns out Copilot's API internals are only exposed to OAuth tokens from VSCode.&lt;/p&gt;

&lt;p&gt;But then... WAIT A SECOND! VSCode has its own device flow authentication! If I could just get VSCode's client ID...&lt;/p&gt;

&lt;p&gt;IT WORKS!&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the Proxy Server
&lt;/h2&gt;

&lt;p&gt;Now came the fun part - actually building the API server. I decided to start simple and disabled streaming at first, just emulating the streaming part in my server.&lt;/p&gt;

&lt;p&gt;I primarily wanted to test the API with these three tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cline&lt;/li&gt;
&lt;li&gt;Aider&lt;/li&gt;
&lt;li&gt;bolt.diy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cline immediately threw some weird "can't read undefined index 0" error and I went slightly insane trying to debug it. I even tried diving deep into Cline codebase, just for it to not result to anything.&lt;/p&gt;

&lt;p&gt;After a good night's sleep, I realized Hono automatically adds "[DONE]" event in the stream. I didn't realize that and added another "[DONE]". Wow, this pains me physically.&lt;/p&gt;

&lt;p&gt;Fixed that and Cline now works baby!&lt;/p&gt;

&lt;h2&gt;
  
  
  Cline
&lt;/h2&gt;

&lt;p&gt;I tried playing around with it using GPT-4o. But I remembered Cline is advertised to work best with Claude 3.5 Sonnet.&lt;/p&gt;

&lt;p&gt;So I tried that and get a new error.&lt;/p&gt;

&lt;p&gt;And this time, there wasn't even a single error message. The error wasn't even from Cline itself. The error was from GitHub Copilot internal API.&lt;/p&gt;

&lt;p&gt;I tried comparing everything. The prompts, the request, the response. Everything is the same except the model. So I just concluded that the prompt was too long and the max context length for Claude provided by GitHub just wasn't enough. Because it is long, just look at this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Aider
&lt;/h2&gt;

&lt;p&gt;Aider worked immediately! WITH CLAUDE AS WELL!&lt;/p&gt;

&lt;p&gt;...until it didn't.&lt;/p&gt;

&lt;p&gt;Random errors sometimes popped up and I didn't know why. Commit command also wasn't working.&lt;/p&gt;

&lt;p&gt;The only things those two have in common that I know was those two tasks use the "weak" model in aider settings.&lt;/p&gt;

&lt;p&gt;I was losing my mind again. I've double, hell even 10+ times checked to make sure that my API is structured the same as OpenAI.&lt;/p&gt;

&lt;p&gt;I gave up and decided to open an issue.&lt;/p&gt;

&lt;p&gt;No updates...&lt;/p&gt;

&lt;p&gt;I just gonna write the result of my tests here&lt;/p&gt;

&lt;p&gt;(realizes o1 doesn't support streaming)&lt;/p&gt;

&lt;p&gt;THEN IT HIT ME.&lt;/p&gt;

&lt;p&gt;THE WEAK MODEL EXPECTS NON-STREAMING RESPONSE.&lt;/p&gt;

&lt;p&gt;My server didn't support non-streaming response. What an irony since I always disabled streaming internally and even emulated streaming response.&lt;/p&gt;

&lt;p&gt;Might as well start implementing actual streaming now.&lt;/p&gt;

&lt;h2&gt;
  
  
  bolt.diy
&lt;/h2&gt;

&lt;p&gt;This thing just works baby!&lt;/p&gt;

&lt;p&gt;Except that one issue but that's on bolt.diy itself and not me.&lt;/p&gt;

&lt;p&gt;THE SERVER IS FEATURE COMPLETE!&lt;/p&gt;

&lt;h2&gt;
  
  
  The Humbling Reality Check
&lt;/h2&gt;

&lt;p&gt;So there I was, feeling like a genius, ready to write this blog post about my AMAZING DISCOVERY...&lt;/p&gt;

&lt;p&gt;...only to find out that thousands (not really) of other developers had already done this exact thing.&lt;/p&gt;

&lt;p&gt;But you know what? That's okay! I learned a ton of things.&lt;/p&gt;

&lt;p&gt;Also, reverse engineering is fun!&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;I'm actually using this setup daily with Aider now (Cline still doesn't work, I'll probably fork it with shorter prompt). And while I wasn't the first person to figure this out, the journey was worth it.&lt;/p&gt;

&lt;p&gt;Remember: don't be discouraged when you discover others have already built what you're building. The learning experience is what matters!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;obligatory disclaimer: This is all for educational purposes only. Please don't sue me, GitHub! Also use at your own risk!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>githubcopilot</category>
      <category>javascript</category>
      <category>ai</category>
    </item>
    <item>
      <title>My GitHub Copilot Hackathon Submission: Year Compass - Helping You Achieve Your Goals</title>
      <dc:creator>Erick Christian</dc:creator>
      <pubDate>Sat, 18 Jan 2025 09:20:40 +0000</pubDate>
      <link>https://dev.to/ericc/my-github-copilot-hackathon-submission-year-compass-helping-you-achieve-your-goals-1lhf</link>
      <guid>https://dev.to/ericc/my-github-copilot-hackathon-submission-year-compass-helping-you-achieve-your-goals-1lhf</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github"&gt;GitHub Copilot Challenge &lt;/a&gt;: New Beginnings&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;So, for this hackathon, I decided to build a little web app called "Year Compass." The idea is pretty simple: it helps you actually &lt;em&gt;achieve&lt;/em&gt; your New Year's resolutions instead of just making them and forgetting about them by February!&lt;/p&gt;

&lt;p&gt;The core of it is taking that big, sometimes vague resolution and using AI to break it down into smaller, more manageable steps. Think of it like having a mini AI coach in your browser. You type in your resolution, hit a button, and bam! You get a list of things you can actually &lt;em&gt;do&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Here are the main things it does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Easy Resolution Input:&lt;/strong&gt; Just a text box to type in your goal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-Powered Steps:&lt;/strong&gt; Click a button, and the magic happens on the backend to generate those actionable steps.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clear Step Display:&lt;/strong&gt; The steps show up in a list, each with a little checkbox.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Progress Tracking:&lt;/strong&gt; A simple progress bar at the top shows how far you've come. It updates as you check off those steps!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local Saving:&lt;/strong&gt; Everything (your resolution, the steps, and your progress) gets saved right in your browser. So when you come back, it's all still there.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Little Celebrations:&lt;/strong&gt; When you hit certain milestones (like 25%, 50%, etc.), the app gives you a little "Woohoo!" message to keep you going.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since it's a hackathon and we're focusing on using Copilot, everything is stored locally in the browser. No fancy databases or user accounts for this version! It's all about that "new beginning" vibe, helping people get started and stay motivated with their goals.&lt;/p&gt;

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

&lt;p&gt;You can check out the app here &lt;a href="https://year-compass-copilot.vercel.app/" rel="noopener noreferrer"&gt;Year Compass&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%2Fbu856r5pfhlcu4fdz5xu.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%2Fbu856r5pfhlcu4fdz5xu.png" alt="home - empty" width="800" height="384"&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%2F8bl6l2y7hkbksy1qsf15.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%2F8bl6l2y7hkbksy1qsf15.png" alt="home - filled form" width="800" height="384"&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%2Fgmmyq3wz6jk7mil46vvd.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%2Fgmmyq3wz6jk7mil46vvd.png" alt="result" width="800" height="384"&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%2F6hrkp21vwlp7jmmz3fdm.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%2F6hrkp21vwlp7jmmz3fdm.png" alt="motivation notification" width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Repo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/ericc-ch/year-compass" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Copilot Experience
&lt;/h2&gt;

&lt;p&gt;Honestly, I leaned on it &lt;em&gt;heavily&lt;/em&gt; throughout this whole process. The Copilot Edits feature was a lifesaver. It's really similar to using Aider, but having it integrated right in VS Code with a GUI is just fantastic. It made refactoring and adding new features so much smoother.&lt;/p&gt;

&lt;p&gt;For smaller tweaks and quick fixes, the inline chat was also super handy. Instead of sending whole files to Copilot Edits, I could just select a line or two and ask it to make a specific change.&lt;/p&gt;

&lt;p&gt;And of course, the autocomplete is still a game-changer. Even though I was relying on Copilot for a lot, there were still times I was writing code from scratch, and the suggestions were incredibly helpful, especially in the early stages of setting things up. I've been using Copilot's autocomplete since it first came out, and it's still a core part of my workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub Models
&lt;/h2&gt;

&lt;p&gt;Yep, I definitely used GitHub Models for this project! The main place where they came in was for generating those actionable steps from the user's resolution. That's the core AI-powered part of the app. I used the models to take the user's input and turn it into a list of concrete things they could do. So, it wasn't just for prototyping – it's actually a core part of how the app works.&lt;/p&gt;

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

&lt;p&gt;Overall, this was a really fun and productive hackathon! Building "Year Compass" with Copilot felt like a really streamlined experience. It helped me focus on the logic and the user experience, knowing that I had a powerful AI assistant helping with the coding. I think the idea of breaking down big goals into smaller steps is really powerful, and hopefully, this little app can help people make real progress on their "new beginnings" throughout the year. Thanks for the challenge!&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>Estile: AI-Driven Clothing Recommendations Enhanced by Bright Data Scraping</title>
      <dc:creator>Erick Christian</dc:creator>
      <pubDate>Mon, 30 Dec 2024 07:06:10 +0000</pubDate>
      <link>https://dev.to/ericc/estile-ai-driven-clothing-recommendations-enhanced-by-bright-data-scraping-43fc</link>
      <guid>https://dev.to/ericc/estile-ai-driven-clothing-recommendations-enhanced-by-bright-data-scraping-43fc</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/brightdata"&gt;Bright Data Web Scraping Challenge&lt;/a&gt;: Most Creative Use of Web Data for AI Models&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Estile is an AI-powered fashion recommendation app designed to help users discover clothing articles tailored to their preferences. The app combines artificial intelligence and web scraping technologies to recommend outfits and automatically search for matching products on eBay in real time.&lt;/p&gt;

&lt;p&gt;The app’s AI system suggests styles based on user preferences and trends. It then uses a custom fine-tuning process to optimize search keywords and ensure accurate product matching with items available on eBay.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/ericc-ch/estile" rel="noopener noreferrer"&gt;Frontend Code Repository&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/ericc-ch/estile-scraper" rel="noopener noreferrer"&gt;Backend Code Repository&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Screenshots
&lt;/h3&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%2Fmpc12jd64b5kgr0zqi6y.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%2Fmpc12jd64b5kgr0zqi6y.png" alt="Home" width="800" height="397"&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%2F1qij0t169slxd71apftn.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%2F1qij0t169slxd71apftn.png" alt="Loading" width="800" height="397"&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%2F1olzk3whlgeke3yq60hl.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%2F1olzk3whlgeke3yq60hl.png" alt="Result" width="800" height="397"&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%2Ff88ntvp3s3vz64psx6dc.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%2Ff88ntvp3s3vz64psx6dc.png" alt="Fine-tuning logging" width="800" height="480"&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%2F3uvk7mi95rfeue0g98sa.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%2F3uvk7mi95rfeue0g98sa.png" alt="Fine-tuning process" width="800" height="606"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Used Bright Data
&lt;/h2&gt;

&lt;p&gt;Bright Data was instrumental in building Estile by enabling real-time data scraping and fine-tuning the AI model. Here’s how I leveraged it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Real-Time Scraping for Clothing Recommendations&lt;/strong&gt; - Using Bright Data’s Scraping Browser, I extracted data from dynamic and JavaScript-heavy websites to fetch the latest fashion items and trends. This ensured that recommendations were always fresh and relevant.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;eBay Data Collection and AI Fine-Tuning&lt;/strong&gt; - I utilized Bright Data’s Web Scraper API to collect and structure data from eBay. The data was used to train and fine-tune a language model (LLM) that matches AI-generated fashion descriptions with optimal product keywords. This allows the app to enhance search accuracy and deliver precise product suggestions to users.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Additional Prompt Qualifications
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Prompt 2: Build a Web Scraper API to Solve Business Problems&lt;/strong&gt; – Estile demonstrates a practical use of web scraping to tackle challenges in product discovery and recommendation systems.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;A big thank you as well to the DEV.to team for hosting this exciting hackathon. Also thank you for considering my project for the Bright Data Web Scraping Challenge!&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>brightdatachallenge</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Distro suggestion that looks cool</title>
      <dc:creator>Erick Christian</dc:creator>
      <pubDate>Tue, 17 Nov 2020 14:59:12 +0000</pubDate>
      <link>https://dev.to/ericc/distro-suggestion-that-looks-cool-ifl</link>
      <guid>https://dev.to/ericc/distro-suggestion-that-looks-cool-ifl</guid>
      <description>&lt;p&gt;Gonna reinstall Linux for the 2nd time this weekend.&lt;/p&gt;

&lt;p&gt;I want a distro that doesnt require much setup but looks cool.&lt;/p&gt;

&lt;p&gt;I'm thinking about installing Manjaro.&lt;/p&gt;

&lt;p&gt;Have any suggestion what distro should I use?&lt;/p&gt;

&lt;p&gt;Currently it's Fedora 33.&lt;/p&gt;

</description>
      <category>linux</category>
    </item>
  </channel>
</rss>
