<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>sam le</title>
    <link>https://sam.dev/</link>
    <description>sam le is a creative coder and high school student. He writes about software engineering, web development, and side projects.</description>
    <generator>Hugo</generator>
    <language>en</language>
    <copyright>Copyright © 2025–2026 sam le. All rights reserved.</copyright>
    <lastBuildDate>Tue, 27 Oct 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://sam.dev/index.xml" rel="self" type="application/rss+xml"/>
    <item><title>A Spotify visualiser for less than $10</title><link>https://sam.dev/blog/engineering/hardware/spotify-cyd/</link><pubDate>Tue, 27 Oct 2026 00:00:00 +0000</pubDate><dc:creator>sam le</dc:creator><guid>https://sam.dev/blog/engineering/hardware/spotify-cyd/</guid><description>How I turned a need into a nightmare working with the CYD.</description><content:encoded><![CDATA[My desk used to have a problem. Between the keyboard, the monitor,
            and the empty space beside my mouse, something was missing. I didn't
            want another generic plastic gadget glowing with obnoxious RGB LEDs.
            I didn't want to fall into the consumerism trap: I&nbsp;wanted
            something that I could be able to build AND customise myself.
            <p>
              That itch is what led me down the topic of microcontrollers. What
              started as a casual weekend need turned into a growing interest
              -&nbsp; building a desktop dashboard that breathes life into my
              workspace, without the need to manually check myself.
            </p>
            <p>
              Every good desk gadget needs a dual personality. When I'm locked
              into deep focus and the room is quiet, my workspace shouldn't
              really scream for attention. So the idle state is a&nbsp;digital
              clock which stares back at me, flanked by localised weather icons
              and a subtle date readout.
            </p>
            <p><br /></p>
            <h2
              id="fighting-the-pixel-wars"
              aria-labelledby="fighting-the-pixel-wars-text"
            >
              <span id="fighting-the-pixel-wars-text" class="h-text"
                >Fighting the pixel wars</span
              ><a
                class="anchor"
                href="#fighting-the-pixel-wars"
                aria-label="Link to this section"
              ></a>
            </h2>
            <p>
              Building for a 320x240 screen is equal parts liberating and
              agonizing. Every single pixel counts.
            </p>
            <p>
              Early on, my album art was behaving like a stubborn puzzle piece,
              rendering only half of the cover or clipping awkwardly off the
              edges because the container size didn't match the scaled-down JPEG
              output. Worse yet, when long track titles kicked in, they collided
              straight into the progress bar, creating a cluttered mess.
            </p>
            <p>
              Fixing it meant dialing in the math, (since I actually have no
              clue if there's a UI visualiser for ESP32s):
            </p>
            <ul>
              <li>
                <p>
                  Centering the album art precisely within a 150x150 boundary so
                  300x300 JPEGs decode cleanly.
                </p>
              </li>
              <li>
                <p>
                  Creating a dedicated vertical hierarchy (<code>TITLE_Y</code>,
                  <code>ARTIST_Y</code>, <code>ALBUM_Y</code>) with protective
                  spacing buffers.
                </p>
              </li>
              <li>
                <p>
                  Padding the bottom layout so the elapsed time numbers and the
                  progress bar never step on each other's toes.
                </p>
              </li>
            </ul>
            <figure class="fig">
              <img
                src="/images/postmedia/engineering/hardware/spotify-esp32/ver1.1.jpg"
                width="400"
              />
              <figcaption>First version of the visualiser!</figcaption>
            </figure>
            <p><br /></p>
            <h2 id="debugging" aria-labelledby="debugging-text">
              <span id="debugging-text" class="h-text">Debugging</span
              ><a
                class="anchor"
                href="#debugging"
                aria-label="Link to this section"
              ></a>
            </h2>
            <p>
              The biggest heartbreak of working with hardware isn't wiring
              mistakes or bad code; it's the random bugs that happen to appear
              in the middle of the night.
            </p>
            <p>
              In my early versions, the display would run flawlessly for a few
              hours, and then completely lock up. I’d walk back to my desk to
              find a frozen screen, forcing me to yank the USB-C cable and
              replug it.
            </p>
            <p>
              The culprit? Heap fragmentation. Every time a track changed, my
              code was dynamically calling <code>malloc()</code> and
              <code>free()</code> to handle the incoming 40KB JPEG image buffer.
              Over hours of continuous API polling, the ESP32's heap memory
              became Swiss cheese until it choked and crashed.
            </p>
            <p>
              So I killed dynamic allocation entirely for the buffer. By
              pre-allocating a global <code>jpgBuffer</code> right at startup,
              the memory footprint stays dead-steady. The board doesn't have to
              scramble for breathing room anymore, making it stable enough to
              run indefinitely. I'm still on the lookout for many more
              unprecedented problems.
            </p>
            </br>
            <figure class="fig">
              <img
                src="/images/postmedia/engineering/hardware/spotify-esp32/ver1.4.jpg"
                width="400"
                alt="Version 1.4 of the visualiser."
                loading="lazy"
                decoding="async"
              />
              <figcaption>Version 1.4 of the visualiser.</figcaption>
            </figure>
            <p><br /></p>
            <h2 id="aesthetics" aria-labelledby="aesthetics-text">
              <span id="aesthetics-text" class="h-text">Aesthetics</span
              ><a
                class="anchor"
                href="#aesthetics"
                aria-label="Link to this section"
              ></a>
            </h2>
            <figure class="fig">
              <img
                src="/images/postmedia/engineering/hardware/spotify-esp32/beforecase.png"
                width="400"
                alt="Before 3D printing the case."
                loading="lazy"
                decoding="async"
              />
              <figcaption>Before 3D printing the case.</figcaption>
            </figure>

            Afterwards, the final step was to 3D print a case for the microcontroller since I didn't like the look of it resting on the off-colored wood brick. I wanted something that would look clean, while also being functional. The case needed to have precise cutouts for the USB-C port and display, while also allowing for proper ventilation to prevent overheating. Luckily I got a model off <a href="https://makerworld.com" rel="noopener noreferrer">MakerWorld</a> and modified it to slice out a port for the USB-C cable. After a few iterations, and a little bit of waiting, I finally had a case that looked great and protected the board (with M2 screws I got off Ebay).

            <figure class="fig">
              <img
                src="/images/postmedia/engineering/hardware/spotify-esp32/case.jpg"
                width="400"
                alt="After 3D printing the case."
                loading="lazy"
                decoding="async"
              />
              <figcaption>After 3D printing the case.</figcaption>
            </figure>
            <br />
            <h2
              id="final-thoughts-why-we-build"
              aria-labelledby="final-thoughts-why-we-build-text"
            >
              <span id="final-thoughts-why-we-build-text" class="h-text"
                >Final Thoughts: Why We Build</span
              ><a
                class="anchor"
                href="#final-thoughts-why-we-build"
                aria-label="Link to this section"
              ></a>
            </h2>
            <p>
              At the end of the day, plugging a raw microcontroller into a USB
              port and watching it come alive with your own layout, your own
              fonts, and your own API keys is an unmatched feeling! In case you
              want to spin up your own desktop companion, the source code and
              everything else is
              <a
                href="https://github.com/itssmnle/spotifyesp32"
                rel="noopener noreferrer"
                >linked in my GitHub</a
              >. (I update it regularly for bugs, and feel free to suggest
              changes).
            </p>
            <p>
              If you've got an ESP32 CYD gathering dust in a drawer somewhere,
              pull it out, flash the code, and give your desk the companion it
              deserves.
            </p>
            <p><br /></p>]]></content:encoded></item>
<item><title>Raspberry Pis are interesting: Pi-hole and DNS setup</title><link>https://sam.dev/blog/engineering/hardware/raspberry-pi-and-pihole/</link><pubDate>Sat, 10 Oct 2026 00:00:00 +0000</pubDate><dc:creator>sam le</dc:creator><guid>https://sam.dev/blog/engineering/hardware/raspberry-pi-and-pihole/</guid><description>Diving into Raspberry Pi OS, headless Linux administration, and setting up network-wide ad blocking.</description><content:encoded><![CDATA[<h2 id="stepping-into-raspberry-pi-os" aria-labelledby="stepping-into-raspberry-pi-os-text"><span id="stepping-into-raspberry-pi-os-text" class="h-text">Stepping into Raspberry Pi OS</span><a class="anchor" href="#stepping-into-raspberry-pi-os" aria-label="Link to this section"></a></h2>
            <p>Hardware tinkering has always been a fascination of mine, but software-wise, diving deeper into Linux and managing a headless single-board computer is a whole different kind of rewarding. Recently, I got my hands on a Raspberry Pi 3B and set out to understand the ins and outs of this magnificent hardware.</p>
            <p>Moving away from a graphical desktop environment to operating entirely through CLI taught me a lot. Breaking things and having to reflash the SD card became part of the tuition...</p>
            <figure class="fig">
              <img src="/images/postmedia/engineering/hardware/pihole-setup.jpg" alt="Downloading Pi-Hole directly on the machine" loading="lazy" decoding="async">
              <figcaption>Downloading Pi-Hole directly on the machine.</figcaption>
            </figure>
            <h2 id="building-a-pi-hole" aria-labelledby="building-a-pi-hole-text"><span id="building-a-pi-hole-text" class="h-text">Building a Pi-hole</span><a class="anchor" href="#building-a-pi-hole" aria-label="Link to this section"></a></h2>
            <p>With the Pi up and running, I wanted a practical project - which was when I decided to install <strong>Pi-hole</strong>, acting as a DNS sinkhole for network-wide ad blocking.</p>
            <p>The installation process was remarkably straightforward, but configuring my router to hand out the Pi’s IP as the primary DNS server required lots of work. Firstly, I didn't know my router gateway credentials, so that took an entire week to figure out (including calling support from my ISP, which was not pleasant). So once setting up DNS to route to the Pi and binding my it to a static IP was complete, as well as configuring SSH for a headless setup, it was all good to go!<br>In all honesty, the thing shouldnt've taken so long, but figuring it out myself was the rewarding part of it, I guess.</p>
            <figure class="fig">
              <img src="/images/postmedia/engineering/hardware/pihole-hub.png" alt="Pi-hole dashboard showing blocked ads and queries" loading="lazy" decoding="async">
              <figcaption>Here's the pi-hole dashboard, after 2 days of activity!</figcaption>
            </figure>]]></content:encoded></item>
