<?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: Cole</title>
    <description>The latest articles on DEV Community by Cole (@yupthatscole).</description>
    <link>https://dev.to/yupthatscole</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%2F4207368%2F56ac80c0-89fb-4b2d-a859-9a68a25013ef.jpg</url>
      <title>DEV Community: Cole</title>
      <link>https://dev.to/yupthatscole</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yupthatscole"/>
    <language>en</language>
    <item>
      <title>I Made a Programming Language Where fetch() Is a Syntax Error</title>
      <dc:creator>Cole</dc:creator>
      <pubDate>Sun, 01 Nov 2026 19:07:14 +0000</pubDate>
      <link>https://dev.to/yupthatscole/i-made-a-programming-language-where-fetch-is-a-syntax-error-lm9</link>
      <guid>https://dev.to/yupthatscole/i-made-a-programming-language-where-fetch-is-a-syntax-error-lm9</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%2Fc94clilrvysbcv6bqqbt.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%2Fc94clilrvysbcv6bqqbt.gif" alt="catscript" width="600" height="298"&gt;&lt;/a&gt;&lt;br&gt;
so i made a programming language.&lt;/p&gt;

&lt;p&gt;it's called catscript. you print with &lt;code&gt;cat&lt;/code&gt;, functions are called &lt;code&gt;hunt&lt;/code&gt;, lists are called &lt;code&gt;litter&lt;/code&gt;, and if you type &lt;code&gt;fetch&lt;/code&gt; anywhere in your code it refuses to run, because this is a cat household.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;try it in your browser:&lt;/strong&gt; &lt;a href="https://yupthatscole.github.io/catscript" rel="noopener noreferrer"&gt;https://yupthatscole.github.io/catscript&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(no install. the first load takes a few seconds because it's loading python into your browser.)&lt;/p&gt;
&lt;h2&gt;
  
  
  what it looks like
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;hunt double(x) {
    bring x * 2
}

kittens = litter["mochi", "pip", "clover"]
cat("there are", size(kittens), "kittens")
cat("double 21 is", double(21))
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;there are 3 kittens
double 21 is 42

   /\_/\
  ( ^.^ )  purr. it worked.
   &amp;gt; ^ &amp;lt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;every program ends with a cat. a happy one if it worked. an angry one if it didn't.&lt;/p&gt;
&lt;h2&gt;
  
  
  the cat words
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cat(x)&lt;/code&gt; prints something (it's also the linux command for printing files, so it's a pun twice)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pspsps("name? ")&lt;/code&gt; asks the user for input. you're literally calling them over&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hunt&lt;/code&gt; makes a function, &lt;code&gt;bring&lt;/code&gt; returns something, because cats bring you things&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;litter[1, 2, 3]&lt;/code&gt; is a list&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;purr&lt;/code&gt; and &lt;code&gt;hiss&lt;/code&gt; are true and false&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;empty_bowl&lt;/code&gt; is null&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;knock(x)&lt;/code&gt; deletes a variable. knocks it off the table&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;try { } pounce { }&lt;/code&gt; catches errors&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  errors
&lt;/h2&gt;

&lt;p&gt;errors get a hiss code, a line number, and an insult.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  HISS-404 (line 2): never heard of 'y'. did you make it up?
  did you write this while walking across the keyboard?

   /\_/\
  ( &amp;gt;.&amp;lt; )  HISS.
   &amp;gt; ^ &amp;lt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;dividing by zero is &lt;code&gt;HISS-500: you can't split the fish into zero pieces&lt;/code&gt;. a function that calls itself forever is &lt;code&gt;HISS-508: your cat is chasing its tail&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;and the dog words (&lt;code&gt;fetch&lt;/code&gt;, &lt;code&gt;bark&lt;/code&gt;, &lt;code&gt;goodboy&lt;/code&gt;, &lt;code&gt;woof&lt;/code&gt;, &lt;code&gt;sit&lt;/code&gt;, &lt;code&gt;wag&lt;/code&gt;) are just banned:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  HISS-403 (line 1, col 1): 'fetch'?? this is a cat household.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  how it works
