<?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: Ashton Chew</title>
    <description>The latest articles on DEV Community by Ashton Chew (@ashtonckj).</description>
    <link>https://dev.to/ashtonckj</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%2F4160958%2F5434e485-3dbc-4778-b455-25e0aa748ff3.jpg</url>
      <title>DEV Community: Ashton Chew</title>
      <link>https://dev.to/ashtonckj</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ashtonckj"/>
    <language>en</language>
    <item>
      <title>👻 Ghostlet: We Built Something Useless for Hacktoberfest (And Loved It)</title>
      <dc:creator>Ashton Chew</dc:creator>
      <pubDate>Wed, 04 Nov 2026 05:51:41 +0000</pubDate>
      <link>https://dev.to/ashtonckj/ghostlet-we-built-something-useless-for-hacktoberfest-and-loved-it-535l</link>
      <guid>https://dev.to/ashtonckj/ghostlet-we-built-something-useless-for-hacktoberfest-and-loved-it-535l</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/mlh-hackathon"&gt;MLH x DEV Writing Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Not every hackathon project needs to solve a problem. Sometimes, you just want to build something silly, cute and fun!&lt;/p&gt;

&lt;p&gt;Meet &lt;strong&gt;Ghostlet&lt;/strong&gt; 👻, a tiny pixel-art desktop companion for Windows, built by three friends for Hacktoberfest 2026 Week 4.&lt;/p&gt;

&lt;p&gt;Leave your PC idle, and little ghosts start appearing around your cursor. The longer you're away, the more ghosts, pumpkins, graves and spooky decorations accumulate.&lt;/p&gt;

&lt;p&gt;But move your mouse or press a key, and they'll panic, grab their decorations and run away!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2znqhxnsrue73mr4oa6p.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2znqhxnsrue73mr4oa6p.gif" alt="Ghostlet ghosts fleeing" width="560" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why something useless?
&lt;/h3&gt;

&lt;p&gt;We initially weren't even planning to participate in Week 4.&lt;/p&gt;

&lt;p&gt;There were plenty of interesting projects being built, many experimenting with AI and solving practical problems. We wanted to try something different.&lt;/p&gt;

&lt;p&gt;AI models were still relatively new to us, so instead of forcing ourselves to build something unfamiliar, we decided to use technologies we already knew and create something we would genuinely enjoy.&lt;/p&gt;

&lt;p&gt;Our idea? Something deliberately useless, but fun!&lt;/p&gt;

&lt;p&gt;We wanted people to have a little companion running in the background while coding, especially during Halloween.&lt;/p&gt;

&lt;h3&gt;
  
  
  🎨 Bringing Ghostlet to life
&lt;/h3&gt;

&lt;p&gt;We split the work based on what we enjoyed most. My teammates focused on the creative side, while I handled most of the programming.&lt;/p&gt;

&lt;p&gt;Taking inspiration from perler bead art, we manually created pixel-art ghosts and decorations, giving each character its own personality. There are even several ghost variations, including a rare witch ghost! ✨&lt;/p&gt;

&lt;p&gt;Technically, Ghostlet is built with &lt;strong&gt;Python, PySide6 and the Windows API&lt;/strong&gt;, which detects system idle time and allows the ghosts to react to user activity.&lt;/p&gt;

&lt;p&gt;PySide6 was new to me, so understanding the framework and getting everything working was one of my biggest challenges. I used AI assistance through Claude on the web to help me learn unfamiliar concepts and work through implementation details.&lt;/p&gt;

&lt;p&gt;It was a fun opportunity to explore desktop application development using Python!&lt;/p&gt;

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

&lt;p&gt;Want some little ghosts on your desktop?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ashtonckj/ghostlet" rel="noopener noreferrer"&gt;https://github.com/ashtonckj/ghostlet&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Download:&lt;/strong&gt; &lt;a href="https://github.com/ashtonckj/ghostlet/releases" rel="noopener noreferrer"&gt;Windows executable on GitHub Releases&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No Python installation required!&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%2Fzua7exkumwn1ld5gajyr.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%2Fzua7exkumwn1ld5gajyr.png" alt="Ghostlet application settings" width="452" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The project is open source under the MIT License. Feel free to explore, customise the ghosts or create your own decorations!&lt;/p&gt;

&lt;h2&gt;
  
  
  Partner Technologies
