<?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: Ralph Rosael</title>
    <description>The latest articles on DEV Community by Ralph Rosael (@coderralph).</description>
    <link>https://dev.to/coderralph</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1008118%2Ffcc851aa-c9e7-4fec-adaa-87bef7f24e17.png</url>
      <title>DEV Community: Ralph Rosael</title>
      <link>https://dev.to/coderralph</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/coderralph"/>
    <language>en</language>
    <item>
      <title>Echoes of the Terminal: a haunted shell that runs on your own machine</title>
      <dc:creator>Ralph Rosael</dc:creator>
      <pubDate>Tue, 27 Oct 2026 16:47:06 +0000</pubDate>
      <link>https://dev.to/coderralph/echoes-of-the-terminal-a-haunted-shell-that-runs-on-your-own-machine-gle</link>
      <guid>https://dev.to/coderralph/echoes-of-the-terminal-a-haunted-shell-that-runs-on-your-own-machine-gle</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week4-2026-10-26"&gt;Hacktoberfest Open-Source AI Challenge Week 4: Ghost in the Machine&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Echoes of the Terminal is a shell that answers back.&lt;/p&gt;

&lt;p&gt;You type &lt;code&gt;git push --force&lt;/code&gt;. The command runs, and then something in the terminal speaks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Are you sure you want to rewrite history, mortal? The dead do not like being disturbed, and your teammates' commits will not rest quietly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That whisper comes from an open-weight model running on your own machine. It reads each command along with its exit status, your directory, your git branch, the hour of the night and what you ran just before. Dangerous commands get theatrical warnings. Harmless ones (&lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;pwd&lt;/code&gt;) get remarks about your sterile existence. Failures get smug.&lt;/p&gt;

&lt;p&gt;It comes in two forms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A web shell&lt;/strong&gt; with a retro CRT look: amber or green phosphor, scanlines, a screen that bleeds when the ghost speaks, and a presence meter of five lamps. The more dangerous your commands, the angrier the ghost gets, until the screen tears and your hostname changes to &lt;code&gt;it-sees-you&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;haunt&lt;/code&gt;, a CLI&lt;/strong&gt; that possesses your real shell. Run &lt;code&gt;haunt git push --force&lt;/code&gt;, or hook it into bash or zsh so it comments on every command you type.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I took the theme literally: the haunted terminal that "possesses your shell" was on the prompt list, and I wanted to build it as a tool I would leave open, not a one-joke demo. So the ghost is grounded. Each warning is built on what the command actually does, so a spooky line about &lt;code&gt;rm -rf&lt;/code&gt; still tells you something true.&lt;/p&gt;

&lt;p&gt;There is also a séance mode that lets the dead-technology ghosts take over. &lt;code&gt;seance cobol&lt;/code&gt; turns every comment into SHOUTING PAYROLL BUREAUCRACY. Perl, Fortran, Flash, jQuery and Internet Explorer 6 are available too, and IE6 is insufferable.&lt;/p&gt;

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


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://echoes-of-the-terminal.vercel.app/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;echoes-of-the-terminal.vercel.app&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm9r3ardsab6s2uwrsupm.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm9r3ardsab6s2uwrsupm.png" alt="The haunted shell in amber phosphor" width="800" height="500"&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl9n4m67qi6wdklctfwb0.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl9n4m67qi6wdklctfwb0.png" alt="The same shell in green phosphor" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Try these in the shell: &lt;code&gt;git push --force&lt;/code&gt;, &lt;code&gt;rm -rf node_modules&lt;/code&gt;, &lt;code&gt;cat .env&lt;/code&gt;, &lt;code&gt;npm test&lt;/code&gt;, &lt;code&gt;gti status&lt;/code&gt;, &lt;code&gt;sudo rm -rf /&lt;/code&gt;. Then run &lt;code&gt;seance cobol&lt;/code&gt; and try them again.&lt;/p&gt;

