<?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: Ethan Hawksley</title>
    <description>The latest articles on DEV Community by Ethan Hawksley (@ethanhawksley).</description>
    <link>https://dev.to/ethanhawksley</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%2F3654330%2F7a5d946f-6505-4db8-9b5d-0f83ca0eef6a.png</url>
      <title>DEV Community: Ethan Hawksley</title>
      <link>https://dev.to/ethanhawksley</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ethanhawksley"/>
    <language>en</language>
    <item>
      <title>The Shipwrecked Hackathon by Hack Club</title>
      <dc:creator>Ethan Hawksley</dc:creator>
      <pubDate>Tue, 23 Jun 2026 08:59:59 +0000</pubDate>
      <link>https://dev.to/ethanhawksley/the-shipwrecked-hackathon-by-hack-club-1ch4</link>
      <guid>https://dev.to/ethanhawksley/the-shipwrecked-hackathon-by-hack-club-1ch4</guid>
      <description>&lt;p&gt;Last April, I was minding my own business when I received a curious email in my inbox.&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Hack Club is renting an island.&lt;/li&gt;
&lt;li&gt;We are hosting a hackathon.&lt;/li&gt;
&lt;li&gt;Anyone who ships 4 projects gets to come. Flight stipends available!&lt;/li&gt;
&lt;li&gt;Dates are August 8th - 11th. Boston, USA.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;I'd signed up for &lt;a href="https://hackclub.com" rel="noopener noreferrer"&gt;Hack&amp;nbsp;Club&lt;/a&gt; mailing lists in the past since they run a variety of coding activities. However, this email particularly stood out to me. I've always wanted to visit America, and it seemed like they would be offering me a free flight!&lt;/p&gt;

&lt;p&gt;Following the link led me to a sign-up page where I entered my details to register my interest. I spread the word about this event to the other coders I knew, and soon it reached the 5,000-signup threshold to be given the green light.&lt;/p&gt;

&lt;p&gt;Hack&amp;nbsp;Club is a non-profit organisation that has received some &lt;a href="https://eu.burlingtonfreepress.com/story/news/2021/11/26/hack-club-shelburne-vt-grant-elon-musk-teens-coding/8552542002/" rel="noopener noreferrer"&gt;generous donations&lt;/a&gt; in the past, but they still can't afford to give away such a great trip for free. To earn my place at the event, I needed to pass The Bay.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bay
&lt;/h2&gt;

&lt;p&gt;The Bay was an online platform designed by Hack&amp;nbsp;Club specifically for this event. You tracked your time spent coding projects with their WakaTime server &lt;a href="https://hackatime.hackclub.com/" rel="noopener noreferrer"&gt;Hackatime&lt;/a&gt; and submitted any completed projects for review by the Shipwrecked moderators.&lt;/p&gt;

&lt;p&gt;Approved projects granted you a number of "shells" relative to how many hours were spent creating the project. These shells could be spent on many different items from their shop, from Flipper Zeros to 3D printers. However, the grand prize was a ticket for the Shipwrecked hackathon in Boston. This cost the small sum of 60 hours total. Travel stipends were also available, at a conversion rate of 1 hour coding → $10 grant towards a flight.&lt;/p&gt;

&lt;p&gt;After checking Skyscanner to see return flights would charge an entire £400 (~$550), I checked the clauses for Shipwrecked and saw that if I programmed for 100 hours total, they would fully cover my flight regardless of how expensive.&lt;/p&gt;

