<?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: orangishcat</title>
    <description>The latest articles on DEV Community by orangishcat (@orangishcat).</description>
    <link>https://dev.to/orangishcat</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%2F3846821%2Fd9075f68-8e1e-4c61-9cfb-0e5499cc65ea.png</url>
      <title>DEV Community: orangishcat</title>
      <link>https://dev.to/orangishcat</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/orangishcat"/>
    <language>en</language>
    <item>
      <title>I learned art, design, and webdev to create my personal website!</title>
      <dc:creator>orangishcat</dc:creator>
      <pubDate>Mon, 10 Aug 2026 01:20:34 +0000</pubDate>
      <link>https://dev.to/orangishcat/i-learned-art-design-and-webdev-to-create-my-personal-website-fd9</link>
      <guid>https://dev.to/orangishcat/i-learned-art-design-and-webdev-to-create-my-personal-website-fd9</guid>
      <description>&lt;h1&gt;
  
  
  Intro
&lt;/h1&gt;

&lt;p&gt;I've never made a personal website before. If I was ever going to do it, I would do it now, during summer break. I've done plenty of webdev over the past two years or so, and I think I know just about enough to make the best personal website I could make.&lt;/p&gt;

&lt;p&gt;A month and a half ago, I sat down and listed all the ideas I wanted to do for my personal website. &lt;/p&gt;

&lt;p&gt;Most importantly:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Must be my own design. No templates, no AI, must be &lt;em&gt;my&lt;/em&gt; work. I should be able to enjoy the process as well. The website must be &lt;em&gt;personal&lt;/em&gt;, and I must enjoy spending time there.

&lt;ul&gt;
&lt;li&gt;Draw inspiration from &lt;a href="https://neocities.org" rel="noopener noreferrer"&gt;Neocities&lt;/a&gt;. The retro style with hand-drawn art is exactly the style I'm going for.&lt;/li&gt;
&lt;li&gt;Make it based upon my real life a bit. Like, use my real room for example, but change some stuff. &lt;/li&gt;
&lt;li&gt;Some things that would appear in my room: a plant, my desk setup, a cat similar to the one in my pfp, and more.&lt;/li&gt;
&lt;li&gt;This is kinda supposed to be like a portfolio. Fit in a bio somewhere, and maybe some links to a blog and whatnot.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Looking back, I'm quite surprised at just how terrible the earliest drawings were, and how easily I managed to make the later ones. Such is the importance of learning new skills. It's fun and also very rewarding!&lt;/p&gt;

&lt;p&gt;Alright, the final finished website is on &lt;a href="https://orangishcat.github.io" rel="noopener noreferrer"&gt;https://orangishcat.github.io&lt;/a&gt;. Next are all my devlogs, fully unedited. I highly recommend giving them a read, it feels like I became a totally different person after the project.&lt;/p&gt;




&lt;h1&gt;
  
  
  2026-6-3
&lt;/h1&gt;

&lt;p&gt;I have no idea how to draw, and this is my first time. I've procrastinated for about a week already because I know this is going to be hard. And I'm also starting with the hardest thing to draw: the cat.&lt;/p&gt;

&lt;p&gt;I started off with a 256x256 canvas, then realized that was too difficult for me to handle given my nonexistent skill. I then downscaled to 128x128, then to 64x64.&lt;/p&gt;