&lt;/h2&gt;

&lt;p&gt;Ghostlet uses Python, PySide6 and the Windows API. We didn't integrate any MLH partner technologies into the application itself. Instead, we focused on building something with tools we were comfortable with while using AI assistance as a learning aid.&lt;/p&gt;

&lt;h2&gt;
  
  
  Hackathon Experience
&lt;/h2&gt;

&lt;p&gt;We participated online as a team of three:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/ashtonckj"&gt;@ashtonckj&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/fionakhl"&gt;@fionakhl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/moltenice3"&gt;@moltenice3&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Honestly, I'm glad I convinced everyone to give Week 4 a try!&lt;/p&gt;

&lt;p&gt;The teamwork was amazing. Everyone contributed in their own way, and we had fun bringing our little Halloween idea to life.&lt;/p&gt;

&lt;p&gt;We didn't build something that would change the world, but we made something that could brighten someone's day while coding. And I think that's pretty cool.&lt;/p&gt;

&lt;p&gt;Halloween might be over, but who knows? Maybe Ghostlet will return with some Christmas friends! 🎄&lt;/p&gt;

&lt;p&gt;Happy coding, and don't leave your computer unattended for too long. You never know who's watching. 👻&lt;/p&gt;

</description>
      <category>mlhacks</category>
      <category>devchallenge</category>
      <category>hackathon</category>
      <category>halloween</category>
    </item>
    <item>
      <title>👻 Ghostlet: While you’re away, the ghosts will play.</title>
      <dc:creator>Ashton Chew</dc:creator>
      <pubDate>Fri, 30 Oct 2026 15:38:40 +0000</pubDate>
      <link>https://dev.to/ashtonckj/ghostlet-while-youre-away-the-ghosts-will-play-1909</link>
      <guid>https://dev.to/ashtonckj/ghostlet-while-youre-away-the-ghosts-will-play-1909</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 We Built
&lt;/h2&gt;

&lt;p&gt;Meet &lt;strong&gt;Ghostlet&lt;/strong&gt; 👻, a tiny pixel-art desktop companion for Windows!&lt;/p&gt;

&lt;p&gt;The idea is simple: leave your PC idle, and little ghosts start appearing around your cursor. The longer you're away, the more ghosts, pumpkins, graves and spooky decorations accumulate.&lt;/p&gt;

&lt;p&gt;Move your mouse or press a key, and the ghosts panic, grab their decorations and run away!&lt;/p&gt;

&lt;p&gt;We wanted to turn an ordinary idle desktop into a little Halloween scene.&lt;/p&gt;

&lt;h3&gt;
  
  
  👻 Meet the Ghosts!
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&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%2Fashtonckj%2Fghostlet%2Fmain%2Fdocs%2Fghosts%2Fdefault.png" width="96" alt="Classic ghost" height="96"&gt;&lt;br&gt;&lt;strong&gt;Classic&lt;/strong&gt;
&lt;/td&gt;
      &lt;td&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%2Fashtonckj%2Fghostlet%2Fmain%2Fdocs%2Fghosts%2Fcool.png" width="96" alt="Cool ghost" height="96"&gt;&lt;br&gt;&lt;strong&gt;Cool&lt;/strong&gt;
&lt;/td&gt;
      &lt;td&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%2Fashtonckj%2Fghostlet%2Fmain%2Fdocs%2Fghosts%2Fcrying.png" width="96" alt="Crying ghost" height="96"&gt;&lt;br&gt;&lt;strong&gt;Crying&lt;/strong&gt;
&lt;/td&gt;
      &lt;td&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%2Fashtonckj%2Fghostlet%2Fmain%2Fdocs%2Fghosts%2Fhunt.png" width="96" alt="Hunting ghost" height="96"&gt;&lt;br&gt;&lt;strong&gt;Hunting&lt;/strong&gt;
&lt;/td&gt;
      &lt;td&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%2Fashtonckj%2Fghostlet%2Fmain%2Fdocs%2Fghosts%2Flove.png" width="96" alt="Loving ghost" height="96"&gt;&lt;br&gt;&lt;strong&gt;Loving&lt;/strong&gt;