&lt;p&gt;Now I had the 100-hour goal in mind, it was time to start programming.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some Notable Projects
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Gravify
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvqaaq24su9xasu4kyy4o.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvqaaq24su9xasu4kyy4o.jpg" alt="Gravify extension in action" width="800" height="432"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I had found an interesting library called &lt;a href="https://github.com/bubkoo/html-to-image" rel="noopener noreferrer"&gt;html-to-image&lt;/a&gt; that could convert DOM elements into images I could manipulate with JavaScript. While that library was sitting in the back of my mind, I stumbled across the &lt;a href="https://brm.io/matter-js/" rel="noopener noreferrer"&gt;Matter.js&lt;/a&gt; physics simulation library. The library supported custom PNGs as input to the physics simulation, so I decided to combine these two libraries and recreate something very similar to &lt;a href="https://mrdoob.com/projects/chromeexperiments/google-gravity/" rel="noopener noreferrer"&gt;Google Gravity.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Going through the &lt;a href="https://developer.mozilla.org/en-US/" rel="noopener noreferrer"&gt;MDN Web Docs&lt;/a&gt; to learn how to build a browser extension was far smoother than I had expected. I was comfortable writing JavaScript, and not much boilerplate was required to hook into the Browser APIs. After not too long, &lt;a href="https://github.com/ethan-hawksley/gravify-extension" rel="noopener noreferrer"&gt;Gravify&lt;/a&gt; was created.&lt;/p&gt;

&lt;h3&gt;
  
  
  Turing Machine Simulator
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F35y328nyt6vgt44xajag.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F35y328nyt6vgt44xajag.webp" alt="Turing Machine Simulator" width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After visits to Bletchley Park and diving into more theoretical computer science, I knew I wanted to build a Turing machine.&lt;/p&gt;

&lt;p&gt;Turing machines are a model for computing first devised by Alan Turing in 1936. They consist of an infinite roll of tape marked out into squares, a "head" that points to a single square at a time, and a set of states and instructions. Each cycle, the Turing machine reads the value of the tape underneath itself, compares it to the corresponding instruction, writes a new symbol onto the tape, and finally either moves left or right along the tape.&lt;/p&gt;

&lt;p&gt;Despite their limited nature, they can provably carry out any calculation and are often used for proving new theorems in computer science. I did some research and couldn't find a simulator online that I was content with using, so I built my own.&lt;/p&gt;

&lt;p&gt;I was still studying a React course at the time, so I wasn't fully confident building UI with JSX components. This led to a lot of repetitive code.&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;rightOption&lt;/span&gt; &lt;span class="o"&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;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;option&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;rightOption&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Right&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;rightOption&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Right&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Looking back at it, it is quite brittle and challenging to debug, but I can thank my understanding of JavaScript fundamentals for framework-less code like this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reaching America
&lt;/h2&gt;

&lt;p&gt;As soon as I got the official go-ahead from the organisers, I booked a flight ready to set off for Boston.&lt;/p&gt;

&lt;p&gt;Coming alongside me were two friends who also qualified for the event. They had put in the hours to earn tickets, and we all came over together.&lt;/p&gt;

&lt;p&gt;The flight took a long eight hours, but after not too long we finally reached America.&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%2Fqglhzoihug3xsufind6p.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqglhzoihug3xsufind6p.jpg" alt="EDIC Pier" width="799" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once we arrived at the airport, we set off to EDIC Pier where we laid our picnic blankets and bought some local food. I got to know the other contestants who were there. Many were American, but surprising numbers were from all across the globe, with one even as far as Vietnam!&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%2Fy2f565hxq3j4lxgkxl1e.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fy2f565hxq3j4lxgkxl1e.jpg" alt="Boston Harbour" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It didn't take long until we began to set off towards Cathleen Stone Island. The ride was short but a great opportunity to chat with the other people there and take some photos. By the time we finally reached the island, we had already decided on the structure of our teams.&lt;/p&gt;

&lt;p&gt;Everyone scrambled to claim their beds, but as one of my projects had gone viral, I was given first pick and stayed in the executive suite with the other viral programmers. It was here that I met Daniel, another participant who managed to go viral, and formed a team with him and Oliver.&lt;/p&gt;