&lt;/h2&gt;

&lt;p&gt;i always assumed making a programming language was some crazy thing. it's actually three parts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;the lexer&lt;/strong&gt; reads your code and chops it into pieces. &lt;code&gt;cat("hi")&lt;/code&gt; becomes &lt;code&gt;cat&lt;/code&gt;, &lt;code&gt;(&lt;/code&gt;, &lt;code&gt;"hi"&lt;/code&gt;, &lt;code&gt;)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;the parser&lt;/strong&gt; turns those pieces into a tree, so it knows &lt;code&gt;1 + 2 * 3&lt;/code&gt; means do the &lt;code&gt;2 * 3&lt;/code&gt; first&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;the interpreter&lt;/strong&gt; walks through the tree and actually runs it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;the whole thing is about 1,100 lines of python with no libraries.&lt;/p&gt;

&lt;h2&gt;
  
  
  the bug
&lt;/h2&gt;

&lt;p&gt;the first time i typed my own code into the playground instead of using the examples, it crashed with a huge python error.&lt;/p&gt;

&lt;p&gt;turns out the lexer looks two characters ahead to catch stuff like &lt;code&gt;==&lt;/code&gt; and &lt;code&gt;&amp;gt;=&lt;/code&gt;. if your code ended on something like &lt;code&gt;)&lt;/code&gt; with nothing after it, it looked at a character that didn't exist and fell off the end of the file.&lt;/p&gt;

&lt;p&gt;it worked fine for me because all my example files ended with a blank line. so it only broke the second someone else used it. classic.&lt;/p&gt;

&lt;p&gt;now if catscript itself ever crashes, you get &lt;code&gt;HISS-999: catscript tripped over its own tail. this one's not your fault.&lt;/code&gt; instead of a wall of python.&lt;/p&gt;

&lt;h2&gt;
  
  
  it also runs in your browser and vs code
&lt;/h2&gt;

&lt;p&gt;the playground runs the exact same python files in your browser using pyodide, so there's no separate version to keep updated.&lt;/p&gt;

&lt;p&gt;there's also a vs code extension that gives &lt;code&gt;.meow&lt;/code&gt; files syntax highlighting, a little cat icon, and a run button. dog words get a red squiggle.&lt;/p&gt;

&lt;h2&gt;
  
  
  try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;playground:&lt;/strong&gt; &lt;a href="https://yupthatscole.github.io/catscript" rel="noopener noreferrer"&gt;https://yupthatscole.github.io/catscript&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;code:&lt;/strong&gt; &lt;a href="https://github.com/yupthatscole/catscript" rel="noopener noreferrer"&gt;https://github.com/yupthatscole/catscript&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;write something in catscript and put it in the comments. i want to see what you make &lt;/p&gt;

&lt;p&gt;meow&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>python</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>your github repositories are fish now. sorry.</title>
      <dc:creator>Cole</dc:creator>
      <pubDate>Sat, 31 Oct 2026 01:11:32 +0000</pubDate>
      <link>https://dev.to/yupthatscole/your-github-repositories-are-fish-now-sorry-455i</link>
      <guid>https://dev.to/yupthatscole/your-github-repositories-are-fish-now-sorry-455i</guid>
      <description>&lt;p&gt;i was very bored of the green squares on github so i turned them into fish.&lt;/p&gt;

&lt;h1&gt;
  
  
  github aquarium
&lt;/h1&gt;

&lt;p&gt;basically you enter any github account and it shows their repos as little fish :)&lt;/p&gt;

&lt;p&gt;(i drew everything in ms paint btw)&lt;/p&gt;

&lt;p&gt;yes, the fish are supposed to look like that. no, i will not be hiring an artist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;try it here:&lt;/strong&gt; &lt;a href="https://github-aquarium.vercel.app" rel="noopener noreferrer"&gt;https://github-aquarium.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  how it works
&lt;/h2&gt;