&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&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%2Fashtonckj%2Fghostlet%2Fmain%2Fdocs%2Fghosts%2Fmagic.png" width="96" alt="Magic ghost" height="96"&gt;&lt;br&gt;&lt;strong&gt;Magic&lt;/strong&gt;
&lt;/td&gt;
      &lt;td&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%2Fashtonckj%2Fghostlet%2Fmain%2Fdocs%2Fghosts%2Fpeeping.png" width="96" alt="Peeping ghost" height="96"&gt;&lt;br&gt;&lt;strong&gt;Peeping&lt;/strong&gt;
&lt;/td&gt;
      &lt;td&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%2Fashtonckj%2Fghostlet%2Fmain%2Fdocs%2Fghosts%2Fshiver.png" width="96" alt="Shivering ghost" height="96"&gt;&lt;br&gt;&lt;strong&gt;Shivering&lt;/strong&gt;
&lt;/td&gt;
      &lt;td&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%2Fashtonckj%2Fghostlet%2Fmain%2Fdocs%2Fghosts%2Fsleeping.png" width="96" alt="Sleeping ghost" height="96"&gt;&lt;br&gt;&lt;strong&gt;Sleeping&lt;/strong&gt;
&lt;/td&gt;
      &lt;td&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%2Fashtonckj%2Fghostlet%2Fmain%2Fdocs%2Fghosts%2Frare.png" width="96" alt="Rare witch ghost" height="96"&gt;&lt;br&gt;&lt;strong&gt;Rare Witch!&lt;/strong&gt; ✨&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  🎃 Meet the Decorations!
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&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%2Fashtonckj%2Fghostlet%2Fmain%2Fdocs%2Fprops%2Fpumpkin.png" width="64" alt="Pumpkin" height="64"&gt;&lt;br&gt;&lt;strong&gt;Pumpkin&lt;/strong&gt;
&lt;/td&gt;
      &lt;td&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%2Fashtonckj%2Fghostlet%2Fmain%2Fdocs%2Fprops%2Fpumpkin_happy.png" width="64" alt="Happy pumpkin" height="64"&gt;&lt;br&gt;&lt;strong&gt;Happy Pumpkin&lt;/strong&gt;
&lt;/td&gt;
      &lt;td&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%2Fashtonckj%2Fghostlet%2Fmain%2Fdocs%2Fprops%2Fpumpkin_red.png" width="64" alt="Red pumpkin" height="64"&gt;&lt;br&gt;&lt;strong&gt;Red Pumpkin&lt;/strong&gt;
&lt;/td&gt;
      &lt;td&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%2Fashtonckj%2Fghostlet%2Fmain%2Fdocs%2Fprops%2Fpumpkin_medium.png" width="80" alt="Medium pumpkin" height="80"&gt;&lt;br&gt;&lt;strong&gt;Medium Pumpkin&lt;/strong&gt;
&lt;/td&gt;
      &lt;td&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%2Fashtonckj%2Fghostlet%2Fmain%2Fdocs%2Fprops%2Fjack_o_lantern.png" width="80" alt="Jack-o'-lantern" height="80"&gt;&lt;br&gt;&lt;strong&gt;Jack-o'-Lantern&lt;/strong&gt;
&lt;/td&gt;
      &lt;td&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%2Fashtonckj%2Fghostlet%2Fmain%2Fdocs%2Fprops%2Fspider.png" width="64" alt="Spider" height="64"&gt;&lt;br&gt;&lt;strong&gt;Spider&lt;/strong&gt;
&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&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%2Fashtonckj%2Fghostlet%2Fmain%2Fdocs%2Fprops%2Fskeleton.png" width="64" alt="Skeleton" height="64"&gt;&lt;br&gt;&lt;strong&gt;Skeleton&lt;/strong&gt;
&lt;/td&gt;
      &lt;td&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%2Fashtonckj%2Fghostlet%2Fmain%2Fdocs%2Fprops%2Fgrave_cross.png" width="64" alt="Cross grave" height="64"&gt;&lt;br&gt;&lt;strong&gt;Cross Grave&lt;/strong&gt;
&lt;/td&gt;
      &lt;td&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%2Fashtonckj%2Fghostlet%2Fmain%2Fdocs%2Fprops%2Fgrave_tall.png" width="64" alt="Tall grave" height="64"&gt;&lt;br&gt;&lt;strong&gt;Tall Grave&lt;/strong&gt;