&lt;p&gt;By the end of the day, we were all invited down to the pavilion to learn about the first project we would be assigned. This hackathon had three projects that we would make in total, each themed around a certain idea. The first project was to design a method of communication that wouldn't involve letters or numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  SymbolNotes
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fntg8yktqsz3r69swxlbr.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%2Fntg8yktqsz3r69swxlbr.png" alt="SymbolNotes UI" width="567" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In my team, we decided to create an online peer-to-peer messaging app. Since I had prior experience with the PeerJS library, I suggested that we use that.&lt;/p&gt;

&lt;p&gt;As per hackathon tradition, the code we made was hacky, and the graphics were rough, but we managed to create a working solution. We released the source code for &lt;a href="https://github.com/Thesupernile/SymbolNotes" rel="noopener noreferrer"&gt;SymbolNotes&lt;/a&gt; onto GitHub so others could examine and learn from it. We made it together over the course of a morning and submitted it onto The Bay.&lt;/p&gt;

&lt;h2&gt;
  
  
  Exploring The Island
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9ts0fxzo8jt7pemqmq5s.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9ts0fxzo8jt7pemqmq5s.jpg" alt="Map of Cathleen Stone Island" width="800" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With our project complete, we spent the rest of the day exploring the island as a team. The executive suite and pavilion were both very close to the docks, but there was the entire rest of the island still to investigate.&lt;/p&gt;

&lt;p&gt;Alongside us were some Americans who knew the area much better than we did and told plenty of stories about what it was like living in America. As somebody who'd only set foot outside Europe once before, it was very refreshing to hear such different perspectives.&lt;/p&gt;

&lt;p&gt;Before long, however, it was back to the next challenge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connect Infinity
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flvwt9662i2ygrtbh201r.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%2Flvwt9662i2ygrtbh201r.png" alt="Connect Infinity gameplay" width="800" height="488"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our next challenge was to design a creative game that could be played online. We decided to put a spin on the classic game Connect 4 and make it real-time. To prevent it from ending extremely quickly, the game only ends once the entire board is full. Every 4-in-a-row gives a point, most points win.&lt;/p&gt;

&lt;p&gt;Now the team had got used to PeerJS, we decided to use it once again here as it seemed perfectly suited for the task. As a challenge, we designed the code so that lobbies of unlimited size were supported, instead of just groups of two.&lt;/p&gt;

&lt;p&gt;This took more time than the previous project due to its larger scope, but we worked as a team much more efficiently. After a few tireless hours, &lt;a href="https://github.com/ethan-hawksley/connect-infinity" rel="noopener noreferrer"&gt;Connect Infinity&lt;/a&gt; was created just in time to present.&lt;/p&gt;

&lt;p&gt;We took laptops down to the pavilion and set them up running the game by the shore. The other participants all tried out the game, and it was surprisingly well received! We managed to win a limited-edition Shipwrecked shirt, which I still have and wear to this day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Perlin Colours
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1c1uolvy45at1ugk9px5.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%2F1c1uolvy45at1ugk9px5.png" alt="Perlin Colours" width="799" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our final task was to create a project that heavily featured a variety of colours. One of our team had the idea to create a Perlin noise generator that could create plenty of colourful gradients. We decided to name it &lt;a href="https://github.com/Thesupernile/PerlinColours" rel="noopener noreferrer"&gt;Perlin Colours&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;After some research on the formulas involved and a fair bit of trial and error, we ended up with a functioning noise generator implemented with HTML Canvas. I had dabbled with Canvas before, but this was the first time I had implemented a proper renderer using it.&lt;/p&gt;

&lt;p&gt;We ended up sleeping on the problem, but once we woke up, we were fully refreshed and fixed the final bugs with the implementation. It was very satisfying to have a proper end product.&lt;/p&gt;

&lt;p&gt;The project was presented, and it went down a treat! The prizes were limited-edition laptop stickers that I have proudly stuck onto my laptop ever since.&lt;/p&gt;