&lt;p&gt;basically, the site fetches your public repositories using the github api and turns them into fish.&lt;/p&gt;

&lt;p&gt;every fish represents a repository, and the species depends on the programming language.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;python = fat fish&lt;/li&gt;
&lt;li&gt;javascript / typescript = normal fish&lt;/li&gt;
&lt;li&gt;rust = crab (obviously)&lt;/li&gt;
&lt;li&gt;c / c++ / java = shark&lt;/li&gt;
&lt;li&gt;html / css = tiny fish&lt;/li&gt;
&lt;li&gt;other languages get different fish too&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;the number of stars also affects how big the fish is.&lt;/p&gt;

&lt;p&gt;you can click on a fish to see which repository it represents, its language, its stars, and a link to the actual repo.&lt;/p&gt;

&lt;p&gt;they also swim around, randomly change directions, and attempt to avoid each other. emphasis on &lt;em&gt;attempt&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  some examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  linus torvalds
&lt;/h3&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%2F6ymjt3uz71yosyyz1ct7.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%2F6ymjt3uz71yosyyz1ct7.gif" alt="linus torvalds github aquarium full of sharks" width="568" height="286"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;apparently he owns a concerning amount of sharks.&lt;/p&gt;

&lt;h3&gt;
  
  
  sindresorhus
&lt;/h3&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%2Ffa1pl0ewk5cyr5zmmj1x.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%2Ffa1pl0ewk5cyr5zmmj1x.gif" alt="sindresorhus github aquarium full of fish" width="692" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;there are too many fish. send help.&lt;/p&gt;

&lt;h3&gt;
  
  
  me (yupthatscole)
&lt;/h3&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%2F3ddo3r726ug5acp5u8cq.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%2F3ddo3r726ug5acp5u8cq.gif" alt="my github aquarium with badly drawn fish" width="698" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;my repositories are mostly represented by these stupid yellow blobs. i love them.&lt;/p&gt;

&lt;h2&gt;
  
  
  technical stuff
&lt;/h2&gt;

&lt;p&gt;i built it with vite, vanilla javascript, and pixijs for rendering the aquarium.&lt;/p&gt;

&lt;p&gt;it uses github's public api to fetch repository data, so there's no login required.&lt;/p&gt;

&lt;p&gt;there's no database, no ai, and no backend. it's just a bunch of poorly drawn fish swimming around based on your github repositories.&lt;/p&gt;

&lt;p&gt;there are some limitations, like only displaying up to 25 repositories at once and github's api rate limits, but it works!&lt;/p&gt;

&lt;h2&gt;
  
  
  anyways
&lt;/h2&gt;

&lt;p&gt;that's pretty much it.&lt;/p&gt;

&lt;p&gt;i wanted to make something silly and ended up with a github-powered aquarium.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github-aquarium.vercel.app" rel="noopener noreferrer"&gt;https://github-aquarium.vercel.app&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;try putting your username in and tell me what kind of fish you get.&lt;/p&gt;

&lt;p&gt;meow&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>showdev</category>
      <category>github</category>
      <category>javascript</category>
    </item>
    <item>
      <title>I Built a Task Manager That Insults Me for Using Too Much RAM</title>
      <dc:creator>Cole</dc:creator>
      <pubDate>Thu, 29 Oct 2026 21:04:48 +0000</pubDate>
      <link>https://dev.to/yupthatscole/i-built-a-task-manager-that-insults-me-for-using-too-much-ram-30gi</link>
      <guid>https://dev.to/yupthatscole/i-built-a-task-manager-that-insults-me-for-using-too-much-ram-30gi</guid>
      <description>&lt;p&gt;so i was looking at task manager one day and realized how much ram my computer was using.&lt;/p&gt;

&lt;p&gt;naturally, instead of closing some programs like a normal person, i decided to make my own task manager.&lt;/p&gt;

&lt;p&gt;except this one has a cat.&lt;/p&gt;

&lt;p&gt;and he hates you.&lt;/p&gt;