<item><title>Introducing Contexto</title><link>https://sam.dev/blog/engineering/software/games/introducing-contexto/</link><pubDate>Fri, 11 Sep 2026 00:00:00 +0000</pubDate><dc:creator>sam le</dc:creator><guid>https://sam.dev/blog/engineering/software/games/introducing-contexto/</guid><description>A semantic word guessing game inspired by the enthusiasm of friends at school, built as a browser extension.</description><content:encoded><![CDATA[<h2 id="school-inspiration" aria-labelledby="school-inspiration-text">
              <span id="school-inspiration-text" class="h-text">A game everyone kept talking about</span>
              <a class="anchor" href="#school-inspiration" aria-label="Link to this section"></a>
            </h2>
            <p>Contexto first caught my attention during tutor time and in class, where my friends kept coming back to it. They really enjoyed trying to find the hidden word, and seeing how much fun a simple guessing game could create made me want to build my own version. I called it <strong>Contexto</strong>, after the game that started the conversations.</p>

            <figure class="fig">
              <img src="/images/postmedia/engineering/software/games/contexto/contexto.png" alt="Contexto word guessing game branding and interface preview" loading="eager" fetchpriority="high" decoding="async" width="440" height="280">
              <figcaption>Contexto, a small word game built around the fun of guessing together.</figcaption>
            </figure>

            <h2 id="meaning-not-spelling" aria-labelledby="meaning-not-spelling-text">
              <span id="meaning-not-spelling-text" class="h-text">Guess by meaning, not spelling</span>
              <a class="anchor" href="#meaning-not-spelling" aria-label="Link to this section"></a>
            </h2>
            <p>Instead of telling you whether a guess is spelled correctly or shares letters with the answer, Contexto ranks words by how close their meaning is to the secret word. A low rank means you are getting warmer, while a high one sends you back to explore a different idea. That makes each guess feel like a clue, and the next word is often a small leap of intuition.</p>

            <h2 id="daily-and-infinite" aria-labelledby="daily-and-infinite-text">
              <span id="daily-and-infinite-text" class="h-text">A daily puzzle, or another round</span>
              <a class="anchor" href="#daily-and-infinite" aria-label="Link to this section"></a>
            </h2>
            <p>I wanted the extension to work for a quick daily game and for those times when one round turns into several. You can play the current puzzle, choose another game, or jump into a random one. Guesses are ranked by closeness, and a history panel keeps completed games and personal stats in view. Hints and a give-up option make it easier to keep moving when a word has you stuck.</p>

            <h2 id="building-the-extension" aria-labelledby="building-the-extension-text">
              <span id="building-the-extension-text" class="h-text">Keeping the game close at hand</span>
              <a class="anchor" href="#building-the-extension" aria-label="Link to this section"></a>
            </h2>
            <p>Contexto is a Chrome extension with a compact popup and an option to open a larger view. The game uses the Contexto service to check guesses, while browser storage keeps the current game, settings, and history between visits. That combination lets the game stay lightweight without losing the progress that makes a longer guessing session satisfying.</p>]]></content:encoded></item>
<item><title>Color theory..?</title><link>https://sam.dev/blog/engineering/software/games/introducing-spectrum/</link><pubDate>Fri, 04 Sep 2026 00:00:00 +0000</pubDate><dc:creator>sam le</dc:creator><guid>https://sam.dev/blog/engineering/software/games/introducing-spectrum/</guid><description>A minimalist color memory game built as a browser extension to test chromatic recall and visual precision.</description><content:encoded><![CDATA[<h2 id="color-theory" aria-labelledby="color-theory-text">
              <span id="color-theory-text" class="h-text">A simple idea in color theory</span>
              <a class="anchor" href="#color-theory" aria-label="Link to this section"></a>
            </h2>
            <p>I've always been intrigued by color theory and how a small set of values can describe a shade with surprising precision. While scrolling through reels, I came across a similar color-memory idea and wondered how simply it could work as a game. It helped me develop <a href="https://chromewebstore.google.com/detail/spectrum/jkjlbhbmmedngjceejobaibbdkjogfgb">spectrum</a>, an extension that asks players to remember colors and recreate them from memory.</p>

            <figure class="fig">
              <img src="/images/postmedia/engineering/software/games/spectrum/home.png" alt="Spectrum extension start screen" loading="eager" fetchpriority="high" decoding="async" width="640" height="360">
              <figcaption>The start screen.</figcaption>
            </figure>

            <h2 id="gameplay-mechanics" aria-labelledby="gameplay-mechanics-text">
              <span id="gameplay-mechanics-text" class="h-text">How the mechanics work</span>
              <a class="anchor" href="#gameplay-mechanics" aria-label="Link to this section"></a>
            </h2>
            <p>The gameplay is quite straightforward. Players are presented with five random colors in sequence. Each color flashes on screen for five seconds with a countdown. Once the timer expires, players adjust sliders for hue, saturation, and lightness to recreate the shade they just saw - easily said than done though!</p>

            <figure class="fig">
              <img src="/images/postmedia/engineering/software/games/spectrum/memorise.png" alt="Memorizing phase with active countdown timer" loading="lazy" decoding="async" width="640" height="360">
              <figcaption>Memorizing phase with the running ms countdown.</figcaption>
            </figure>

            <h2 id="scoring-and-precision" aria-labelledby="scoring-and-precision-text">
              <span id="scoring-and-precision-text" class="h-text">Scoring chromatic accuracy</span>
              <a class="anchor" href="#scoring-and-precision" aria-label="Link to this section"></a>
            </h2>
            <p>Scoring is calculated using an algorithm based on HSL color space geometry. Hue is weighted most heavily since our brains perceive angular color shifts drastically, while saturation and lightness are graded using smooth power curves. Scores range from zero to ten per round, leading to a maximum possible score of fifty points, in which you get a message depending on your accuracy. (Out of all the people I know, not many score over 45).</p>


            <figure class="fig">
              <img src="/images/postmedia/engineering/software/games/spectrum/narrow-eyes.gif" alt="Squinting" loading="lazy" decoding="async" width="400" height="360">
              <figcaption>The squinting is always not on purpose - it always makes me laugh seeing others do.</figcaption>
            </figure>

            <h2 id="tech-stack" aria-labelledby="tech-stack-text">
              <span id="tech-stack-text" class="h-text">Under the hood with Plasmo and React</span>
              <a class="anchor" href="#tech-stack" aria-label="Link to this section"></a>
            </h2>
            <p>It's built using modern web tooling, using React, TypeScript, and Tailwind CSS. Persistence is handled via Chrome storage with automatic session recovery.</p>]]></content:encoded></item>