&lt;/td&gt;
      &lt;td&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%2Fashtonckj%2Fghostlet%2Fmain%2Fdocs%2Fprops%2Fgrave_wide.png" width="64" alt="Wide grave" height="64"&gt;&lt;br&gt;&lt;strong&gt;Wide Grave&lt;/strong&gt;
&lt;/td&gt;
      &lt;td&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%2Fashtonckj%2Fghostlet%2Fmain%2Fdocs%2Fprops%2Fgrave_short.png" width="64" alt="Short grave" height="64"&gt;&lt;br&gt;&lt;strong&gt;Short Grave&lt;/strong&gt;
&lt;/td&gt;
      &lt;td&gt;&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2znqhxnsrue73mr4oa6p.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2znqhxnsrue73mr4oa6p.gif" alt="Ghost Fleeing Gif" width="560" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Download Ghostlet and give it a try!&lt;br&gt;
GitHub Releases (Windows executable, no Python installation required)&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%2Fzua7exkumwn1ld5gajyr.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%2Fzua7exkumwn1ld5gajyr.png" alt="App Settings" width="452" height="492"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;The project is open source under the MIT License.&lt;/p&gt;

&lt;p&gt;GitHub Repository – Ghostlet&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://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ashtonckj" rel="noopener noreferrer"&gt;
        ashtonckj
      &lt;/a&gt; / &lt;a href="https://github.com/ashtonckj/ghostlet" rel="noopener noreferrer"&gt;
        ghostlet
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      While you’re away, the ghosts will play. BOO!
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/ashtonckj/ghostlet/docs/ghost.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%2Fashtonckj%2Fghostlet%2FHEAD%2Fdocs%2Fghost.png" alt="Ghostlet ghost"&gt;&lt;/a&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Ghostlet&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Step away from your PC. Tiny ghosts move in.&lt;/strong&gt; 👻&lt;/p&gt;
&lt;p&gt;&lt;a href="https://hacktoberfest.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e0f867d4203c4bbc2ba8d309575de1bb40d7be239fc103ef08849df211140ac7/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4861636b746f626572666573742d323032362d6f72616e67653f6c6162656c436f6c6f723d333833383338267374796c653d666f722d7468652d6261646765" alt="Hacktoberfest 2026"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/10c8d77838375d2e62ea3f11b82ad6de38597ef310fb8e30a2b036b26c6a12e5/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f57696e646f77732d313025323025374325323031312d3030373864343f6c6162656c436f6c6f723d333833383338267374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/10c8d77838375d2e62ea3f11b82ad6de38597ef310fb8e30a2b036b26c6a12e5/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f57696e646f77732d313025323025374325323031312d3030373864343f6c6162656c436f6c6f723d333833383338267374796c653d666f722d7468652d6261646765" alt="Windows"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/19328abb14b15937b772f0562cf09c616977cb9006616b511a56452023efc828/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507974686f6e2d332e31302532422d3337373661623f6c6162656c436f6c6f723d333833383338267374796c653d666f722d7468652d6261646765266c6f676f3d707974686f6e266c6f676f436f6c6f723d7768697465"&gt;&lt;img src="https://camo.githubusercontent.com/19328abb14b15937b772f0562cf09c616977cb9006616b511a56452023efc828/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507974686f6e2d332e31302532422d3337373661623f6c6162656c436f6c6f723d333833383338267374796c653d666f722d7468652d6261646765266c6f676f3d707974686f6e266c6f676f436f6c6f723d7768697465" alt="Python"&gt;&lt;/a&gt;
&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/f76fd407da9d439cd5c040ef387533683d92893eef4c5c075e4b2d21798069ca/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f773f6c6162656c436f6c6f723d333833383338267374796c653d666f722d7468652d6261646765"&gt;&lt;img src="https://camo.githubusercontent.com/f76fd407da9d439cd5c040ef387533683d92893eef4c5c075e4b2d21798069ca/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f773f6c6162656c436f6c6f723d333833383338267374796c653d666f722d7468652d6261646765" alt="License: MIT"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Leave your mouse alone for a minute and pixel ghosts float up around your cursor, while pumpkins, graves and spooky friends pile up along the bottom of your screen. Come back and they panic, grab the decorations and run away! 🎃&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;👻 Meet the ghosts&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Each ghost picks a random look.&lt;/p&gt;
&lt;div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ashtonckj/ghostlet/docs/ghosts/default.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%2Fashtonckj%2Fghostlet%2FHEAD%2Fdocs%2Fghosts%2Fdefault.png" alt="classic ghost"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ashtonckj/ghostlet/docs/ghosts/cool.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%2Fashtonckj%2Fghostlet%2FHEAD%2Fdocs%2Fghosts%2Fcool.png" alt="cool ghost"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ashtonckj/ghostlet/docs/ghosts/crying.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%2Fashtonckj%2Fghostlet%2FHEAD%2Fdocs%2Fghosts%2Fcrying.png" alt="crying ghost"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;classic&lt;/td&gt;
&lt;td&gt;cool&lt;/td&gt;
&lt;td&gt;crying&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ashtonckj/ghostlet/docs/ghosts/hunt.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%2Fashtonckj%2Fghostlet%2FHEAD%2Fdocs%2Fghosts%2Fhunt.png" alt="hunting ghost"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ashtonckj/ghostlet/docs/ghosts/love.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%2Fashtonckj%2Fghostlet%2FHEAD%2Fdocs%2Fghosts%2Flove.png" alt="loving ghost"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ashtonckj/ghostlet/docs/ghosts/magic.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%2Fashtonckj%2Fghostlet%2FHEAD%2Fdocs%2Fghosts%2Fmagic.png" alt="magic ghost"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;hunting&lt;/td&gt;
&lt;td&gt;loving&lt;/td&gt;
&lt;td&gt;magic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ashtonckj/ghostlet/docs/ghosts/peeping.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%2Fashtonckj%2Fghostlet%2FHEAD%2Fdocs%2Fghosts%2Fpeeping.png" alt="peeping ghost"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ashtonckj/ghostlet/docs/ghosts/shiver.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%2Fashtonckj%2Fghostlet%2FHEAD%2Fdocs%2Fghosts%2Fshiver.png" alt="shivering ghost"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ashtonckj/ghostlet/docs/ghosts/sleeping.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%2Fashtonckj%2Fghostlet%2FHEAD%2Fdocs%2Fghosts%2Fsleeping.png" alt="sleeping ghost"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;peeping&lt;/td&gt;
&lt;td&gt;shivering&lt;/td&gt;
&lt;td&gt;sleeping&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;a rel="noopener noreferrer" href="https://github.com/ashtonckj/ghostlet/docs/ghosts/rare.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%2Fashtonckj%2Fghostlet%2FHEAD%2Fdocs%2Fghosts%2Frare.png" alt="the rare witch ghost"&gt;&lt;/a&gt;
&lt;p&gt;✨ &lt;strong&gt;The rare one!&lt;/strong&gt; 10× less likely to show up than any other ghost. ✨&lt;/p&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;🎃 Spooky props&lt;/h2&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ashtonckj/ghostlet/docs/props/pumpkin.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%2Fashtonckj%2Fghostlet%2FHEAD%2Fdocs%2Fprops%2Fpumpkin.png" alt="pumpkin"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ashtonckj/ghostlet/docs/props/pumpkin_happy.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%2Fashtonckj%2Fghostlet%2FHEAD%2Fdocs%2Fprops%2Fpumpkin_happy.png" alt="happy pumpkin"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ashtonckj/ghostlet/docs/props/pumpkin_red.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%2Fashtonckj%2Fghostlet%2FHEAD%2Fdocs%2Fprops%2Fpumpkin_red.png" alt="red pumpkin"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ashtonckj/ghostlet/docs/props/pumpkin_medium.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%2Fashtonckj%2Fghostlet%2FHEAD%2Fdocs%2Fprops%2Fpumpkin_medium.png" alt="medium pumpkin"&gt;&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ashtonckj/ghostlet/docs/props/jack_o_lantern.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%2Fashtonckj%2Fghostlet%2FHEAD%2Fdocs%2Fprops%2Fjack_o_lantern.png" alt="jack-o'-lantern"&gt;&lt;/a&gt;&lt;/th&gt;