&lt;h2&gt;
  
  
  introducing meowtop
&lt;/h2&gt;

&lt;p&gt;meowtop is a system monitor i made using python, pyqt6, and psutil.&lt;/p&gt;

&lt;p&gt;it shows your cpu, ram, and disk usage, lists running processes, and can notify you when your ram usage gets too high.&lt;/p&gt;

&lt;p&gt;but that's boring.&lt;/p&gt;

&lt;p&gt;so i added tuft.&lt;/p&gt;

&lt;p&gt;tuft is a purple cat who lives inside the app and judges your computer usage. he has different moods, animations, and a concerning number of insults.&lt;/p&gt;

&lt;p&gt;if your ram usage gets too high, he'll complain about it. if a program starts using an unreasonable amount of memory, he'll question your decisions.&lt;/p&gt;

&lt;p&gt;he also falls asleep when he's bored.&lt;/p&gt;

&lt;p&gt;and you can pet him.&lt;/p&gt;

&lt;p&gt;he likes that, surprisingly.&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%2Fvq1vycfu2psiqjk7bidf.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%2Fvq1vycfu2psiqjk7bidf.png" alt="picture" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  how it works
&lt;/h2&gt;

&lt;p&gt;the actual system monitoring is done using &lt;code&gt;psutil&lt;/code&gt;, a python library that lets you get information about your computer and running processes.&lt;/p&gt;

&lt;p&gt;for example, getting cpu and ram usage is pretty simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;cpu&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cpu_percent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;ram&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;psutil&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;virtual_memory&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;percent&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then i use PyQt6 to display everything in a desktop application.&lt;/p&gt;

&lt;p&gt;the interface updates every couple of seconds, and the process list gets refreshed separately so the entire app doesn't freeze while checking everything that's running.&lt;/p&gt;

&lt;p&gt;because making a task manager that lags your computer would be a little embarrassing.&lt;/p&gt;

&lt;h2&gt;
  
  
  giving tuft a personality
&lt;/h2&gt;

&lt;p&gt;tuft uses a sprite sheet with different animations for different moods.&lt;/p&gt;

&lt;p&gt;he can be normal, concerned, confused, angry, happy, or asleep.&lt;/p&gt;

&lt;p&gt;his mood changes depending on what's happening with your computer.&lt;/p&gt;

&lt;p&gt;i also made him clickable, so you can pet him. he'll get happy for a few seconds before going back to judging you.&lt;/p&gt;

&lt;p&gt;there's also a button specifically for roasting your computer.&lt;/p&gt;

&lt;p&gt;completely necessary feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  the windows defender incident
&lt;/h2&gt;

&lt;p&gt;once i finished, i tried packaging everything into an exe using pyinstaller.&lt;/p&gt;

&lt;p&gt;it worked.&lt;/p&gt;

&lt;p&gt;and then windows defender decided meowtop was a trojan.&lt;/p&gt;

&lt;p&gt;so that's great.&lt;/p&gt;

&lt;p&gt;from what i've investigated, it might be a false positive related to how pyinstaller packages executables, but i haven't confirmed that yet.&lt;/p&gt;

&lt;p&gt;for now, i'm just publishing the source code instead of distributing an exe that windows is actively trying to delete.&lt;/p&gt;

&lt;p&gt;apparently tuft is a national security threat.&lt;/p&gt;

&lt;h2&gt;
  
  
  anyway
&lt;/h2&gt;

&lt;p&gt;this started as a tiny python window showing two percentages and somehow turned into an entire system monitor with an animated cat.&lt;/p&gt;

&lt;p&gt;it's not meant to replace windows task manager, but it was a fun project and i learned more about pyqt6, system monitoring, threads, and making desktop interfaces.&lt;/p&gt;

&lt;p&gt;the source code is on github if you want to try it yourself, look through it, or see how it works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;github:&lt;/strong&gt; &lt;a href="https://github.com/yupthatscole/meowtop/tree/main" rel="noopener noreferrer"&gt;meowtop&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;meow.&lt;/p&gt;