<item><title>KojoNote, formerly StudyForge</title><link>https://sam.dev/blog/engineering/software/introducing-kojonote/</link><pubDate>Sat, 15 Aug 2026 00:00:00 +0000</pubDate><dc:creator>sam le</dc:creator><guid>https://sam.dev/blog/engineering/software/introducing-kojonote/</guid><description>A unified revision platform designed to make learning more accessible, engaging, and effective for students.</description><content:encoded><![CDATA[<h2 id=one-place aria-labelledby=one-place-text>
            <span id=one-place-text class=h-text>A single place for revision</span>
            <a class=anchor href=#one-place aria-label="Link to this section"></a>
          </h2>
          <p><strong>KojoNote</strong> (which originally started as <a href="/blog/engineering/software/introducing-studyforge/">StudyForge</a>) is a platform designed to make revision more accessible, engaging, and effective for KS3 students. It is particularly beneficial for students who require additional support in subjects such as Science, while encouraging independent learning beyond the classroom. The core aim is to provide students with a single platform that brings together everything they need for effective revision—including a dashboard, revision notes, student notes, flashcards, and interactive practice modules.</p>
          <figure class="fig">
            <img src="/images/postmedia/engineering/software/kojonote/kojonote-banner.png" alt="Our current brand identity!">
            <figcaption>Our current brand identity!</figcaption>
          </figure>
          <h2 id=curriculum aria-labelledby=curriculum-text>
            <span id=curriculum-text class=h-text>Grounded in the KS3 curriculum</span>
            <a class=anchor href=#curriculum aria-label="Link to this section"></a>
          </h2>
          <p>To ensure the content aligns closely with the school's curriculum, the KS3 curriculum has been integrated directly into the system. Mathematics as well as the three core Sciences (Biology, Chemistry, and Physics) have already been implemented, with content specifically tailored to our curriculum requirements. As the platform develops, there is significant potential to extend its scope to support iGCSE and, eventually, A-Level students.</p>

          <h2 id=one-learning-space aria-labelledby=one-learning-space-text>
            <span id=one-learning-space-text class=h-text>Bringing learning together</span>
            <a class=anchor href=#one-learning-space aria-label="Link to this section"></a>
          </h2>
          <p>Feedback on the concept from staff members has been overwhelmingly positive. One of the platform's key strengths is its ability to combine teacher-assigned work and independent revision within a single environment. Rather than students relying on multiple systems for homework, notes, and revision materials, KojoNote aims to provide a unified experience that simplifies both learning and organisation.</p>

          <p>The platform draws inspiration from services such as <a href="https://www.khanacademy.org" target="_blank" rel="noopener noreferrer">Khan Academy</a>, <a href="https://www.savemyexams.com" target="_blank" rel="noopener noreferrer">Save My Exams</a>, and <a href="https://www.carousel-learning.com" target="_blank" rel="noopener noreferrer">Carousel Learning</a>, while seeking to offer a more personalised experience. Although external resources such as <a href="https://www.physicsandmathstutor.com" target="_blank" rel="noopener noreferrer">PMT</a> and <a href="https://www.sparxmaths.uk" target="_blank" rel="noopener noreferrer">Sparx</a> continue to play an important role, KojoNote acts as a central hub that directs students to the most relevant materials and resources. Furthermore, content can be developed collaboratively by both students and teachers, allowing the platform to become increasingly tailored to the needs of the community over time.</p>

          <h2 id=building-together aria-labelledby=building-together-text>
            <span id=building-together-text class=h-text>Building together</span>
            <a class=anchor href=#building-together aria-label="Link to this section"></a>
          </h2>
          <p>Building this isn't a solo journey—I'm lucky enough to have my wonderful friend who is helping me with illustrations, and I hope to build and expand an ambitious team around the project as it grows!</p>

          <h2 id=lasting-notes aria-labelledby=lasting-notes-text>
            <span id=lasting-notes-text class=h-text>Keeping notes accessible</span>
            <a class=anchor href=#lasting-notes aria-label="Link to this section"></a>
          </h2>
          <p>Another major challenge in school environments relates to Microsoft Teams and Class Notebooks—when student Teams are archived or deleted at the end of an academic year, notes stored within the associated OneNote Class Notebooks can become difficult or impossible to access. KojoNote addresses this challenge through a permanent 'notes' system (currently a work-in-progress), enabling students to retain access to their notes throughout their time at school regardless of changes to Teams, classes, or year groups. I hope to get a tenant to simplify login via Azure AD integration!</p>

          <h2 id=join-kojonote aria-labelledby=join-kojonote-text>
            <span id=join-kojonote-text class=h-text>Get involved</span>
            <a class=anchor href=#join-kojonote aria-label="Link to this section"></a>
          </h2>
          <p>If anyone is interested in collaborating or coming on board, feel free to <a href="https://kojonote.web.app/join" target="_blank" rel="noopener noreferrer">join us here</a>!</p>]]></content:encoded></item>