&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;pumpkin&lt;/td&gt;
&lt;td&gt;happy pumpkin&lt;/td&gt;
&lt;td&gt;red pumpkin&lt;/td&gt;
&lt;td&gt;medium pumpkin&lt;/td&gt;
&lt;td&gt;jack-o'-lantern&lt;/td&gt;

&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ashtonckj/ghostlet/docs/props/spider.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%2Fashtonckj%2Fghostlet%2FHEAD%2Fdocs%2Fprops%2Fspider.png" alt="spider"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ashtonckj/ghostlet/docs/props/skeleton.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%2Fashtonckj%2Fghostlet%2FHEAD%2Fdocs%2Fprops%2Fskeleton.png" alt="skeleton"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ashtonckj/ghostlet/docs/props/grave_cross.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%2Fashtonckj%2Fghostlet%2FHEAD%2Fdocs%2Fprops%2Fgrave_cross.png" alt="cross grave"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ashtonckj/ghostlet/docs/props/grave_tall.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%2Fashtonckj%2Fghostlet%2FHEAD%2Fdocs%2Fprops%2Fgrave_tall.png" alt="tall grave"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ashtonckj/ghostlet/docs/props/grave_wide.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%2Fashtonckj%2Fghostlet%2FHEAD%2Fdocs%2Fprops%2Fgrave_wide.png" alt="wide grave"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a rel="noopener noreferrer" href="https://github.com/ashtonckj/ghostlet/docs/props/grave_short.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%2Fashtonckj%2Fghostlet%2FHEAD%2Fdocs%2Fprops%2Fgrave_short.png" alt="short grave"&gt;&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;spider&lt;/td&gt;
&lt;td&gt;skeleton&lt;/td&gt;
&lt;td&gt;cross grave&lt;/td&gt;
&lt;td&gt;tall grave&lt;/td&gt;
&lt;td&gt;wide grave&lt;/td&gt;
&lt;td&gt;short grave&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;The longer you're away, the more pile up. When you're back, the ghosts carry them off.&lt;/p&gt;
&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;💾 Get it&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Grab &lt;code&gt;Ghostlet.exe&lt;/code&gt; from &lt;a href="https://github.com/ashtonckj/ghostlet/releases" rel="noopener noreferrer"&gt;Releases&lt;/a&gt; and double-click it. No Python needed.&lt;/p&gt;
&lt;p&gt;Ghostlet lives in your tray (bottom-right). Right-click the ghost for &lt;strong&gt;Settings&lt;/strong&gt;.&lt;/p&gt;