</description>
      <category>python</category>
      <category>desktop</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
    <item>
      <title>meet catweb: a browser for windows (with a cat)</title>
      <dc:creator>Cole</dc:creator>
      <pubDate>Sun, 25 Oct 2026 22:49:40 +0000</pubDate>
      <link>https://dev.to/yupthatscole/meet-catweb-a-browser-for-windows-with-a-cat-3j3h</link>
      <guid>https://dev.to/yupthatscole/meet-catweb-a-browser-for-windows-with-a-cat-3j3h</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faeq17f8ilykr0w6kr9y0.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%2Faeq17f8ilykr0w6kr9y0.png" alt=" " width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;so i have a browser now. it's called catweb, a pixel cat named tuft lives on the new tab page.&lt;/p&gt;

&lt;p&gt;download: &lt;a href="https://yupthatscole.github.io/catweb-releases/" rel="noopener noreferrer"&gt;https://yupthatscole.github.io/catweb-releases/&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  what it is
&lt;/h1&gt;

&lt;p&gt;catweb is a windows browser written in rust.&lt;/p&gt;

&lt;p&gt;websites run on webview2, the same engine microsoft edge uses, so most sites just work. catweb draws everything around the page itself: tabs, address bar, menus, settings, downloads, and tuft.&lt;/p&gt;

&lt;p&gt;there's also catweb native, a from-scratch rendering engine. it's an experimental side project, and tabs using it get an "Experimental" label. don't sign in to anything in those.&lt;/p&gt;

&lt;h1&gt;
  
  
  what it does
&lt;/h1&gt;

&lt;p&gt;built-in ad and tracker blocking (easylist), toggle per site&lt;br&gt;
tries https first, strips tracking junk from links&lt;br&gt;
private tabs that forget everything when closed&lt;br&gt;
tabs in the title bar, drag to reorder, reopen closed tabs (ctrl+shift+t)&lt;br&gt;
address bar suggestions, bookmarks bar, history, downloads panel&lt;br&gt;
imports your chrome bookmarks and history&lt;br&gt;
themes and accent colors (default is "lavender soft")&lt;br&gt;
updates itself and checks a signature before installing anything&lt;br&gt;
silly settings, off by default. yes, the switches meow.&lt;br&gt;
privacy&lt;br&gt;
no accounts, no analytics, no telemetry. on its own, catweb only talks to:&lt;/p&gt;

&lt;p&gt;github, once a day, to check for updates (can be turned off)&lt;br&gt;
sites you visit, to grab their icons (never in private tabs)&lt;br&gt;
microsoft smartscreen, for dangerous sites and downloads (on by default, can be turned off)&lt;br&gt;
history and bookmarks stay on your pc. catweb doesn't save passwords.&lt;/p&gt;

&lt;p&gt;it hasn't had an outside security audit, so i wouldn't use it for banking yet.&lt;/p&gt;

&lt;h1&gt;
  
  
  the smartscreen thing
&lt;/h1&gt;

&lt;p&gt;catweb isn't code-signed (that costs money every year), so windows will warn you. click "More info", then "Run anyway".&lt;/p&gt;

&lt;p&gt;if you want to check it first:&lt;/p&gt;

&lt;p&gt;virustotal: &lt;a href="https://www.virustotal.com/gui/file/ea48b93c00d2345afdcbc42327ce868ffac0f0fcb33bd4c1df12320d2c864cec/detection" rel="noopener noreferrer"&gt;https://www.virustotal.com/gui/file/ea48b93c00d2345afdcbc42327ce868ffac0f0fcb33bd4c1df12320d2c864cec/detection&lt;/a&gt;&lt;br&gt;
every release has a sha-256 checksum next to the download&lt;/p&gt;

&lt;h1&gt;
  
  
  what's next
&lt;/h1&gt;

&lt;p&gt;a vpn/proxy option someday, making catweb native good enough for real sites.&lt;/p&gt;

&lt;h1&gt;
  
  
  bugs