<item><title>World Youth Economic Forum (WYEF) 2026</title><link>https://sam.dev/blog/misc/wyef-shanghai-trip/</link><pubDate>Mon, 03 Aug 2026 00:00:00 +0000</pubDate><dc:creator>sam le</dc:creator><guid>https://sam.dev/blog/misc/wyef-shanghai-trip/</guid><description>A week in Shanghai competing at the 2026 World Youth Economic Forum, from months of preparation to an unforgettable team win.</description><content:encoded><![CDATA[<p>One of the best trips I&#39;ve ever had would honestly be the 2026 World Youth Economic Forum. It wasn&#39;t necessarily Shanghai itself that made it so memorable, although the city was amazing in its own right. What made the trip special was the experience, the people I shared it with, and the journey leading up to it. Looking back, it was one of the few experiences that genuinely changed the way I viewed myself. The competition pushed me further than I thought I could go, introduced me to incredible people, and gave me memories that I know I&#39;ll still be talking about years from now.</p>
<h2 id="the-preparation" aria-labelledby="the-preparation-text"><span id="the-preparation-text" class="h-text">The Preparation  </span><a class="anchor" href="#the-preparation" aria-label="Link to this section"></a></h2>
<p>For me, the competition itself was a huge deal, so naturally, preparation started as early as possible. Long before we ever stepped foot in Shanghai, we were already spending our afternoons and evenings working on pitch decks, cost forecasts, financial projections, and market reports. Some of the research dated all the way back to May, almost three months before the actual competition.</p>
<p>It wasn&#39;t until July that things really started becoming serious. That was when we began doing regular practice rounds and meeting in person as a full team. Everyone naturally settled into their own roles based on their strengths. The strongest speakers focused on presenting, others worked on the pitch decks and research, another teammate and I took responsibility for the entire marketing side of the campaign, while the rest of the team spent hours preparing spreadsheets and training for the business simulation round.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-01.jpg" alt="Preparing for the World Youth Economic Forum" loading="lazy" decoding="async"></figure>
<p>There was an introductory meeting with all the participants, as well as several practice rounds for the business simulation. Unfortunately, we didn&#39;t perform particularly well, finishing 5th and 3rd in the trial rounds. At the time, it was a little discouraging. We knew we had potential, but seeing other teams perform so strongly made it clear that this competition wasn&#39;t going to be easy. Still, the practice rounds helped us understand where our weaknesses were and what we needed to improve before the real competition began.</p>
<p>Everyone had their own scripts for the pitch deck presentations, and we spent countless hours rehearsing them. Every slide had to be polished, every transition had to feel natural, and every speaker had to know exactly what they were saying. Looking back on it now, I genuinely cannot fathom how many times we practiced the same presentation. There were moments when I could probably recite entire sections from memory without even looking at the slides.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-02.jpg" alt="Timer" loading="lazy" decoding="async"><figcaption>I'd say over 100 screenshots of just this in the groupchat.</figcaption></figure>
<p>My responsibilities went beyond just the strategic side of marketing. During my free time, I was designing mascots, branding assets, packaging concepts, and promotional materials for the team. I contacted manufacturers and different printing services to produce custom stickers of our branding as well as custom-made mascots. There were nights where I was still working long after everyone else had gone to sleep, trying to finalize designs or communicate with suppliers. The workload was demanding, and there were definitely sacrifices involved. Many late nights disappeared to deadlines, revisions, and last-minute changes.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-03.jpg" alt="This on vacation" loading="lazy" decoding="async"></figure>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-04.jpg" alt="This AT NIGHT" loading="lazy" decoding="async"></figure>
<p>We also arranged meetings with marketing experts and attended various events to better understand how successful brands built engagement and communicated with their audiences. That research became incredibly important later, especially for the roadshow portion of the competition. One of the highlights was visiting Coca-Cola&#39;s campaign event in July to observe how an internationally recognized brand executed its strategy. We had also hoped to visit Yeah Gelato&#39;s store in Ho Chi Minh City, but unfortunately the branch had already closed down by then, so we missed the chance.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-05.jpg" alt="Coca Cola campaign" loading="lazy" decoding="async"></figure>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-06.jpg" alt="I got a pen!" loading="lazy" decoding="async"></figure>
<p>I won this really cool pen though.</p>
<p>Eventually, all the pieces began arriving. The mascots. The packaging boxes. The cups. The stickers. The promotional materials. The standees. The banners.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-07.jpg" alt="Packaging" loading="lazy" decoding="async"></figure>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-08.jpg" alt="Layout" loading="lazy" decoding="async"></figure>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-09.jpg" alt="Arriving" loading="lazy" decoding="async"></figure>
<p>For months, these had only existed as concepts on a screen, but suddenly they were all real. My room slowly turned into a storage area filled with competition materials waiting to be shipped. It was my responsibility to put everything together before bringing it to Shanghai. I also worked with an agency to print my designs onto large standees and banners.</p>
<p>When everything was finally assembled, it looked incredible. For the first time, I remember looking at everything and genuinely thinking that we had a real shot at winning. The day before departure was spent making sure nothing had been forgotten. I went out to buy food, clothes, and a few last-minute supplies, including some film boxes (which were going to be used as part of our stall display). It felt strange knowing that after months of preparation, there was very little left to do except wait.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-10.jpg" alt="Lots and lots of film" loading="lazy" decoding="async"><figcaption>Lots and lots of film.</figcaption></figure>
<h2 id="departures" aria-labelledby="departures-text"><span id="departures-text" class="h-text">Departures  </span><a class="anchor" href="#departures" aria-label="Link to this section"></a></h2>
<p>Eventually, after months of preparation, late-night meetings, and countless rehearsals, the day we had been working towards finally arrived. I met up with one of my teammates at the airport, and luckily we were travelling together, which made the whole experience feel a lot less stressful. Up until that point, Shanghai had felt more like an idea than a real destination. We had spent so much time talking about the competition, preparing materials, and thinking about what might happen when we got there that it was strange to realise we were actually leaving. The excitement was definitely there, but so were the nerves. This was the culmination of several months of work, and even before we had boarded the plane, I was already thinking about presentations, simulations, and everything that still needed to go right over the coming week. Of course, things didn&#39;t begin entirely smoothly. Our flight ended up being delayed, and almost immediately I started worrying that we wouldn&#39;t arrive in time to check into the hotel. It wasn&#39;t a major delay, but when you&#39;re about to attend an international competition that you&#39;ve been preparing for all summer, every little setback suddenly feels much bigger than it actually is. Fortunately, the delay wasn&#39;t particularly long, and before we knew it we were finally boarding. The flight itself took around five hours, and most of that time was spent talking about the competition, discussing our plans once we arrived, and occasionally staring out the window. As we approached Shanghai, we could actually see parts of the city below us, including the area where we would be staying.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-11.jpg" alt="Travelling to Shanghai for the World Youth Economic Forum" loading="lazy" decoding="async"></figure>
<p>By the time we landed, it was already getting dark. Getting through customs took much longer than expected, and after collecting our luggage and finding transportation into the city, another hour and a half had passed before we finally arrived at our hotel. After an entire day of travelling, we were both completely exhausted, but thankfully the hotel staff informed us that our rooms were right next to each other (yes!). At that point we were far too tired to do any exploring, and after realising just how hungry we were, the only thing left to do was grab a quick dinner. Instant noodles became our first meal in Shanghai, which admittedly wasn&#39;t the most glamorous introduction to the city, but after everything that had happened during the day, it tasted amazing.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-12.jpg" alt="Taxi ride there" loading="lazy" decoding="async"><figcaption>Taxi ride there.</figcaption></figure>
<h2 id="hello-shanghai" aria-labelledby="hello-shanghai-text"><span id="hello-shanghai-text" class="h-text">Hello, Shanghai  </span><a class="anchor" href="#hello-shanghai" aria-label="Link to this section"></a></h2>
<p>The following day was technically a free day before the competition officially began, which gave us an opportunity to explore the surrounding area and settle into the city. I ended up waking up at around five in the morning and going for a run by myself. There was something really refreshing about being out that early, especially in a completely different country. The area around the hotel was beautiful, and running through unfamiliar streets while the city was slowly waking up gave me a chance to take everything in before the week became busy.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-13.jpg" alt="Exploring Shanghai" loading="lazy" decoding="async"></figure>
<p>After coming back, showering, and eating breakfast, the entire team met up for the first time in China. Although it was supposed to be a relatively relaxed day, we still ended up spending around three hours going through our pitch deck and rehearsing our presentation. The room was packed, people were moving back and forth organising different things, parents were helping out where they could, and despite how cramped it was, there was a genuine sense of excitement. It felt like the moment where all the preparation we&#39;d done back home was finally coming together, and to be honest, it felt pretty cool.</p>
<p>Once we had finished, I grabbed a quick lunch before meeting up with everyone again for our visit to the Shanghai Astronomy Museum (there&#39;s already a blog post on this!). The museum itself was incredible, but what I remember most from that day actually happened afterwards. A few of us rented bikes and spent the afternoon cycling around the area, exploring without much of a plan and simply enjoying the fact that we were finally in Shanghai.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-14.jpg" alt="Biking" loading="lazy" decoding="async"></figure>
<p>Eventually we stopped by a Yeah Gelato branch near our hotel and tried their ice cream. After spending hours cycling around in the summer heat, it honestly couldn&#39;t have come at a better time. We sat there eating ice cream, talking about the days ahead, and enjoying what would turn out to be one of the last genuinely relaxed afternoons of the trip. After that, I squeezed in a quick visit to the gym before everyone met up again for dinner, and by the end of the evening we were all ready for the competition to finally begin.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-15.jpg" alt="Yeah Gelato store" loading="lazy" decoding="async"></figure>
<h2 id="opening-ceremony" aria-labelledby="opening-ceremony-text"><span id="opening-ceremony-text" class="h-text">Opening Ceremony  </span><a class="anchor" href="#opening-ceremony" aria-label="Link to this section"></a></h2>
<p>By the next morning, we had already fallen into a routine. I woke up early for another run, had breakfast, spent some time reviewing our presentations, and continued helping prepare the demo booth, which was finally finished by that point (yessss).</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-16.jpg" alt="Demo booth" loading="lazy" decoding="async"> <figcaption>The demo booth.</figcaption></figure>
<p>After arriving at the venue, I checked in, collected my pass, and started looking around. The organisers had set up numerous stalls and activity booths where participants could introduce themselves, play games, and earn prizes. Naturally, my friends and I immediately turned the whole thing into a competition of our own. What started as a quick look around quickly became us trying to outperform each other at every activity we came across. By the end of it, one of my teammates had won a really cool umbrella while I walked away with a water bottle, which I was more than happy with (sweet!)</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-17.jpg" alt="Check in" loading="lazy" decoding="async"><figcaption>Checking in.</figcaption></figure>
<p>What I enjoyed most about the opening ceremony, however, was the opportunity to meet so many participants from different countries before the competition officially began. Everybody was excited, everyone wanted to make a good impression, and there was a unique atmosphere created by having so many ambitious and talented people gathered in the same place. Later that evening, after dinner, we met up with the other Vietnamese teams staying at the hotel. It was great finally putting faces to names and getting the chance to talk to people we&#39;d only heard about previously. Even though we would technically be competing against one another over the coming days, there was still a strong sense of camaraderie among everyone there.</p>
<p>So, the first official competition day arrived much sooner than expected. After our now-standard routine of a morning run and breakfast, we said goodbye to the two teammates who would be focusing on the business simulation and turned our attention towards Challenge 1. Even though we had rehearsed the presentation countless times, there were still last-minute changes being discussed and small details being refined right up until lunch. At a certain point, however, there wasn&#39;t really anything left to improve. We had practiced as much as we possibly could, and all that remained was to trust our preparation and deliver. By that stage, we knew the material inside and out, and everyone understood their role perfectly. The presentation itself went smoothly, and when we walked out of the room afterwards there was a quiet sense of confidence among the team. Nobody wanted to become overconfident, but we all felt that we had performed well. The day didn&#39;t end there, though. After making a quick trip to a grocery store, we regrouped and spent part of the evening discussing logistics and reviewing parts of our presentation. One of my teammates and I even ended up redesigning sections of the pitch deck after reconsidering a few ideas. Looking back, that&#39;s probably what impressed me most about our team throughout the competition. Even after delivering a strong presentation, nobody was satisfied with simply leaving things as they were. We were constantly looking for ways to improve. Later that evening, the results finally arrived. To our absolute excitement, we had won the round. The reaction was immediate. After months of preparation and weeks of uncertainty, receiving confirmation that our work was paying off gave everyone a huge boost in confidence.</p>
<h2 id="trading-day" aria-labelledby="trading-day-text"><span id="trading-day-text" class="h-text">Trading Day  </span><a class="anchor" href="#trading-day" aria-label="Link to this section"></a></h2>
<p>The second official day was the trading round, and I was responsible for leading the team during the simulation. We were assigned the role of an HR company, which meant our objective was to sell workers to food factories and purchase food from restaurants, before exchanging that food with the government for additional workers. The whole process sounds simple when explained afterwards, but during the competition it was incredibly hectic because every team was constantly negotiating, rushing from one side of the room to the other, and trying to gain even the slightest advantage over everyone else. Early on, I managed to establish an alliance with two other teams from different sectors, and together we built a small ecosystem where we could buy and sell simultaneously in a way that increased everyone&#39;s profits. For a while it worked surprisingly well, and we were making steady progress while keeping ourselves competitive against the other companies in the room.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-18.jpg" alt="Trading rules" loading="lazy" decoding="async"><figcaption>The trading rules, if you're interested.</figcaption></figure>
<p>However, after some time I started noticing that one of the teams appeared to be working in their own interests much more aggressively than expected, and some of the decisions they were making seemed designed to disadvantage us rather than help the alliance as a whole. Once I realised what was happening, I decided that staying in the arrangement would hurt us more than help us, so we left the alliance and continued operating independently. Thankfully, that decision ended up working in our favour, and everything ran much more smoothly after that. We continued negotiating deals throughout the simulation and built up what I believed was a strong balance by the end. As far as I was concerned, we had performed extremely well and had put ourselves in a very good position heading into the final stages of the competition.</p>
<p>My teammates, however, weren&#39;t quite as confident. Towards the end of the round I declined a number of deals because the prices being offered were absurdly high, and in my opinion they simply weren&#39;t worth accepting. The others disagreed, arguing that we were running out of time and that any opportunity to make profit was valuable, regardless of the margin. To make matters worse, rumours had started spreading around the room that another company in the same industry had managed to earn nearly three times as much money as we had. Whether the number was true or not, it was enough to plant seeds of doubt in everyone&#39;s minds. Even though I felt we had made the correct decisions throughout the day, there was always that lingering uncertainty that maybe we had overlooked something important.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-19.jpg" alt="Final Balance" loading="lazy" decoding="async"><figcaption>Our final balance.</figcaption></figure>
<p>After the trading round concluded, we immediately shifted our attention to the Challenge 2 presentation before finally heading back to the hotel that evening. By that point I was completely exhausted. Between the constant negotiations, presentations, and discussions throughout the day, I felt like I hadn&#39;t stopped talking for hours. All I really wanted was a chance to rest, but there was still work to be done. We met up again later that evening to continue preparing materials for the next day, and I focused on designing the poster that would eventually be used during the roadshow round. Then the results were announced.</p>
<p>When we got back to the hotel that evening, everyone was already exhausted. The trading round had drained so much energy out of us, and even though the day was technically over, there was still work that needed to be done. We met up again to continue preparing materials for the following day&#39;s roadshow round, and I focused on working on the poster that I had been assigned to design. Despite being tired, there was still a sense of optimism among the team because we genuinely believed we had done well in Challenge 2. We had invested an incredible amount of effort into that presentation, and unlike many of the other teams, we had gone far beyond simply making slides. We had a mascot, physical examples, custom branding, a flag, and plenty of visual elements that helped bring our idea to life. More importantly, the presentation itself had gone smoothly. Nobody forgot their lines, nobody froze under pressure, and everyone delivered their sections exactly as we had practiced countless times beforehand. That was why the results hit so hard.</p>
<p>When the rankings were announced and we found out that we had only placed third in the Challenge 2 presentation, nobody quite knew what to say. It wasn&#39;t just disappointment from losing a category; it was the fact that all of us had genuinely believed we were the strongest team in that round. We&#39;d walked away from the presentation feeling confident, proud of what we&#39;d produced, and hopeful that it would be enough to push us further ahead in the overall standings. Instead, we found ourselves looking at a result that simply didn&#39;t match our expectations. As if that wasn&#39;t enough, we also discovered that we had placed 22nd in the budgeting section, which made the situation feel even worse. What had started out as a successful competition was beginning to feel uncertain. The mood that night was noticeably different from every other evening we&#39;d spent together. Usually our meetings were filled with discussions, planning, jokes, and excitement, but this time there was a sense of frustration hanging over everyone. Nobody was angry at each other, but we were all trying to make sense of what had happened. We went over the presentation, discussing what we could have done differently and wondering whether we had overlooked something obvious. The more we talked about it, however, the more confusing it became, because none of us could identify a major mistake that would justify the gap between our expectations and the result we received.</p>
<p>Since May, we had poured an enormous amount of time into preparing for WYEF. We had sacrificed weekends, spent evenings revising pitch decks, attended events for research, designed branding materials, organised meetings, and rehearsed presentations until we could practically deliver them from memory. Looking back on all those months of preparation, it was difficult not to feel discouraged. For the first time since arriving in Shanghai, I genuinely wondered whether we had already missed our chance to win. It felt as though we had put everything we had into one of our strongest rounds, only to watch the result fall painfully short of what we hoped for.</p>
<p>Of course, there wasn&#39;t much time to dwell on it. The roadshow round was waiting for us the next morning, and regardless of how disappointed we felt, the competition wasn&#39;t over. Deep down, I knew that if we wanted any chance of recovering, we would have to put the setback behind us and focus on whatever came next. Now, I found myself staring at the ceiling and wondering whether all the work we&#39;d put in over the past few months was going to be enough after all.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-20.jpg" alt="Poster sketch" loading="lazy" decoding="async"></figure>
<h2 id="the-roadshow-round" aria-labelledby="the-roadshow-round-text"><span id="the-roadshow-round-text" class="h-text">The Roadshow Round  </span><a class="anchor" href="#the-roadshow-round" aria-label="Link to this section"></a></h2>
<p>Day three arrived, and with it came the roadshow round, which was probably the event I had been looking forward to the most ever since we started preparing back in May. Unlike the presentations or simulations, this was the round where all the branding, marketing, and physical materials we had spent months working on would finally be put on display. It was also one of the rounds where I had invested the most time personally, so there was definitely some pressure to make sure everything came together properly.</p>
<p>Unfortunately, the morning didn&#39;t get off to the smoothest start. The night before, I had been so exhausted from everything that had happened that I fell asleep before finishing the poster, leaving it as little more than a sketch. The moment I woke up, I realised how much work was still left to do, so I quickly called one of my teammates upstairs and the two of us rushed to finish shading and completing the design before breakfast. It wasn&#39;t exactly how I had imagined starting one of the most important days of the competition, but somehow we managed to finish everything in time. After grabbing breakfast, we headed back to our rooms, changed, gathered all of our materials, and made our way to the venue to begin setting up.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-21.png" alt="Final poster" loading="lazy" decoding="async"><figcaption>Our finalised poster. It was rushed through, but a proof of concept.</figcaption></figure>
<p>The moment we started assembling the booth, I felt a lot more confident. After weeks of planning and months of preparation, it was finally coming together exactly how I had imagined it. While some teams were still colouring posters, cutting materials, or making last-minute adjustments, our setup already looked complete. The branding was consistent, the standees looked professional, the packaging and mascots added personality, and everything felt cohesive rather than thrown together at the last moment. Of course, looking good wasn&#39;t enough to win. As I walked around the venue, I came across several other teams with genuinely impressive booths, and it became clear that there was still plenty of competition. Nevertheless, I couldn&#39;t help feeling proud of what we had built.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-22.jpg" alt="Picture of the booth" loading="lazy" decoding="async"></figure>
<p>Our goal wasn&#39;t simply to make a booth that looked nice. We wanted visitors to interact with it and actually remember it afterwards. We had designed a flow that would guide people through the entire experience, beginning with an introduction to our campaign and moving into a ten-second &quot;Beat the Clock&quot; basketball challenge where participants had to score as many baskets as possible before the timer ran out. After that, they could take photos using our custom-made frame before moving on to the final section of the booth. It sounds simple looking back, but every part of it had been carefully thought through so that visitors would stay engaged from beginning to end rather than just walking past after a quick glance.</p>
<p>The sticker system added another layer of competition. Every participant had a limited number of stickers they could award to booths they enjoyed, while judges carried stickers that were worth significantly more points. On top of that, participants could exchange stickers for rewards, including WYEF&#39;s pony mascot, which suddenly became the goal everyone seemed to be chasing. As a result, every conversation mattered, every visitor mattered, and every interaction became an opportunity to leave a positive impression.</p>
<p>Just when everything seemed to be going perfectly, disaster nearly struck. Somebody accidentally bumped into the power bank that was powering the LED strip at the back of our display, causing the fuse to blow. We tried turning it back on, checked the connections, and did everything we could think of, but the lights were completely dead. Months of preparation, and one accidental knock had taken out one of the visual features we were most excited about. At first, it was frustrating, especially because there was very little we could do about it, but after a few minutes we simply accepted it and moved on. The roadshow had already started, and there was no point spending the rest of the day worrying about something that couldn&#39;t be fixed.</p>
<p>After the setup was complete, we headed off for lunch. This was probably one of the best meals I had during the entire trip.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-23.jpg" alt="Lunch!" loading="lazy" decoding="async"></figure>
<p>When we returned, it was time to give everything we had. For the next few hours, we continuously introduced our campaign, explained our ideas, ran visitors through the challenge, handed out souvenirs, answered questions, and did our best to attract judges as well as participants. The booth remained busy throughout most of the day, and seeing people genuinely engage with something we had spent months creating was <em>incredibly</em> satisfying. Even the teams around us seemed impressed. The team opposite us had unfortunately forgotten most of their materials at their previous hotel (oops), which made me appreciate even more how much planning had gone into our own preparation.</p>
<p>By the time the event was coming to an end, things were looking very promising. We had collected a large number of stickers, earned enough points to receive the unicorn mascots, and most importantly, received positive reactions from both participants and judges. It wasn&#39;t just the results that made me happy, though. Throughout the day I had the chance to meet a lot of interesting people from other countries, including two guys named Agape and Tom. Both of them were incredibly easy to talk to and suuuper down-to-earth. Some of my favourite conversations from the entire trip happened during those few hours between rounds.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-24.jpg" alt="Unicorns" loading="lazy" decoding="async"><figcaption>It was quite hilarious having them all lined up :)</figcaption></figure>
<p>Towards the end of the day, once things had started winding down, I wandered over to the senior division booths to see what they had been working on. That ended up being far more fun than I expected. I spent time exploring different projects, participating in activities, and somehow managed to collect a surprising number of prizes along the way. One of the highlights was meeting Team 14 from Morocco, who were genuinely some of the chillest people I met during the entire competition. We ended up talking for quite a while, and in a moment that somehow became one of my most memorable memories from WYEF, and also thank you for the Greek yogurt! Out of everything that happened during the week, I&#39;m not entirely sure why that particular detail stuck with me, but it did.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-25.jpg" alt="Pictures" loading="lazy" decoding="async"><figcaption>One of the senior stalls let us take a picture!</figcaption></figure>
<p>As we packed up our booth and headed back that evening, the atmosphere felt completely different from the night before. Following the disappointment of the previous day, everyone had been frustrated and uncertain about our chances, but the roadshow round brought that confidence back. For the first time since receiving those disappointing results, it genuinely felt like we had responded in the best possible way. We had taken a setback, put it behind us, and delivered one of our strongest performances of the competition. Whether or not it would be enough to win was still unclear, but as we left the venue that evening, I think all of us knew that we had given the roadshow everything we had.</p>
<h2 id="last-day" aria-labelledby="last-day-text"><span id="last-day-text" class="h-text">Last Day  </span><a class="anchor" href="#last-day" aria-label="Link to this section"></a></h2>
<p>The final official day had finally arrived, and with it came a mixture of excitement, anticipation, and nervousness that had been building throughout the entire week. This was the day everything would be decided. Between the final business simulation round and the awards ceremony later that evening, the results of months of preparation were about to be revealed. By that point, there was very little left that we could actually control. We had already given our presentations, completed the simulations, survived the setbacks, and done everything we possibly could to put ourselves in a strong position. All that remained was to find out whether it had been enough.</p>
<p>After breakfast, we said goodbye to our two teammates who would be representing us in the final business simulation round before heading off to complete our HCBC fast-track pitches in front of the judges. Compared to everything else we had done throughout the week, the pitches felt relatively straightforward, although there was still a sense of urgency knowing that every point could potentially matter for a future competition. Once they were finished, however, there was nothing left for us to do except wait. And so we waited.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-26.jpg" alt="Fast Track" loading="lazy" decoding="async"></figure>
<p>Most of us ended up sitting outside the conference room where the simulation was taking place, trying to distract ourselves by discussing potential outcomes. Although the gap between first and second was reasonably large, it wasn&#39;t large enough for any of us to feel completely comfortable. The uncertainty made those few hours feel much longer than they actually were.</p>
<p>Eventually, the conference room doors opened and our two teammates stepped out. Almost immediately everyone rushed over to them, desperate to hear how things had gone. Before they could even sit down, questions started coming from every direction. Had the simulation gone well? Were there any major mistakes? Did everything work as planned? They simply told us that it had gone perfectly (yesssss!)</p>
<h2 id="awards-ceremony" aria-labelledby="awards-ceremony-text"><span id="awards-ceremony-text" class="h-text">Awards Ceremony  </span><a class="anchor" href="#awards-ceremony" aria-label="Link to this section"></a></h2>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-27.jpg" alt="Run" loading="lazy" decoding="async"><figcaption>Here's a picture of the run that day.</figcaption></figure>
<p>After everything that had happened throughout the week, the final day felt strangely calm. The pressure that had been building ever since we arrived in Shanghai was still there, but by that point there was very little left that we could actually control. We had already presented our ideas, completed the trading rounds, survived the setbacks, and given everything we had during the roadshow. All that remained was to find out whether those months of preparation had been enough. Earlier in the day, after completing our fast-track pitches and waiting nervously outside the business simulation room, our confidence had grown significantly when our two teammates emerged with huge smiles on their faces and told us that everything had gone perfectly. Even then, though, nobody wanted to assume anything. We had already experienced what it felt like to walk away from a round convinced that we had done brilliantly, only to be disappointed by the results. Because of that, most of us kept our expectations in check, choosing instead to focus on enjoying whatever happened next rather than trying to calculate our chances of winning.</p>
<p>The category awards were announced first, and seeing our team&#39;s name appear repeatedly throughout the ceremony was one of the most satisfying moments of the entire competition. Every award felt like validation for a different part of the journey. Some represented months of preparation, while others reflected decisions we had made under pressure during the week itself. As the announcements continued, it became clear that we had performed exceptionally well across almost every aspect of the competition. In the end, the only category that escaped us was the Challenge 2 presentation, which was almost ironic considering how much that result had affected us emotionally a few days earlier. By then, however, nobody was dwelling on it anymore. Looking around at my teammates, it was obvious that everyone was simply happy to see our efforts being recognised.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-28.jpg" alt="Our group!" loading="lazy" decoding="async"></figure>
<p>With the category awards over and the final results still a few hours away, we decided to make the most of the time we had left. Rather than spending the afternoon anxiously waiting around, we headed off to a niche karting venue where we spent the next few hours racing each other and forgetting about competition altogether. It was exactly what we needed. For the first time all week, nobody was talking about presentations, judging criteria, trading strategies, or rankings. We were just enjoying ourselves. Looking back on it now, that break probably helped calm all of our nerves before the final ceremony. Eventually, it was time to return to the hotel and prepare for the evening. I went back to my room, took a shower, got dressed, and carefully prepared my suit for what would be the final major event of the trip.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-29.jpg" alt="Karting" loading="lazy" decoding="async"></figure>
<p>When we finally took our seats in the hall, the atmosphere felt completely different from any previous event during the week. Everyone was dressed formally, conversations were quieter, and there was a sense that months of work from every participant in the room were about to culminate in a single moment. Although we felt confident about our position in the business simulation, there was still uncertainty. One of the strongest teams throughout the competition had been another Vietnamese team that we had met earlier in the week. They had excellent preparation, strong coaching, and had consistently performed at a high level, making them our biggest rivals heading into the final announcements.</p>
<p>As the awards presentation progressed, the anticipation in the room became almost unbearable. Every category brought us closer to the result everyone was waiting for, and with each passing minute I could feel the nervousness growing. Then came the announcement for the business simulation rankings. The moment the other Vietnamese team&#39;s name was announced in second place, our entire table exploded. Months of preparation, endless spreadsheet practice, countless simulation rounds, and all the strategic decisions made throughout the week had paid off. We had officially won the business simulation, and for a few moments it felt like that achievement alone was enough to make the entire trip worthwhile.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-30.jpg" alt="Stats" loading="lazy" decoding="async"><figcaption>Nearly 1bn Yuan lead ahead of 2nd place.</figcaption></figure>
<p>But there was still one more announcement.</p>
<p>The overall championship was the final award of the evening, and despite everything we had achieved so far, I still found myself feeling nervous. Rationally, the numbers seemed to be on our side. We had won seven out of the eight categories, performed consistently throughout the event, and built an enormous lead during the simulation rounds. Yet until the words were actually spoken, there was always the possibility that something unexpected could happen. Then the announcement came.</p>
<p>The moment our team&#39;s name was called as the overall champions, everything became a blur. People were cheering, standing up, hugging one another, and trying to process what had just happened all at the same time. I remember looking around at my teammates and seeing the same mix of disbelief and happiness on everyone&#39;s faces. It wasn&#39;t just excitement from winning. It was relief. It was pride. It was the realisation that all those months of preparation, all the late nights designing materials, all the rehearsals, all the moments where we doubted ourselves, and even the disappointment of Challenge 2 had ultimately led to this exact moment.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-31.jpg" alt="Winning" loading="lazy" decoding="async"></figure>
<p>Even now, it&#39;s difficult to describe exactly how it felt. It wasn&#39;t just about receiving a trophy or hearing our name announced. It was about knowing that every single person on the team had contributed something meaningful, and that together we had accomplished something none of us could have achieved alone. For a few minutes after the announcement, it genuinely felt as though nothing else existed except our team celebrating together, completely overwhelmed by what had just happened.</p>
<p>The rest of the evening passed in a haze of photographs, congratulations, and celebrations, but if there&#39;s one thing I remember most clearly, it&#39;s that feeling of looking around the room and realising that we had actually done it. After months of preparation and one unforgettable week in Shanghai, we were leaving as champions.</p>
<h2 id="reflection" aria-labelledby="reflection-text"><span id="reflection-text" class="h-text">Reflection  </span><a class="anchor" href="#reflection" aria-label="Link to this section"></a></h2>
<p>After the awards ceremony, everything felt different. For months, the competition had been the centre of our lives. Every meeting, every practice session, every redesign, every late night spent working on presentations, branding, spreadsheets, and logistics had all been leading towards this single moment. Now that it was over and we had actually won, there was a strange sense of calm that settled over the team. The pressure that had followed us from Vietnam to Shanghai had finally disappeared, replaced by a mixture of happiness, relief, and disbelief that we had managed to accomplish what we set out to do.</p>
<p>Naturally, the celebrations continued. We went out for a celebratory meal with the entire team, and for the first time all week there was nothing left to prepare for, nothing left to rehearse, and no more results to worry about. Everyone was laughing, telling stories from different rounds of the competition, and reflecting on everything that had happened over the past few days. Looking around the table, it was hard not to appreciate just how much effort every single person had contributed. Months earlier, we had simply been a group of students preparing for a competition. Now, after everything we had gone through together, it genuinely felt like we had earned the right to celebrate.</p>
<p>Later that evening, we headed to the gala party that had been organised for participants. Honestly, it was a complete snoozefest, but we couldn&#39;t have cared less. We had spent the entire week stressing about rankings, presentations, judges, and simulations, and now none of it mattered anymore because we were the winners. While everyone else was focused on socialising and enjoying the event, our group was still riding the high of the awards ceremony. Looking back on it now, I don&#39;t remember much about the gala itself, but I remember the feeling. There was a sense that we had finally crossed the finish line after a race that had started months ago. *Cue Queen&#39;s music*</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-32.jpg" alt="Gala party" loading="lazy" decoding="async"><figcaption>Only picture I have of that night.</figcaption></figure>
<p>Unfortunately, reality returned much sooner than I would have liked. My flight back to Vietnam was at four in the morning, which meant my final night in Shanghai was going to be very short. After the gala ended, instead of immediately heading back to the hotel, I decided to take a walk with one of my friends. Out of all the memories from the trip, that walk remains one of my favourites because it was one of the few moments where everything slowed down. There were no more schedules to follow, no deadlines to meet, and no expectations hanging over us. We simply walked through the city, trying to process everything that had happened, and just taking it all in..</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-33.jpg" alt="Night walk" loading="lazy" decoding="async"></figure>
<p>I remember looking around at the streets one final time and thinking about how much I was going to miss the experience. Not necessarily the city itself, although Shanghai was incredible, but everything the city had come to represent over the course of that week. It had become the setting for one of the most rewarding experiences of my life, a place where months of hard work had finally paid off and where I had met people I never would have encountered otherwise. Every hotel corridor, conference room, exhibition hall, and restaurant suddenly felt connected to a memory.</p>
<p>Eventually, the walk came to an end, and we headed back to the hotel. By then, most of the excitement had started to settle, replaced by the quiet realisation that the trip was finally over. I packed up the last of my belongings, made sure nothing had been left behind, and spent a few moments thinking about everything that had happened. Winning was obviously unforgettable, but what stood out even more was the journey that led there. The preparation, the uncertainty, the setbacks, the friendships, and the countless small moments in between were what made the experience special.</p>
<p>After that, there wasn&#39;t much left to do. I lay down on the bed, stared at the ceiling for a while, replayed the week in my head one last time, and thought about how unlikely it felt that all of it had actually happened. A few months earlier, Shanghai had been nothing more than a goal we were working towards. Now it was a collection of memories, stories, and experiences that I knew would stay with me for a very long time. Then I closed my eyes.</p>
<p>And just like that, it was over.</p>
<figure class="fig"><img src="/images/postmedia/misc/wyef-shanghai/photo-34.jpg" alt="Ride home." loading="lazy" decoding="async"></figure>]]></content:encoded></item>
<item><title>Why I Built CompassBite</title><link>https://sam.dev/blog/engineering/software/why-i-built-compassbite/</link><pubDate>Fri, 24 Jul 2026 00:00:00 +0000</pubDate><dc:creator>sam le</dc:creator><guid>https://sam.dev/blog/engineering/software/why-i-built-compassbite/</guid><description>A food and beverage specialized compass to find your nearest restaurant, coffee shop, or bar using OpenStreetMap.</description><content:encoded><![CDATA[<p>Every weekend, my family goes out for breakfast, and every weekend the same problem shows up before we even leave the house. My parents struggle to find a local restaurant that suits everyone, so we open review apps, scroll through noisy listings, see the same sponsored places, and often end up going somewhere we already know. Being the kid in the family, and I got tired of watching that weekly debate, so I decided to build an app called <strong>CompassBite</strong>.</p>
            <figure class="fig">
              <img src="/images/postmedia/engineering/software/compassbite/clueless-spongebob.gif" alt="The general frustration of looking for a place to eat. Seriously couldn't we settle for cereal?" loading="eager" fetchpriority="high" decoding="async" width="640" height="360">
              <figcaption>The tiring chore of looking around for a restaurant... seriously?</figcaption>
            </figure>
            <h2 id=the-idea aria-labelledby=the-idea-text>
              <span id=the-idea-text class=h-text>The idea</span>
              <a class=anchor href=#the-idea aria-label="Link to this section">
              </a>
            </h2>
            <p>The idea is fairly simple. CompassBite finds your current location, looks for nearby food and drink places <a href="https://www.openstreetmap.org/" target="_blank" rel="noopener noreferrer">using <strong>OpenStreetMap</strong></a>, and shows restaurants, cafes, and bars on a map. I currently have a basic version running <a href="https://expo.dev" target="_blank" rel="noopener noreferrer">through a sandbox</a>. Currently data caching, filters for opening hours and location type is available. The app is still in development though.</p>
            <p>Building it has been harder than I expected. I thought getting the location and showing nearby restaurants would be the easy part, but I had to learn way too much just for this one project, one of which was understanding how to work with Overpass queries. <code>MapLibre</code> brought its own problems too, especially frequent rendering bugs I <i><strong>kept</strong></i> on encountering. You cannot believe the amount of times I threw my phone over the couch in frustration.</p>
            <p>General programming forums did not help much because my problems were very specific to OSM, so I found help elsewhere:</p>
            <ul>
              <li>The <a href="https://community.openstreetmap.org" target="_blank" rel="noopener noreferrer">OpenStreetMap Forum</a> became my primary place to refer to about all things OpenStreetMap.</li>
              <li>A thread on <a href="https://forum.openstreetmap.fr" target="_blank" rel="noopener noreferrer">forum.openstreetmap.fr</a> helped me understand server timeouts and alternative Overpass instances.</li>
              <li><a href="https://gis.stackexchange.com" target="_blank" rel="noopener noreferrer">GIS Stack Exchange</a> helped with geospatial logic.</li>
              <li>For <code>MapLibre</code> issues, fortunately <a href="https://slack.openstreetmap.us" target="_blank" rel="noopener noreferrer">OSM's US Slack</a> helped with it.</li>
            </ul>
            <p>I <i>*also*</i> got a lot of help from my lovely buddy Codex. Whenever I was stuck on a build error or a bug, it helped me fix the problems, but eventually stumped at the nicher problems that required looking into the forums manually. They taught me how OSM worked, and Codex helped me build the app that talks to it.</p>
            <figure class="fig">
              <img src="/images/postmedia/engineering/software/compassbite/claude-limit.gif" alt="Typing out every line manually when my Codex limits run out:" loading="eager" fetchpriority="high" decoding="async" width="640" height="360">
              <figcaption>This but Codex. (you get the gist)</figcaption>
            </figure>
            <p>CompassBite is still a work in progress - which I hope one day my parents can use it to find breakfast without the weekly struggle! But when I open my local build on a weekend, it can show me a local cafe nearby that we never noticed, and that makes the hard parts so worth it. It was a great learning opportunity that also gave me a deeper understanding of how geospatial data is processed and used to power location-based features.</br></br>I also look forward to sharing more updates as the app develops, and hopefully open source the software for all Android users! (or publish it to the Play Store).</br></br></br>A little bit more on OSM, if you'd like to read more: </p>
            <h2 id=osm-overview aria-labelledby=osm-overview-text>
              <span id=osm-overview-text class=h-text>A general overview of OSM</span>
              <a class=anchor href=#osm-overview aria-label="Link to this section">
              </a>
            </h2>
            <p>OpenStreetMap stores "the planet" (the full global dataset) in a PostgreSQL relational database. It relies heavily on <code><a href="https://postgis.net" target="_blank" rel="noopener noreferrer">PostGIS</a></code>, an extension that adds support for geographic objects, allowing SQL queries to calculate distances, map areas, and run spatial coordinates. Initially I thought it (OSM) would just fetch from Google's existing infrastructure, but oh boy was I wrong.</p>
            <p> To get data smoothly in and out of the database, the backend uses tools like <code>osm2pgsql</code> to convert standard map data into <code>PostGIS</code> format, and Osmium, a fast C++ <i>"Swiss Army knife"</i> framework for processing raw mapping logs and tracking file updates.</p>
            <p>To turn raw coordinates into a visual map, OSM uses a rendering toolkit called <code><a href="https://mapnik.org" target="_blank" rel="noopener noreferrer">Mapnik</a></code>. It converts geographic data points into images, which tile servers then chop into small square pieces so web browsers and apps can load local areas instantly.</p>
            <p>Map searches are powered by <code><a href="https://nominatim.org" target="_blank" rel="noopener noreferrer">Nominatim</a></code>, which translates text addresses into map coordinates. For developers looking to extract specific information from the map, the <code><a href="https://openstreetmap.org" target="_blank" rel="noopener noreferrer">Overpass API</a></code> acts as a fast data filtering engine that pulls custom location datasets without taxing the main database.</p>]]></content:encoded></item>