Run from…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ashtonckj/ghostlet" 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;Ghostlet is built with Python and PySide6, using the Windows API to detect system idle time.&lt;/p&gt;

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

&lt;p&gt;Open-source development makes it possible for people to inspect, modify and build upon existing work.&lt;/p&gt;

&lt;p&gt;Ghostlet is released under MIT, so anyone can customise the ghosts, create new pixel-art decorations or even add their own behaviours.&lt;/p&gt;

&lt;p&gt;Sometimes, even a small silly project can become something others want to experiment with!&lt;/p&gt;

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

&lt;p&gt;We think the funniest part is coming back to your PC and finding a whole bunch of ghosts having a little party on your desktop.&lt;/p&gt;

&lt;p&gt;And then watching them desperately run away when they realise you're back. 🎃&lt;/p&gt;

&lt;h2&gt;
  
  
  👥 Built by three humans
&lt;/h2&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/ashtonckj"&gt;@ashtonckj&lt;/a&gt; &lt;br&gt;
&lt;a class="mentioned-user" href="https://dev.to/fionakhl"&gt;@fionakhl&lt;/a&gt; &lt;br&gt;
&lt;a class="mentioned-user" href="https://dev.to/moltenice3"&gt;@moltenice3&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;Happy Halloween! 👻🎃&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>halloween</category>
      <category>python</category>
    </item>
    <item>
      <title>🦥 We built a pixel-art office where five cats do your data analysis while a sloth naps 🐱</title>
      <dc:creator>Ashton Chew</dc:creator>
      <pubDate>Sun, 25 Oct 2026 06:44:33 +0000</pubDate>
      <link>https://dev.to/ashtonckj/we-built-a-pixel-art-office-where-five-cats-do-your-data-analysis-while-a-sloth-naps-2mld</link>
      <guid>https://dev.to/ashtonckj/we-built-a-pixel-art-office-where-five-cats-do-your-data-analysis-while-a-sloth-naps-2mld</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;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%2Fganw58mo3yit9snkv1d2.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%2Fganw58mo3yit9snkv1d2.png" alt="Professor Slothhh and his five specialist cats in a pixel-art office" width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every dataset starts the same way: &lt;code&gt;df.head()&lt;/code&gt;, count the missing values, find the duplicates, draw a histogram, repeat. So we handed that work to a team of cats.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Purrrfessorrr Slothhh&lt;/strong&gt; is a local-first data analysis assistant. Upload a CSV, TSV, or Excel file, and a very sleepy sloth professor delegates the work to five specialist cats. Your data never leaves your machine.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;🕵️ &lt;strong&gt;Detective Cat&lt;/strong&gt; finds outliers, duplicates, and type problems&lt;/li&gt;