&lt;/h1&gt;

&lt;p&gt;found one? open an issue at &lt;a href="https://github.com/yupthatscole/catweb-releases/issues" rel="noopener noreferrer"&gt;https://github.com/yupthatscole/catweb-releases/issues&lt;/a&gt; and say what you did and what happened.&lt;/p&gt;

&lt;p&gt;meow &lt;/p&gt;

</description>
      <category>showdev</category>
      <category>rust</category>
      <category>privacy</category>
      <category>microsoft</category>
    </item>
    <item>
      <title>I built a little social site with zero npm dependencies (and a cat runs it)</title>
      <dc:creator>Cole</dc:creator>
      <pubDate>Sun, 25 Oct 2026 21:56:35 +0000</pubDate>
      <link>https://dev.to/yupthatscole/i-built-a-little-social-site-with-zero-npm-dependencies-and-a-cat-runs-it-4lo3</link>
      <guid>https://dev.to/yupthatscole/i-built-a-little-social-site-with-zero-npm-dependencies-and-a-cat-runs-it-4lo3</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fir74tdfef5wh3c5u8rq4.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%2Fir74tdfef5wh3c5u8rq4.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I've been building catcloud, a small corner of the internet where everyone gets their own page to decorate, kind of like old GeoCities/MySpace pages. It's run by Tuft, a purple pixel cat who is officially the CEO. He writes memos.&lt;/p&gt;

&lt;p&gt;You get a page at catcloud.party/@yourname that you can paint however you want: colors, layouts, pictures, or raw HTML/CSS. There are guestbooks, a mini pixel cat on every page that visitors can pet and feed, trading cards, a small arcade, and a live hangout room where everyone's mini cats walk around together.&lt;/p&gt;

&lt;p&gt;Here's how it's built, because a few parts were fun to figure out.&lt;/p&gt;

&lt;p&gt;Zero dependencies&lt;br&gt;
The whole thing runs on plain Node 22: node:http for the server and the built-in node:sqlite for the database. There's nothing in node_modules, no framework, and no build step. The frontend is plain JavaScript too.&lt;/p&gt;

&lt;p&gt;Hosting it for free&lt;br&gt;
It runs on the Cloudflare Workers free plan. The whole app lives inside one SQLite-backed Durable Object, so it's still "one server with one database", just on someone else's computer. The same code also runs on a normal PC with npm start.&lt;/p&gt;

&lt;p&gt;Letting people write raw HTML safely&lt;br&gt;
People can put their own HTML and CSS on their page. To make that safe, each page renders inside a sandboxed iframe with a strict Content-Security-Policy and no scripts allowed. That way someone's page can look however they want, but it can't run code or touch anyone's account.&lt;/p&gt;

&lt;p&gt;Pixel art without image editors&lt;br&gt;
Most of the art (game sprites, furniture, cat clothes) is drawn as little text grids in JavaScript, where each letter is a color. The browser turns them into outlined pixel sprites at 4x. It's a lot easier to tweak a hat when the hat is a string.&lt;/p&gt;

&lt;p&gt;Games that are hard to cheat&lt;br&gt;
The arcade pays out coins, so people would want to cheat it. The server picks every round from a seed, then re-checks the results when you finish: it replays the round and checks that you didn't move faster than the game allows. If the numbers don't add up, no coins.&lt;/p&gt;

&lt;p&gt;A live room on a free plan&lt;br&gt;
The hangout room uses Server-Sent Events. To keep traffic tiny, the cats' walking paths come from a shared seed, so the server only sends "this cat did something" events, never positions. Every browser works out where each cat is on its own.&lt;/p&gt;

&lt;p&gt;Try it&lt;br&gt;
It's free and still new, so it's pretty quiet right now. If you make a page, drop your link in the comments and I'll sign your guestbook. I'd love feedback on what's confusing or broken!&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://catcloud.party" rel="noopener noreferrer"&gt;https://catcloud.party&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>node</category>
    </item>
  </channel>
</rss>