<item><title>An interesting engineering challenge</title><link>https://sam.dev/blog/engineering/an-interesting-engineering-challenge/</link><pubDate>Thu, 18 Jun 2026 00:00:00 +0000</pubDate><dc:creator>sam le</dc:creator><guid>https://sam.dev/blog/engineering/an-interesting-engineering-challenge/</guid><description>A two-hour cardboard boat build, a 25-metre swim, and an unlikely finish.</description><content:encoded><![CDATA[<p>With the school year drawing to a close, everyone has started to realise that we'll soon be heading our separate ways for two long months. Before that happened, however, our STEM teachers decided to give us one final challenge: build a cardboard boat capable of carrying a person across a 25-metre swimming pool (spicy!)</p>
            <p>It sounded simple enough on paper. In reality, it was a wonderfully ridiculous engineering problem.</p>

            <h2 id="the-challenge" aria-labelledby="the-challenge-text"><span id="the-challenge-text" class="h-text">The challenge</span><a class="anchor" href="#the-challenge" aria-label="Link to this section"></a></h2>
            <p>We were split into our school houses and given roughly two hours to design and construct our boats. At first, I was sceptical. Cardboard and water have never exactly been known for getting along, and although we had plenty of material, time was definitely not on our side.</p>
            <p>After some quick research and brainstorming, we settled on a fairly conventional design. The hull would have a regular shape, reinforced with two beams running along the sides to improve rigidity and prevent the structure from collapsing under load. It wasn't flashy, but it seemed practical, and practical felt like the safest option when your boat was literally made of cardboard.</p>
            <figure class="fig"><img src="/images/postmedia/engineering/cardboard-boat-construction.jpg" alt="The cardboard boat taking shape in a garage, with its hull, supports, and tools laid out." width="600" height="768" loading="lazy" decoding="async"><figcaption>One of the few solutions proposed, and looked promising as well.</figcaption></figure>
            <p>The workshop quickly descended into organised chaos.</p>
            <p>Some members measured and plotted dimensions onto sheets of cardboard. Others cut panels, assembled supports, and suggested ways to strengthen weak points. A dedicated group worked on constructing a mast because, naturally, if we were building a boat, we were going to build one with style (and also to assert dominance over other houses).</p>
            <p>I had the opportunity to lead the project, coordinating the different groups and helping keep everything moving as the clock ticked down. Despite the pressure, it was incredible to watch everyone contribute. Each person found a role, and slowly our pile of cardboard transformed into something that vaguely resembled a seaworthy vessel.</p>
            <p>As the deadline approached, desperation became an engineering strategy.</p>
            <p>We scavenged the last remaining roll of tape and covered every seam, corner, and suspicious-looking gap we could find. Meanwhile, several team members were crouched underneath the boat, physically holding sections together while others frantically taped from above. It looked less like a professional shipyard and more like a pit crew trying to keep a race car together for one final lap (haha).</p>
            <figure class="fig"><img src="/images/postmedia/engineering/cardboard-boat-teamwork.jpg" alt="Two mechanics working underneath a raised car." width="700" height="768" loading="lazy" decoding="async"><figcaption>(literally like this, but with 15 people.)</figcaption></figure>

            <h2 id="the-aftermath" aria-labelledby="the-aftermath-text"><span id="the-aftermath-text" class="h-text">The aftermath</span><a class="anchor" href="#the-aftermath" aria-label="Link to this section"></a></h2>
            <p>Towards the final period, we rushed to the swimming pool, where (proudly) we presented our final product to awed faces.</p>
            <p>When the final bell approached, we carried our creation to the swimming pool.</p>
            <figure class="fig"><img src="/images/postmedia/engineering/cardboard-boat-carrying.jpg" alt="Students carrying their cardboard boat above their heads through a school corridor." width="300" height="1025" loading="lazy" decoding="async"></figure>
            <p>One by one, the teams tested their boats while dozens of students and teachers watched from the sidelines. By the time our turn arrived, more than eighty people were gathered around the pool. We were the last team to go.</p>
            <p>Standing there, looking at the boat we'd spent two frantic hours building, I felt a mixture of pride and nerves. Somehow, against all odds, it actually looked like it might work. So, after a teammate climbed in and started paddling, I felt relieved because we were already three quarters through and it didn't look like that boat was going to fail at all.</p>
            <p>Until five metres left to the finish line - when the boat finally surrendered to physics. Water rushed in, the hull gave way, and our carefully engineered vessel began its slow descent to the bottom of the pool.</p>
            <p>But the teammate that was in the boat managed to get to the end smartly, and to our surprise, we won! (Thank you a lot, if you're reading).</p>
            <figure class="fig"><img src="/images/postmedia/engineering/cardboard-boat-aftermath.jpg" alt="The cardboard boat collapsed and crumpled after its swim across the pool." width="500" height="768" loading="lazy" decoding="async"></figure>
            <p>Looking back, the victory was great, but it wasn't the best part of the experience. What I'll remember most is the collaboration. In just a couple of hours, a large group of students came together, solved problems under pressure, adapted when things went wrong, and built something that actually worked, at least long enough to matter.</p>
            <p>For a project made entirely of cardboard and tape, it turned out to be one of the most memorable engineering experiences I've ever had.</p>]]></content:encoded></item>
<item><title>Favourite Football Players</title><link>https://sam.dev/blog/misc/football-mount-rushmore/</link><pubDate>Mon, 22 Dec 2025 00:00:00 +0000</pubDate><dc:creator>sam le</dc:creator><guid>https://sam.dev/blog/misc/football-mount-rushmore/</guid><description>Players who&#39;ve given me the most emotions over the years as a football fan.</description><content:encoded><![CDATA[<p>Every football fan has that list: the one you defend in group chats, the one that starts friendly debates at the pub, the one that makes your friends roll their eyes because you’ve brought it up <em>again</em>. Well, here’s mine: five players who’ve given me the most joy, frustration, and most importantly - sheer disbelief over the years. This is just a list for me to keep track whenever someone asks.</p>

            <h2 id="lionel-messi" aria-labelledby="lionel-messi-text"><span id="lionel-messi-text" class="h-text">Lionel Messi</span><a class="anchor" href="#lionel-messi" aria-label="Link to this section"></a></h2>
            <p>Where do you even start? There’s nothing left to say about Messi that hasn’t been said, and yet somehow every time he touches the ball it feels like a new sentence. What I love most isn’t the goals (though, yes, those goals). It’s the way he sees the game three seconds before anyone else: the pass nobody else spotted; the dribble that shouldn’t work against three defenders and yet does. Watching Messi is like watching someone play chess while everyone else plays checkers, and I feel lucky to have watched it live rather than just in highlight reels. As an football fan, I’ll never stop being grateful that the best years of his career, including the 2008-12 years under Pep that made the team undefeatable.</p>

            <h2 id="robert-lewandowski" aria-labelledby="robert-lewandowski-text"><span id="robert-lewandowski-text" class="h-text">Robert Lewandowski</span><a class="anchor" href="#robert-lewandowski" aria-label="Link to this section"></a></h2>
            <p>There’s something deeply satisfying about a number nine who does exactly what he’s supposed to do, only better than anyone. The positioning, the movement, the finishing with either foot, the headers. Five goals in nine minutes is the kind of thing you tell your grandkids about. He’s proof that relentless consistency and hard work can be just as awe-inspiring as raw genius. And seeing him bring that ruthlessness to Barca after everything he achieved in Germany has been a proper treat: we finally got the number 9 we’d been missing.</p>

            <figure class="fig"><img src="/images/postmedia/misc/sports/lewandowski-barca.jpg" alt="Lewandowski at Barcelona" loading="lazy" decoding="async"><figcaption>Still carrying the team as a veteran - respect.</figcaption></figure>
            <h2 id="antoine-griezmann" aria-labelledby="antoine-griezmann-text"><span id="antoine-griezmann-text" class="h-text">
              Antoine Griezmann</span><a class="anchor" href="#antoine-griezmann" aria-label="Link to this section"></a></h2>
            <p>Griezmann might be the most <em>intelligent</em> player on this list. He’s never been the fastest or the flashiest, but watch him off the ball and you’ll see a player who reads the game like a novel he’s already finished. He drops deep, links play, defends when he has to, and pops up with big goals when it matters most. The 2018 World Cup was his masterpiece. He’s the kind of player who makes everyone around him better, and honestly, every team needs a Griezmann.</p><p><br></p><figure class="fig"><img src="/images/postmedia/misc/sports/griezmann-barca.jpg" alt="Griezmann at Barcelona" loading="lazy" decoding="async"><figcaption>A generational striker, just not his best at Barca.</figcaption></figure><p><br></p>

            <h2 id="david-luiz" aria-labelledby="david-luiz-text"><span id="david-luiz-text" class="h-text">David Luiz</span><a class="anchor" href="#david-luiz" aria-label="Link to this section"></a></h2>
            <p>Okay, hear me out: David Luiz is not on this list because he’s the most reliable defender in history. He’s here because football is <em>entertainment</em>, and nobody understood that better than David Luiz. The marauding runs from centre-back, the 60-yard diagonals, the free-kicks, the tackles: either genius or disaster, with absolutely no middle ground. He played every match like it was a cup final and he’d bet his house on it. And let’s not forget: he was genuinely brilliant in that 2012 Champions League run and the 2014 World Cup until… yeah. Football needs characters, and David Luiz is a character!</p>

            <h2 id="neymar" aria-labelledby="neymar-text"><span id="neymar-text" class="h-text">Neymar</span><a class="anchor" href="#neymar" aria-label="Link to this section"></a></h2>
            <p>Neymar is the player who makes you gasp and groan within the same ten seconds, sometimes with the same touch. The pure audacity of his game (the rainbow flicks, the elasticos, the dribbles that seem designed to humiliate) is exactly why I watch football. Yes, he goes down easily; yes, the drama is exhausting. But when he’s on song, he’s unplayable, and the Santos and Barca versions of Neymar were some of the most electric football I’ve ever seen. That MSN front three is still the most fun I’ve ever had watching football - the best version of football I think anyone can achieve - being selfless. He played like the game was supposed to be <em>fun</em>, and to be honest, more players should.</p>

            <h2 id="what-they-have-in-common" aria-labelledby="what-they-have-in-common-text"><span id="what-they-have-in-common-text" class="h-text">What they have in common</span><a class="anchor" href="#what-they-have-in-common" aria-label="Link to this section"></a></h2>
            <p>Looking at this list, I notice something: none of these players are <strong>boring</strong>. Five completely different ways to be brilliant at football, and that’s exactly why I love this sport. There’s no single right way to play it.</p>
            <p>Four of these five gave me some of my best memories in blue and red, and the other ones are exactly the kind of players you’d want in a Barcelona shirt anyway.</p>
            <p>Who’s on your list?</p>]]></content:encoded></item>