&lt;h2&gt;
  
  
  Returning Home
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5s1svg0fllo8i4xeyiwx.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F5s1svg0fllo8i4xeyiwx.jpg" alt="Boston Logan International restaurant" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alas, all good things must come to an end. It was the final day, so I gathered all my belongings and packed them away into a suitcase. My team attended the closing ceremony and said our goodbyes to the people there. There were so many nice people I met, and I'll cherish the memories made forever.&lt;/p&gt;

&lt;p&gt;I caught an Uber alongside some others also needing a flight back and returned to the airport. It was there our team finally disbanded. One amusing thing at the airport was the Hack&amp;nbsp;Club official plushies were just over the weight limit and were tripping all the security alarms. I got through just fine, but it caused a right mess!&lt;/p&gt;

&lt;p&gt;It was then I also got to see my very first American passport. Having only seen European ones, it was a right culture shock with pages full of landmarks and a giant eagle on the photo page.&lt;/p&gt;

&lt;p&gt;The actual flight was thankfully uneventful. I watched the in-flight entertainment and ate the food, but slowly drifted off to sleep until we landed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reflections
&lt;/h2&gt;

&lt;p&gt;Participating in Shipwrecked is an experience I'll remember forever, and I thank Hack&amp;nbsp;Club and the organisers for helping set up such a wonderful event. I have still maintained contact with several of the other people there and arrange to meet up with them at future hackathons.&lt;/p&gt;

&lt;p&gt;It was also very enjoyable working in teams. Having spent so much of my time programming solo, it was nice bouncing ideas back and forth to come to informed conclusions.&lt;/p&gt;

&lt;p&gt;I've done many other things with Hack&amp;nbsp;Club since, but they are perhaps a story for another blog post...&lt;/p&gt;

&lt;p&gt;One thing you can take for granted is that I'll absolutely be doing more hackathons in the future!&lt;/p&gt;

</description>
      <category>hackclub</category>
      <category>hackathon</category>
      <category>development</category>
    </item>
    <item>
      <title>Building An Astro Blog</title>
      <dc:creator>Ethan Hawksley</dc:creator>
      <pubDate>Thu, 11 Jun 2026 18:39:35 +0000</pubDate>
      <link>https://dev.to/ethanhawksley/building-an-astro-blog-1a95</link>
      <guid>https://dev.to/ethanhawksley/building-an-astro-blog-1a95</guid>
      <description>&lt;p&gt;This article was originally published on &lt;a href="https://hawksley.dev/blog/building-astro-blog/" rel="noopener noreferrer"&gt;hawksley.dev&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I've owned the domain name hawksley.dev for a while now, but I've never done much with it aside from sending email. Over the weekend, I thought I might as well make good use of it and decided to create a blog.&lt;/p&gt;

&lt;p&gt;In the beginning, this site had a humble home page with some links to GitHub projects. A blog requires much more infrastructure for me to use it effectively. For one, it'd be great if I could just write my posts in Markdown and have them formatted by my project automatically. Having a look at the options available, the first that stood out was &lt;a href="https://jekyllrb.com/" rel="noopener noreferrer"&gt;GitHub's Jekyll&lt;/a&gt;. It looked nice and had great integration with GitHub Pages, which I'm hosting with at the time of writing. However, it just felt too rigid. I needed something modern that I felt I could get my hands dirty with.&lt;/p&gt;

&lt;p&gt;Enter Astro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Astro
&lt;/h2&gt;

&lt;p&gt;In the grand scheme of things, &lt;a href="https://astro.build/" rel="noopener noreferrer"&gt;the Astro framework&lt;/a&gt; is pretty new at just 5 years old. That hasn't prevented it from gaining popularity rapidly. It holds performance as a key design principle, anything that can be static will render statically. By default, it ships absolutely no JS to the browser, which felt perfect for my use case. I have no need for advertising or heavy tracking scripts weighing down my site. All I need is a place to write.&lt;/p&gt;