&lt;p&gt;The shell is simulated, so nothing you type touches your machine. To wake a real model, open the séance board and pick one. The scripted ghost speaks until a model is read&lt;/p&gt;

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


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/coder-ralph" rel="noopener noreferrer"&gt;
        coder-ralph
      &lt;/a&gt; / &lt;a href="https://github.com/coder-ralph/echoes-of-the-terminal" rel="noopener noreferrer"&gt;
        echoes-of-the-terminal
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Hacktoberfest 2026 — Week 4: Ghost in the Machine Challenge 5
    &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;Echoes of the Terminal&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A haunted shell that answers back. An open-weight model running on your own machine reads each command you type and whispers about it. Try &lt;code&gt;git push --force&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/coder-ralph/echoes-of-the-terminal/docs/screenshot-amber.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fcoder-ralph%2Fechoes-of-the-terminal%2FHEAD%2Fdocs%2Fscreenshot-amber.png" alt="Echoes of the Terminal, amber phosphor"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Built for the DEV Hacktoberfest Open-Source AI Challenge, week 4: Ghost in the Machine.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Runs locally.&lt;/strong&gt; Gemma, Llama or Qwen through WebLLM (in your browser, on your GPU) or through Ollama. No cloud API, no keys, no cost.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private.&lt;/strong&gt; Your commands and history never leave your machine. Secrets in commands are redacted before a model sees them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two shells.&lt;/strong&gt; A simulated web shell with a CRT look, and &lt;code&gt;haunt&lt;/code&gt;, a CLI that haunts your real terminal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Always speaks.&lt;/strong&gt; If no model is loaded or one misbehaves, a hand-written scripted ghost answers instead.&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;npm install
npm run dev        &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; http://localhost:3000&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;Open the page and type. The scripted ghost works immediately. To wake a real model, open…&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/coder-ralph/echoes-of-the-terminal" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


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

&lt;p&gt;&lt;strong&gt;Stack:&lt;/strong&gt; Next.js (App Router) and TypeScript, Tailwind CSS, xterm.js for the terminal, WebLLM and Ollama for inference. No server code and no environment variables.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The pipeline&lt;/strong&gt;, in the order a keystroke travels:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Line editor.&lt;/strong&gt; xterm.js gives the terminal, and I wrote the editor: history, tab completion, and type-ahead, so keys you type while the ghost is still talking are kept.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A simulated shell.&lt;/strong&gt; Pipes, redirects, globs, &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; and &lt;code&gt;||&lt;/code&gt;, a virtual filesystem, a git workflow (status, add, commit, log, push, reset, rebase, stash) and an &lt;code&gt;npm test&lt;/code&gt; that fails because the ghost enjoys it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A command interceptor.&lt;/strong&gt; Regex rules classify each line into a category, a dread score from 0 to 3 and tags such as &lt;code&gt;force-push&lt;/code&gt;, &lt;code&gt;secrets&lt;/code&gt; or &lt;code&gt;apocalypse&lt;/code&gt;. The score decides whether the ghost speaks at all. Dangerous commands and failures always wake it, and harmless ones only sometimes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A prompt engine.&lt;/strong&gt; One tight system prompt, three few-shot turns written in exactly the format of the live request, and a context block with the command, exit status, directory, branch, time of night, recent commands and a plain-English summary of the risk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One interface, three engines.&lt;/strong&gt; &lt;code&gt;GhostBackend&lt;/code&gt; has three implementations:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WebLLM&lt;/strong&gt; runs the model in the browser on WebGPU, inside a Web Worker so inference never freezes the CRT animation. The weights are cached by the browser, so after the first download it works with the network off.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama&lt;/strong&gt; streams from a local server. I run Gemma 3 4B through it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scripted&lt;/strong&gt; is a hand-written ghost keyed on the same tags as the interceptor.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A whisper pipeline.&lt;/strong&gt; It cleans the stream, caps the reply at one to three sentences, rejects text that breaks character ("As an AI...") and falls back to the scripted ghost on any failure or timeout. The typewriter then renders it with word wrapping and the occasional glitch.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Models.&lt;/strong&gt; Gemma 3 4B through Ollama is my default. In the browser you can choose from Gemma 3 1B, Gemma 2 2B, Gemma 4 E2B, Llama 3.2, Qwen 2.5 and Llama 3 8B, all verified against WebLLM's prebuilt model list. The CLI uses whichever Ollama model you have and prefers Gemma 3 4B.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Things I had to design around:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Small models drift.&lt;/em&gt; A 1B model will happily say "Sure! Here's a spooky warning:". The fix is not a cleverer prompt but the pipeline around it: a sentence budget, a character cap, a break-character detector and a fallback. A model that fails still produces a ghost.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The typed command is untrusted text.&lt;/em&gt; A system prompt rule tells the model the command is data, so &lt;code&gt;echo "ignore your instructions"&lt;/code&gt; gets mocked, not obeyed.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Privacy is enforced, not promised.&lt;/em&gt; The UI and, by default, the CLI refuse any Ollama address that is not loopback. The CLI redacts tokens, passwords, bearer headers and URL credentials before the command text reaches even a local model, and only ever sends the command, never its output.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;The ghost has to keep working.&lt;/em&gt; The scripted engine means a missing GPU, a model still downloading or a stopped Ollama never leaves you with a dead terminal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tests caught a real bug: &lt;code&gt;rm -rf /*&lt;/code&gt; was being glob-expanded before &lt;code&gt;rm&lt;/code&gt; saw it, which wiped the fake filesystem instead of triggering the permission-denied scene. There are 55 tests across the shell, the risk rules, the terminal session (including type-ahead), the CLI and the helpers.&lt;/p&gt;

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