&lt;p&gt;Long story short, I fiddled around a long time with no clear results. But I have learned a few things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drawing actual lines is too hard. I'm going with pixel art.&lt;/li&gt;
&lt;li&gt;Krita is actually a really nice piece of software. 10/10 would recommend. And it's FOSS too!&lt;/li&gt;
&lt;li&gt;I'm gonna have to use reference images pretty heavily.&lt;/li&gt;
&lt;li&gt;I'm pretty terrible at this. Hopefully things will improve...&lt;/li&gt;
&lt;li&gt;I'm glad I went with pixel art. How am I meant to draw the eyes? That would be an absolute nightmare if I didn't choose pixel art. I know literally nothing about drawing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Revision #7&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F39f1de2d832c9292b4107f6b6973d648_MD5.avif" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F39f1de2d832c9292b4107f6b6973d648_MD5.avif" alt="39f1de2d832c9292b4107f6b6973d648_MD5.avif" width="64" height="64"&gt;&lt;/a&gt;&lt;br&gt;
Revision #8 Added spots&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F48315ed73c909c85d96dcfeda4e5aac4_MD5.avif" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F48315ed73c909c85d96dcfeda4e5aac4_MD5.avif" alt="48315ed73c909c85d96dcfeda4e5aac4_MD5.avif" width="64" height="64"&gt;&lt;/a&gt;&lt;br&gt;
Revision #15 adjusted the head position a bit to make it look better&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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2Fdfca422b6c50fd69634365d7163f81e0_MD5.avif" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2Fdfca422b6c50fd69634365d7163f81e0_MD5.avif" alt="dfca422b6c50fd69634365d7163f81e0_MD5.avif" width="64" height="64"&gt;&lt;/a&gt;&lt;br&gt;
Revision #16: Adjusted the face and the shape of the body&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2Fdfca422b6c50fd69634365d7163f81e0_MD5.avif" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2Fdfca422b6c50fd69634365d7163f81e0_MD5.avif" alt="dfca422b6c50fd69634365d7163f81e0_MD5.avif" width="64" height="64"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Total time spent today: 4 hours?&lt;br&gt;
(these are all estimations as I'm not really time tracking for art)&lt;/p&gt;




&lt;h1&gt;
  
  
  2026-6-4
&lt;/h1&gt;

&lt;p&gt;Any artist looking at this is probably losing brain cells right now.&lt;/p&gt;

&lt;p&gt;By the way, I make a new revision every time I make a potentially breaking change that I might want to revert. So Day 1 consisted of a lot of experimenting. Hopefully things will stabilize now...&lt;/p&gt;

&lt;p&gt;Revision #17: Adjusted the face, moved the head like 10 times so that the position made more sense.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F70a8a3b4ed789bab632cfa26b097d8b9_MD5.avif" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F70a8a3b4ed789bab632cfa26b097d8b9_MD5.avif" alt="70a8a3b4ed789bab632cfa26b097d8b9_MD5.avif" width="64" height="64"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Revision #18: Added whiskers, adjusted the spot pattern and added some white for the belly&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2Fb51282d9909267347645a0ca3c7b984e_MD5.avif" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2Fb51282d9909267347645a0ca3c7b984e_MD5.avif" alt="b51282d9909267347645a0ca3c7b984e_MD5.avif" width="64" height="64"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Total time: roughly 2 hours&lt;/p&gt;




&lt;h1&gt;
  
  
  2026-6-5
&lt;/h1&gt;

&lt;p&gt;I had an interview for a robotics competition. I had plenty of time to draw, but my brain refused to stop thinking about the interview so I just didn't.&lt;/p&gt;

&lt;p&gt;I set up the Astro template for my website though.&lt;/p&gt;

&lt;p&gt;The robotics interview went pretty well. Yay!&lt;/p&gt;

&lt;p&gt;Total time: 14 minutes&lt;/p&gt;




&lt;h1&gt;
  
  
  2026-6-6
&lt;/h1&gt;

&lt;p&gt;Maybe I should have googled "cat proportions" or something before this. The drawing has started to make sense, but it's clear the proportions are off.&lt;/p&gt;

&lt;p&gt;I've run out of ways to adjust the cat for the most part. But a lot of things are still glaringly wrong. I tried to make it look cartoonish to play off all the issues, but they're still making my drawing look a lot worse than it could be.&lt;/p&gt;

&lt;p&gt;Some issues:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The head is too big. &lt;/li&gt;
&lt;li&gt;It looks as if the cat has no neck.&lt;/li&gt;
&lt;li&gt;The face expression is supposed to be minimal and cartoonish, but it still looks kinda bad.&lt;/li&gt;
&lt;li&gt;The tail is disproportionately thick.&lt;/li&gt;
&lt;li&gt;The legs are too thick. &lt;/li&gt;
&lt;li&gt;I dunno how else to describe it, but cats are extremely long. The body in the drawing is definitely not long enough, and too thick.&lt;/li&gt;
&lt;li&gt;I found a good reference image to compare my original drawing with, and it becomes pretty obvious what I'm talking about.&lt;/li&gt;
&lt;/ul&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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F32fdf05cc9a76831e2137171f5945959_MD5.avif" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F32fdf05cc9a76831e2137171f5945959_MD5.avif" alt="32fdf05cc9a76831e2137171f5945959_MD5.avif" width="800" height="489"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://en.wikipedia.org/wiki/Cat#/media/File:Cat_August_2010-4.jpg" rel="noopener noreferrer"&gt;Source (Alvesgaspar on Wikipedia)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Revision 1&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;New drawing time!&lt;/p&gt;

&lt;p&gt;I'm not quite satisfied with the cat design, so I'm redoing it. I'm gonna draw it in a sleeping pose so I don't have to draw sprites for like walking animations and stuff.&lt;/p&gt;

&lt;p&gt;Nevermind, this is taking way too long. Let's just copy the original design and modify the shape.&lt;/p&gt;

&lt;p&gt;In editor screenshot 'cause why not&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2Fa477b55686ed6feda01365017f1b5355_MD5.avif" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2Fa477b55686ed6feda01365017f1b5355_MD5.avif" alt="a477b55686ed6feda01365017f1b5355_MD5.avif" width="800" height="520"&gt;&lt;/a&gt;&lt;br&gt;
My reference images:&lt;br&gt;
3D Cat Billboard in Shinjuku, Tokyo (from a video I took while I was there in the summer of 2024)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://kr.pinterest.com/pin/523191681736548418/" rel="noopener noreferrer"&gt;Kylahhill on Pinterest&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.shutterstock.com/image-vector/pixel-art-cat-sleeping-isolated-on-2666930147" rel="noopener noreferrer"&gt;Oliver_Johnson on Shutterstock&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Revision 2: made the head smaller&lt;/p&gt;

&lt;p&gt;I did it again, the head was too big. So I fixed it.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F5854252030f94d4b491215e315bb5e09_MD5.avif" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F5854252030f94d4b491215e315bb5e09_MD5.avif" alt="5854252030f94d4b491215e315bb5e09_MD5.avif" width="64" height="64"&gt;&lt;/a&gt;&lt;br&gt;
Revision 3: Fixed the coloring&lt;/p&gt;

&lt;p&gt;I realized that the coloring didn't make sense. You would usually see stripes like these on an orange cat, not a calico.&lt;/p&gt;

&lt;p&gt;Also I got distracted and read &lt;a href="https://www.reddit.com/r/CalicoKittys/comments/1kwvtmz/is_my_cat_a_calico_a_guide/" rel="noopener noreferrer"&gt;a post&lt;/a&gt; on calico cats. Basically calicos have three colors in their fur, are 25-75% white, and from what I can tell, their fur colors are mixed pretty evenly. So that means redoing the coloring.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2Ff5428336f26290fd559115fe72ff2e0e_MD5.avif" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2Ff5428336f26290fd559115fe72ff2e0e_MD5.avif" alt="f5428336f26290fd559115fe72ff2e0e_MD5.avif" width="64" height="64"&gt;&lt;/a&gt;&lt;br&gt;
This is pretty good. I could probably adjust the color a bit more by adding some blending between the fur colors and whatnot, but this is pretty much done. The size of the spots are a bit too similar, but I don't have a good fix for this so I'll just leave it as is.&lt;/p&gt;

&lt;p&gt;Total time: 2 hours&lt;/p&gt;




&lt;h1&gt;
  
  
  2026-6-7
&lt;/h1&gt;

&lt;p&gt;Ok moving on. Let's draw a plant to put on my table.&lt;/p&gt;

&lt;p&gt;Nah, not the right vibe.&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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F2eece84156a8c784c6ddc2d2435c6544_MD5.avif" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F2eece84156a8c784c6ddc2d2435c6544_MD5.avif" alt="2eece84156a8c784c6ddc2d2435c6544_MD5.avif" width="799" height="494"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://gardenerspath.com/how-to/indoor-gardening/houseplant-care-primer/" rel="noopener noreferrer"&gt;Reference image source&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This plant is apparently called a dumb cane, and is a beginner friendly indoor plant.&lt;/p&gt;

&lt;p&gt;Ok, that's better.&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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2Fe8462aa2090ac152441dfe42842581f8_MD5.avif" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2Fe8462aa2090ac152441dfe42842581f8_MD5.avif" alt="e8462aa2090ac152441dfe42842581f8_MD5.avif" width="800" height="502"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With some color&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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2Fe3e153ade289a3869ba4c33e76369d1e_MD5.avif" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2Fe3e153ade289a3869ba4c33e76369d1e_MD5.avif" alt="e3e153ade289a3869ba4c33e76369d1e_MD5.avif" width="504" height="522"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;added the leaf veins&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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F9db873afb47d1d11bdb748c3c5c57a58_MD5.avif" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F9db873afb47d1d11bdb748c3c5c57a58_MD5.avif" alt="9db873afb47d1d11bdb748c3c5c57a58_MD5.avif" width="374" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Final result&lt;/p&gt;

&lt;p&gt;Pretty good. I could add some horizontal veins and improve the coloring a little bit, but I'm getting tired. For now, this is done.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F007764a6249fdeaee59bf69f79b3a4b7_MD5.avif" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F007764a6249fdeaee59bf69f79b3a4b7_MD5.avif" alt="007764a6249fdeaee59bf69f79b3a4b7_MD5.avif" width="64" height="64"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Total time: 2 hours&lt;/p&gt;




&lt;h1&gt;
  
  
  2026-6-8
&lt;/h1&gt;

&lt;p&gt;Drew this.&lt;/p&gt;

&lt;p&gt;I needed to make the screen a slightly bit more interesting, so I added a splotch of gray and then aggressively blended it with the Blender blur brush. Now the screen looks like it's been smudged with fingerprints. The AVIF image compression kinda ruined the effect a bit, but that's fine. The effect still works out pretty nicely. &lt;/p&gt;

&lt;p&gt;For improvements, I definitely need a bright accent color and incorporate it into the drawing somehow. This is good for now.&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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F617235d3394af32376354ae85a859038_MD5.avif" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F617235d3394af32376354ae85a859038_MD5.avif" alt="617235d3394af32376354ae85a859038_MD5.avif" width="64" height="64"&gt;&lt;/a&gt;&lt;br&gt;
Fortunately, the cat seemed to be by far the hardest thing to draw. Hopefully that means smooth sailing from here?&lt;/p&gt;

&lt;p&gt;Total time: 1 hr 15 mins&lt;/p&gt;




&lt;h1&gt;
  
  
  2026-6-9
&lt;/h1&gt;

&lt;p&gt;Used the same technique to brighten the frame of the keyboard. I'm too lazy to figure out to draw a bright spot on the screen so whatever, leaving it as is.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F6b63bd9730e21f0d9b96b64f5cbd707c_MD5.avif" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F6b63bd9730e21f0d9b96b64f5cbd707c_MD5.avif" alt="6b63bd9730e21f0d9b96b64f5cbd707c_MD5.avif" width="64" height="64"&gt;&lt;/a&gt;&lt;br&gt;
I also stared at a blank screen for 20 minutes trying to figure out the layout of the website. &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmrtxc6o3aq5zq75j1xno.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%2Fmrtxc6o3aq5zq75j1xno.png" alt="22f12939ba34493b6cd48041d8471c3e_MD5.png" width="800" height="520"&gt;&lt;/a&gt;&lt;br&gt;
The biggest challenge was definitely how to fit all the content I wanted to, such as updates, bio, and blog, while leaving space to view the art and assets I had spent a long time making.&lt;/p&gt;

&lt;p&gt;Plus, since this is based off of a front-view of my room, it would be very challenging to create a scrollable section in the website. Like what would happen if you scrolled an image downwards?&lt;/p&gt;

&lt;p&gt;I'm tempted to use the computer screen as a scrollable section, but I had already decided that the computer would be purely cosmetic.&lt;/p&gt;

&lt;p&gt;Total time: 45 minutes.&lt;/p&gt;




&lt;h1&gt;
  
  
  2026-6-10
&lt;/h1&gt;

&lt;p&gt;Yeah so progress started to slow down...&lt;/p&gt;

&lt;p&gt;June 10: I spent 20 minutes and couldn't think of anything.&lt;/p&gt;

&lt;p&gt;June 11-15: I was busy preparing for and attending robotics competition, and had no time at all to work on this.&lt;/p&gt;

&lt;p&gt;June 16-July 7: Traveling. Although I had time, I didn't feel like it and wanted to enjoy the vacation.&lt;/p&gt;




&lt;h1&gt;
  
  
  2026-7-3
&lt;/h1&gt;

&lt;p&gt;Finally I've done enough work to the point where I can at least make some sort of devlog from it.&lt;/p&gt;

&lt;p&gt;It totally hasn't been 3 weeks since the last devlog...&lt;/p&gt;

&lt;p&gt;Layout would look like this:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpb3gvig0grfnu5zjwuvw.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%2Fpb3gvig0grfnu5zjwuvw.png" alt="93a5558dd9c2fc79643e10a68b65c510_MD5.png" width="800" height="520"&gt;&lt;/a&gt;&lt;br&gt;
I still need to draw a banner to place on the top, fix up the clock, and replace the table lamp with a hand drawn version instead of a downscaled version of a random image from Amazon.&lt;/p&gt;

&lt;p&gt;Not sure what to do with the window, either. &lt;/p&gt;

&lt;p&gt;I will definitely be using a grid view (similar to &lt;a href="https://supabase.com/" rel="noopener noreferrer"&gt;Supabase&lt;/a&gt;'s landing page) where there will be my about me, projects, blog, etc. taking up each panel. I might make it appear immediately after the user scrolls down on the webpage, or I might make it replace the window. I'm leaning towards the latter option, as otherwise I'd have to draw something for the window, which would be super annoying. &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%2Fj5obmxofz2qyjwxffg65.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%2Fj5obmxofz2qyjwxffg65.png" alt="268b0c5ec125b5caa410042584c86ea9_MD5.png" width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Annoyingly, I pretty much abandoned my original idea for the layout, where you hover over items to reveal panels such as the about me, but that doesn't really fit a personal site very well. For most personal sites, all you need to do in terms of interaction is read and scroll down on the page, and all the important information should be present in front of you.&lt;/p&gt;

&lt;p&gt;I also drew the title banner (won't be including the background pattern in the actual site, I'll make something else for it). My reference for this was neon lights, as I had the idea of a glowing neon banner at the top of the page. However, I didn't really execute the neon effect that well, as if you imagine each letter as a neon light tube, they would be too thick. The glow effect also kinda sucks, because I was lazy and just used Krita's fill tool with some feathering. It recreates light scattering decently, but it's not the greatest.&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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F2391263f1525f22ba1a0ca59164f8e4f_MD5.avif" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F2391263f1525f22ba1a0ca59164f8e4f_MD5.avif" alt="2391263f1525f22ba1a0ca59164f8e4f_MD5.avif" width="224" height="41"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, the text would've looked much better in lowercase. Didn't think that one through.&lt;/p&gt;

&lt;p&gt;Total time: 4 hours (since the last devlog)&lt;/p&gt;




&lt;h1&gt;
  
  
  2026-7-4
&lt;/h1&gt;

&lt;p&gt;Did the clock. It's a very rough drawing, but it gets the job done.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F73e9054b055db3a8dcb09ad37bad92ce_MD5.avif" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F73e9054b055db3a8dcb09ad37bad92ce_MD5.avif" alt="73e9054b055db3a8dcb09ad37bad92ce_MD5.avif" width="32" height="32"&gt;&lt;/a&gt;&lt;br&gt;
This is an exported image of the table as of right now. I need to replace the desk lamp, but it's getting pretty close to completion.&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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2Fecd148abff79e9b88a024238d6ea18a8_MD5.avif" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2Fecd148abff79e9b88a024238d6ea18a8_MD5.avif" alt="ecd148abff79e9b88a024238d6ea18a8_MD5.avif" width="256" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Updated layout: (not drawing the window that will take forever)&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%2Fwfbyycxtx16frtz35de7.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%2Fwfbyycxtx16frtz35de7.png" alt="4381c8fe4219433728ba93ab2d1b93c0_MD5.png" width="800" height="533"&gt;&lt;/a&gt;&lt;br&gt;
the main content and bookshelf won't overlap in the actual site&lt;/p&gt;

&lt;p&gt;I started coding a bit, and it seems like taking up so much vertical space just doesn't make sense. The layout might need to change again.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyom3iuenxtlfobmywp9u.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%2Fyom3iuenxtlfobmywp9u.png" alt="3a7a145b15da4038cd1f4db6055ec962_MD5.png" width="800" height="556"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Total time: 3 hours&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%2Ftrn8onv9nklkwktrxbcn.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%2Ftrn8onv9nklkwktrxbcn.png" alt="6f2afb7c147adba1c66eb53026ad8b13_MD5.png" width="498" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;yeah, this project is starting to take too long.&lt;/p&gt;




&lt;h1&gt;
  
  
  2026-7-6
&lt;/h1&gt;

&lt;p&gt;Stuff is happening. The page layout is already different as the desk setup is part of the main content rather than scrolling. Now I need to decide if I want to change the bookshelf on the left and screen on the right as was originally planned in the layout.&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%2Ffw4b3z60by88tepg7ef2.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%2Ffw4b3z60by88tepg7ef2.png" alt="b39f1145fae404fb1dc23d8871a0a242_MD5.png" width="800" height="494"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Total time: 2 hours&lt;/p&gt;




&lt;h1&gt;
  
  
  2026-7-7
&lt;/h1&gt;

&lt;p&gt;I changed the layout again. Hopefully this time will be the last.&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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2Fa87693f37463e86c24423a9a2aa1ea43_MD5.avif" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2Fa87693f37463e86c24423a9a2aa1ea43_MD5.avif" alt="a87693f37463e86c24423a9a2aa1ea43_MD5.avif" width="384" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also improved the styling of the homepage.&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%2Fy0c01i8dtpqhrlhsenci.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%2Fy0c01i8dtpqhrlhsenci.png" alt="c38869bf0c914bd064ecf2d0dda98838_MD5.png" width="800" height="517"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Remaining tasks for the website:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add more content to main page&lt;/li&gt;
&lt;li&gt;Add Projects page&lt;/li&gt;
&lt;li&gt;Set up the blog&lt;/li&gt;
&lt;li&gt;Figure out how to use remaining assets&lt;/li&gt;
&lt;li&gt;Make the clock display the user's time&lt;/li&gt;
&lt;li&gt;Add custom icons for entries in the links and socials sections&lt;/li&gt;
&lt;li&gt;Bookshelf asset + move devlogs there&lt;/li&gt;
&lt;li&gt;Add something as the background (e.g. rain, moon, stars)&lt;/li&gt;
&lt;li&gt;Polish all assets
That is still a lot of tasks... but the layout and design (which is what I struggled with the most,  basically stalling the project for like 2.5 weeks) seems to be fully done, now only the implementation remains.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total time: 2 hours?&lt;/p&gt;




&lt;h1&gt;
  
  
  2026-7-9
&lt;/h1&gt;

&lt;p&gt;I'm in a summer program now. I'm actually writing this devlog and all the ones until July 14 on July 14, since I've been doing work occasionally in the background without logging it. I've spent my remaining free time working on this project, here's what I've been up to (according to my commits).&lt;/p&gt;

&lt;p&gt;Created a separate component for the links on the right sidebar, and adding it to the About me page.&lt;/p&gt;

&lt;p&gt;Also moved the cat into the links component, as I've decided I want it there all the time.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Faar678kqj84d68lnx1a3.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%2Faar678kqj84d68lnx1a3.png" alt="b0ab51f5d0cb84cba036ef6f9c55ffe3_MD5.png" width="800" height="440"&gt;&lt;/a&gt;&lt;br&gt;
The text is currently the same as the index page, I'll figure out something new to write later.&lt;/p&gt;

&lt;p&gt;Total time: 30 minutes&lt;/p&gt;




&lt;h1&gt;
  
  
  2026-7-10
&lt;/h1&gt;

&lt;p&gt;Set up the blog. I'm gonna debug it further when I get an actual blog post in.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fv8pcwzhol4hsy7y2zmer.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%2Fv8pcwzhol4hsy7y2zmer.png" alt="484555d9b07674bcb062ef96b06fb1d2_MD5.png" width="800" height="390"&gt;&lt;/a&gt;&lt;br&gt;
I also added a &lt;code&gt;robots.txt&lt;/code&gt; that allows search engines to crawl my entire site if they wanted to.&lt;/p&gt;

&lt;p&gt;Total time: 30 minutes&lt;/p&gt;




&lt;h1&gt;
  
  
  2026-7-11
&lt;/h1&gt;

&lt;p&gt;Finished the content in the homepage!&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%2Fou1qtwz3hmye5baiympz.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%2Fou1qtwz3hmye5baiympz.png" alt="9464244230d34b88ed587191d689a0b2_MD5.png" width="800" height="780"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And yay, I used the computer for what I intended it to be used for: displaying stuff on the screen!&lt;/p&gt;

&lt;p&gt;The video is intentionally very low resolution, it fits the pixelated aesthetic of the site. Right now it's just my top play in osu!, but I want to put bird videos, cat videos, memes, etc.&lt;/p&gt;

&lt;p&gt;And I also changed out the about me too, so it doesn't repeat information on the homepage.&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%2Fj04yltslxp6fdcav92fn.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%2Fj04yltslxp6fdcav92fn.png" alt="50b350e145b580e0e1496644a86ccc80_MD5.png" width="800" height="669"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Total time: 2 hours&lt;/p&gt;




&lt;h1&gt;
  
  
  2026-7-12
&lt;/h1&gt;

&lt;p&gt;Animated the clock.&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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F34c03e364e71d5921a0c13b3e4048b80_MD5.apng" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F34c03e364e71d5921a0c13b3e4048b80_MD5.apng" alt="34c03e364e71d5921a0c13b3e4048b80_MD5.apng" width="69" height="35"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since I didn't have any resolution for the &lt;code&gt;am&lt;/code&gt; text, I actually tripled the resolution of the image. But it still fits in surprisingly well.&lt;/p&gt;

&lt;p&gt;And I animated the cat too!&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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F974c2b63735eed985eaf712db98a52a4_MD5.apng" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F974c2b63735eed985eaf712db98a52a4_MD5.apng" alt="974c2b63735eed985eaf712db98a52a4_MD5.apng" width="64" height="64"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I learned a lot about how to use Krita's animation features. &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%2Fqhnqkz9whhxpdf68m43q.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%2Fqhnqkz9whhxpdf68m43q.png" alt="d428a5f42bf444b7a926dec74db34878_MD5.png" width="800" height="520"&gt;&lt;/a&gt;&lt;br&gt;
The animation is just a linear fade-in-out animation for each of the three z's, where there is one for each layer and offset for each layer. &lt;/p&gt;

&lt;p&gt;And the clock is even simpler, it's just two frames, one with dots, one without.&lt;/p&gt;

&lt;p&gt;One caveat was that GIF images don't support partial transparency. I was too lazy to figure out how to do a color transition instead of an opacity transition (I'd have to transition the color of the Z to the background color of the website). So instead I converted all my animated images to APNG.&lt;/p&gt;

&lt;p&gt;Then I got GitHub Pages deployment working.&lt;/p&gt;

&lt;p&gt;I found out that instead of using the base &lt;code&gt;img&lt;/code&gt; HTML tag, I had to use Astro's &lt;code&gt;Image&lt;/code&gt; component, otherwise all the assets in &lt;code&gt;/src/assets&lt;/code&gt; would not be included in the built output.&lt;/p&gt;

&lt;p&gt;Instead of fixing it properly, I just dumped all my assets into &lt;code&gt;public/&lt;/code&gt;, changed the paths, and called it a day.&lt;/p&gt;

&lt;p&gt;Total time: 4 hours&lt;/p&gt;




&lt;h1&gt;
  
  
  2026-7-13
&lt;/h1&gt;

&lt;p&gt;Projects page!&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fn5yew2x43lthd7c6p61p.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%2Fn5yew2x43lthd7c6p61p.png" alt="274321230c919c370b8bcee1139e3b14_MD5.png" width="799" height="521"&gt;&lt;/a&gt;&lt;br&gt;
Projects list! (in the homepage)&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fo7hzpq8hrr4m3vk7vt6i.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%2Fo7hzpq8hrr4m3vk7vt6i.png" alt="a8eac386f28fb31dcc920f622a18f35e_MD5.png" width="498" height="938"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Devlog book!&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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F6689df8248e8fda24739fe8487d4c58f_MD5.apng" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F6689df8248e8fda24739fe8487d4c58f_MD5.apng" alt="6689df8248e8fda24739fe8487d4c58f_MD5.apng" width="256" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This one was fun to draw. I used the book on &lt;a href="https://kuroi.neocities.org/" rel="noopener noreferrer"&gt;https://kuroi.neocities.org/&lt;/a&gt; as a reference on how to draw a book, then I drew my own.&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%2Fj95moar4vjg8afu4zc2d.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%2Fj95moar4vjg8afu4zc2d.png" alt="eccfb4ba76ce3038b8cabf7310e408fe_MD5.png" width="358" height="246"&gt;&lt;/a&gt;&lt;br&gt;
It turned out surprisingly well! I went for the look of a non-spiral notebook, but I think it fits better.&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%2Fem0lo4am5y5xhkux4qzi.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%2Fem0lo4am5y5xhkux4qzi.png" alt="7a87462d2f2daff79ea405dbbcf24bc0_MD5.png" width="800" height="520"&gt;&lt;/a&gt;&lt;br&gt;
I also learned how to use a transparency mask in Krita to create the beam of light, and how to animate a transform mask.&lt;/p&gt;

&lt;p&gt;Total time: 4 hours&lt;/p&gt;




&lt;h1&gt;
  
  
  2026-7-14
&lt;/h1&gt;

&lt;p&gt;Everything was completed, except for the blog post.&lt;/p&gt;

&lt;p&gt;Then I spent like an hour fixing the blog. First it was fixing the content collection to load it from the blog site properly, then it was passing the table of contents to the blog's layout component so that it could render a post's table of contents.&lt;/p&gt;

&lt;p&gt;I also made a favicon for the site, it's very basic.&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%2Fhvtb1u5xw6sfor2zxp5s.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%2Fhvtb1u5xw6sfor2zxp5s.png" alt="cf22076aee1f6bdc7b493ebca5e58e91_MD5.png" width="16" height="16"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I can't believe everything is done.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0gtr2cjso8brcmoy68xo.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%2F0gtr2cjso8brcmoy68xo.png" alt="6e6a3d1e456cc6c0b591d16958cdb5e1_MD5.png" width="800" height="848"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Total time: 3 hour&lt;/p&gt;




&lt;h1&gt;
  
  
  2026-7-15
&lt;/h1&gt;

&lt;p&gt;The site is fully up and functional, and &lt;em&gt;could&lt;/em&gt; be considered done. Some few remaining tasks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Background image. This one is important as not having one bugs me a lot.&lt;/li&gt;
&lt;li&gt;More animations on the images. Like do one for the plant and definitely the banner.&lt;/li&gt;
&lt;li&gt;Separate background image for the blog.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ok I'm making a background image.&lt;/p&gt;

&lt;p&gt;I was wondering why I couldn't erase this, turns out it was a reference image I somehow pasted in.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0s162661jrvps7lhlwiu.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%2F0s162661jrvps7lhlwiu.png" alt="c4092aae3da373b489b543645b2732fd_MD5.png" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Background. btw, the little dipper is on the top left!&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2Fe08820eef239d6ff6055156097869549_MD5.avif" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2Fe08820eef239d6ff6055156097869549_MD5.avif" alt="e08820eef239d6ff6055156097869549_MD5.avif" width="384" height="64"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stars only; just an upside-down image of the background with the moon removed and the stars scattered a bit.&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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F437edeb4294a169c4c649526983949d0_MD5.avif" 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%2Fgithub.com%2Forangishcat%2Forangishcat.github.io%2Fraw%2Frefs%2Fheads%2Fmain%2Fsrc%2Fcontent%2Fblog%2Fpersonal-website%2Fattachments%2F437edeb4294a169c4c649526983949d0_MD5.avif" alt="437edeb4294a169c4c649526983949d0_MD5.avif" width="384" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now I could do a grass overlay on the rest of the images, but maybe later. The project is fully done now! Everything works amazingly, and I could not be more satisfied with the outcome.&lt;/p&gt;

&lt;p&gt;Total time: 4 hours&lt;/p&gt;




&lt;h1&gt;
  
  
  Final thoughts
&lt;/h1&gt;

&lt;p&gt;The website is done. Fully done. There are improvements that could be made, but everything is functional and looks great. As with most projects, I will have to leave some stuff for the future to complete, as I need to be done with this project and move on.&lt;/p&gt;

&lt;p&gt;Originally, this website was supposed to take 2 weeks max, but it instead took a month and a half and 30+ hours.&lt;/p&gt;

&lt;p&gt;Remaining tasks for the future (in order):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ANIMATE THE STARS&lt;/li&gt;
&lt;li&gt;"ground" background image to place at end of page (e.g. grass, stardew valley, or drawing of a street with houses)&lt;/li&gt;
&lt;li&gt;Animate more assets (most importantly the banner and plant)&lt;/li&gt;
&lt;li&gt;Add a music player&lt;/li&gt;
&lt;li&gt;Add more easter eggs to the computer screen&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Alright, let's summarize what I've learned.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pixel art! I gained so much experience with using reference images and different techniques to achieve my desired drawing. Definitely my biggest gain from the entire project, I had no idea I would improve this much.&lt;/li&gt;
&lt;li&gt;Krita! One of the best art programs out there (if not the best), yet 100% free and open source!&lt;/li&gt;
&lt;li&gt;Astro! Friendship ended with SvelteKit, Astro is now my new favorite web framework. Its built-in routing and &lt;code&gt;mdx&lt;/code&gt; support is amazing.&lt;/li&gt;
&lt;li&gt;Writing blog posts! Like this one! The only time I've ever documented my progress was after I had finished my project. Bad idea. These devlogs literally showcase an entire character arc.&lt;/li&gt;
&lt;li&gt;Finishing projects! I have a slightly better idea on how to manage my time and finish a project, hopefully the next project won't take any more than 2x longer than expected.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These final thoughts probably don't do my learnings justice. But I really need to wrap up the project, so I will be ending it here.&lt;/p&gt;

&lt;p&gt;The end!&lt;/p&gt;




&lt;h1&gt;
  
  
  Reflection (1 month later)
&lt;/h1&gt;

&lt;p&gt;It's been nearly a month since the site was finished, and honestly, it feels like a weight off my chest.&lt;/p&gt;

&lt;p&gt;I've gotten so used to having a bunch of half-finished projects that having a completed one feels incredibly unusual.&lt;/p&gt;

&lt;p&gt;Unlike my other projects, this site does not need any maintainence. If I edit the site, I'm almost always adding new content&lt;br&gt;
or writing a new blog post.&lt;/p&gt;

&lt;p&gt;Practically, having a personal website is highly useful. It's a centralized place where my projects and activities reside, and a good marketing tool as well. I can drop a link to my site if anyone wants to know more about me, and I don't have to individually tell other people what I've been up to.&lt;/p&gt;

&lt;p&gt;Besides, blog hosting (e.g. Medium) feels very predatory these days. Large companies essentially have full access to your work, and who knows what they will do with it. Their site experience is often terrible, with ads, trackers, and paywalls throughout the page, and it's not something I want to be associated with. As for something &lt;em&gt;this&lt;/em&gt; personal, I needed to feel like I had true ownership of my work, and I also wanted to have the ability to customize the webpage surrounding my blog posts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Joining Neocities
&lt;/h2&gt;

&lt;p&gt;This site is dual hosted on &lt;a href="https://orangishcat.github.io" rel="noopener noreferrer"&gt;https://orangishcat.github.io&lt;/a&gt; and &lt;a href="https://orangishcat.neocities.org" rel="noopener noreferrer"&gt;https://orangishcat.neocities.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I usually use Neocities as it gives me a view counter, and number go up make me happy.&lt;/p&gt;

&lt;p&gt;More importantly though, it's a great community. Neocities was one of the biggest inspirations for my site, and I'm honored that I can and am allowed to contribute something to the platform. I'm glad to know that out there, creative people making cool things still exist.&lt;/p&gt;

&lt;p&gt;I might consider joining a webring someday.&lt;/p&gt;

&lt;p&gt;I'm also, like, probably the only person to use Tailwind CSS on the entire platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Site changes
&lt;/h2&gt;

&lt;p&gt;I updated my socials and my games list. There are, as it turns out, lots of cool games out there.&lt;/p&gt;

&lt;p&gt;I also made my first Rust project, so I will be adding that to my projects list too.&lt;/p&gt;

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

&lt;p&gt;I'm pretty proud of this website. I've never really made something so personal before. I partially wish I had done it earlier, but I'm also glad that doing it this late means I had enough webdev and art experience to execute it well.&lt;/p&gt;

&lt;p&gt;Thank you so much for reading.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>astro</category>
      <category>programming</category>
      <category>typescript</category>
    </item>
    <item>
      <title>Page Proxy v0.2.x: the boring 'polishing' work and why I think it matters</title>
      <dc:creator>orangishcat</dc:creator>
      <pubDate>Fri, 10 Apr 2026 22:48:12 +0000</pubDate>
      <link>https://dev.to/orangishcat/page-proxy-v02x-the-boring-polishing-work-and-why-i-think-it-matters-2cea</link>
      <guid>https://dev.to/orangishcat/page-proxy-v02x-the-boring-polishing-work-and-why-i-think-it-matters-2cea</guid>
      <description>&lt;p&gt;This is the second devlog for my Chrome/Firefox userscript manager extension, &lt;a href="https://orangishcat.github.io/page-proxy/" rel="noopener noreferrer"&gt;Page Proxy&lt;/a&gt;! Here I'm gonna cover v0.2.x, where I'm still trying to figure out what direction I'm planning to take the extension in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Refining and QOL work
&lt;/h2&gt;

&lt;p&gt;This is what I would normally call "polishing" work. It gives the extension much-needed features and fixes long-standing bugs. This stage, I would say, comes after the "minimum viable product" stage, where you just need to get something working as idea validation.&lt;/p&gt;

&lt;p&gt;After you get your initial users who are interested in your idea, keeping them becomes very important. This is where usability comes in, and to make a product with good usability, it must have adequate features and minimal bugs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extension early stage
&lt;/h2&gt;

&lt;p&gt;At this point, I had a solid main idea of what I wanted the extension to do: turn page interactions into reusable userscripts.&lt;br&gt;
But the extension was lacking a lot of features, so I had to find the order which I wanted to implement them in.&lt;/p&gt;
&lt;h2&gt;
  
  
  Roadmap
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Website homepage&lt;/li&gt;
&lt;li&gt;Create tool:

&lt;ul&gt;
&lt;li&gt;Create a settings UI for your script (or any UI) easily&lt;/li&gt;
&lt;li&gt;Create components&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Settings page for the extension&lt;/li&gt;
&lt;li&gt;Multi-file scripts&lt;/li&gt;
&lt;li&gt;Local scripts&lt;/li&gt;
&lt;li&gt;Export to Tampermonkey userscript, CSS stylesheet, WXT extension&lt;/li&gt;
&lt;li&gt;Import/export with Figma&lt;/li&gt;
&lt;li&gt;Sync to cloud storage (Appwrite backend)&lt;/li&gt;
&lt;li&gt;Userscript discovery, sharing, and collaboration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now I had a good idea for what I wanted the extension to do.&lt;/p&gt;

&lt;p&gt;But for v0.2.x, I started with the missing features.&lt;/p&gt;
&lt;h2&gt;
  
  
  The inconvenience I wanted to solve
&lt;/h2&gt;

&lt;p&gt;While &lt;code&gt;pq.selector&lt;/code&gt; could do a lot, sometimes it is simpler to just write CSS instead.&lt;/p&gt;

&lt;p&gt;Using JS would be a waste for doing things that CSS can do already. Worst of all would be using a JS &lt;code&gt;pq.selector&lt;/code&gt; just to inject styles on every matching element.&lt;/p&gt;

&lt;p&gt;So I made a CSS inspector!&lt;/p&gt;
&lt;h2&gt;
  
  
  CSS Inspector
&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%2Fq3qnuu3u4fesjt4kvhu4.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%2Fq3qnuu3u4fesjt4kvhu4.jpg" alt=" " width="800" height="495"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The CSS Inspector (above) works similarly to the selector popup added in the previous version, but it directly allows you to apply CSS rules to a pregenerated selector for the element.&lt;/p&gt;

&lt;p&gt;And there's a nice dropdown that allows you to switch between this and the selector popup.&lt;/p&gt;

&lt;p&gt;On the right side of the CSS inspector is a properties list, similar to the one from the other selector. Placing the mouse caret over any part of the main CSS selector will provide documentation for what that CSS keyword does, which essentially acts like built-in documentation.&lt;/p&gt;

&lt;p&gt;As the tooltip says, you can also hold &lt;code&gt;z&lt;/code&gt; to highlight matching elements in lime or &lt;code&gt;x&lt;/code&gt; to preview styles applied in the editor.&lt;/p&gt;

&lt;p&gt;I also added a button that can bring you to the CSS inspector page directly from the Select Tool.&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%2Fmpimc2fwdpb2fh8iotvr.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%2Fmpimc2fwdpb2fh8iotvr.jpg" alt=" " width="800" height="612"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There's also some other features. Like, you can view the computed styles for the selected element! It's very similar to the computed styles in DevTools. If there are :nth-of-type selectors in the selector, a link appears to remove them easily. The CSS selector syncs with the &lt;code&gt;baseSelector&lt;/code&gt; field in the selector popup as well! Anything to avoid repetitive copying.&lt;/p&gt;

&lt;p&gt;Upon hitting &lt;code&gt;Save&lt;/code&gt;, it adds a &lt;code&gt;ps.injectCSS&lt;/code&gt; snippet into the editor, which will directly inject a style tag into the document head upon script run.&lt;/p&gt;
&lt;h2&gt;
  
  
  Other QOL features
&lt;/h2&gt;
&lt;h3&gt;
  
  
  run-on-page-load grant
&lt;/h3&gt;

&lt;p&gt;Before the update, the script wouldn't even be able to run on page load, and you'd have to click the run button manually every time. Fortunately, I added a &lt;code&gt;@grant&lt;/code&gt; field to the metadata. It only accepts one value as of now, &lt;code&gt;run-on-page-load&lt;/code&gt;, but it allows the script to execute automatically. A much needed feature.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// @grant run-on-page-load&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Upon reload, it will create a dialog asking the user to grant permissions, like this:&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%2Fwv15iop8m4ibzvtx64vn.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%2Fwv15iop8m4ibzvtx64vn.jpg" alt=" " width="800" height="374"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then it will ask the user to reload to apply updated permissions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Help tool
&lt;/h3&gt;

&lt;p&gt;Previously it was hardcoded into the extension. Now it fetches from the Github repository's HELP.md file, and rendered nicely in markdown.&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%2Fxq2uencgmwnge6ml6yih.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%2Fxq2uencgmwnge6ml6yih.jpg" alt=" " width="796" height="1127"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  DevTools integration
&lt;/h3&gt;

&lt;p&gt;Added a wrench button in the select tool panel that appears when DevTools is open on the active tab. When clicking it, the selected element will match the selected element in DevTools. Highly useful for when the select tool can't select the element you want, like for example if its bounding box is covered by the bounding box of another element.&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%2Fdatr888dux2r2lk64xjo.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%2Fdatr888dux2r2lk64xjo.jpg" alt=" " width="796" height="614"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  New APIs
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;pa.moveNode to move a node elsewhere, such as to a parent node, or before or after another node.&lt;/li&gt;
&lt;li&gt;pv.pressKey to press keys programmatically using JS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Editor persistence
&lt;/h3&gt;

&lt;p&gt;Previously if a script was unsaved, switching to another tab without saving would cause you to lose your changes. Not anymore. Now a warning message appears and forces you to manually save before continuing.&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%2Fs9l484r4pns5rzqhy3xy.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%2Fs9l484r4pns5rzqhy3xy.jpg" alt=" " width="800" height="94"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It does not handle the extension sidepanel being closed, though, as there is no way to prevent it. The only solution in that case would be to autosave, which is risky as if there are bugs in the implementation someone's userscript can get overriden with the default script, causing them to lose it entirely.&lt;/p&gt;

&lt;h3&gt;
  
  
  Selectors tool
&lt;/h3&gt;

&lt;p&gt;I gave it functionality by displaying highlighted elements upon hover.&lt;/p&gt;

&lt;h3&gt;
  
  
  Error handling
&lt;/h3&gt;

&lt;p&gt;Errors are less likely to be silently swallowed now, and surface more clearly. It still needs a bit of work though.&lt;/p&gt;

&lt;h3&gt;
  
  
  Moving on to v0.3.x
&lt;/h3&gt;

&lt;p&gt;v0.2.x added some much needed polish and a crucial CSS Inspector. It wasn't much, and ended up only being three versions, v0.2.0 to v0.2.2. That just means there were less features.&lt;/p&gt;

&lt;p&gt;Oh and I also changed the storage format, which ended up causing some scripts to be lost. It was okay as I still don't have that many users, but I definitely need to be more careful with that next time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;I think it's okay to be still figuring things out, and not just for your project either, this probably could work as life advice too. Changing directions in software development or in general is perfectly okay, and it allows one to refine and test their designs, and also throw out ideas that just don't quite work.&lt;/p&gt;

&lt;p&gt;Of course, I definitely could have planned my features more thoroughly. The CSS Inspector as the main feature in v0.2.x is probably fine, but the rest of the polish would probably make more sense to be done in v0.1.x. Like having a method to inject CSS (&lt;code&gt;ps.injectCSS&lt;/code&gt;) should have been like one of the main features of the custom pp-api. And making a breaking change to the storage format was definitely not a good idea. Could have used some planning beforehand.&lt;/p&gt;

&lt;p&gt;Also, I started to use AI for coding a lot for this project. My AI setup is just Codex and some basic skills like &lt;code&gt;superpowers&lt;/code&gt;, but it works pretty well. AI-generated code certainly isn't as clean as handwritten code, but it handles edge cases pretty well. Previously I found myself spending a lot more time passing states between components and fixing type objects, than spending time implementing actual functionality. So it's nice that AI allows me to go back to focusing on features, rather than type errors.&lt;/p&gt;

&lt;p&gt;But the great thing about agentic engineering is that the product is still the output of &lt;em&gt;my&lt;/em&gt; creative work. All the designs, the raw flow chart, and all my ideas are all me, and I've documented them in the Figma file and my devlogs. AI is just speeding up the implementation of those ideas, in a controlled manner.&lt;/p&gt;

&lt;p&gt;The landing page is still looking pretty barren... definitely need to do that earlier next time.&lt;/p&gt;

&lt;p&gt;I think that's it for this devlog. If you want to stick around, maybe I'll see you for v0.3.x?&lt;/p&gt;

&lt;p&gt;Try out &lt;a href="https://orangishcat.github.io/page-proxy/" rel="noopener noreferrer"&gt;Page Proxy&lt;/a&gt;, and maybe give me some feedback? I'd also be interested to hear about your thoughts on AI and whatnot.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>browser</category>
      <category>extensions</category>
      <category>typescript</category>
    </item>
    <item>
      <title>I built a GUI-powered Userscript manager to turn page interactions into userscripts!</title>
      <dc:creator>orangishcat</dc:creator>
      <pubDate>Sat, 04 Apr 2026 04:04:56 +0000</pubDate>
      <link>https://dev.to/orangishcat/i-built-a-gui-powered-userscript-manager-for-faster-userscript-creation-ebb</link>
      <guid>https://dev.to/orangishcat/i-built-a-gui-powered-userscript-manager-for-faster-userscript-creation-ebb</guid>
      <description>&lt;p&gt;I made &lt;a href="https://orangishcat.github.io/page-proxy/" rel="noopener noreferrer"&gt;Page Proxy&lt;/a&gt;, a Chrome and Firefox extension that converts page interactions into reusable code via Userscripts.&lt;/p&gt;

&lt;p&gt;This is my first project I've ever released. Please try it out and give feedback! Would be really appreciated.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why?
&lt;/h2&gt;

&lt;p&gt;I've always found messing around with userscript managers like Tampermonkey quite fun; I could fix websites and change their behavior to my liking. But it took me roughly 15 minutes to go from idea to code, then 30 minutes to an hour just to debug and polish the script.&lt;/p&gt;

&lt;p&gt;The first issue: juggling with DevTools windows, copy-pasting CSS selectors, and debugging my scripts was incredibly tedious.&lt;br&gt;
I'd mostly have to rely on print debugging, then I would have to reload the page every time and search through the console for errors.&lt;/p&gt;

&lt;p&gt;So I wanted a way to quickly generate CSS selectors and code. I wanted something similar to DevTools, but has integration with code and selector generation to speed up userscript development.&lt;/p&gt;

&lt;p&gt;Second of all, there were many reoccurring patterns in all of my scripts. For example:&lt;/p&gt;

&lt;p&gt;Do something on key press:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;keydown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="nx"&gt;ev&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;ev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;altKey&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;code&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;KeyV&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;runFunction&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Press a key using JS (e.g. Escape):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;escEvent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;KeyboardEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;keydown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Escape&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;keyCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;which&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;bubbles&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;cancelable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dispatchEvent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;escEvent&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So I wanted to make an API that included all of these common usage patterns out of the box.&lt;/p&gt;

&lt;h2&gt;
  
  
  My philosophy
&lt;/h2&gt;

&lt;p&gt;The product should solve:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;GUI tools for userscript creation to make it less tedious&lt;/li&gt;
&lt;li&gt;API covering common use cases and code patterns&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The product must remain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Accessibility: The extension can be complicated, but it should be easy to use. Add help docs (or links to them) everywhere.&lt;/li&gt;
&lt;li&gt;Break-resistant: If a website's CSS classes change, the script should still work or at least be easy to migrate.&lt;/li&gt;
&lt;li&gt;Integration: The extension should not replace any other tools. Keep Tampermonkey compatibility, integrate with DevTools.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Planning and design
&lt;/h2&gt;

&lt;p&gt;Note: this was the first ever design sketch of the project. The extension has probably strayed quite far from it now.&lt;/p&gt;

&lt;p&gt;I learned how to use Figma and some common design patterns. Designing my own UI has always been a goal of mine as a programmer, so I'm glad I was able to do that for this project.&lt;/p&gt;

&lt;p&gt;Plus, I really disliked the overused blue-and-purple palette signature of AI website design. So using &lt;a href="https://www.realtimecolors.com/" rel="noopener noreferrer"&gt;Realtime Colors&lt;/a&gt;, I chose a simple orange and lime color palette.&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%2Foa1lgab0pr1usrp0cq14.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%2Foa1lgab0pr1usrp0cq14.png" alt=" " width="800" height="200"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're interested, here's a raw, unedited flow chart of the features I wanted in Page Proxy that I threw up in an hour or so.&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%2Fcqhqlb956v4a1sv2dnzp.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%2Fcqhqlb956v4a1sv2dnzp.png" alt=" " width="800" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Initial design
&lt;/h3&gt;

&lt;p&gt;I originally wanted to make Page Proxy a web app, mainly so it would "be unique". I quickly realized that unique does not always mean that it's good.&lt;/p&gt;

&lt;p&gt;From a technical standpoint, the web app quickly became a terrible idea. Websites won't function due to &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Guides/CSP" rel="noopener noreferrer"&gt;CSP&lt;/a&gt;, and they certainly won't keep cookies, rendering pretty much all content behind a login screen completely inaccessible.&lt;/p&gt;

&lt;p&gt;Besides, it just didn't make sense at all. It would be much more convenient to create an extension side panel, allowing it to be easily accessed, like DevTools.&lt;/p&gt;

&lt;p&gt;Old design:&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%2Ff5krgfsr8n3r65iirahq.webp" 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%2Ff5krgfsr8n3r65iirahq.webp" alt=" " width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  New extension design
&lt;/h3&gt;

&lt;p&gt;After some designing, I came up with this:&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%2Fw8y2im9tkx2b4mbgp2jl.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%2Fw8y2im9tkx2b4mbgp2jl.png" alt=" " width="800" height="167"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I finally loved the design. It was significantly cleaner, and I also was incredibly proud of myself that I could make my color palette work so well.&lt;/p&gt;

&lt;p&gt;It's similar to DevTools, but I kept the top toolbar as buttons. This fits the design very well, keeping the UI large-scale and with self-explanatory icons.&lt;/p&gt;

&lt;p&gt;I liked this design for its simplicity. While DevTools, for example, was feature rich, it also had quite a steep learning curve, and a very dense, packed UI. I wanted to do the opposite; with the features I am planning, I wanted to prioritize ease of use, and I had no need for such densely packed features.&lt;/p&gt;

&lt;p&gt;So the natural next question was: what tools do I want to add?&lt;/p&gt;

&lt;h3&gt;
  
  
  Tools
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Select tool: Similar to DevTools' inspect element, but provides additional information like selectors, attributes, and more.&lt;/li&gt;
&lt;li&gt;Create tool: Create components (like in web frameworks like React and Svelte) in scripts&lt;/li&gt;
&lt;li&gt;Selectors tool: List CSS selectors and their properties&lt;/li&gt;
&lt;li&gt;Help tool: Help links and stuff&lt;/li&gt;
&lt;li&gt;Export tool: Export the script in a variety of different formats.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now for the bottom half of the sidepanel.&lt;/p&gt;

&lt;h3&gt;
  
  
  Code editor
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;JS code editor&lt;/li&gt;
&lt;li&gt;Has highlighting and autocomplete&lt;/li&gt;
&lt;li&gt;Inspiration: Tampermonkey editor&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total time spent in design phase: 10 days. Probably only a few hours overall, but designing kinda felt like a chore since I was so new to it, which is why I didn't have the motivation to spend much time on it per day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Setup
&lt;/h3&gt;

&lt;p&gt;I split the monorepo into web and extension directories.&lt;/p&gt;

&lt;p&gt;Some library choices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Package manager: &lt;code&gt;bun&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Web framework: &lt;code&gt;Svelte&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Extension framework: &lt;code&gt;WXT&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Components: &lt;code&gt;bits-ui&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;CSS: &lt;code&gt;tailwindcss&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Icons: &lt;code&gt;lucide-svelte&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Network: &lt;code&gt;axios&lt;/code&gt; (no I was not affected by the breach, because I update my packages like once a month)&lt;/li&gt;
&lt;li&gt;Test: &lt;code&gt;vitest&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Code editor: &lt;code&gt;CodeMirror&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Actual coding
&lt;/h3&gt;

&lt;p&gt;And implementation began. It was a bit rough at the start; the first implementation did not look good.&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%2F70m7986ac5fhyj1u3nje.webp" 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%2F70m7986ac5fhyj1u3nje.webp" alt=" " width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Along with the selector panel, I added a popup centered on the main page that provides element information and a selector builder. This helped identifying elements &lt;em&gt;much&lt;/em&gt; easier, as unlike DevTools, all the selector information was all laid out already for me to convert into code.&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%2Fnkdvh0yxggkpa9b4ch46.webp" 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%2Fnkdvh0yxggkpa9b4ch46.webp" alt=" " width="800" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The API
&lt;/h3&gt;

&lt;p&gt;Original API layout (changed now):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;pq&lt;/code&gt;: stands for &lt;code&gt;pp-query&lt;/code&gt;, contains methods related to querying and traversing through DOM elements.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ps&lt;/code&gt;: &lt;code&gt;pp-style&lt;/code&gt;: A module for style helpers&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pv&lt;/code&gt;: &lt;code&gt;pp-event&lt;/code&gt;: A module for callback-based event selectors
For the methods that were added, view the &lt;a href="https://orangishcat.github.io/page-proxy/docs/0.1.x/" rel="noopener noreferrer"&gt;old documentation&lt;/a&gt;, there's too many for me to list here.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The three files was placed in the extension directory, serving as a library containing the modules.&lt;/p&gt;

&lt;p&gt;Also at the top of each userscript, there must be metadata. Similar to Tampermonkey, it had &lt;code&gt;@title&lt;/code&gt;, &lt;code&gt;@website&lt;/code&gt;, and &lt;code&gt;@description&lt;/code&gt; to describe the script, and it is autogenerated upon new script creation but is very much editable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ==Page Proxy==&lt;/span&gt;
&lt;span class="c1"&gt;// @title Page Proxy&lt;/span&gt;
&lt;span class="c1"&gt;// @website&lt;/span&gt;
&lt;span class="c1"&gt;// @description&lt;/span&gt;
&lt;span class="c1"&gt;// ==/Page Proxy==&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  The editor
&lt;/h3&gt;

&lt;p&gt;Looking at the above screenshot, the editor looked, well, not great. Code syntax highlighting broke often, and required a lot of maintenance. There were no line numbers. The entire container was offset for some reason. It was overall a huge pain to fix.&lt;/p&gt;

&lt;p&gt;So I switched to &lt;a href="https://microsoft.github.io/monaco-editor/" rel="noopener noreferrer"&gt;Monaco&lt;/a&gt; editor, the same editor that powers VSCode. The extension instantly became a few MB heavier, but it was definitely worth it. Monaco editor was extremely powerful, with all the standard editor features such as renaming variables, syntax highlighting, and more just out of the box. I'm so glad I didn't have to implement any of that myself, yet it's available for everyone to use.&lt;/p&gt;

&lt;p&gt;For autocomplete, I eventually hacked together a solution that generated type stubs from the API and passed it into Monaco editor. That temporary solution is still being used today. If it ain't broke, I ain't fixing it. It's probably staying in the codebase for good.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nearly two months of coding later
&lt;/h3&gt;

&lt;p&gt;The extension looks much more polished now. It was also functional enough that I was able to actually make and run userscripts on it.&lt;br&gt;
I had spent way longer than expected on the project, and decided to cut some features for the initial release.&lt;br&gt;
The select tool was finished fully, but the create tool was marked "Coming soon", and I settled on a simple display for the selectors tool.&lt;br&gt;
At this point, I just needed to publish it and get some initial validation.&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%2Fq1xetab42507vwh7b76j.webp" 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%2Fq1xetab42507vwh7b76j.webp" alt=" " width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;It was quite plain, and didn't even have a feature list. I struggled a lot to explain the premise of the system in just 1-2 sentences. Even after publishing, the landing page remained incomplete for another two months.&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%2Fgqqf12r6cgwujsy28czo.webp" 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%2Fgqqf12r6cgwujsy28czo.webp" alt=" " width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Final polishes
&lt;/h2&gt;

&lt;p&gt;Oh... no one could figure out how to use the extension. I've already tried to make the extension pretty self-explanatory, but I guess I still need to write some documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Documentation
&lt;/h3&gt;

&lt;p&gt;I used &lt;a href="https://docusaurus.io/" rel="noopener noreferrer"&gt;Docusaurus&lt;/a&gt; to host my documentation website. Although it used &lt;code&gt;mdx&lt;/code&gt; (based on React) while the rest of my website was using Svelte, there just wasn't a solution that worked nearly as well out of the box. There I made some basic tutorials and wrote documentation for the API.&lt;/p&gt;

&lt;p&gt;It was very primitive, but it got the job done, and eventually it was good enough for publish.&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%2Fd51x4m6m8ykmloyrlg15.webp" 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%2Fd51x4m6m8ykmloyrlg15.webp" alt=" " width="800" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Bugs
&lt;/h3&gt;

&lt;p&gt;I initially used script injection to run user JS in the page content, but that would be blocked by CSP on certain websites, rendering them completely inaccessible for userscripts. This was fixed easily by migrating to the UserScript API, but now users will have to enable permissions to run scripts on the main page.&lt;/p&gt;

&lt;p&gt;Also, there were annoying Firefox-specific bugs that I had to fix, but they overall weren't too important.&lt;/p&gt;

&lt;h2&gt;
  
  
  The end of v0.1.x
&lt;/h2&gt;

&lt;p&gt;For the rest of v0.1.x I just did some chores, bug fixes, and small features. I had made a basic sandbox for the userscript using &lt;code&gt;@endojs/lockdown&lt;/code&gt;, but it didn't really work as it was extremely easy to bypass. I wanted to add functions, network access controls, etc., but it couldn't be done reliably without OS-native controls so I removed it in the last version of v0.1.x.&lt;/p&gt;

&lt;h2&gt;
  
  
  Initial validation
&lt;/h2&gt;

&lt;p&gt;I published to Hack Club, and everyone who viewed my project thought it was pretty cool :D&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;Whew! This is probably the longest piece of media I have written in my entire life. Evidently I have a lot to learn.&lt;/p&gt;

&lt;p&gt;I'm ending the devlog at v0.1.x because as my first post ever, this took me like 3-4 hours to write. I've already added way more features in v0.2.x and v0.3.x, but I will get around to writing about them another time.&lt;/p&gt;

&lt;p&gt;I learned a lot over this journey. This was my first introduction to multiple new webdev (and also non-webdev) concepts I had never interacted with before.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Figma&lt;/code&gt;: Probably my biggest reward from seeing the project through. I used to never plan out my projects, working things out as I go. Terrible idea. I eventually lost track of where I was going, leading me to lose motivation, and it's much easier to change a wireframe or Figma design than website code. Without UI planning, the UI doesn't look good and is quite clunky. I definitely also wanted to avoid the AI-generated UI look, so rolling my own would be a great learning process and would also look decent.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Svelte&lt;/code&gt;: I used React for a project once, but I hated it. I eventually became trapped in &lt;code&gt;useEffect&lt;/code&gt; hell and gave up. Svelte gave me way less trouble; it handled all the dependencies and states easily without me ever needing to use a &lt;code&gt;$effect&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;WXT&lt;/code&gt;: Last time I tried making a Chrome extension, I gave up because Chrome refused to recognize my manifest no matter what I tried. WXT allows me to build extensions that are not only cross-browser using a unified API, but simplify the configuration as well. WXT gets a glowing recommendation from me.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Docusaurus&lt;/code&gt;: Not much else to say, other than it is insanely cool and works very well for hosting documentation.&lt;/li&gt;
&lt;li&gt;GitHub actions: I learned to set up Actions workflows for basically whatever I wanted. I wrote build, check, deploy to GitHub Pages workflows using myself and some AI.&lt;/li&gt;
&lt;li&gt;Dependency management: I configured Renovate to check for package updates. After all the package breaches that have been happening lately, I probably won't be updating any packages until they're each at least three days old.&lt;/li&gt;
&lt;li&gt;Search Engine Optimization: I learned to add some basic metadata to the website for SEO.&lt;/li&gt;
&lt;li&gt;Coding with AI: I learned to code alongside AI (no, letting the AI do everything didn't work) and speed up development, while I reviewed the code and kept the code quality as best as I could.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And as of v0.1.x, am I following my original goals for the project?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;GUI tools: yes&lt;/li&gt;
&lt;li&gt;API for common use cases: yes&lt;/li&gt;
&lt;li&gt;Accessibility: yes&lt;/li&gt;
&lt;li&gt;Break-resistant: no, not really; there were matchers based on other attributes like inner text, but CSS selectors were still much better&lt;/li&gt;
&lt;li&gt;Integration: no, there's not much integration&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But this is just the beginning, so I'd say this is a great starting point. I still have a lot of blogging to do for v0.2.x and v0.3.x.&lt;/p&gt;

&lt;p&gt;If you think my extension is interesting, you can &lt;a href="https://orangishcat.github.io/page-proxy/" rel="noopener noreferrer"&gt;give it a try&lt;/a&gt; and maybe stick around as I devlog more of my journey!&lt;/p&gt;

&lt;p&gt;This being my first project, I've probably never even written a blog post before, so I'm still figuring things out. Any feedback you have would be greatly appreciated!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>browser</category>
      <category>extensions</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