&lt;li&gt;🎨 &lt;strong&gt;Artist Cat&lt;/strong&gt; draws the charts&lt;/li&gt;
&lt;li&gt;📝 &lt;strong&gt;Scribe Cat&lt;/strong&gt; explains the findings in plain English&lt;/li&gt;
&lt;li&gt;💻 &lt;strong&gt;Coder Cat&lt;/strong&gt; writes Python and R code for every analysis&lt;/li&gt;
&lt;li&gt;🧹 &lt;strong&gt;Janitor Cat&lt;/strong&gt; suggests how to clean the data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ask follow-up questions in chat, then export everything as a ZIP or a Jupyter notebook.&lt;/p&gt;

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

&lt;p&gt;Try it in two minutes. No account and no API key needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/ashtonckj/Purrrfessorrr-Slothhh.git
&lt;span class="nb"&gt;cd &lt;/span&gt;Purrrfessorrr-Slothhh
.&lt;span class="se"&gt;\r&lt;/span&gt;un.bat        &lt;span class="c"&gt;# macOS / Linux: ./run.sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&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%2Fasjeaq0t9l8v1dw13djy.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%2Fasjeaq0t9l8v1dw13djy.png" alt="Python/R snippet with graphs generated by one cat" width="799" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/ashtonckj/Purrrfessorrr-Slothhh" rel="noopener noreferrer"&gt;https://github.com/ashtonckj/Purrrfessorrr-Slothhh&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Python + FastAPI&lt;/strong&gt;, &lt;strong&gt;vanilla JavaScript&lt;/strong&gt;, and optional &lt;strong&gt;Gemma 3&lt;/strong&gt; running locally through Ollama.&lt;/p&gt;

&lt;p&gt;The key decision was to keep calculation and conversation separate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python computes every number.&lt;/strong&gt; The analysis is a plain, documented pipeline, so the same file always gives the same report.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemma only explains.&lt;/strong&gt; It sees a summary of the computed results, not your raw rows. A guard then &lt;strong&gt;removes any sentence containing a number that isn't in the real data.&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No model? Still works.&lt;/strong&gt; Without Ollama, the full analysis and rule-based chat keep running.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;A dataset is often the most sensitive thing on your laptop. Open-weight models let us build AI-assisted analysis that needs no hosted API and sends nothing to a third party. We enforced it in code: the app refuses to talk to any model that isn't on localhost.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lazy Payoff
&lt;/h2&gt;

&lt;p&gt;The repetitive first pass of exploratory analysis (profiling, quality checks, starter charts, boilerplate code) happens in one guided workflow, so you spend your time on what the data &lt;em&gt;means&lt;/em&gt;. We haven't benchmarked the time saved, so we won't claim a number.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Best Use of Gemma&lt;/strong&gt; (featured): Gemma 3 runs locally via Ollama to write the morning digest, grounded strictly on the model's own output, with a deterministic offline fallback so it never hard-fails.&lt;/p&gt;




&lt;h3&gt;
  
  
  👥 Built by three humans (and five fictional cats)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ashton&lt;/strong&gt; — Github: &lt;a href="https://github.com/ashtonckj" rel="noopener noreferrer"&gt;@ashtonckj&lt;/a&gt; · Dev: &lt;a class="mentioned-user" href="https://dev.to/ashtonckj"&gt;@ashtonckj&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fiona&lt;/strong&gt; — Github: &lt;a href="https://github.com/fionakhl" rel="noopener noreferrer"&gt;@fionakhl&lt;/a&gt; · Dev: &lt;a class="mentioned-user" href="https://dev.to/fionakhl"&gt;@fionakhl&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jocelyn&lt;/strong&gt; — Github: &lt;a href="https://github.com/jocelynkoh3" rel="noopener noreferrer"&gt;@JocelynKoh3&lt;/a&gt; · Dev: &lt;a class="mentioned-user" href="https://dev.to/moltenice3"&gt;@moltenice3&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🎨 Third-party Credits