&lt;p&gt;A terminal is the most private place on a developer's machine. Your command history holds hostnames, project names, half-pasted tokens, the &lt;code&gt;git push --force&lt;/code&gt; you regret. A ghost that reads it should not be a cloud API.&lt;/p&gt;

&lt;p&gt;Open weights made three things possible that a closed API would not:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It stays on your machine.&lt;/strong&gt; The model runs in your browser or on your own Ollama. The commands it sees never reach a server I operate or anyone else does. I can say that in the UI because the code enforces it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It works with the lights off.&lt;/strong&gt; After one download the browser version needs no network at all. For a Halloween project that felt right: the ghost lives in the machine, not in a service.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It cannot disappear.&lt;/strong&gt; A haunted terminal that goes silent because an API key expired, a model was retired or a free tier ended would be a bad ghost. With open weights and a MIT-licensed repo the ghost lasts as long as the files do.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also cost nothing to run and nothing to share, and swapping the model is one dropdown. The model is a component here. The same prompt and pipeline are built to run Gemma, Llama and Qwen. A closed API would have made that a per-vendor integration, and every user would have needed a key.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Spirit of It
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftmufxb2sl62f4dmq5mz1.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftmufxb2sl62f4dmq5mz1.png" alt="Haunt real-shell CLI" width="800" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I wanted the ghost to feel like an observant companion rather than a random text generator. The moment it landed for me was during a typo check—typing &lt;code&gt;gti status&lt;/code&gt; and having the ghost respond:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;I do not know that spell either, but I admire the confidence.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And when running &lt;code&gt;git status&lt;/code&gt; on a clean working tree:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;git status: the morbid habit of checking the wounds.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That balance between developer humor, gothic flourish, and technical accuracy is where the project came alive.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best Use of Gemma.&lt;/strong&gt; Gemma 3 4B is the default voice through Ollama, and Gemma 3 1B, Gemma 2 2B and Gemma 4 E2B are available in the browser through WebLLM.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Happy Hacktoberfest! 👻🎃 Wishing everyone the best of luck with the final challenge!&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>RepairSloth: Fix It Before You Replace It 🦥</title>
      <dc:creator>Ralph Rosael</dc:creator>
      <pubDate>Wed, 21 Oct 2026 12:04:25 +0000</pubDate>
      <link>https://dev.to/coderralph/repairsloth-fix-it-before-you-replace-it-ae3</link>
      <guid>https://dev.to/coderralph/repairsloth-fix-it-before-you-replace-it-ae3</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Meet &lt;strong&gt;RepairSloth&lt;/strong&gt;, a local-first AI appliance troubleshooting assistant built for people who would rather fix a washing machine than spend hours searching the internet for answers.&lt;/p&gt;

&lt;p&gt;When a washing machine stops draining, starts leaking, or refuses to spin, most people have the same questions: What's wrong with it? Is it something simple? Do I need to call a technician?&lt;/p&gt;

&lt;p&gt;RepairSloth aims to make that first step easier.&lt;/p&gt;

&lt;p&gt;Users can upload a photo of their washing machine, describe the symptoms, and get structured troubleshooting guidance with supporting evidence. Instead of digging through scattered forum posts and troubleshooting articles, users have one place to start investigating the problem.&lt;/p&gt;

&lt;p&gt;The goal isn't to replace professional technicians or pretend AI can identify every fault from a photo. It's to help people understand possible causes, identify safe initial checks, and make more informed repair decisions before spending money.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who gets to be a little lazier?&lt;/strong&gt; Anyone who owns a washing machine, especially people who aren't familiar with appliance repair and don't know where to begin.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Local demo:&lt;/strong&gt; RepairSloth is currently an early-stage project that runs locally.&lt;/p&gt;