<item><title>StudyForge: a new initiative I&#39;m planning on</title><link>https://sam.dev/blog/engineering/software/introducing-studyforge/</link><pubDate>Fri, 14 Nov 2025 00:00:00 +0000</pubDate><dc:creator>sam le</dc:creator><guid>https://sam.dev/blog/engineering/software/introducing-studyforge/</guid><description>A lightweight, minimal web tool focused on scope, speed, and getting core revision materials done.</description><content:encoded><![CDATA[<h2 id="minimal-focus" aria-labelledby="minimal-focus-text">
              <span id="minimal-focus-text" class="h-text">A minimal approach to revision</span>
              <a class="anchor" href="#minimal-focus" aria-label="Link to this section"></a>
            </h2>
            <p><strong>StudyForge</strong> is a fresh side project I’ve been hacking away at recently, in order to solve an abundant need in the academic space! The philosophy behind it is simple: to get core revision tasks done as quickly as possible.</p>

            <h2 id="the-scope" aria-labelledby="the-scope-text">
              <span id="the-scope-text" class="h-text">Focusing on the scope</span>
              <a class="anchor" href="#the-scope" aria-label="Link to this section"></a>
            </h2>
            <p>Too many study tools suffer from feature creep before they even solve the primary problem. With StudyForge, I wanted to strip away complex dashboards and unnecessary settings to focus purely on creating a reliable place for essential notes and quick flashcard practice, similar to <a href="https://www.savemyexams.co.uk/">SaveMyExams</a>.</p>
            <p>The interface is purposely bare-bones for now, while I try to define the scope of the project.</p>
            <figure class="fig">
              <img src="/images/postmedia/engineering/software/kojonote/studyforge-logo.png" alt="StudyForge's logo" width="600" height="200">
              <figcaption class="figure-caption">Our logo - I thought it was simple enough without overthinking it.</br>(NOTE - I forgot to take pictures of the old UI. whoops!)</figcaption>
            </figure>
            <h2 id="what-comes-next" aria-labelledby="what-comes-next-text">
              <span id="what-comes-next-text" class="h-text">Building the foundation</span>
              <a class="anchor" href="#what-comes-next" aria-label="Link to this section"></a>
            </h2>
            <p>Since this is a brand new project, the primary goal right now is testing out core UX patterns for organizing revision materials. I’m experimenting with simple ways to render markdown notes and build fast, responsive quiz modules. Built on <i>Vite+React</i> though, so I have a lot of flexibility in how I approach the development.</p>
            <p>It’s an early experiment, but getting the core functionality right first will give a solid foundation to iterate on as new ideas take shape down the line!</p>]]></content:encoded></item>
<item><title>Welcome To My Blog</title><link>https://sam.dev/blog/welcome-to-my-blog/</link><pubDate>Wed, 12 Nov 2025 00:00:00 +0000</pubDate><dc:creator>sam le</dc:creator><guid>https://sam.dev/blog/welcome-to-my-blog/</guid><description>A personal corner of the web for thoughts, projects, and creative endeavors.</description><content:encoded><![CDATA[<p>Welcome to my blog! I built this space to document what I am working on, share thoughts on software, and reflect on projects along the way.</p>
            <p>I’ve always loved building things: from tinkering with early code projects to reverse engineering things and (hopefully), creating something useful for others. Having my own website feels like having a proper digital workbench where I can publish write-ups, tutorial notes, and side-project deep dives without relying on algorithms or big social platforms.</p>
            <p>Expect posts about web development, embedded systems, open-source tools, and occasional experiments. Thanks for stopping by!</p>]]></content:encoded></item>
  </channel>
</rss>