&lt;/h3&gt;

&lt;p&gt;While the application itself was developed by us, some of the illustrations and icons were sourced from artists and creative communities across the web. 🐈✨&lt;/p&gt;

&lt;p&gt;A huge thank you to the creators whose artwork helped give this project its playful personality! 💛&lt;/p&gt;

&lt;p&gt;We've documented the sources of these assets in my GitHub repository under &lt;strong&gt;ASSETS.md&lt;/strong&gt;, where you can explore the original artwork and its attribution details.&lt;/p&gt;

&lt;p&gt;All credit for the third-party illustrations belongs to their respective creators.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The sloth is slow. The workflow doesn't have to be.&lt;/strong&gt; 🦥💤&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Bringing Better Classic ASP Support to VS Code in 2026</title>
      <dc:creator>Ashton Chew</dc:creator>
      <pubDate>Mon, 12 Oct 2026 12:40:48 +0000</pubDate>
      <link>https://dev.to/ashtonckj/bringing-better-classic-asp-support-to-vs-code-in-2026-4faj</link>
      <guid>https://dev.to/ashtonckj/bringing-better-classic-asp-support-to-vs-code-in-2026-4faj</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foqx6i1rp0luq7jciqm4t.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foqx6i1rp0luq7jciqm4t.gif" alt=" " width="560" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Bringing Better Classic ASP Support to VS Code in 2026
&lt;/h1&gt;

&lt;p&gt;Classic ASP may be old, but legacy applications still need to be maintained. When working with these applications, the editor should help with more than syntax highlighting.&lt;/p&gt;

&lt;p&gt;I started building Classic ASP Language Support because I wanted a more complete development experience in VS Code. What began as an extension for a legacy language has grown into a project covering formatting, IntelliSense, navigation, diagnostics and several other language features.&lt;/p&gt;

&lt;p&gt;In this article, I'll explain the problems I wanted to solve, some of the challenges of supporting VBScript alongside HTML and JavaScript, and what I've learned from building and maintaining the extension.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Classic ASP is difficult to support
&lt;/h2&gt;

&lt;p&gt;A single &lt;code&gt;.asp&lt;/code&gt; file can contain several different languages. The editor has to understand where server-side VBScript begins and ends, how it interacts with HTML, and how embedded JavaScript, CSS and SQL should be handled.&lt;/p&gt;

&lt;p&gt;Simply highlighting keywords is not enough when you also want useful completion, navigation and diagnostics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a better development experience
&lt;/h2&gt;

&lt;p&gt;I'll walk through some of the features I've implemented, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Formatting mixed-language ASP files.&lt;/li&gt;
&lt;li&gt;IntelliSense and context-aware completions.&lt;/li&gt;
&lt;li&gt;Navigating definitions across &lt;code&gt;#include&lt;/code&gt; files.&lt;/li&gt;
&lt;li&gt;Renaming symbols and finding references.&lt;/li&gt;
&lt;li&gt;Detecting common VBScript and markup mistakes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The challenges behind the features
&lt;/h2&gt;

&lt;p&gt;The interesting part isn't just adding commands to an editor. It's making different language features cooperate without interfering with each other, while keeping the extension responsive on large files.&lt;/p&gt;

&lt;p&gt;I'll share examples of the edge cases I've encountered and the lessons I've learned from improving the implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Classic ASP is a legacy technology, but that doesn't mean maintaining it should be unnecessarily difficult.&lt;/p&gt;

&lt;p&gt;I'm continuing to improve the extension and would welcome feedback from developers who work with real Classic ASP applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://marketplace.visualstudio.com/items?itemName=ashtonckj.classic-asp-language-support" rel="noopener noreferrer"&gt;Classic ASP Language Support on the VS Code Marketplace&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Source code:&lt;/strong&gt; &lt;a href="https://github.com/ashtonckj/Classic-ASP-Language-Support" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>asp</category>
      <category>typescript</category>
      <category>extensions</category>
    </item>
  </channel>
</rss>