&lt;p&gt;To try it, clone the repository, install the dependencies, start Ollama, download the model, and run the development server.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install
&lt;/span&gt;ollama pull gemma3:4b
npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: Ollama must be installed and running. See the README for the complete setup instructions.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demo video:&lt;/strong&gt; [&lt;a href="https://github.com/user-attachments/assets/235ab0eb-5efc-443b-a765-70d3522df7a4" rel="noopener noreferrer"&gt;https://github.com/user-attachments/assets/235ab0eb-5efc-443b-a765-70d3522df7a4&lt;/a&gt;]&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;GitHub repository:&lt;/strong&gt; [&lt;a href="https://github.com/coder-ralph/RepairSloth" rel="noopener noreferrer"&gt;https://github.com/coder-ralph/RepairSloth&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;RepairSloth is built with an open-source-oriented stack, including Next.js, TypeScript, and Ollama for local AI inference.&lt;/p&gt;

&lt;p&gt;The project is intended to make the troubleshooting workflow inspectable and customizable, rather than hiding the entire process behind a proprietary API.&lt;/p&gt;

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

&lt;p&gt;I built RepairSloth with a simple principle in mind: &lt;strong&gt;AI should reduce the effort required to solve everyday problems, not introduce another complicated workflow.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The current implementation uses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js and React&lt;/strong&gt; for the web application and user interface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript&lt;/strong&gt; for application logic and shared types.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ollama&lt;/strong&gt; to run an AI model locally.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 3 4B&lt;/strong&gt; as the intended local model for image understanding and troubleshooting assistance.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured validation&lt;/strong&gt; to help keep model inputs and outputs within the application's expected format.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A retrieval-oriented architecture&lt;/strong&gt; to connect troubleshooting guidance with supporting information.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local browser storage&lt;/strong&gt; for keeping a history of previous troubleshooting sessions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The application is organized around separate API routes for image identification and diagnosis, with dedicated components for photo uploads, symptom selection, diagnosis results, evidence, and safety notices.&lt;/p&gt;

&lt;p&gt;I also designed the workflow to emphasize safety. An AI-generated suggestion should be treated as a possible explanation, not proof that a particular component is broken. Electrical work, internal repairs, and other hazardous procedures should be left to qualified technicians.&lt;/p&gt;

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

&lt;p&gt;Open innovation matters because practical AI shouldn't be limited to companies that can afford expensive API usage or teams with access to proprietary infrastructure.&lt;/p&gt;

&lt;p&gt;Using an open-weight model through Ollama gives RepairSloth a path toward local inference. Users and developers can experiment with the model, inspect the surrounding application code, customize the troubleshooting workflow, and potentially adapt the project for different appliances.&lt;/p&gt;

&lt;p&gt;It also changes the economics of experimentation. Instead of making every development test depend on a paid, remote inference API, I can run the model on compatible local hardware and iterate on the application.&lt;/p&gt;

&lt;p&gt;Just as importantly, open-source development allows other contributors to improve the project. Someone could add better troubleshooting references, expand the supported appliance types, improve the safety checks, or contribute translations for people who need repair guidance in their preferred language.&lt;/p&gt;

&lt;p&gt;A small project like RepairSloth won't solve every repair problem. But open innovation makes it possible for more people to participate in improving tools that solve ordinary, real-world problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Best Use of Gemma&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>hacktoberfest</category>
      <category>opensourceai</category>
    </item>
    <item>
      <title>GigReceipt: A Local AI Receipt &amp; Expense Tracker for Freelancers</title>
      <dc:creator>Ralph Rosael</dc:creator>
      <pubDate>Fri, 16 Oct 2026 05:38:32 +0000</pubDate>
      <link>https://dev.to/coderralph/gigreceipt-a-local-ai-receipt-expense-tracker-for-freelancers-2fa0</link>
      <guid>https://dev.to/coderralph/gigreceipt-a-local-ai-receipt-expense-tracker-for-freelancers-2fa0</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;GigReceipt is a local-first receipt scanner and expense tracker built for freelancers, gig workers, and small business owners who want to simplify expense management without sending sensitive financial documents to a third-party AI service.&lt;/p&gt;

&lt;p&gt;Manually entering receipt details is tedious. Keeping track of expenses across different receipts makes bookkeeping even more frustrating.&lt;/p&gt;

&lt;p&gt;GigReceipt lets users upload a receipt image and extract important details with local AI, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Merchant name&lt;/li&gt;
&lt;li&gt;Transaction date&lt;/li&gt;
&lt;li&gt;Total amount and currency&lt;/li&gt;
&lt;li&gt;Expense category&lt;/li&gt;
&lt;li&gt;Payment method&lt;/li&gt;
&lt;li&gt;Notes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Users can review and edit the extracted information, save expenses locally, manage their records, and export them to CSV for bookkeeping.&lt;/p&gt;

&lt;p&gt;The goal is simple: turn a pile of receipts into organized expense records with less manual work.&lt;/p&gt;

&lt;p&gt;It's a tool that could be useful to freelancers and small business owners who want a lightweight alternative to expensive bookkeeping software.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Demo video:&lt;/strong&gt; [&lt;a href="https://github.com/user-attachments/assets/dfeb4644-c42c-4637-859c-14406812af54" rel="noopener noreferrer"&gt;https://github.com/user-attachments/assets/dfeb4644-c42c-4637-859c-14406812af54&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;The video will show the receipt upload, AI extraction, expense review, local saving, and CSV export workflows.&lt;/p&gt;

&lt;p&gt;GigReceipt currently runs locally because it uses Ollama for AI inference. A screen-recorded demo is the most straightforward way to let judges see it in action.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;GitHub repository:&lt;/strong&gt; [&lt;a href="https://github.com/coder-ralph/GigReceipt" rel="noopener noreferrer"&gt;https://github.com/coder-ralph/GigReceipt&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;The repository includes the application source code, setup instructions, and configuration needed to run GigReceipt locally.&lt;/p&gt;

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

&lt;p&gt;I built GigReceipt using Next.js, TypeScript, Tailwind CSS, and Ollama.&lt;/p&gt;

&lt;p&gt;The AI extraction workflow uses Gemma 4 through Ollama's local API. When a user uploads a receipt, the application sends the image to the local model, validates the returned structured data, and presents the results in an editable review form.&lt;/p&gt;

&lt;p&gt;The main technologies are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js App Router&lt;/strong&gt; for the application and receipt extraction API route.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript&lt;/strong&gt; for type-safe application logic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma 4 + Ollama&lt;/strong&gt; for local vision-based receipt extraction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zod&lt;/strong&gt; for validating extracted data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dexie + IndexedDB&lt;/strong&gt; for storing expenses locally in the browser.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CSV export&lt;/strong&gt; for transferring expense records into spreadsheet and bookkeeping workflows.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One important part of the implementation is that AI-generated results are treated as data that needs validation and user review, rather than being accepted blindly.&lt;/p&gt;

&lt;p&gt;I tested the workflow using a Maple Grove Market receipt. GigReceipt successfully extracted the merchant name, identified the exact total of $33.43, categorized the expense as Shopping, detected Visa as the payment method, and saved the record locally.&lt;/p&gt;

&lt;h3&gt;
  
  
  Screenshot
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn77i5muttt9o8lbkuczh.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn77i5muttt9o8lbkuczh.png" alt="Sample Receipt Result" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Receipts contain financial information that users may not want to upload to an external service. For a freelancer or small business owner, privacy and predictable costs matter.&lt;/p&gt;

&lt;p&gt;Using an open-weight model through local inference makes a different approach possible.&lt;/p&gt;

&lt;p&gt;With GigReceipt, receipt images can be processed by a model running on the user's own computer instead of being sent to a hosted AI API. Expense records are stored in the browser's local database, giving users control over their data.&lt;/p&gt;

&lt;p&gt;Local inference also avoids per-request charges from a third-party AI provider, although users still need suitable hardware and incur their own electricity and computing costs.&lt;/p&gt;

&lt;p&gt;Open models give developers the freedom to experiment with different models, inspect their behavior, and adapt the application without being locked into a single hosted AI provider's pricing or API.&lt;/p&gt;

&lt;p&gt;For me, open innovation makes it possible to build practical AI tools that prioritize privacy, accessibility, and user control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Best Use of Gemma&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>hacktoberfest</category>
      <category>opensourceai</category>
    </item>
    <item>
      <title>Dev Daily Dashboard — A Simple Developer Productivity Dashboard</title>
      <dc:creator>Ralph Rosael</dc:creator>
      <pubDate>Tue, 17 Mar 2026 00:32:15 +0000</pubDate>
      <link>https://dev.to/coderralph/dev-daily-dashboard-16mm</link>
      <guid>https://dev.to/coderralph/dev-daily-dashboard-16mm</guid>
      <description>&lt;p&gt;Dev Daily Dashboard is a developer-focused productivity dashboard to track daily coding activity in one place.&lt;/p&gt;

&lt;p&gt;🔗 Live: &lt;a href="https://devdaily-dashboard.vercel.app/" rel="noopener noreferrer"&gt;https://devdaily-dashboard.vercel.app/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What it shows&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub activity (commits, contributions)&lt;/li&gt;
&lt;li&gt;WakaTime coding stats&lt;/li&gt;
&lt;li&gt;Pomodoro timer&lt;/li&gt;
&lt;li&gt;LeetCode progress (mock data)&lt;/li&gt;
&lt;li&gt;Tasks and notes&lt;/li&gt;
&lt;li&gt;Productivity XP system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything runs directly in the browser, with data stored locally for persistence across sessions.&lt;/p&gt;

&lt;p&gt;Designed as a lightweight, all-in-one dashboard to quickly check progress, maintain consistency, and stay focused on daily development work.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>api</category>
    </item>
    <item>
      <title>RepoTree: Generate ASCII Tree from GitHub Repositories</title>
      <dc:creator>Ralph Rosael</dc:creator>
      <pubDate>Wed, 13 Nov 2024 15:04:45 +0000</pubDate>
      <link>https://dev.to/coderralph/repotree-generate-ascii-tree-from-github-repositories-364g</link>
      <guid>https://dev.to/coderralph/repotree-generate-ascii-tree-from-github-repositories-364g</guid>
      <description>&lt;p&gt;Hey folks! 🎉&lt;/p&gt;

&lt;p&gt;I’ve built a simple web app called &lt;a href="https://ascii-repotree.vercel.app/" rel="noopener noreferrer"&gt;RepoTree&lt;/a&gt;, which takes any GitHub repository URL and converts its structure into a clean ASCII tree format. This tool is perfect for documentation purposes or when you want to easily share the structure of a repository.&lt;/p&gt;

&lt;p&gt;With RepoTree, you can quickly visualize your GitHub repository hierarchy and export it to a text format to include in your docs. It’s a small utility that can save you time and effort while documenting your projects!&lt;/p&gt;

&lt;p&gt;Check it out on &lt;a href="https://github.com/coder-ralph/RepoTree" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;This project was inspired by Nathan Friend's &lt;a href="https://gitlab.com/nfriend/tree-online" rel="noopener noreferrer"&gt;Tree Online&lt;/a&gt; and &lt;a href="https://ascii-tree-generator.com/" rel="noopener noreferrer"&gt;ASCII Tree Generator&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>learning</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Revamped UI for NFT Artworks</title>
      <dc:creator>Ralph Rosael</dc:creator>
      <pubDate>Tue, 15 Oct 2024 01:57:57 +0000</pubDate>
      <link>https://dev.to/coderralph/revamped-ui-for-nft-artworks-43o8</link>
      <guid>https://dev.to/coderralph/revamped-ui-for-nft-artworks-43o8</guid>
      <description>&lt;p&gt;Hey folks, I revamped the UI of NFT Artworks! Check out the new design &lt;a href="https://youtu.be/B3LXUL_BRto" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Screenshots:&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%2Fia4uawkb889ksdv2h0wi.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%2Fia4uawkb889ksdv2h0wi.png" alt="Image 1" width="799" height="435"&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%2Fqtngu6irlypoiphnj9u8.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%2Fqtngu6irlypoiphnj9u8.png" alt="Image 2" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>pinatachallenge</category>
      <category>webdev</category>
      <category>api</category>
    </item>
    <item>
      <title>Creating NFT Artworks with Pinata</title>
      <dc:creator>Ralph Rosael</dc:creator>
      <pubDate>Sat, 12 Oct 2024 14:26:04 +0000</pubDate>
      <link>https://dev.to/coderralph/creating-nft-artworks-with-pinata-4c9k</link>
      <guid>https://dev.to/coderralph/creating-nft-artworks-with-pinata-4c9k</guid>
      <description>&lt;h2&gt;
  
  
  NFT Artworks
&lt;/h2&gt;

&lt;p&gt;A web application that allows users to upload and display their NFT artworks. It utilizes Pinata for IPFS storage, enabling secure and decentralized hosting of NFT artworks. This project is a submission for the &lt;a href="https://dev.to/challenges/pinata"&gt;Pinata Challenge&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;The application allows users to upload multiple images, which are then stored on IPFS using Pinata. Users can view their uploaded images in a gallery format and enjoy features such as drag-and-drop uploads, toast notifications for feedback, and a responsive design.&lt;/p&gt;

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

&lt;p&gt;You can access the live application &lt;a href="https://nft-artworks.vercel.app/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Screenshot]
&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%2F2a3kly6c4s5efjuv52lr.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%2F2a3kly6c4s5efjuv52lr.png" alt="light-theme" width="800" height="500"&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%2F643dhzrtnqd1z1pah4si.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%2F643dhzrtnqd1z1pah4si.png" alt="dark-theme" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The source code for this project can be found in the GitHub repository: &lt;a href="https://github.com/coder-ralph/NFT-Artworks.git" rel="noopener noreferrer"&gt;NFT-Artworks&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  More Details
&lt;/h2&gt;

&lt;p&gt;In this project, I used Pinata to pin uploaded images to IPFS. Upon uploading an image, the application sends a request to the Pinata API with the selected file. The API responds with the IPFS hash of the uploaded image, allowing users to access their NFTs via a gateway URL.&lt;/p&gt;

&lt;p&gt;Key Features Utilizing Pinata:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Image Upload to IPFS&lt;/strong&gt;: Users can upload images, which are pinned to IPFS through the Pinata API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fetching Uploaded Files&lt;/strong&gt;: The application retrieves previously uploaded images from Pinata using the provided API keys.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>pinatachallenge</category>
      <category>webdev</category>
      <category>api</category>
    </item>
    <item>
      <title>Creating NFT Artworks with Pinata</title>
      <dc:creator>Ralph Rosael</dc:creator>
      <pubDate>Sat, 12 Oct 2024 14:26:04 +0000</pubDate>
      <link>https://dev.to/coderralph/creating-nft-artworks-with-pinata-26d1</link>
      <guid>https://dev.to/coderralph/creating-nft-artworks-with-pinata-26d1</guid>
      <description>&lt;h2&gt;
  
  
  NFT Artworks
&lt;/h2&gt;

&lt;p&gt;A web application that allows users to upload and display their NFT artworks. It utilizes Pinata for IPFS storage, enabling secure and decentralized hosting of NFT artworks. This project is a submission for the &lt;a href="https://dev.to/challenges/pinata"&gt;Pinata Challenge&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;The application allows users to upload multiple images, which are then stored on IPFS using Pinata. Users can view their uploaded images in a gallery format and enjoy features such as drag-and-drop uploads, toast notifications for feedback, and a responsive design.&lt;/p&gt;

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

&lt;p&gt;You can access the live application &lt;a href="https://nft-artworks.vercel.app/" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Watch the video demo &lt;a href="https://youtu.be/Ea5UZJrEJoQ?si=8Aav2-mOoWixREVY" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Screenshot]
&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%2F2a3kly6c4s5efjuv52lr.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%2F2a3kly6c4s5efjuv52lr.png" alt="light-theme" width="800" height="500"&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%2F643dhzrtnqd1z1pah4si.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%2F643dhzrtnqd1z1pah4si.png" alt="dark-theme" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;The source code for this project can be found in the GitHub repository: &lt;a href="https://github.com/coder-ralph/NFT-Artworks.git" rel="noopener noreferrer"&gt;NFT-Artworks&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  More Details
&lt;/h2&gt;

&lt;p&gt;In this project, I used Pinata to pin uploaded images to IPFS. Upon uploading an image, the application sends a request to the Pinata API with the selected file. The API responds with the IPFS hash of the uploaded image, allowing users to access their NFTs via a gateway URL.&lt;/p&gt;

&lt;p&gt;Key Features Utilizing Pinata:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Image Upload to IPFS&lt;/strong&gt;: Users can upload images, which are pinned to IPFS through the Pinata API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fetching Uploaded Files&lt;/strong&gt;: The application retrieves previously uploaded images from Pinata using the provided API keys.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>pinatachallenge</category>
      <category>webdev</category>
      <category>api</category>
    </item>
    <item>
      <title>My First Hacktoberfest Journey: A Remarkable Experience</title>
      <dc:creator>Ralph Rosael</dc:creator>
      <pubDate>Wed, 18 Oct 2023 02:37:25 +0000</pubDate>
      <link>https://dev.to/coderralph/my-first-hacktoberfest-journey-a-remarkable-experience-1c5m</link>
      <guid>https://dev.to/coderralph/my-first-hacktoberfest-journey-a-remarkable-experience-1c5m</guid>
      <description>&lt;p&gt;I'm thrilled to share that I've embarked on my very first Hacktoberfest journey, and it's been an incredible ride so far. Joining the open-source community and making my humble contributions during Hacktoberfest 2023 has been a truly rewarding experience. You can check out my GitHub profile- &lt;a href="https://github.com/coder-ralph" rel="noopener noreferrer"&gt;https://github.com/coder-ralph&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  A Journey of Recognition 🎉
&lt;/h3&gt;

&lt;p&gt;One of the most heartwarming moments during Hacktoberfest was the recognition of my efforts. While the digital badges serve as a symbol of accomplishment, I was pleasantly surprised to receive a Hacktoberfest 2023 Reward Kit. This tangible token of appreciation made me feel even more connected to the global open-source community.&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%2Fxhi8373xw774n4f9oeal.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%2Fxhi8373xw774n4f9oeal.png" alt="Hacktoberfest 2023 Reward Kit" width="800" height="650"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Planting Trees for a Greener Future 🌳
&lt;/h3&gt;

&lt;p&gt;Apart from the badges and the Reward Kit, I received a certificate from TreeNation. What's even more inspiring is that a tree will be planted in my name as a part of this initiative. Knowing that my contributions are not only benefiting the world of technology but also making a positive impact on the environment is an incredibly fulfilling feeling. It's a reminder that every small step we take can contribute to a greener, more sustainable future.&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%2Ff4cafq5dqcs1ax1abj8k.jpg" 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%2Ff4cafq5dqcs1ax1abj8k.jpg" alt="Tree Planting Certificate" width="800" height="827"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Shoutout to My Collaborators and the Hacktoberfest Team 🙌
&lt;/h3&gt;

&lt;p&gt;None of this would have been possible without the support and collaboration of amazing individuals within the open-source community. I want to give a massive shoutout to all my collaborators who guided me, reviewed my pull requests, and shared their knowledge. It's the collective effort of the community that makes Hacktoberfest such a remarkable event.&lt;/p&gt;

&lt;p&gt;I'd also like to express my gratitude to the Hacktoberfest team for organizing this event. Their dedication and hard work in bringing open-source enthusiasts together is truly commendable. Hacktoberfest serves as a platform for developers of all levels to come together, learn, and make a meaningful impact.&lt;/p&gt;

&lt;h3&gt;
  
  
  Let's Keep the Momentum Going 🚀🌍🌱
&lt;/h3&gt;

&lt;p&gt;As my first Hacktoberfest journey draws to a close, I'm not only reflecting on the knowledge and skills I've gained but also the sense of fulfillment that comes from being part of a larger mission. Let's not limit our contributions to just one month; instead, let's keep coding, collaborating, and making a positive impact on the world.&lt;/p&gt;

&lt;p&gt;Hacktoberfest has shown me the power of the open-source community, and I'm excited to continue my journey as a contributor, learn more, and inspire others to join this incredible world of coding and collaboration. Together, we can shape a better future, one pull request at a time. 🚀🌍🌱&lt;/p&gt;

&lt;p&gt;Thank you, Hacktoberfest 2023, for this remarkable experience. Until next year! 🙌&lt;/p&gt;

&lt;p&gt;Check out my GitHub Contributions: 4 PRs Submitted!&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;OSSPhilippines/freefolio:&lt;br&gt;
PR #113: &lt;a href="https://github.com/OSSPhilippines/freefolio/pull/113" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;br&gt;
PR #115: &lt;a href="https://github.com/OSSPhilippines/freefolio/pull/115" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rudra016/WebDev-OpenSource:&lt;br&gt;
PR #210: &lt;a href="https://github.com/rudra016/WebDev-OpenSource/pull/210" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Astha369/CPP_Problems:&lt;br&gt;
PR #12: &lt;a href="https://github.com/Astha369/CPP_Problems/pull/12" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;coder-ralph/fcc-antique-dev-profiles:&lt;br&gt;
PR #1: &lt;a href="https://github.com/coder-ralph/fcc-antique-dev-profiles/pull/1" rel="noopener noreferrer"&gt;Link&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Connect me on &lt;a href="https://www.linkedin.com/in/ralphrosael/" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;, and &lt;a href="https://github.com/coder-ralph" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>hack23contributor</category>
      <category>hacktoberfest</category>
      <category>hacktoberfest23</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