&lt;p&gt;Learning how to work with Astro was completely painless. I created a new GitHub repository and followed along with their very high-quality documentation to create a blog of my own. At the very end of it, I’d created a nice neat blog that loaded instantly and was easy to write for.&lt;/p&gt;

&lt;p&gt;I wasn't satisfied by using the tutorial's blog for my site, though, as it felt too cookie-cutter, and so I started again, now with confidence in the framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Design Decisions
&lt;/h2&gt;

&lt;p&gt;There were some definite design decisions I knew I wanted from the get-go. First-class light mode and dark mode support were a must. Plenty of blogs offered just one or the other, and after a bit of digging, it didn't seem technically hard to implement at all.&lt;/p&gt;

&lt;p&gt;Another key principle was mobile-first design. Many of my previous projects started with the key assumption that the reader will be on a laptop or desktop, but that often isn't the case. Mobile devices account for approximately two-thirds of global internet traffic, with the remaining third coming from desktops. I wanted this site to stand the test of time until I inevitably rebuild it again, so it's only natural I designed it with mobile devices in mind.&lt;/p&gt;

&lt;p&gt;My final decision I knew I wanted was to have excellent performance scores, one of the very reasons that I chose Astro for the job. Components are almost a certainty in modern web design to ensure consistency across pages, but I needed to write components used at compile time, rather than at run time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Actually Programming the Site
&lt;/h2&gt;

&lt;p&gt;After creating an experimental fork of my main repository and wiping the directory, I initialised a new blank Astro project with &lt;code&gt;pnpm create astro@latest&lt;/code&gt; and scaffolded the directory structure I'd need.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public // Assets such as robots.txt and favicons.
src
  assets // Any assets displayed in the actual site.
  components // Reusable components representing sections of UI.
  content // Markdown files representing the blog.
  layouts // The base layout each page uses.
  pages // The actual pages rendered, combining all parts together.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Development went very smoothly over two days and 15 full hours, with only some minor hiccups along the way.&lt;/p&gt;

&lt;p&gt;Google's PageSpeed Insights flagged my planned accent colour International Orange &lt;code&gt;#FF4F00&lt;/code&gt; as having insufficient contrast in light mode, so I had to split into separate accents for light and dark mode. By using global CSS variables that change depending on the theme, I implemented this change painlessly.&lt;/p&gt;

&lt;p&gt;I also encountered some CLS issues surrounding my choice of font. I personally love the look of the &lt;a href="https://rsms.me/inter/" rel="noopener noreferrer"&gt;Inter font&lt;/a&gt; and included it in my project&lt;sup id="fnref1"&gt;1&lt;/sup&gt;. However, although 300&amp;nbsp;KiB may not sound like a lot, on a slow connection it’s a noticeable delay. After some research I discovered the &lt;a href="https://github.com/fonttools/fonttools" rel="noopener noreferrer"&gt;fontTools library&lt;/a&gt; and managed to shrink the Inter font to 70&amp;nbsp;KiB by subsetting the font to only the character sets I need.&lt;/p&gt;

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

&lt;p&gt;Astro has been a pleasure to work with, and I can easily see myself using it in future projects now I've adjusted to it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fztryiypec0hqw9jeex91.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%2Fztryiypec0hqw9jeex91.webp" alt="Perfect hawksley.dev Google PageSpeed score"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A perfect score has got to be one of the most satisfying feelings after doing a site redesign.&lt;/p&gt;




&lt;ol&gt;

&lt;li id="fn1"&gt;
&lt;p&gt;I'm now using IBM Plex Sans and IBM Plex Mono, but they are subsetted to 62KiB and 9KiB respectively, so the advice still holds.&amp;nbsp;↩&lt;/p&gt;
&lt;/li&gt;

&lt;/ol&gt;

</description>
      <category>astro</category>
      <category>webdev</category>
      <category>programming</category>
      <category>portfolio</category>
    </item>
  </channel>
</rss>
