<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="text">cheeaunblog</title>
	<icon>https://cheeaun.com/favicon.ico</icon>
	<id>tag:cheeaun.com,2011:blog</id>
	<link rel="alternate" type="text/html" href="https://cheeaun.com/blog"/>
	<link rel="self" type="application/atom+xml" href="https://cheeaun.com/blog/feed.xml"/>
	<updated>2026-01-15T00:00:00Z</updated>
	<author>
		<name>Lim Chee Aun</name>
	</author>
		<entry>
			<id>https://cheeaun.com/blog/2026/01/2025-in-review/</id>
			<updated>2026-01-15T00:00:00Z</updated>
			<title type="text">2025 in review</title>
			<summary type="text">Back to my ritual of writing annual reviews.January 🙏 Made a web dev wishlist. Only one is checked in the end. 🤖 Made a bot with BotKit. 😩…</summary>
			<content type="html">&lt;p&gt;Back to my &lt;em&gt;ritual&lt;/em&gt; of writing annual reviews.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;January&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&amp;#x1F64F; Made a &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/113799164264894990&quot;&gt;web dev wishlist&lt;/a&gt;. Only one is checked in the end.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&amp;#x1F916; Made &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/113826068433133218&quot;&gt;a bot&lt;/a&gt; &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/113833019917192734&quot;&gt;with BotKit&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&amp;#x1F629; Ranted &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/113889240442161844&quot;&gt;about UX&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;February&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F3A7; Hoping that &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/113960248954188558&quot;&gt;AirPods Pro will have self-cleaning feature&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F310; Experimented using &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/114081619667642589&quot;&gt;Language detection and translator APIs&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;March&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F914; Wondering about &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/114160647931006112&quot;&gt;&amp;quot;mockup as a service&amp;quot;&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;April&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F4CA; Built a &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/114339962315074336&quot;&gt;browser extension that visualizes (Service Worker) Cache Storage for web sites&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;May&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F50B; &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/114470918223042608&quot;&gt;Battery replacement&lt;/a&gt; for my iPhone 13 mini. Free, surprisingly.&lt;/li&gt;
&lt;li&gt;&amp;#x1F4D4; Built &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/114494995294330803&quot;&gt;my own version of Storybook&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F916; Having &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/114549056215375753&quot;&gt;thoughts about AI and browsers&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;June&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F648; My name &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/114659269992038684&quot;&gt;got mentioned&lt;/a&gt; in a &lt;a href&#x3D;&quot;https://blog.elenarossini.com/fediverse-video/&quot;&gt;video&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F5A5;&amp;#xFE0F; Ranted about &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/114715512561540752&quot;&gt;mockups starting with large viewports&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F474; Got &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/114716231071171534&quot;&gt;older&lt;/a&gt;. The Big 4-O.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;July&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x2328;&amp;#xFE0F; Bought &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/114817148974863638&quot;&gt;a new portable keyboard (again)&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F943; Experimented with &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/114941715635756601&quot;&gt;a &amp;quot;Liquid Glass&amp;quot;-effect wallpaper&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;August&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F5FA;&amp;#xFE0F; Getting &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/114985449711810341&quot;&gt;excited&lt;/a&gt; about &lt;a href&#x3D;&quot;https://www.reddit.com/r/singapore/comments/1mjp6m8/apple_maps_dce_detailed_city_experience_in/&quot;&gt;Apple Maps DCE (Detailed City Experience) in Singapore&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F68C; My BusRouter SG web app got &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/115025528906514405&quot;&gt;featured&lt;/a&gt; on &lt;a href&#x3D;&quot;https://www.youtube.com/watch?t&#x3D;248&amp;amp;feature&#x3D;shared&amp;amp;v&#x3D;_BURy2_mGZM&quot;&gt;CNA Insider&amp;apos;s video&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;September&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F3A7; Bought &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/115183002742951789&quot;&gt;AirPods Pro 3&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F611; Ranted about &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/115211936124931938&quot;&gt;cursors and smooth rounded edges of macOS Tahoe&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;October&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F515; Getting &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/115383299807627794&quot;&gt;spam GitHub notifications&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F488; &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/115417377939230723&quot;&gt;Made&lt;/a&gt; a &lt;a href&#x3D;&quot;https://codepen.io/cheeaun/pen/OPMvRJO&quot;&gt;cool CSS demo with &lt;code&gt;marquee&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F3C1; &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/115426444671648424&quot;&gt;Submitted my entry&lt;/a&gt; to &lt;a href&#x3D;&quot;https://badux.lol/&quot;&gt;Bad UX World Cup&lt;/a&gt; and didn&amp;apos;t win.&lt;/li&gt;
&lt;li&gt;&amp;#x1F62D; Ranted about &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/115468370271773117&quot;&gt;proprietary formats in the design industry&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;November&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F50D; Found a &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/115548314526128813&quot;&gt;weird server limit on Discord&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F440; Saw the &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/115570545374837195&quot;&gt;Cloudflare internal server error page&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;December&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F98B; Got &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/115722909495583742&quot;&gt;&amp;quot;The Butterfly&amp;quot; archetype on Mastodon #Wrapstodon&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Honestly looking at this list, I think some folks might think that this is AI-generated &amp;#x1F605; &amp;#x2013; I always use emojis for this list in most, if not all, my previous year-in-review posts.&lt;/p&gt;&lt;h2&gt;Phanpy&lt;/h2&gt;&lt;p&gt;It&amp;apos;s been another year of developing Phanpy, my 3rd-party web client for Mastodon, so total up to &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/115723674656240039&quot;&gt;3 years&lt;/a&gt; now. It&amp;apos;s still an enjoyable journey so far, as I continue implementing new ideas while keeping feature parity with official Mastodon.&lt;/p&gt;&lt;p&gt;Few of the interesting implementations:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/114856458121817802&quot;&gt;Math (LaTeX) rendering&lt;/a&gt; &amp;#x2013; converts LaTeX markup to MathML.&lt;/li&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/115077992755071832&quot;&gt;&amp;quot;X months/years later&amp;quot; indicator&lt;/a&gt; &amp;#x2013; an idea borrowed from Discourse.&lt;/li&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/115151888570560625&quot;&gt;Edit History Snapshots&lt;/a&gt; &amp;#x2013; visualise edit history of a post.&lt;/li&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/115355963388817389&quot;&gt;Reply/Reply All&lt;/a&gt; &amp;#x2013; email-like reply buttons for posts.&lt;/li&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/115389260615602242&quot;&gt;Decal patterns&lt;/a&gt; &amp;#x2013; accessible patterns for charts.&lt;/li&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/115526126563215994&quot;&gt;QR code generator and scanner&lt;/a&gt; &amp;#x2013; for profiles and settings backup.&lt;/li&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/115597819198015079&quot;&gt;Image metadata reader&lt;/a&gt; &amp;#x2013; to be used for alt text.&lt;/li&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/115751067284225457&quot;&gt;Year in Posts&lt;/a&gt; &amp;#x2013; experimental visualisation of posts in a year.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Phanpy also got mentioned so many times that it&amp;apos;s getting hard to keep track.&lt;/p&gt;&lt;p&gt;Thus, listing them down here:&lt;/p&gt;&lt;p&gt;&lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/113944854329462085&quot;&gt;&lt;strong&gt;Feb 4&lt;/strong&gt;&lt;/a&gt; &amp;#x2014; &amp;quot;&lt;a href&#x3D;&quot;https://www.tupodcast.com/@comopiensodigo/episodes/potencia-tu-experiencia-en-mastodon-con-phanpy&quot;&gt;Potencia tu experiencia en Mastodon con Phanpy #Apps&lt;/a&gt;&amp;quot; (podcast) &amp;#x2013; translated to English as &amp;quot;Boost your Mastodon experience with Phanpy&amp;quot;&lt;/p&gt;&lt;p&gt;&lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/114127322242897138&quot;&gt;&lt;strong&gt;Mar 5&lt;/strong&gt;&lt;/a&gt; &amp;#x2014; &amp;quot;&lt;a href&#x3D;&quot;https://dot-social.simplecast.com/episodes/chris-trottier&quot;&gt;Leaving the City of Big Social, with Fediverse Enthusiast Chris Trottier&lt;/a&gt;&amp;quot; (podcast) &amp;#x2013; transcribed from Mike McCue:&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;I mean, I&amp;apos;m incredibly excited to see, you know, there&amp;apos;s a fantastic front end called &lt;em&gt;FanP&lt;/em&gt;. That&amp;apos;s a fantastic user experience.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/114299369556936032&quot;&gt;&lt;strong&gt;Apr 8&lt;/strong&gt;&lt;/a&gt; &amp;#x2014; &amp;quot;&lt;a href&#x3D;&quot;https://blog.joinmastodon.org/2025/04/trunk-tidbits-march-2025/&quot;&gt;Trunk &amp;amp; Tidbits, March 2025&lt;/a&gt;&amp;quot; (article):&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;There was a &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/114149642985452634&quot;&gt;big update&lt;/a&gt; to &lt;a href&#x3D;&quot;https://phanpy.social/&quot;&gt;Phanpy&lt;/a&gt;, a progressive web app client for Mastodon.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/114420119680637910&quot;&gt;&lt;strong&gt;Apr 24&lt;/strong&gt;&lt;/a&gt; &amp;#x2014; &amp;quot;&lt;a href&#x3D;&quot;https://dopingconsomme.blogspot.com/2025/04/phanpy-minimal-mastodon-client-review.html&quot;&gt;&amp;#x3010;(&amp;#xFF9F;&amp;#x2200;&amp;#xFF9F;)!!&amp;#x3011;&amp;#x30DE;&amp;#x30B9;&amp;#x30C8;&amp;#x30C9;&amp;#x30F3;&amp;#x754C;&amp;#x306E;&amp;#x9ED2;&amp;#x8239;&amp;#xFF1F;&amp;#xFF01;&amp;#x5642;&amp;#x306E;&amp;#x30DF;&amp;#x30CB;&amp;#x30DE;&amp;#x30EB;Web&amp;#x30AF;&amp;#x30E9;&amp;#x30A4;&amp;#x30A2;&amp;#x30F3;&amp;#x30C8;&amp;#x300C;&amp;#x30D5;&amp;#x30A1;&amp;#x30F3;&amp;#x30D4;&amp;#x30FC;(Phanpy,social)&amp;#x300D;&amp;#x3092;&amp;#x4E38;&amp;#x88F8;&amp;#x306B;&amp;#x3057;&amp;#x3061;&amp;#x3083;&amp;#x3046;&amp;#x305E;&amp;#xFF01;&amp;#x2606;&amp;#x5F61;&amp;#x3000;#&amp;#x56DB;24&lt;/a&gt;&amp;quot; (article) &amp;#x2013; honestly the most hilarious &amp;quot;review&amp;quot; I&amp;apos;ve ever read &amp;#x1F923;&lt;/p&gt;&lt;p&gt;&lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/114823953269102292&quot;&gt;&lt;strong&gt;Jun 26&lt;/strong&gt;&lt;/a&gt; &amp;#x2014; &amp;quot;&lt;a href&#x3D;&quot;https://www.smashingsecurity.com/423-operation-endgame-deepfakes-and-dead-slugs/&quot;&gt;423: Operation Endgame, deepfakes, and dead slugs&lt;/a&gt;&amp;quot; (podcast) &amp;#x2013; recommended as part of &amp;quot;Pick of the week&amp;quot;&lt;/p&gt;&lt;p&gt;&lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/114964387917276250&quot;&gt;&lt;strong&gt;Jul 24&lt;/strong&gt;&lt;/a&gt; &amp;#x2014; &amp;quot;&lt;a href&#x3D;&quot;https://www.youtube.com/watch?v&#x3D;KEg3dmi9_c4&quot;&gt;Comfort Zone, Episode 59: I am Full-on Bananza&lt;/a&gt;&amp;quot; (podcast) &amp;#x2013; on a 15-minute chapter called &amp;quot;We&amp;apos;re phans of Phanpy&amp;quot;
&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/video-progress-bar-were-phans-of-phanpy@2x.jpg&quot; alt&#x3D;&quot;Video progress bar with a chapter that shows &amp;quot;We&amp;apos;re phans of Phanpy&amp;quot;&quot; width&#x3D;&quot;595&quot; height&#x3D;&quot;117&quot;&gt;&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/115007839891051199&quot;&gt;&lt;strong&gt;Aug 9&lt;/strong&gt;&lt;/a&gt; &amp;#x2014; &amp;quot;&lt;a href&#x3D;&quot;https://spectra.video/w/eLFTfynpY7yXksD6Am26sW&quot;&gt;We Distribute Live &amp;#x2014; Sean Tilley &amp;#x2014; FediCon 2025&lt;/a&gt;&amp;quot; (video) &amp;#x2013; &lt;em&gt;Anuj Ahooja&lt;/em&gt; gave a quick call-out on Phanpy.
&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/panel-discussion-stage-fedicon-2025-fanpei@2x.jpg&quot; alt&#x3D;&quot;Panel discussion on stage of FediCon 2025. Caption shows &amp;quot;kind of to counterbalance the chronological stuff is FANPEI. It&amp;apos;s a mastodon client and they&amp;quot;&quot; width&#x3D;&quot;1139&quot; height&#x3D;&quot;500&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/115068371499517936&quot;&gt;&lt;strong&gt;Aug 17&lt;/strong&gt;&lt;/a&gt; &amp;#x2014; &amp;quot;&lt;a href&#x3D;&quot;https://media.ccc.de/v/froscon2025-3346-taking_a_fresh_look_at_the_fediverse&quot;&gt;Taking a Fresh Look at the Fediverse&lt;/a&gt;&amp;quot; (video) &amp;#x2013; a talk at &lt;a href&#x3D;&quot;https://froscon.org/en/&quot;&gt;FrOSCon&lt;/a&gt; by &lt;em&gt;David Roetzel&lt;/em&gt;, backend developer at Mastodon:
&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/third-party-clients-froscon.jpg&quot; alt&#x3D;&quot;Video of the talk showing a slide titled &amp;quot;Third-party clients&amp;quot; with 3 bullet points (iOS, Android and Web) at FrOSCon&quot; width&#x3D;&quot;1920&quot; height&#x3D;&quot;1080&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;I have a screenshot here which is from a very nice one called Phanpy. Phanpy is doing a lot of innovation on the user interface side and actually when we develop new features today, we always look at hmm&amp;#x2026; how does Phanpy solve it because they have some very cool ideas.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/115064182458931834&quot;&gt;&lt;strong&gt;Aug 20&lt;/strong&gt;&lt;/a&gt; &amp;#x2014; &amp;quot;&lt;a href&#x3D;&quot;https://mackuba.eu/2025/08/20/introduction-to-atproto/&quot;&gt;Introduction to AT Protocol&lt;/a&gt;&amp;quot; (article) &amp;#x2013; small mention under &amp;quot;Client Apps&amp;quot; section:&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;All browsing is done through a separate client, and the client always does everything through the public API &amp;#x2013; kind of like when you run a custom web client for Mastodon like &lt;a href&#x3D;&quot;https://elk.zone/&quot;&gt;Elk&lt;/a&gt; or &lt;a href&#x3D;&quot;https://phanpy.social/&quot;&gt;Phanpy&lt;/a&gt;, you connect it to your instance, and you view your timeline on &lt;a href&#x3D;&quot;https://elk.zone/&quot;&gt;elk.zone&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;Sep 26&lt;/strong&gt; &amp;#x2014; &amp;quot;&lt;a href&#x3D;&quot;https://webtechnology.news/wtn-8-the-new-rock-stars-of-web-development/&quot;&gt;WTN #8: The New Rock Stars of Web Development&lt;/a&gt;&amp;quot; (article)&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;&amp;#x1F9A3; Meanwhile, Mastodon app developers are coming to grips with the new quote posts. I use &lt;a href&#x3D;&quot;https://phanpy.social/?ref&#x3D;webtechnology.news&quot;&gt;Phanpy&lt;/a&gt; for my Mastodon browser app (it&amp;apos;s awesome)&amp;#x2026;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/115428819865785846&quot;&gt;&lt;strong&gt;Oct&lt;/strong&gt;&lt;/a&gt; &amp;#x2014; &amp;quot;&lt;a href&#x3D;&quot;https://c-tube.c-base.org/w/sFSzvrMMbx1sU5yjoM1cyh&quot;&gt;#fediday2025 Elena Rossini - The Future is federated&lt;/a&gt;&amp;quot; (video)
&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/media/fediday2025-elena-rossini-the-future-is-federated-phanpy-social.jpg&quot; alt&#x3D;&quot;Video of &amp;quot;#fediday2025 Elena Rossini - The Future is federated&amp;quot; showing a slide titled &amp;quot;PHANPY.social&amp;quot; with screenshots of the web app&quot; width&#x3D;&quot;1920&quot; height&#x3D;&quot;1080&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/media/fediday2025-elena-rossini-the-future-is-federated-mobile-apps.jpg&quot; alt&#x3D;&quot;Video of &amp;quot;#fediday2025 Elena Rossini - The Future is federated&amp;quot; showing a slide titled &amp;quot;Mobile Apps&amp;quot;&quot; width&#x3D;&quot;1920&quot; height&#x3D;&quot;1080&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Nov 3&lt;/strong&gt; &amp;#x2014; &amp;quot;&lt;a href&#x3D;&quot;https://www.tbray.org/ongoing/When/202x/2025/11/03/Time-to-Migrate&quot;&gt;Time to Migrate&lt;/a&gt;&amp;quot; (article)&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;But iOS people should check out &lt;a href&#x3D;&quot;https://apps.apple.com/us/app/ivory-for-mastodon-by-tapbots/&quot;&gt;Ivory&lt;/a&gt;, Androiders should look at &lt;a href&#x3D;&quot;https://tusky.app/&quot;&gt;Tusky&lt;/a&gt;, and everyone should try &lt;a href&#x3D;&quot;https://phanpy.social/&quot;&gt;Phanpy&lt;/a&gt;. I live in Phanpy on both my Mac and my Pixel&amp;#x2009;&amp;#x2014;&amp;#x2009;it&amp;#x2019;s a Web thing but installable as a PWA on both Android and iOS.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;Nov 8&lt;/strong&gt; &amp;#x2014; &amp;quot;&lt;a href&#x3D;&quot;https://simonwillison.net/2025/Nov/8/mastodon-45/&quot;&gt;Mastodon 4.5&lt;/a&gt;&amp;quot; (article)&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;The first is support for quote posts. This had already become an unofficial feature in the client apps I was using (&lt;a href&#x3D;&quot;https://phanpy.social/&quot;&gt;phanpy.social&lt;/a&gt; on the web and &lt;a href&#x3D;&quot;https://apps.apple.com/us/app/ivory-for-mastodon-by-tapbots/id6444602274&quot;&gt;Ivory&lt;/a&gt; on iOS) but now it&amp;apos;s officially part of Mastodon&amp;apos;s core platform.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;Nov 13&lt;/strong&gt; &amp;#x2014; &amp;quot;&lt;a href&#x3D;&quot;https://www.youtube.com/watch?v&#x3D;G5L0TW-quBo&quot;&gt;Comfort Zone, Episode 75: Klack to the Extreme&lt;/a&gt;&amp;quot; (podcast)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Nov 14&lt;/strong&gt; &amp;#x2014; &amp;quot;&lt;a href&#x3D;&quot;https://www.tbray.org/ongoing/When/202x/2025/11/13/Kendzior-Case-Study&quot;&gt;Kendzior Case-Study&lt;/a&gt;&amp;quot; (article)&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;I use &lt;a href&#x3D;&quot;https://phanpy.social/&quot;&gt;Phanpy&lt;/a&gt;, which has a hilarious little animation with an animated rubber stamp that leaves a red-ink &amp;#x201C;Spam&amp;#x201D; or whatever on the post you&amp;#x2019;re reporting.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;Nov 26&lt;/strong&gt; &amp;#x2014; &lt;a href&#x3D;&quot;https://famichiki.jp/@FlockOfCats/115611365473826497&quot;&gt;&lt;em&gt;Flock of Cats&lt;/em&gt; made a quick video about Phanpy&lt;/a&gt; (video).&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Dec 10&lt;/strong&gt; &amp;#x2014; &amp;quot;&lt;a href&#x3D;&quot;https://simonwillison.net/2025/Dec/10/html-tools/&quot;&gt;Useful patterns for building HTML tools&lt;/a&gt;&amp;quot; (article)&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;Mastodon has generous CORS policies too, as used by applications like &lt;a href&#x3D;&quot;https://phanpy.social/&quot;&gt;phanpy.social&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;And that&amp;apos;s&amp;#x2026; pretty much all the coverage, I think.&lt;/p&gt;&lt;p&gt;It&amp;apos;s always great to see folks enjoying the app I&amp;apos;ve built, and somehow my UI experiments kind of worked well for others besides myself.&lt;/p&gt;&lt;h2&gt;Side quests&lt;/h2&gt;&lt;p&gt;Being unemployed for so long, I do feel like I&amp;apos;m just &lt;em&gt;casually&lt;/em&gt; cruising along this uncertain path with everyone else struggling to keep their jobs, trying to pave through high rents and increasing prices. Layoffs were still happening like it&amp;apos;s a normal thing now.&lt;/p&gt;&lt;p&gt;Unbounded by dominating working hours, I manage to do quite a number of &amp;quot;side quests&amp;quot;, which are pretty much the &lt;em&gt;little&lt;/em&gt; things that I enjoy doing.&lt;/p&gt;&lt;p&gt;Like&amp;#x2026; taking photos of buildings.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/scenery/peoples-park-complex-sunrise-singapore.jpg&quot; alt&#x3D;&quot;People&amp;apos;s Park Complex during sunrise, in Singapore&quot; width&#x3D;&quot;900&quot; height&#x3D;&quot;1200&quot;&gt;&lt;/figure&gt;&lt;p&gt;The iconic People&amp;apos;s Park Complex in Chinatown, before &lt;a href&#x3D;&quot;https://www.straitstimes.com/singapore/peoples-park-complex-being-repainted-red-and-white-but-not-specifically-for-sg60&quot;&gt;repainted red&lt;/a&gt;. Past sunrise. Shadows from tall skyscrapers of the &lt;a href&#x3D;&quot;https://en.wikipedia.org/wiki/Central_Business_District,_Singapore&quot;&gt;CBD&lt;/a&gt;.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/scenery/hdb-block-123-bus-stop-plants-singapore.jpg&quot; alt&#x3D;&quot;HDB block 123, bus-stop and plants, in Singapore&quot; width&#x3D;&quot;900&quot; height&#x3D;&quot;1200&quot;&gt;&lt;/figure&gt;&lt;p&gt;A random orange-and-white &lt;a href&#x3D;&quot;https://en.wikipedia.org/wiki/Housing_and_Development_Board&quot;&gt;HDB&lt;/a&gt; block numbered 123. Construction noise barriers behind the bus stop at bottom right.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/scenery/window-view-top-floor-sim-lim-square-singapore.jpg&quot; alt&#x3D;&quot;Window view at the top floor of Sim Lim Square, Singapore&quot; width&#x3D;&quot;900&quot; height&#x3D;&quot;1200&quot;&gt;&lt;/figure&gt;&lt;p&gt;One of the top floors of Sim Lim Square, overlooking the roads through towering glass panels.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/scenery/marina-bay-sands-tree-leaves-esplanade-bridge-singapore.jpg&quot; alt&#x3D;&quot;Marina Bay Sands, tree leaves and Esplanade Bridge, Singapore&quot; width&#x3D;&quot;900&quot; height&#x3D;&quot;1200&quot;&gt;&lt;/figure&gt;&lt;p&gt;Marina Bay Sands and Esplanade Bridge, viewed from the seats of Queen Elizabeth Walk. Almost sunset.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/scenery/singapore-science-park-geneo-xmas-decorations.jpg&quot; alt&#x3D;&quot;Singapore Science Park, Geneo, with Christmas decorations&quot; width&#x3D;&quot;900&quot; height&#x3D;&quot;1200&quot;&gt;&lt;/figure&gt;&lt;p&gt;Christmas decorations at Geneo.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/scenery/uob-plaza-light-projection-show-singapore.jpg&quot; alt&#x3D;&quot;UOB Plaza building with light projection show, in Singapore&quot; width&#x3D;&quot;900&quot; height&#x3D;&quot;1200&quot;&gt;&lt;/figure&gt;&lt;p&gt;Projection light show on UOB Plaza&amp;apos;s skyscraper.&lt;/p&gt;&lt;p&gt;I&amp;apos;ve also visited &lt;em&gt;The Hidden Green&lt;/em&gt;, a 6&amp;#xD7;12m artwork and data storytelling project about Singapore&amp;#x2019;s urban trees, at the Singapore Art Museum (Tanjong Pagar Distripark). I got to know this project from &lt;a href&#x3D;&quot;https://kontinentalist.com/&quot;&gt;Kontinentalist&lt;/a&gt; folks &lt;a href&#x3D;&quot;https://www.linkedin.com/posts/kontinentalist_weve-just-unveiled-the-hidden-green-a-brand-new-activity-7313489115641966593-sg7T&quot;&gt;who worked on them&lt;/a&gt; and informed me that they&amp;apos;ve referenced one of my side projects &amp;#x1F609;&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/objects/the-hidden-green-infographic-singapore-art-museum.jpg&quot; alt&#x3D;&quot;The Hidden Green infographic at Singapore Art Museum&quot; width&#x3D;&quot;1200&quot; height&#x3D;&quot;900&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/objects/the-hidden-green-infographic-zoomed-map-legend.jpg&quot; alt&#x3D;&quot;The Hidden Green infographic, zoomed-in on the map legend&quot; width&#x3D;&quot;900&quot; height&#x3D;&quot;1200&quot;&gt;&lt;/figure&gt;&lt;p&gt;At the bottom right edge of the Singapore map, there&amp;apos;s a section that says &amp;quot;Map legend&amp;quot;.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/objects/the-hidden-green-infographic-zoomed-map-legend-data-references.jpg&quot; alt&#x3D;&quot;The Hidden Green infographic, zoomed-in on the map legend and Data references section&quot; width&#x3D;&quot;900&quot; height&#x3D;&quot;1200&quot;&gt;&lt;/figure&gt;&lt;p&gt;There&amp;apos;s a small print below &amp;quot;Map legend&amp;quot; section. Zoom in&amp;#x2026;&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/objects/the-hidden-green-infographic-zoomed-data-references.jpg&quot; alt&#x3D;&quot;The Hidden Green infographic, zoomed-in on Data references section&quot; width&#x3D;&quot;900&quot; height&#x3D;&quot;1200&quot;&gt;&lt;/figure&gt;&lt;p&gt;Here&amp;apos;s the small &amp;quot;Data references&amp;quot; section. One of the references is my &lt;a href&#x3D;&quot;https://exploretrees.sg/&quot;&gt;ExploreTrees.SG&lt;/a&gt; side project &amp;#x1F929;.&lt;/p&gt;&lt;p&gt;It&amp;apos;s pretty cool to see a &lt;em&gt;physical&lt;/em&gt; data visualisation work instead of digital ones, though I always wonder if the work will be preserved digitally when the wall gets repainted for other works, or when &lt;a href&#x3D;&quot;https://www.straitstimes.com/life/arts/sam-to-stay-at-tanjong-pagar-distripark-for-now-plans-pending-for-old-st-joseph-institution-building&quot;&gt;Singapore Art Museum moves back to its previous location in Bras Basah&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Anyway, I also got to explore random food places in Singapore, mostly ticking off to-go/to-try places in my list bookmarked on Google Maps. And also, on a quest to try new places before&amp;#x2026; they &lt;em&gt;potentially&lt;/em&gt; close down &amp;#x1F972;&lt;/p&gt;&lt;p&gt;Yes, it&amp;apos;s in the news:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://www.straitstimes.com/life/food/the-2025-fb-rollercoaster-so-far-so-dizzying&quot;&gt;The 2025 F&amp;amp;B roller coaster &amp;#x2013; so far, so dizzying&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://www.channelnewsasia.com/commentary/food-and-beverage-restaurant-close-home-based-business-regulations-5237076&quot;&gt;Commentary: As more restaurants shut, is it time to rethink Singapore&amp;#x2019;s F&amp;amp;B rules?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://www.businesstimes.com.sg/singapore/economy-policy/fb-closures-2025-82-those-registered-5-years-had-never-made-profit-mti&quot;&gt;Of F&amp;amp;B closures in 2025, 82% of those registered for up to 5 years had never made a profit: MTI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://www.straitstimes.com/singapore/community/majority-of-fb-outlets-here-that-closed-in-2025-did-not-last-five-years-mti&quot;&gt;Majority of F&amp;amp;B outlets here that closed in 2025 did not last over five years: MTI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;It&amp;apos;s pretty obvious when I check my bookmarks, a few of them unexpectedly show &amp;quot;Permanently closed&amp;quot; after a year or even within less than a year &amp;#x1F625;&lt;/p&gt;&lt;p&gt;Despite having a lot of bookmarks, it&amp;apos;s technically &lt;strong&gt;impossible&lt;/strong&gt; for any one person to go to &lt;em&gt;all&lt;/em&gt; places in Singapore. It&amp;apos;s because a few months ago, &lt;a href&#x3D;&quot;https://www.channelnewsasia.com/singapore/sg60-vouchers-baby-gift-income-tax-rebate-budget-2025-4944576&quot;&gt;Singapore citizens received cash vouchers of up to S$800 each&lt;/a&gt; to &lt;a href&#x3D;&quot;https://www.channelnewsasia.com/singapore/singapore-pa-lawrence-wong-sg60-punggol-4722646&quot;&gt;mark the country&amp;apos;s 60th birthday&lt;/a&gt;. It&amp;apos;s called the &lt;a href&#x3D;&quot;https://www.cdc.gov.sg/sg60-vouchers/&quot;&gt;SG60 Vouchers&lt;/a&gt; which works the same way as &lt;a href&#x3D;&quot;https://vouchers.cdc.gov.sg/&quot;&gt;CDC Vouchers&lt;/a&gt;. Only specific places accept these vouchers, so I &lt;a href&#x3D;&quot;https://www.reddit.com/r/singapore/comments/1m7181q/made_an_alternate_ui_for_cdc_voucher_locations/&quot;&gt;built a much better alternative UI&lt;/a&gt; than the &lt;a href&#x3D;&quot;https://www.gowhere.gov.sg/cdcvouchers&quot;&gt;official one&lt;/a&gt;. There are over &lt;strong&gt;24,000 places&lt;/strong&gt; that accept these vouchers, while not all of them are hawker stalls or restaurants, they are still &lt;em&gt;way too many&lt;/em&gt;. The list of places is also updated almost daily, so I &lt;a href&#x3D;&quot;https://www.reddit.com/r/singapore/comments/1mdo9eg/keep_track_of_new_places_to_spend_cdc_vouchers/&quot;&gt;built a tracker&lt;/a&gt; which shows a &lt;em&gt;changelog&lt;/em&gt; for places added, removed or edited &amp;#x1F648;.&lt;/p&gt;&lt;p&gt;If let&amp;apos;s say there are 20,000 F&amp;amp;B outlets, and a person visits two every day, it would take more than &lt;strong&gt;27 years&lt;/strong&gt; to visit them all! Take note that SG60 Vouchers will expire on 31 December 2026 &amp;#x1F923;.&lt;/p&gt;&lt;p&gt;In conclusion, supporting local businesses ultimately depends on the collective effort of everyone in the country &amp;#x1F607;.&lt;/p&gt;&lt;p&gt;All I can do is just best-effort support, despite still unemployed, and trying my best to treat it as a mini-adventure.&lt;/p&gt;&lt;p&gt;In no particular order, and not an exhaustive list&amp;#x2026;&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/objects/smashed-shop-yellow-bag.jpg&quot; alt&#x3D;&quot;Smashed shop. My hand holding a yellow bag.&quot; width&#x3D;&quot;900&quot; height&#x3D;&quot;1200&quot;&gt;&lt;/figure&gt;&lt;p&gt;Smashed burgers, which I randomly ordered as takeaway after I saw the place while walking around Kampong Glam. Not sponsored, by the way.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/objects/chive-pork-dumpling-noodle-window-view.jpg&quot; alt&#x3D;&quot;Chive pork dumpling noodle, with a window view&quot; width&#x3D;&quot;900&quot; height&#x3D;&quot;1200&quot;&gt;&lt;/figure&gt;&lt;p&gt;Chive Pork Dumpling Noodle from &lt;a href&#x3D;&quot;https://sethlui.com/a9-noodle-dumpling-singapore/&quot;&gt;A9 Noodle Dumpling&lt;/a&gt; at Fortune Center.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/objects/maggi-goreng-putih-blurred-background.jpg&quot; alt&#x3D;&quot;Maggi goreng putih, with blurred background&quot; width&#x3D;&quot;900&quot; height&#x3D;&quot;1200&quot;&gt;&lt;/figure&gt;&lt;p&gt;&lt;em&gt;Maggi goreng putih&lt;/em&gt;. Yes, &amp;quot;Putih&amp;quot; is the &lt;a href&#x3D;&quot;https://mothership.sg/2021/06/maggi-goreng-red/&quot;&gt;keyword&lt;/a&gt;.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/objects/shio-pan-shio-and-sato-the-centrepoint-singapore.jpg&quot; alt&#x3D;&quot;Shio pan at Shio and Sato, The Centrepoint, Singapore&quot; width&#x3D;&quot;900&quot; height&#x3D;&quot;1200&quot;&gt;&lt;/figure&gt;&lt;p&gt;&lt;em&gt;Shio pan&lt;/em&gt; (salt bread) was trending for a while, so I tried a few from &lt;a href&#x3D;&quot;https://shioandsato.com/&quot;&gt;Shio and Sato&lt;/a&gt;. As expected, the bread was&amp;#x2026; salty &amp;#x1F606;, though it has that extra crispy texture which I find interesting &amp;#x1F914;&lt;/p&gt;&lt;p&gt;Around August, I stumbled upon a site called &lt;a href&#x3D;&quot;https://acuppa.app/&quot;&gt;Acuppa&lt;/a&gt;, a directory listing of home-based businesses in Singapore. They were &lt;a href&#x3D;&quot;https://www.businesstimes.com.sg/opinion-features/home-based-eateries-have-taken-are-they-here-stay&quot;&gt;quite trending for some time&lt;/a&gt;, deemed &lt;a href&#x3D;&quot;https://www.straitstimes.com/singapore/st180-your-singapore-story-home-cafe-discovery-platform-acuppa&quot;&gt;viable alternatives to traditional F&amp;amp;Bs&lt;/a&gt;, while also having their own &lt;a href&#x3D;&quot;https://mothership.sg/2025/06/home-based-cafes-singapore-legal-or-loud/&quot;&gt;fair&lt;/a&gt; &lt;a href&#x3D;&quot;https://www.8days.sg/eatanddrink/newsandreviews/beng-who-cooks-tiktok-nea-home-based-fb-destroying-licensed-food-operators-846681&quot;&gt;share&lt;/a&gt; of criticism.&lt;/p&gt;&lt;p&gt;Being curious, I tried a few of them.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/objects/kobear-matcha-drink-in-hand.jpg&quot; alt&#x3D;&quot;K&amp;#x14D;Bear Matcha drink in hand&quot; width&#x3D;&quot;900&quot; height&#x3D;&quot;1200&quot;&gt;&lt;/figure&gt;&lt;p&gt;&lt;em&gt;Straw-Beary Pawcha Latte&lt;/em&gt; from &lt;a href&#x3D;&quot;https://www.instagram.com/kobearmatcha/&quot;&gt;K&amp;#x14D;Bear Matcha&lt;/a&gt;.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/objects/bendemeer-coffee-matcha-drink-in-hand.jpg&quot; alt&#x3D;&quot;Bendemeer Coffee matcha drink in hand&quot; width&#x3D;&quot;900&quot; height&#x3D;&quot;1200&quot;&gt;&lt;/figure&gt;&lt;p&gt;&lt;em&gt;Bandung Matcha&lt;/em&gt; from &lt;a href&#x3D;&quot;https://www.instagram.com/bendemeercoffee/&quot;&gt;Bendemeer Coffee&lt;/a&gt;.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/objects/amore-brew-matcha-drink-in-hand.jpg&quot; alt&#x3D;&quot;amoRe-brew matcha drink in hand&quot; width&#x3D;&quot;900&quot; height&#x3D;&quot;1200&quot;&gt;&lt;/figure&gt;&lt;p&gt;&lt;em&gt;Blushing Matcha Hug&lt;/em&gt; from &lt;a href&#x3D;&quot;https://www.instagram.com/amorebrew.sg/&quot;&gt;amoRe brew&lt;/a&gt;.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/objects/waterloo-coffee-matcha-drink.jpg&quot; alt&#x3D;&quot;Waterloo Coffee matcha drink&quot; width&#x3D;&quot;900&quot; height&#x3D;&quot;1200&quot;&gt;&lt;/figure&gt;&lt;p&gt;&lt;em&gt;Strawberry Bandung Cold Foam Matcha&lt;/em&gt; from &lt;a href&#x3D;&quot;https://www.instagram.com/waterloocoffeesg&quot;&gt;Waterloo Coffee&lt;/a&gt;, originally a home-based business and &lt;a href&#x3D;&quot;https://danielfooddiary.com/2025/12/14/waterloocoffee/&quot;&gt;eventually opened a physical shop&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;At this point, it&amp;apos;s pretty obvious that &lt;a href&#x3D;&quot;https://en.wikipedia.org/wiki/Matcha&quot;&gt;matcha&lt;/a&gt; is &lt;a href&#x3D;&quot;https://www.businesstimes.com.sg/companies-markets/consumer-healthcare/matcha-mania-hits-singapore-retail-prices-soar&quot;&gt;quite trending&lt;/a&gt; to a point where many other drink stalls also start to offer matcha. Even 7-eleven stores sell matcha-flavoured oat milk cartons by Oatside &amp;#x1F605;.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/objects/oatside-matcha-oat-milk-tea-drink-carton.jpg&quot; alt&#x3D;&quot;Oatside matcha oat milk tea drink carton&quot; width&#x3D;&quot;900&quot; height&#x3D;&quot;1200&quot;&gt;&lt;/figure&gt;&lt;p&gt;This trend feels weird because many years ago, I used to be &lt;a href&#x3D;&quot;https://www.instagram.com/p/m3arb2y90p/&quot;&gt;a little&lt;/a&gt; &lt;a href&#x3D;&quot;https://www.instagram.com/p/-DFUiLS9-_/&quot;&gt;obsessed&lt;/a&gt; &lt;a href&#x3D;&quot;https://www.instagram.com/p/BKuo5bpAz1l/&quot;&gt;with matcha&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;Looking back&lt;/h2&gt;&lt;p&gt;This might sound weird, but my first quarter of the year was carried by &lt;a href&#x3D;&quot;https://myanimelist.net/anime/58567/Ore_dake_Level_Up_na_Ken_Season_2__Arise_from_the_Shadow&quot;&gt;Solo Leveling Season 2&lt;/a&gt;. The intense adrenaline rush with diabolical cliffhangers truly kept me tensed with anticipation every week, to such a high boiling point that &lt;a href&#x3D;&quot;https://www.reddit.com/r/sololeveling/comments/1j9n9gx/most_hated_feet_of_2025_ahhh_those_cliffhanger/&quot;&gt;everyone starts to hate those feet&lt;/a&gt; &amp;#x1F923;&lt;/p&gt;&lt;p&gt;Next few quarters, not much from anime unfortunately, tho&amp;apos; maybe a little from &lt;a href&#x3D;&quot;https://myanimelist.net/anime/61322/&quot;&gt;Dr. Stone: Science Future Part 2&lt;/a&gt; and eventual ending of &lt;a href&#x3D;&quot;https://myanimelist.net/anime/60098/&quot;&gt;Boku no Hero Academia: Final Season&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href&#x3D;&quot;https://en.wikipedia.org/wiki/Bon_App%C3%A9tit,_Your_Majesty&quot;&gt;Bon App&amp;#xE9;tit, Your Majesty&lt;/a&gt; (k-drama) surprisingly brought a small spark of joy that awakened my appetite &amp;#x1F60B;&lt;/p&gt;&lt;p&gt;Apart from all of these, things generally stayed the same.&lt;/p&gt;&lt;p&gt;Rather I&amp;apos;m glad that things stayed the same instead of getting worse.&lt;/p&gt;&lt;p&gt;I mean, we still can&amp;apos;t ignore all the crazy things that are happening around us, though it&amp;apos;s been sort of &lt;em&gt;consistently&lt;/em&gt; like that since&amp;#x2026; the pandemic?&lt;/p&gt;&lt;p&gt;Nevertheless, I&amp;apos;m grateful that some folks have reached out to me. Some have supported my work via thank-you&amp;apos;s and donations.&lt;/p&gt;&lt;p&gt;All the little things matter.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/objects/introducing-the-fediverse-a-new-era-of-social-media-video-credits-special-thanks.jpg&quot; alt&#x3D;&quot;&amp;quot;Introducing the Fediverse: a New Era of Social Media&amp;quot; video showing the credits on &amp;quot;Special thanks&amp;quot; section, listing names including mine&quot; width&#x3D;&quot;900&quot; height&#x3D;&quot;1200&quot;&gt;&lt;/figure&gt;</content>
			<link rel="alternate" type="text/html" href="https://cheeaun.com/blog/2026/01/2025-in-review/" title="2025 in review"/>
		</entry>
		<entry>
			<id>https://cheeaun.com/blog/2025/01/2024-in-review/</id>
			<updated>2025-01-12T00:00:00Z</updated>
			<title type="text">2024 in review</title>
			<summary type="text">This is pretty late, but really, no hurry. This would probably feel like a repeat of my 2023 review.January 😔 Got disappointed by recent events.…</summary>
			<content type="html">&lt;p&gt;This is pretty late, but really, no hurry. This would probably feel like a repeat of my &lt;a href&#x3D;&quot;/blog/2023/12/2023-in-review/&quot;&gt;2023 review&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;January&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F614; Got disappointed by &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/111738006561135999&quot;&gt;recent events&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F4E2; Made &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/111800322951422386&quot;&gt;a statement&lt;/a&gt; that it&amp;#x2019;s impossible for an app to make everyone happy.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;February&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F62E; Gathered quite a lot of attention from &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/111896223599048036&quot;&gt;an experimental UI that I did for catching up on posts on Mastodon&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F929; My web app got &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/111953041035052351&quot;&gt;mentioned&lt;/a&gt; on &lt;a href&#x3D;&quot;https://www.theverge.com/2024/2/18/24075077/bose-ultra-open-superlist-bulletin-text-files-note-apps-installer&quot;&gt;The Verge Installer&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F9D1;&amp;#x200D;&amp;#x2708;&amp;#xFE0F; &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/111962861983335753&quot;&gt;Experienced using Copilot&lt;/a&gt; on error logs in Edge browser&amp;#x2019;s DevTools console.&lt;/li&gt;
&lt;li&gt;&amp;#x1F3F7;&amp;#xFE0F; Had fun &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/111975618073302953&quot;&gt;CSS-ing a rubber stamp effect&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F929; My web app also got &lt;a href&#x3D;&quot;https://mastodon.social/@gruber/111981343339926289&quot;&gt;mentioned by @gruber&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;#x1F68C; BusRouter.SG got &amp;quot;&lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/112014821617338182&quot;&gt;featured&lt;/a&gt;&amp;quot; on &lt;a href&#x3D;&quot;https://vulcanpost.com/853238/a-redundant-solution-sbs-transit-odd-partnership-getgo-will-not-work-out/&quot;&gt;Vulcan Post&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;March&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F468;&amp;#x200D;&amp;#x1F3A8; Did a mockup of how a &amp;#x201C;&lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/112099567913409079&quot;&gt;social address&lt;/a&gt;&amp;#x201D; look like.&lt;/li&gt;
&lt;li&gt;&amp;#x1F5FA;&amp;#xFE0F; Discovered &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/112116343005327189&quot;&gt;a cool change (small green arrows) on Google Maps&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F4F0; Phanpy got &lt;a href&#x3D;&quot;https://fediversereport.com/last-week-in-fediverse-ep-59/&quot;&gt;featured on the Fediverse Report&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;April&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F68F; Discovered &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/112193824054476828&quot;&gt;a new bus stop&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F4E2; Phanpy got &lt;a href&#x3D;&quot;https://www.augment.ink/threads-on-mastodon/&quot;&gt;mentioned on an article by Anuj Ahooja&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F4F0; Also &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/112272819404197934&quot;&gt;got featured on Hacker News front page&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x2615; Attended &lt;a href&#x3D;&quot;https://github.com/KopiJS/kopi.js/issues/83&quot;&gt;59th&lt;/a&gt; &lt;a href&#x3D;&quot;https://www.instagram.com/p/C6QUFXZLJSr/?img_index&#x3D;1&quot;&gt;KopiJS meetup&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;May&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F305; My side project, Phanpy, featured on &lt;a href&#x3D;&quot;https://stefanbohacek.com/blog/impact-of-fediverse-clients-on-the-use-of-alt-text/&quot;&gt;Stefan&amp;#x2019;s article about the impact of clients on the use of alt text&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F575;&amp;#xFE0F; Discovered&lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/112521696071830465&quot;&gt; some interesting trends with Alt text badge UI&amp;#x2019;s&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F4E3; Phanpy &lt;a href&#x3D;&quot;https://xoxo.zone/@mathowie/112452420619405557&quot;&gt;got mentioned by creator of Metafilter&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;June&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x2615; Attended &lt;a href&#x3D;&quot;https://github.com/KopiJS/kopi.js/issues/84&quot;&gt;Kopi.JS #60&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;#x1FA78; Glad to know that my project &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/112573664009207608&quot;&gt;reduced someone&amp;#x2019;s frequency of blood pressure rise&lt;/a&gt; &amp;#x1F602;&lt;/li&gt;
&lt;li&gt;&amp;#x1F4F0; My project got mentioned on &lt;a href&#x3D;&quot;https://www.theverge.com/24173628/ai-pc-raspberry-pi-hit-man-rivian-chromatic-installer&quot;&gt;The Verge Installer again&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F4F0; My project also mentioned on &lt;a href&#x3D;&quot;https://blog.elenarossini.com/the-future-is-federated/&quot;&gt;Elena Rossini&amp;#x2019;s article&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F3A8; Simon &lt;a href&#x3D;&quot;https://fedi.simonwillison.net/@simon/112607271918614961&quot;&gt;mentioned my project&lt;/a&gt; and even &lt;a href&#x3D;&quot;https://fedi.simonwillison.net/@simon/112623074315449711&quot;&gt;dug back my old artwork from 21 years ago&lt;/a&gt; &amp;#x1FAE3;&lt;/li&gt;
&lt;li&gt;&amp;#x1F9F5; &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/112637550017255276&quot;&gt;Played&lt;/a&gt; with Threads API and built &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/112652048630617032&quot;&gt;a bot account&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F474; Got &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/112644156124583200&quot;&gt;older&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F4B8; Shared a little about &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/112680415737826525&quot;&gt;my Chrome extension 13 years ago&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F326;&amp;#xFE0F; Showed off &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/112703309557195063&quot;&gt;my phone Lock Screen when it rains&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;July&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F95E; Ranted about &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/112721893441434571&quot;&gt;the lack of SQLite in the browser&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x2611;&amp;#xFE0F; Learnt about &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/112870354072210776&quot;&gt;&lt;code&gt;border-start-start-radius&lt;/code&gt;.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;August&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F4AC; &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/112932794480750449&quot;&gt;Huge i18n change on Phanpy&lt;/a&gt;, complete with pseudo-localization and &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/112988040458901250&quot;&gt;RTL support&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F914; Wondered about &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/112965379291705351&quot;&gt;&amp;quot;Invalid Date&amp;quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;#x1F468;&amp;#x200D;&amp;#x1F3A8; Rant about &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/112994750087135818&quot;&gt;designers naming things&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F62E; Surprised that &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/113003122727484838&quot;&gt;phones caught up to 16GB RAM&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F510; Learnt about &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/113020903361859381&quot;&gt;PKCE in OAuth&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;September&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x2728; &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/113085806767795566&quot;&gt;Phanpy finally reached 1K stars&lt;/a&gt; after almost 2 years.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;October&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F914; Had some thoughts on &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/113284142730485812&quot;&gt;Markdown parser&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F399;&amp;#xFE0F; Phanpy got &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/113334251884552237&quot;&gt;mentioned on the FLOSS Weekly podcast&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F914; Had some &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/113376918704535534&quot;&gt;thoughts about Arc browser&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F474; Reminiscing on &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/113390558800518056&quot;&gt;my Boosts Carousel invention&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x2615; Attended &lt;a href&#x3D;&quot;https://github.com/KopiJS/kopi.js/issues/85&quot;&gt;Kopi.JS #61&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;November&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F914; Wondered about &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/113451268717905353&quot;&gt;the dynamics of how job interviews are conducted&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F69B; &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/113485296763121994&quot;&gt;Migrated my CheckWeatherSG bot&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F389; &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/113565133745330113&quot;&gt;11th anniversary of Kopi.JS&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;December&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F381; Got my &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/113586545081308960&quot;&gt;#Wrapstodon&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F399;&amp;#xFE0F; Phanpy got &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/113694212513866821&quot;&gt;reviewed in a podcast again&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F680; Started working on &lt;a href&#x3D;&quot;https://bsky.app/profile/cheeaun.com/post/3le7pto6ht72j&quot;&gt;an experimental web client for Bluesky&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Newsletter&lt;/h2&gt;&lt;p&gt;Right after June, I quietly stopped posting my newsletter. The last issue was &lt;a href&#x3D;&quot;https://cheeaun.substack.com/p/2-years-of-funemployment-34&quot;&gt;the 34th&lt;/a&gt;, with the subject &amp;quot;2 years of (f)unemployment&amp;quot;. I was kind of surprised that it&amp;apos;s been two years, and my fun little newsletter ran for almost 3 years, since &lt;a href&#x3D;&quot;/blog/2022/01/2021-in-review/&quot;&gt;2021&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I think a combination of events sort of made me stop. This newsletter thing starts to become like a chore. There&amp;apos;s not enough dopamine release that social media posts give via likes, reposts or replies. Newsletters only show clicks and views, which may not be accurate. I&amp;apos;ve seen how other (tech and non-tech) newsletters thrive by increasing subscriptions or getting sponsorships, so maybe that&amp;apos;s how they could sustain that long.&lt;/p&gt;&lt;p&gt;There are also &lt;a href&#x3D;&quot;https://news.ycombinator.com/item?id&#x3D;40156057&quot;&gt;some&lt;/a&gt; &lt;a href&#x3D;&quot;https://news.ycombinator.com/item?id&#x3D;38962571&quot;&gt;issues&lt;/a&gt; with Substack around that timing and there&amp;apos;s no easy (and free, depending on number of subscribers) way to migrate out of it.&lt;/p&gt;&lt;p&gt;Honestly, the only parts I miss from writing my newsletter are the &amp;quot;Interesting discoveries&amp;quot; and &amp;quot;Neat bookmarks&amp;quot; sections. I &lt;a href&#x3D;&quot;/blog/2022/01/2021-in-review/&quot;&gt;mentioned&lt;/a&gt; this before:&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;This also reminds me of the times when I always share cool stuff to whoever sitting beside me at work, in the office, which is impossible now due to work-from-home setting.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;If I&amp;apos;m going to revive my newsletter, I&amp;apos;ll probably just focus on these but again, I&amp;apos;m not sure if anyone would want that. When I stopped posting, I didn&amp;apos;t really get any feedback or questions from my subscribers, which is probably just the nature of how e-mails work? If you don&amp;apos;t get the e-mails one day, it&amp;apos;s hard to notice them or probably they accidentally end up in the spam folder. There&amp;apos;s already so many e-mails that you need to sift through every day, so missing one doesn&amp;apos;t matter much anyway.&lt;/p&gt;&lt;p&gt;Thinking about it, above points might apply to blog posts too. Though I guess blog posts &amp;quot;live&amp;quot; on the web so it has a permanent and timeless place, while e-mails drop in your inbox where it&amp;apos;s ephemeral. Substack does give a &amp;quot;web presence&amp;quot; to the e-mails but it&amp;apos;s kinda &amp;quot;closed&amp;quot; and too Substack-specific. When I &lt;a href&#x3D;&quot;https://cheeaun.substack.com/p/moving-to-substack-16&quot;&gt;moved from Revue to Substack&lt;/a&gt; in 2022 (&lt;a href&#x3D;&quot;https://techcrunch.com/2022/12/14/twitter-shuts-down-revue-its-newsletter-platform/&quot;&gt;Revue was shutting down&lt;/a&gt;), a lot of the older issues are now 404-ed and there&amp;apos;s no way to redirect them.&lt;/p&gt;&lt;p&gt;So, if I want this to be more long-lived, might as well convert my &amp;quot;newsletter&amp;quot; into a blog? There probably won&amp;apos;t be any easy and free newsletter platforms in near future because sending e-mails are not free. Converting every e-mail subscriber to RSS/Atom feed subscriber seems to make more sense.&lt;/p&gt;&lt;p&gt;One approach that I&amp;apos;ve been keeping my eyes on is &lt;a href&#x3D;&quot;https://simonwillison.net/2024/Dec/22/link-blog/&quot;&gt;Simon&amp;apos;s &amp;quot;Link blog&amp;quot;&lt;/a&gt;.&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;I realize now that link blogging deserves to be included a third category of low stakes, high value writing. We could think of that category as &lt;strong&gt;things I&amp;#x2019;ve found&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;That&amp;#x2019;s the purpose of my link blog: it&amp;#x2019;s an ongoing log of things I&amp;#x2019;ve found&amp;#x2014;effectively a combination of public bookmarks and my own thoughts and commentary on why those things are interesting.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;Imagine a list of links, with commentary &amp;#x2013; duh, that&amp;apos;s what I did in my newsletter.&lt;/p&gt;&lt;p&gt;I&amp;apos;m not sure how I would start this yet, considering the tech used in my blog, the demands from anyone who want to read my link blog, and the amount of effort to make this work and not succumb to it feeling like &amp;quot;chore&amp;quot; again.&lt;/p&gt;&lt;p&gt;Keeping this in mind for now.&lt;/p&gt;&lt;h2&gt;Very extended unemployment&lt;/h2&gt;&lt;p&gt;Time passes by really fast.&lt;/p&gt;&lt;p&gt;I&amp;apos;m passively, not actively, looking for jobs but the overall job market vibe is not the same as pre-pandemic days. The same job posts from the same companies appearing over and over again for the past 2 years. Companies seem to have lost interest in hiring front-end developers, but more into generic &amp;quot;software engineers&amp;quot;. There&amp;apos;s no new exciting startups that catch my eyes. Some companies are on hiring freeze. My LinkedIn and Twitter DMs are filled with messages from people telling me to upvote their Product Hunt submissions. Layoffs are &lt;a href&#x3D;&quot;https://www.businesstimes.com.sg/companies-markets/layoffs-and-job-cuts-singapore-2024&quot;&gt;still very happening&lt;/a&gt; unfortunately.&lt;/p&gt;&lt;p&gt;Things look pretty bleak. I keep telling myself that if I graduated from university around this timing, it would be even worse. Which makes me wonder, how are the folks from coding bootcamps doing now?&lt;/p&gt;&lt;p&gt;It feels like a privilege that I even have the capacity to worry about others while being jobless for more than 2 years.&lt;/p&gt;&lt;p&gt;I&amp;apos;ve been joking to people that I&amp;apos;m &amp;quot;retired&amp;quot;, but honestly in the current economic state, that&amp;apos;s impossible.&lt;/p&gt;&lt;p&gt;Two years of not working does weird things to the brain. Side projects keep me sane. Watching anime series keep me sane. Walking, with light exercises, keeps me sane. Exploring new places like a tourist, keeps me sane. Taking random scenic photos keeps me sane. Randomly meeting up with people keeps me sane. Taking a long bus ride under the rain keeps me sane.&lt;/p&gt;&lt;p&gt;But there&amp;apos;s a limit. Time slows down. Things start to get boring from time to time. My brain starts to hallucinate and I keep asking myself, why do I go to work in the first place? What did I want to do? &amp;quot;Change the world&amp;quot; as what startups used to say? What&amp;apos;s my origin story (&lt;a href&#x3D;&quot;https://en.wikipedia.org/wiki/My_Hero_Academia&quot;&gt;My Hero Academia&lt;/a&gt; reference)? Am I just working because everyone else is working? Do I want go back to being a code monkey or try more executive roles? Are my skillsets still relevant? Should I still do &lt;a href&#x3D;&quot;https://news.ycombinator.com/item?id&#x3D;42570390&quot;&gt;glue work&lt;/a&gt; and get overlooked?&lt;/p&gt;&lt;p&gt;I&amp;apos;m starting to understand why some older folks don&amp;apos;t want to retire. Jobs took most of the time in our lives, morning till night, 5 days a week, they keep the brain occupied with things that seem important, they provide financial income to improve our lifestyles, and the whole process repeats for many, many, many years.&lt;/p&gt;&lt;p&gt;But&amp;#x2026;&lt;/p&gt;&lt;p&gt;Where&amp;apos;s the &amp;quot;fire&amp;quot;?&lt;/p&gt;&lt;p&gt;I realised that I say this in every job interview: &amp;quot;I just want to build cool things that help people.&amp;quot; It&amp;apos;s the very thing that keeps me &amp;quot;alive&amp;quot; but years of work, intertwined with the pandemic and various events, has manage to put it off.&lt;/p&gt;&lt;p&gt;One day, a &lt;a href&#x3D;&quot;https://www.youtube.com/watch?v&#x3D;HmlbpdeYpkk&quot;&gt;soundtrack&lt;/a&gt; (&lt;em&gt;Yuujin a-Kun Wo Watashi No Bansousha Ni Ninmei Shimasu&lt;/em&gt;) suddenly started playing in my head. It&amp;apos;s one of my favourites, from an anime that I watched few years ago, called &amp;quot;&lt;a href&#x3D;&quot;https://myanimelist.net/anime/23273/Shigatsu_wa_Kimi_no_Uso&quot;&gt;Shigatsu wa Kimi no Uso&lt;/a&gt;&amp;quot; (&lt;a href&#x3D;&quot;https://en.wikipedia.org/wiki/Your_Lie_in_April&quot;&gt;Your Lie in April&lt;/a&gt;).&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;Fourteen-year-old piano prodigy K&amp;#x14D;sei Arima becomes famous after winning several music competitions. When his mother Saki dies, K&amp;#x14D;sei has a mental breakdown while performing at a piano recital; this results in him becoming unable to hear the sound of his piano, even though his hearing is otherwise unaffected.&lt;/p&gt;
&lt;p&gt;Two years later, K&amp;#x14D;sei has not touched the piano and views the world in monochrome.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;Obviously, I&amp;apos;m not a prodigy and my &amp;quot;story&amp;quot; is not that dramatic. But &amp;quot;unable to hear the sound of his piano&amp;quot; and &amp;quot;views the world in monochrome&amp;quot; part sounds very similar.&lt;/p&gt;&lt;p&gt;My work is also not like music that could transcend words and connect people in ways that words alone can&amp;apos;t.&lt;/p&gt;&lt;p&gt;Though, I really wished that it could.&lt;/p&gt;&lt;h2&gt;Looking back&lt;/h2&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/scenery/view-sun-ceiling-flower-dome-singapore.jpg&quot; alt&#x3D;&quot;View of the sun from the ceiling of Flower Dome, Singapore&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/scenery/backalley-night-singapore.jpg&quot; alt&#x3D;&quot;Back alley at night, Singapore&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/scenery/tv-test-pattern-hdb-singapore.jpg&quot; alt&#x3D;&quot;TV test pattern on HDB, Singapore&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot; loading&#x3D;&quot;lazy&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/scenery/terracotta-color-stairs-new-bahru-singapore.jpg&quot; alt&#x3D;&quot;Terracotta-colored stairs in New Bahru, Singapore&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/scenery/park-playground-new-bahru-singapore.jpg&quot; alt&#x3D;&quot;Park and playground in New Bahru, Singapore&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot; loading&#x3D;&quot;lazy&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/scenery/balcony-path-pearls-hill-terrace-singapore.jpg&quot; alt&#x3D;&quot;Balcony path in Pearl&amp;apos;s Hill Terrace, Singapore&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/scenery/window-outlook-pearls-hill-terrace-singapore.jpg&quot; alt&#x3D;&quot;Window outlook in Pearl&amp;apos;s Hill Terrace, Singapore&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/scenery/stairs-woollerton-drive-gallop-walk-singapore.jpg&quot; alt&#x3D;&quot;Stairs between Woollerton Drive and Gallop Walk, Singapore&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot; loading&#x3D;&quot;lazy&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/scenery/blurred-window-view-lady-red-umbrella-botanical-art-gallery-singapore.jpg&quot; alt&#x3D;&quot;Blurred window view of a lady holding a red umbrella, in Botanical Art Gallery, Singapore&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/scenery/shing-wah-sports-association-tanjong-pagar-hdb-singapore.jpg&quot; alt&#x3D;&quot;Shing Wah Sports Association, near Tanjong Pagar HDB, Singapore&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot; loading&#x3D;&quot;lazy&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/scenery/view-union-energy-group-new-bridge-centre-peoples-park-complex-singapore.jpg&quot; alt&#x3D;&quot;View of Union Energy Group building, New Bridge Centre and People&amp;apos;s Park Complex, Singapore&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/scenery/chicken-singapore-botanic-gardens.jpg&quot; alt&#x3D;&quot;Chicken crossing the pathway, in Singapore Botanic Gardens&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot; loading&#x3D;&quot;lazy&quot;&gt;&lt;/figure&gt;&lt;p&gt;I&amp;apos;m not a professional photographer, but I really like taking these random photos, despite not travelling anywhere outside of Singapore.&lt;/p&gt;&lt;p&gt;Taking long walks and capturing these moments give me time to pause and think.&lt;/p&gt;&lt;p&gt;Everything around me has changed so much, and I&amp;apos;m constantly yearning for pre-pandemic days. I realised that I&amp;apos;ve inevitably downgraded from a mice to one of those &amp;quot;littlepeople&amp;quot; in &lt;a href&#x3D;&quot;https://en.wikipedia.org/wiki/Who_Moved_My_Cheese%3F&quot;&gt;Who Moved My Cheese?&lt;/a&gt;, a book I read many years ago.&lt;/p&gt;&lt;p&gt;Again, I don&amp;apos;t know what&amp;apos;s going to happen.&lt;/p&gt;&lt;p&gt;Hopefully there&amp;apos;s still a spark somewhere out there.&lt;/p&gt;</content>
			<link rel="alternate" type="text/html" href="https://cheeaun.com/blog/2025/01/2024-in-review/" title="2024 in review"/>
		</entry>
		<entry>
			<id>https://cheeaun.com/blog/2023/12/2023-in-review/</id>
			<updated>2023-12-31T00:00:00Z</updated>
			<title type="text">2023 in review</title>
			<summary type="text">This is probably going to be short as this year is perhaps the most unproductive year I've ever had.As usual, I start this off with a compilation…</summary>
			<content type="html">&lt;p&gt;This is probably going to be short as this year is perhaps the most &lt;em&gt;unproductive&lt;/em&gt; year I&amp;apos;ve ever had.&lt;/p&gt;&lt;p&gt;As usual, I start this off with a compilation of monthly &amp;quot;highlights&amp;quot; that I&amp;apos;ve already listed in my monthly newsletter.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;January&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x2328;&amp;#xFE0F; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1612323029710962688&quot;&gt;Got&lt;/a&gt; my first wireless mechanical keyboard.&lt;/li&gt;
&lt;li&gt;&amp;#x1F468;&amp;#x200D;&amp;#x1F3A8; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1610608761017892865&quot;&gt;Made a diagram&lt;/a&gt; with &lt;a href&#x3D;&quot;https://excalidraw.com/&quot;&gt;Excalidraw&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F4F9; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1611385117511151617&quot;&gt;Made a nice video&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F3AE; Played around with some pretty cool UI (&lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1616481971223552000&quot;&gt;1&lt;/a&gt;) (&lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1619569217363406848&quot;&gt;2&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;February&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F489; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1623882217591279621&quot;&gt;4th jab&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1FAF4; My &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1625337207140786176&quot;&gt;Tumblr account got restored&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F4B8; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1625676926185779201&quot;&gt;Started paying for make.com&lt;/a&gt; because it rained so much.&lt;/li&gt;
&lt;li&gt;&amp;#x1F649; One of my apps &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1628278265084510208&quot;&gt;got reviewed in a podcast&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;March&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F3A8; Did a &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1633445236117585920&quot;&gt;simple 3D thing&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x2728; Made some &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1634444189927718914&quot;&gt;shiny progress&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F4E5; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1634767934496321536&quot;&gt;Dropped&lt;/a&gt; my token.&lt;/li&gt;
&lt;li&gt;&amp;#x1F4BF; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1640522135318716417&quot;&gt;Upgraded&lt;/a&gt; to Ventura 13.3 and iOS 16.4.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;April&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F648; Found a way to &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1645367833143156738&quot;&gt;redact text with pure CSS&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F4CA; Did &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/110161529140061736&quot;&gt;some pretty cool multi-column UI designs&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x270B; One of my Twitter app got &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1647812067532095488&quot;&gt;suspended&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F41B; Found &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1648179311076323328&quot;&gt;a really weird bug&lt;/a&gt; with &lt;code&gt;&amp;lt;datalist&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&amp;#x1F4D6; Visited &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1650519857283190785&quot;&gt;a new regional library&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;May&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F629; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1653960020739129344&quot;&gt;My old Yahoo! Mail account entered inactive state for 1+ year&lt;/a&gt;. All contents were deleted. Really miss &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/110308228969136068&quot;&gt;my chain mails &amp;#x1F648;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;#x1F5FA;&amp;#xFE0F; Made a &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1657727482492235777&quot;&gt;cool demo for Google Maps&amp;#x2019; Photorealistic 3D tiles&lt;/a&gt; and &lt;a href&#x3D;&quot;https://googlemapsmania.blogspot.com/2023/05/explore-world-with-shadows.html&quot;&gt;got featured on Maps Mania&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;June&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F4F2; Trying out &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1666434624183205889&quot;&gt;iOS 17 beta&lt;/a&gt;, as always (every year).&lt;/li&gt;
&lt;li&gt;&amp;#x1F98A; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1666715041444552705&quot;&gt;Worried&lt;/a&gt; about Firefox.&lt;/li&gt;
&lt;li&gt;&amp;#x1F929; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1667561737686753281&quot;&gt;Learned a life hack&lt;/a&gt; on how to eat yoghurt without a spoon.&lt;/li&gt;
&lt;li&gt;&amp;#x1F474; Got &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1670824387807973376&quot;&gt;older&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;July&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F973; My web app finally &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/110679292160877444&quot;&gt;got listed&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F456; Somehow got &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/110673460301613219&quot;&gt;really&lt;/a&gt; &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/110735711383890220&quot;&gt;impressed&lt;/a&gt; by a K-pop group called &lt;a href&#x3D;&quot;https://en.wikipedia.org/wiki/NewJeans&quot;&gt;NewJeans&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;August&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F333; Did &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/110897788209607546&quot;&gt;a little 3D trees tinkering&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x2615; Attended the &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/110956706365734154&quot;&gt;55th KopiJS hangout&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;September&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F914; Learned something about &lt;code&gt;less&lt;/code&gt; and &lt;code&gt;jQuery&lt;/code&gt; thanks to &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/111038906809296287&quot;&gt;GitHub&amp;#x2019;s new newsfeed&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;#x1F622; My iCloud backup &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/111101478267068776&quot;&gt;has been failing&lt;/a&gt; since updating to iOS 17 stable (from beta)&lt;/li&gt;
&lt;li&gt;&amp;#x1F680; Made &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/111010846374607712&quot;&gt;some&lt;/a&gt; &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/111029713309952535&quot;&gt;interesting&lt;/a&gt; &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/111069603769790908&quot;&gt;changes&lt;/a&gt; &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/111075447089809397&quot;&gt;on&lt;/a&gt; Phanpy (my web app project).&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;October&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1FAE3; Tried to use &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/111158531945120251&quot;&gt;iOS 17&amp;#x2019;s new &amp;#x201C;Screen Distance&amp;#x201D;&lt;/a&gt; feature. Gave up after a week, too annoying.&lt;/li&gt;
&lt;li&gt;&amp;#x1F629; Got &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/111250732556057144&quot;&gt;annoyed by YouTube&amp;#x2019;s anti-adblocker attempts&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;November&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F4DC; Did some cool &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/111340601508143964&quot;&gt;CSS scroll-driven animations&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F942; &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/111358866164358949&quot;&gt;Fediversary&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;#x1F4E6; Tried the &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/111431854315671651&quot;&gt;Wayback Machine tweets archive tool&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F973; &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/111492674906861143&quot;&gt;10th anniversary of KopiJS&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;December&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F440; &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/111519612674154599&quot;&gt;Looked for alternatives&lt;/a&gt; to GitHub Copilot.&lt;/li&gt;
&lt;li&gt;&amp;#x1F381; Did my &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/111575786019192213&quot;&gt;#GitHubUnwrapped&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F389; It&amp;#x2019;s been &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/111584407791644659&quot;&gt;one year of building Phanpy&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F60E; First time &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/111647227648224117&quot;&gt;trying out GPT-4 with Vision&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Extended unemployment&lt;/h2&gt;&lt;p&gt;I was expecting at most 1-year of unemployment before I get bored and wanting to start work again.&lt;/p&gt;&lt;p&gt;But somehow I don&amp;apos;t feel like working yet. Feels like a gut feeling thing or I&amp;apos;m still feeling fatigued. There&amp;apos;s a sense of guilt building up but I decided to just do what I want and not get pressured or stressed by it.&lt;/p&gt;&lt;p&gt;Roughly one year after my unemployment, &lt;a href&#x3D;&quot;https://layoffs.fyi/&quot;&gt;tech layoffs&lt;/a&gt; were &lt;em&gt;still&lt;/em&gt; happening, so it doesn&amp;apos;t feel like things are going to be smooth-sailing yet. It&amp;apos;s quite and not quite post-pandemic at the same time, as most folks are still working from home on some days of the week as part of the &amp;quot;new normal&amp;quot; working arrangements. Not a lot of tech meetups too, compared to pre-pandemic days.&lt;/p&gt;&lt;h2&gt;Projects&lt;/h2&gt;&lt;p&gt;I should say, just one project, not project&lt;em&gt;s&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;I&amp;apos;ve spent the whole year working on &lt;a href&#x3D;&quot;https://github.com/cheeaun/phanpy&quot;&gt;Phanpy&lt;/a&gt;, a 3rd-party web client for &lt;a href&#x3D;&quot;https://joinmastodon.org/&quot;&gt;Mastodon-compatible social networks&lt;/a&gt;. It&amp;apos;s been surprisingly enjoyable and challenging, as I use &lt;em&gt;all&lt;/em&gt; my front-end chops, design skills, usability knowledge and years of experience on creating my &lt;em&gt;ideal&lt;/em&gt; social media client.&lt;/p&gt;&lt;p&gt;I&amp;apos;ve added so many cool features since the first inception &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/109515757404630583&quot;&gt;last December&lt;/a&gt;.&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Thread count indicator&lt;/strong&gt; &amp;#x2013; automatic marking of &amp;quot;1/X&amp;quot; on threaded posts so that authors don&amp;apos;t have to type it themselves.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Boosts Carousel&lt;/strong&gt; &amp;#x2013; group all reposted posts from the timeline into separate horizontal-scrolling carousels to prevent them from hogging the timeline.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Multi-column mode&lt;/strong&gt; &amp;#x2013; Tweetdeck-like UI for multiple configurable columns of timelines.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Post translation&lt;/strong&gt; &amp;#x2013; full-fledged translation UI with auto-detection of source text, configurable source language and even includes pronunciation text.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;(Non-native) Quote posts&lt;/strong&gt; &amp;#x2013; links to other Mastodon/Fediverse posts will be expanded to look like quote posts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web Push notifications&lt;/strong&gt; &amp;#x2013; push notifications on the web, a feature that&amp;apos;s more widely available now since &lt;a href&#x3D;&quot;https://webkit.org/blog/13878/web-push-for-web-apps-on-ios-and-ipados/&quot;&gt;the release of iOS 16.4&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Profile posting stats&lt;/strong&gt; &amp;#x2013; quick visualisation of an account&amp;apos;s posting habits showing percentage of original posts, reposts and replies within the last specific number of days.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;quot;ALT&amp;quot; badge &amp;amp; inline captions&lt;/strong&gt; &amp;#x2013; Instead of just showing ALT badges, they&amp;apos;re also conditionally inlined like image captions.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Experimental image description generator&lt;/strong&gt; &amp;#x2013; using &lt;a href&#x3D;&quot;https://platform.openai.com/docs/guides/vision&quot;&gt;GPT-4 with Vision&lt;/a&gt; to &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/111647227648224117&quot;&gt;generate description for images&lt;/a&gt; when posting images.&lt;/li&gt;
&lt;li&gt;And&amp;#x2026; a whole bunch of small UI tweaks and bug fixes.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;I&amp;apos;m quite proud of this. It&amp;apos;s pretty hard to explain or describe in words, thus I feel that folks should really try the web app to &amp;quot;get it&amp;quot;.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/code-frequency-history-phanpy-2023.png&quot; alt&#x3D;&quot;Code frequency over the history of cheeaun/phanpy repository, showing all additions and deletions per wee on a monthly area chart from January to December 2023&quot; width&#x3D;&quot;640&quot; height&#x3D;&quot;404&quot;&gt;&lt;/figure&gt;&lt;p&gt;I find myself surprised that I&amp;apos;m able to focus on &lt;em&gt;one&lt;/em&gt; project as I usually get distracted easily to start another new project or shift focus to one of my existing projects.&lt;/p&gt;&lt;p&gt;It feels good to focus on building a product, &lt;em&gt;not&lt;/em&gt; during your &amp;quot;free time&amp;quot; or after-work hours, and really just laser-focus on delivering the best user experience without tight deadlines, the need to chase numbers, or reach certain KPI&amp;apos;s.&lt;/p&gt;&lt;p&gt;Thanks to Phanpy, my sponsorship grew quite significantly on &lt;a href&#x3D;&quot;https://www.buymeacoffee.com/cheeaun&quot;&gt;Buy Me a Coffee&lt;/a&gt; and &lt;a href&#x3D;&quot;https://github.com/sponsors/cheeaun&quot;&gt;GitHub Sponsors&lt;/a&gt;. I really appreciate all the donations! &amp;#x1F647;&amp;#x200D;&amp;#x2642;&amp;#xFE0F;.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/total-earnings-past-year-chart-github-sponsors-dashboard.png&quot; alt&#x3D;&quot;Total earnings for past year, showing a line chart of monthly earnings from January to December 2023, on GitHub Sponsors dashboard site&quot; width&#x3D;&quot;653&quot; height&#x3D;&quot;288&quot;&gt;&lt;/figure&gt;&lt;h2&gt;Looking back&lt;/h2&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/scenery/view-sky-garden-capitaspring-singapore-river-asian-civilizations-museum-swissotel-the-stamford.jpg&quot; alt&#x3D;&quot;View from Sky Garden Capitaspring, looking at Singapore River, Asian Civilizations Museum and Swiss&amp;#xF4;tel The Stamford&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;1067&quot;&gt;&lt;/figure&gt;&lt;p&gt;Despite having more than a year to think about my next steps, I didn&amp;apos;t really put much thought in the end. After 1.5 years of unemployment, I started to get used to this, which is something that I never thought that I could. Time passed by so fast while everyone else continue working, meeting friends, and travelling.&lt;/p&gt;&lt;p&gt;I&amp;apos;m grateful that I have the luxury to be jobless for this long. I&amp;apos;m still able to spend on things that I want. I could go to places like art museums during weekdays while everyone else is working.&lt;/p&gt;&lt;p&gt;There&amp;apos;s still a lot of things in my mind. A lot of to-dos and future planning.&lt;/p&gt;&lt;p&gt;But, I&amp;apos;m just too lazy to think.&lt;/p&gt;&lt;p&gt;And I want to convince myself that it&amp;apos;s fine to be lazy.&lt;/p&gt;</content>
			<link rel="alternate" type="text/html" href="https://cheeaun.com/blog/2023/12/2023-in-review/" title="2023 in review"/>
		</entry>
		<entry>
			<id>https://cheeaun.com/blog/2022/12/2022-in-review/</id>
			<updated>2022-12-31T00:00:00Z</updated>
			<title type="text">2022 in review</title>
			<summary type="text">Wow, another year has passed. And now another review.It's time for the list, that I usually compile monthly for my newsletter.January Scraped…</summary>
			<content type="html">&lt;p&gt;Wow, another year has passed. And now another review.&lt;/p&gt;&lt;p&gt;It&amp;apos;s time for &lt;em&gt;the&lt;/em&gt; list, that I usually compile monthly for my newsletter.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;January&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1477919978191949826&quot;&gt;Scraped&lt;/a&gt; a bunch of taxi stands &amp;#x1F695;&lt;/li&gt;
&lt;li&gt;Ordered &amp;amp; printed &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1478249439613493249&quot;&gt;misbrands&lt;/a&gt; stickers &amp;#x1F47E;&lt;/li&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1478911115249664001&quot;&gt;Experimented&lt;/a&gt; with a 3D globe &amp;#x1F30F;&lt;/li&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1480148673472303106&quot;&gt;Made a repo&lt;/a&gt; that scrapes what&amp;apos;s happening in SG &amp;#x1F1F8;&amp;#x1F1EC;&lt;/li&gt;
&lt;li&gt;Got another &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1480521200799387648&quot;&gt;free mask&lt;/a&gt; from vending machine &amp;#x1F637;&lt;/li&gt;
&lt;li&gt;Revived &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1481602832231206922&quot;&gt;one of my (very) old projects&lt;/a&gt; &amp;#x1F3D4;&amp;#xFE0F;&lt;/li&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1482721291371450368&quot;&gt;Light to night&lt;/a&gt; festival &amp;#x1F31D;&lt;/li&gt;
&lt;li&gt;Did a &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1483011049519710211&quot;&gt;CSS Speedrun&amp;#x2122;&amp;#xFE0F;&lt;/a&gt; &amp;#x1F3C3;&amp;#x200D;&amp;#x2642;&amp;#xFE0F;&lt;/li&gt;
&lt;li&gt;Launched &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1486655277516480527&quot;&gt;my own variant of Wordle&lt;/a&gt;! &amp;#x1F680;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;February&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Made a &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1491749802023202816&quot;&gt;3D model of Wordle results with Spline&lt;/a&gt; &amp;#x1F4E6;&lt;/li&gt;
&lt;li&gt;Blogged: &lt;a href&#x3D;&quot;/blog/2022/02/chengyu-wordle-is-not-a-love-story/&quot;&gt;Chengyu Wordle Is Not a Love Story&lt;/a&gt; &amp;#x1F4DD;&lt;/li&gt;
&lt;li&gt;Had a &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1495057584256012289&quot;&gt;night walk&lt;/a&gt; &amp;#x1F6B6;&lt;/li&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1495790421322129411&quot;&gt;2&amp;#xFE0F;&amp;#x20E3;2&amp;#xFE0F;&amp;#x20E3;0&amp;#xFE0F;&amp;#x20E3;2&amp;#xFE0F;&amp;#x20E3;2&amp;#xFE0F;&amp;#x20E3;0&amp;#xFE0F;&amp;#x20E3;2&amp;#xFE0F;&amp;#x20E3;2&amp;#xFE0F;&amp;#x20E3;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Built &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1497756369541210121&quot;&gt;a Cloudflare worker&lt;/a&gt; &amp;#x1F477;&amp;#x200D;&amp;#x2640;&amp;#xFE0F;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;March&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Reported &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1498704027877777409&quot;&gt;a bug&lt;/a&gt; to MDN and it got &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1505491409562116100&quot;&gt;fixed&lt;/a&gt;. &amp;#x1F313;&lt;/li&gt;
&lt;li&gt;Another &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1502668058770350084&quot;&gt;night walk&lt;/a&gt; &amp;#x1F6B6;&lt;/li&gt;
&lt;li&gt;Tested iOS 15.4&amp;apos;s &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1503572368475639810&quot;&gt;Face ID unlock &lt;em&gt;with a mask&lt;/em&gt;&lt;/a&gt; &amp;#x1F637;&lt;/li&gt;
&lt;li&gt;Showed &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1505510267509043202&quot;&gt;a sneak peek&lt;/a&gt; of my new map web app designed for walking. &amp;#x1F5FA;&amp;#xFE0F;&lt;/li&gt;
&lt;li&gt;Got &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1506876978041098246&quot;&gt;interviewed&lt;/a&gt;. &amp;#x1F5E3;&amp;#xFE0F;&lt;/li&gt;
&lt;li&gt;My blog post &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1508332113275518979&quot;&gt;got linked from Slate&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;April&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F6B6; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1510278670568501248&quot;&gt;Night walk&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F6B6; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1510531609514033155&quot;&gt;Afternoon walk&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F517; Got another &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1512744603421601793&quot;&gt;link-in-bio&lt;/a&gt; page.&lt;/li&gt;
&lt;li&gt;&amp;#x270C;&amp;#xFE0F; Made &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1513069547569676288&quot;&gt;2 big changes&lt;/a&gt; to checkweather.sg.&lt;/li&gt;
&lt;li&gt;&amp;#x1F4AC; Started &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1513500939444912128&quot;&gt;a new Telegram chat group&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#xA9;&amp;#xFE0F; Found a &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1514286125182971905&quot;&gt;cool font&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F922; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1515157674316349449&quot;&gt;Gastric week&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1FA9C; Ranted about &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1514565947884924937&quot;&gt;ladders&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F6B6; Night walk &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1517141144295018498&quot;&gt;again&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F47E; Bought &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1517157741034319873&quot;&gt;MRT/LRT stickers&lt;/a&gt; from a Redditor!&lt;/li&gt;
&lt;li&gt;&amp;#x1F34E; Ranted about &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1517414101017788416&quot;&gt;Apple Store on different maps&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F4B0; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1519155214732783616&quot;&gt;Sponsored&lt;/a&gt; devs on GitHub Sponsors.&lt;/li&gt;
&lt;li&gt;&amp;#x1F4B8; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1519923906005528576&quot;&gt;Subscribed to MDN Plus 5&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;May&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F192; Made &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1521123550723285008&quot;&gt;pretty cool updates&lt;/a&gt; to my HackerWeb iOS app.&lt;/li&gt;
&lt;li&gt;&amp;#x1F50E; Discovered that &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1522608987564560384&quot;&gt;SEO for Chengyu Wordle&lt;/a&gt; became really weird&lt;/li&gt;
&lt;li&gt;&amp;#x2615; Received &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1523691180852097024&quot;&gt;5 coffees&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F0CF; Made a &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1523888447039045632&quot;&gt;joke&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F50A; Got &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1524988280944488448&quot;&gt;mentioned in /r/programmerhumor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;#x1F30F; Finally using &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1525346727125209088&quot;&gt;globe projection on my cheeaun.earth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;#x1F485; Spruced up &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1526962826187010048&quot;&gt;my projects page&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;#x2795; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1527604392022593537&quot;&gt;Tough week(s)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;#x1F35B; First time saw &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1528560755398037504&quot;&gt;Uncle Roger mentioned on HN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;#x1F193; Got &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1527873622949658625&quot;&gt;a free .dev domain&lt;/a&gt; and made &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1528747046962077696&quot;&gt;a Cloudflare worker&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;June&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F4F2; Trying out &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1534042657168580608&quot;&gt;iOS 16 beta&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F914; Made a &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1534867432887951365&quot;&gt;Spiral Emoji Wallpaper Generator&lt;/a&gt; &amp;#x2190; this went viral!&lt;/li&gt;
&lt;li&gt;&amp;#x1F680; Released &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1536914467048796160&quot;&gt;Hackerweb for iOS v2.1.0&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F3E8; Had &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1541293270847762432&quot;&gt;1-week staycation&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;July&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F5E3; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1544943757174636545&quot;&gt;Mentioned&lt;/a&gt; some realities of front-end.&lt;/li&gt;
&lt;li&gt;&amp;#x1F4BB; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1545384138873507845&quot;&gt;Ordered&lt;/a&gt; Macbook Air M2. &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1553339507717525504&quot;&gt;Got it&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F47E; Restocked &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1547101020504788992&quot;&gt;stickers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F4F2; Tested &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1547460681724637184&quot;&gt;some cool wallpapers&lt;/a&gt; on iOS 16 beta.&lt;/li&gt;
&lt;li&gt;&amp;#x1F46F; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1552838834328457217&quot;&gt;Attended&lt;/a&gt; an in-person conference.&lt;/li&gt;
&lt;li&gt;&amp;#x1F958; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1553326753472360448&quot;&gt;Co-organized&lt;/a&gt; Geek Brunch SG.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;August&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F4F9; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1554072421296066561&quot;&gt;Made&lt;/a&gt; a viral &lt;a href&#x3D;&quot;https://www.tiktok.com/@cheeauntok/video/7126872546745584898&quot;&gt;TikTok&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F5FA;&amp;#xFE0F; Made a new &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1561624324124975104&quot;&gt;map viz for Singapore Night Festival&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F47E; Got &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1562103821840502784&quot;&gt;new stickers!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;September&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F440; Saw &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1565946352080523266&quot;&gt;Uncle Raymond&lt;/a&gt;, a &lt;a href&#x3D;&quot;https://www.channelnewsasia.com/singapore/uncle-raymond-tiktok-dancing-video-singapore-2751001&quot;&gt;TikTok sensation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F4B8; Bought &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1566301550695239682&quot;&gt;a lot of stickers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F911; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1570676999131377665&quot;&gt;Sold&lt;/a&gt; my Macbook Air (M1) because I got the new M2 now.&lt;/li&gt;
&lt;li&gt;&amp;#x1F4B0; Almost got &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1571879690658525184&quot;&gt;scammed&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F3A7; Got my new &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1573242192365293569&quot;&gt;Airpods Pro 2nd generation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F97A; Finally &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1575117325069451264&quot;&gt;3 meetups&lt;/a&gt; in one day (like pre-covid times).&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;October&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F4E6; Made a few 3D logos&amp;#x2026; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1577254662834561027&quot;&gt;1&lt;/a&gt; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1578219364091719680&quot;&gt;2&lt;/a&gt; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1578400619601096704&quot;&gt;3&lt;/a&gt; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1578566280998580225&quot;&gt;4&lt;/a&gt; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1578693407144554497&quot;&gt;5&lt;/a&gt; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1578950142182363136&quot;&gt;6&lt;/a&gt; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1579414342943924224&quot;&gt;7&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&amp;#x1F4F1; Started using a new pretty nice &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1579285794623467521&quot;&gt;Lock Screen wallpaper&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F39F;&amp;#xFE0F; Attended &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1579852745812869120&quot;&gt;ViteConf&lt;/a&gt; online.&lt;/li&gt;
&lt;li&gt;&amp;#x1F9A6; &lt;a href&#x3D;&quot;https://www.reddit.com/r/singapore/comments/y55n45/i_made_a_3d_model_of_tracetogether_otter/&quot;&gt;Designed&lt;/a&gt; another &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1581267045240295424&quot;&gt;3D mascot&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F3A8; Designed yet another &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1583785195668328449&quot;&gt;3D mascot&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F199; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1584712248651837440&quot;&gt;Upgraded&lt;/a&gt; to macOS Ventura and iOS 16.1.&lt;/li&gt;
&lt;li&gt;&amp;#x1F31E; Got a free &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1585119776895954944&quot;&gt;TEL3 sunshade pouch&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F929; Tested the new &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1585143638845112320&quot;&gt;iOS16 Live Activities from CityMapper&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x26F0;&amp;#xFE0F; Remade &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1585627075477528576&quot;&gt;3D models from Monument Valley level 1&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F39F;&amp;#xFE0F; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1586240578949242880&quot;&gt;Attended&lt;/a&gt; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1586309722818256896&quot;&gt;Geekcamp&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F91A; Designed &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1586603224529707009&quot;&gt;a 3D hand&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;November&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F4FA; Got &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1587268513164451841&quot;&gt;a new YouTube handle&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F600; Designed &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1587462133612130307&quot;&gt;a 3D emoji&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F370; Designed &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1587745777081729029&quot;&gt;UIlicious&amp;apos;s logo in 3D&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x26F3; Made &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1588044067383803904&quot;&gt;a 3D golf game&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F418; Start using Mastodon &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/109295299882124302&quot;&gt;again&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x2728; Played with &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1589573334102347777&quot;&gt;Spline&amp;apos;s Conditional Logic&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F684; Visited &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1590970134633787394&quot;&gt;all 11 new stations in Thomson-East Coast line&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F6B6; Had a &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1591832831378206720&quot;&gt;walk&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F682; Updated &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1593545139602870272&quot;&gt;RailRouter.SG&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F68F; Made some UI updates for &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1594990167261343745&quot;&gt;bus stop 66271&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F5FA;&amp;#xFE0F; Played &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1596847755074445314&quot;&gt;a little with Mapbox Tiling Service&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F3D7;&amp;#xFE0F; Started &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1597613196734787584&quot;&gt;building something&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;December&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&amp;#x1F4AF; Hit &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1600296819418103809&quot;&gt;100-day streak&lt;/a&gt; on Product Hunt.&lt;/li&gt;
&lt;li&gt;&amp;#x1F680; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1603241907970519040&quot;&gt;Soft-launched&lt;/a&gt; an alpha version of my Mastodon web client.&lt;/li&gt;
&lt;li&gt;&amp;#x1F327;&amp;#xFE0F; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1604441852513435649&quot;&gt;Set up a Mastodon bot account&lt;/a&gt; for checkweather.sg.&lt;/li&gt;
&lt;li&gt;&amp;#x1F381; &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1604855085737345029&quot;&gt;GitHub Unwrapped&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&amp;#x1F9BE; Got &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1605226397131497472&quot;&gt;access&lt;/a&gt; to Notion AI.&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;Work and unemployment&lt;/h2&gt;&lt;p&gt;After working for almost 3 years with work-from-home and sometimes-work-from-office arrangement, it gets pretty tiring. The &lt;a href&#x3D;&quot;/blog/2020/12/2020-in-review&quot;&gt;first year&lt;/a&gt; (2020) was cool as everyone starts to learn how to juggle things around. The &lt;a href&#x3D;&quot;/blog/2022/01/2021-in-review&quot;&gt;second year&lt;/a&gt; became pretty distressing for me, especially when I got hospitalised (not due to that disease).&lt;/p&gt;&lt;p&gt;This year is supposedly better in many ways as it&amp;apos;s almost &amp;quot;post-pandemic&amp;quot; with lesser restrictions, but the tiredness start to kick in for me. A lot of things happen, a lot of problems to be solved, a lot of uncertainties. Despite seeing other folks moving on with new plans ahead, I felt like I&amp;apos;m stuck. In this pandemic or post-pandemic sense, I feel like I&amp;apos;m still in 2020. In the career side of things, I feel like I&amp;apos;ve been stuck for more than 10 years.&lt;/p&gt;&lt;p&gt;On April, I &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1514565947884924937&quot;&gt;tweeted&lt;/a&gt;:&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;Been working for 16 years (first web dev job, excluding my part-time freelance work while schooling) Seems like my career ladder has been flat for the past 10 years. Maybe my approach has been wrong all the while.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;There&amp;apos;s a few good replies, though sadly some were like &amp;quot;me too&amp;quot; answers &amp;#x1F622;.&lt;/p&gt;&lt;p&gt;On July, I posted &lt;a href&#x3D;&quot;https://news.ycombinator.com/item?id&#x3D;32008368&quot;&gt;this on Hacker News&lt;/a&gt;, answering the question for &amp;quot;&lt;a href&#x3D;&quot;https://news.ycombinator.com/item?id&#x3D;32006252&quot;&gt;Ask HN: Where are all the senior front end engineers?&lt;/a&gt;&amp;quot;:&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;I&amp;apos;m a senior FE engineer in Singapore, been doing FE since 2000, here&amp;apos;s what I think:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Job descriptions and interviews now are skewed towards &amp;quot;full-stack&amp;quot; or backend. Most interviews are lacking or outdated due to the fast and volatile nature of FE.&lt;/li&gt;
&lt;li&gt;Literally no career progression if you&amp;apos;re specialised in FE. Most BE or &amp;quot;full-stack&amp;quot; devs will be given a chance to become principal engineers, tech leads, engineering managers, CTOs, etc. I&amp;apos;ve seen folks with &amp;quot;FE Team Lead&amp;quot; titles but never goes beyond that.&lt;/li&gt;
&lt;li&gt;FE is a subconsciously looked-down field. Neither a designer nor an engineer. Product/design team won&amp;apos;t involve you in meetings (but will treat you like a code monkey). BE/&amp;quot;full-stack&amp;quot;/API engineers will think your job is easy and keep throwing business logic stuff to FE.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;&lt;p&gt;This got &lt;a href&#x3D;&quot;https://www.linkedin.com/feed/update/urn:li:activity:6950717836327563264/&quot;&gt;reposted&lt;/a&gt; on LinkedIn and gained quite a few reactions.&lt;/p&gt;&lt;p&gt;Overall, I&amp;apos;m not really looking for an answer. These are just rants. It may not apply to all other companies and of course, there are many other factors besides these areas. I can complain all day long but life goes on and I&amp;apos;ll still need to do what I need to do. These feelings probably have escalated due to anxiety and recent incidents all over the world.&lt;/p&gt;&lt;p&gt;I needed a break.&lt;/p&gt;&lt;p&gt;So I quit my job and became unemployed since July. It took quite a long while for this feeling of unemployment to kick in, after all these years of working from home. When I have a job, I work from home. Now that I don&amp;apos;t have a job, I&amp;apos;m still&amp;#x2026; at home &amp;#x1F602;. I guess it became very obvious that my work and personal life are not properly separated.&lt;/p&gt;&lt;p&gt;I&amp;apos;ve talked with a few people and there are two kinds:&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;People who also felt like quitting and asking me how I manage to quit without any plans, regarding my career and my budget to sustain &amp;#x1F605;.&lt;/li&gt;
&lt;li&gt;People who told me they&amp;apos;ve done it before, and it was liberating for them &amp;#x1F607;.&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;This isn&amp;apos;t the first time I have a career break. My first time was in &lt;a href&#x3D;&quot;/blog/2015/12/2015-in-review&quot;&gt;2015&lt;/a&gt;. I personally describe it as &amp;quot;school holidays for working adults&amp;quot;. At that time, I travelled to Tokyo and San Francisco. This time, I chose not to travel anywhere. I get asked why a lot of times and I mention that travelling is actually &lt;em&gt;more&lt;/em&gt; tiring. I mean, it&amp;apos;s tiring in a good and enjoyable way, but I don&amp;apos;t need that now.&lt;/p&gt;&lt;p&gt;Being unemployed is a double-edge sword. It feels great not to think about work, but at the same time, it feels bad because &lt;em&gt;everything&lt;/em&gt; needs money and it gets worse with the recent wake of mass &lt;a href&#x3D;&quot;https://layoffs.fyi/&quot;&gt;tech layoffs&lt;/a&gt;. I personally know how this feels, not very affected by them, and have learned to prioritise my own mental health. I don&amp;apos;t have the capacity to save others if I don&amp;apos;t save myself first.&lt;/p&gt;&lt;p&gt;It&amp;apos;s been 6 months of unemployment. I don&amp;apos;t have plans yet but I&amp;apos;ll just do what I can do.&lt;/p&gt;&lt;h2&gt;Projects&lt;/h2&gt;&lt;p&gt;This year started &lt;strong&gt;great&lt;/strong&gt; for my side projects.&lt;/p&gt;&lt;p&gt;On January, &lt;strong&gt;Wordle&lt;/strong&gt; became popular, so I &lt;a href&#x3D;&quot;/blog/2022/02/chengyu-wordle-is-not-a-love-story&quot;&gt;made my own variant of Wordle called &lt;strong&gt;Chengyu Wordle&lt;/strong&gt;&lt;/a&gt; and it &lt;a href&#x3D;&quot;https://www.facebook.com/leehsienloong/posts/484183366401131&quot;&gt;got mentioned by the Prime Minister&lt;/a&gt; &amp;#x1F631;!&lt;/p&gt;&lt;figure&gt;&lt;a href&#x3D;&quot;https://www.facebook.com/leehsienloong/posts/484183366401131&quot;&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/facebook-post-lee-hsien-loong-chengyu-wordle@2x.png&quot; alt&#x3D;&quot;Facebook post by Lee Hsien Loong, with the content &amp;#x201C;Many Singaporeans have joined in the fun of playing Wordle - an online word puzzle game, where the goal is to guess a five-letter word within six tries. This game has become such a viral sensation that it was recently purchased by The New York Times. I&amp;#x2019;ve even noticed some ministries and agencies using the green, yellow and grey squares to liven up government messaging! I was pleasantly surprised to find out that there are Chinese and Malay versions of the game. Give it a go &amp;#x2013; a simple but fun way to keep the mind engaged. Original https://www.powerlanguage.co.uk/wordle/ Chinese: https://cheeaun.github.io/chengyu-wordle/ Malay: https://www.projecteugene.com/katapat.html &amp;#x2013; LHL&amp;#x201D;&quot; width&#x3D;&quot;538&quot; height&#x3D;&quot;755&quot; loading&#x3D;&quot;lazy&quot;&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;I was thinking of printing this screenshot and hang it on the wall or something &amp;#x1F602;.&lt;/p&gt;&lt;p&gt;On June, I made a &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1534867432887951365&quot;&gt;&lt;strong&gt;Spiral Emoji Wallpaper Generator&lt;/strong&gt;&lt;/a&gt;. It got &lt;a href&#x3D;&quot;https://twitter.com/hrdbacot/status/1534934417579204613&quot;&gt;quote-tweeted by @hrdbacot&lt;/a&gt;, a Twitter user account with 800K+ followers &amp;#x1F631;.&lt;/p&gt;&lt;figure&gt;&lt;a href&#x3D;&quot;https://twitter.com/hrdbacot/status/1534934417579204613&quot;&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/twitter-post-hrdbacot-spiral-emoji-wallpaper-generator@2x.jpg&quot; alt&#x3D;&quot;Twitter post by @hrdbacot, quote-tweeting my tweet about my Spiral Emoji Wallpaper Generator project, with a generated wallpaper of spiralling &amp;quot;&amp;#x1F64F;&amp;quot; characters. The quote-tweet received up to 200+ retweets, 30+ quote tweets and 600+ likes.&quot; width&#x3D;&quot;598&quot; height&#x3D;&quot;1514&quot; loading&#x3D;&quot;lazy&quot;&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;This was super fun and hilarious, as I could see how others were playing around with the wallpaper generator.&lt;/p&gt;&lt;p&gt;On December, I &lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/109515757404630583&quot;&gt;soft-launched &lt;strong&gt;a new Mastodon web client&lt;/strong&gt; called Phanpy&lt;/a&gt;. It was also &lt;a href&#x3D;&quot;https://mastodon.social/@tbernard/109547007513595567&quot;&gt;mentioned by Tobias Bernard&lt;/a&gt; which gave it a lot more attention. &amp;#x1F631;&lt;/p&gt;&lt;figure&gt;&lt;a href&#x3D;&quot;https://mastodon.social/@cheeaun/109515757404630583&quot;&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/mastodon-post-cheeaun-soft-launch-phanpy-social@2x.png&quot; alt&#x3D;&quot;Mastodon post by @cheeaun, soft-launching a new Mastodon client called Phanpy&quot; width&#x3D;&quot;578&quot; height&#x3D;&quot;502&quot;&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;I spent quite a good chunk of time on this, typically enjoying the process as it reminded me of the time when I was building my own Twitter client &lt;a href&#x3D;&quot;https://www.slideshare.net/cheeaun/story-of-a-thousand-birds&quot;&gt;13 years ago&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;As always, I learn a lot whenever I work on new side projects. Many more to come.&lt;/p&gt;&lt;h2&gt;3D Designs&lt;/h2&gt;&lt;p&gt;Last year, I made quite a bunch of 3D-based maps. I&amp;apos;m especially proud of &lt;a href&#x3D;&quot;/blog/2021/11/replicating-3d-trees-apple-maps&quot;&gt;my Apple-Maps-like 3D trees work&lt;/a&gt; &amp;#x1F929;.&lt;/p&gt;&lt;p&gt;This year, I went &lt;strong&gt;all in&lt;/strong&gt; &amp;#x1F3CB;&amp;#xFE0F;&amp;#x200D;&amp;#x2642;&amp;#xFE0F;, using a cool 3D design tool called &lt;a href&#x3D;&quot;https://spline.design/&quot;&gt;Spline&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Geekcamp logo&lt;/h3&gt;&lt;p&gt;I designed the &lt;a href&#x3D;&quot;https://github.com/cheeaun/geekcampsg-2017-design&quot;&gt;Geekcamp logo back in 2017&lt;/a&gt; and has been wondering if it would look cool in 3D. So, here goes&amp;#x2026;&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/logos/geekcamp-sg-3d-logo-cartoonish@2x.png&quot; alt&#x3D;&quot;Geekcamp logo in 3D, cartoonish look&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot; loading&#x3D;&quot;lazy&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/logos/geekcamp-sg-3d-logo-cartoonish-outline@2x.png&quot; alt&#x3D;&quot;Geekcamp logo in 3D, cartoonish look with outlines&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/logos/geekcamp-sg-3d-logo-cartoonish-glass@2x.png&quot; alt&#x3D;&quot;Geekcamp logo in 3D, cartoonish look with glass effect&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/logos/geekcamp-sg-3d-logo-cartoonish-different-angle@2x.png&quot; alt&#x3D;&quot;Geekcamp logo in 3D, cartoonish look from a different angle&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot; loading&#x3D;&quot;lazy&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/logos/geekcamp-sg-3d-logo-glass-dark@2x.png&quot; alt&#x3D;&quot;Geekcamp logo in 3D, with glass effect and dark background&quot; width&#x3D;&quot;400&quot; height&#x3D;&quot;297&quot;&gt;&lt;/figure&gt;&lt;p&gt;At this point, I thought to myself, why not a 3D Pac-Man? &amp;#x1F648;&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/logos/geekcamp-sg-3d-logo-pacman-campfire@2x.png&quot; alt&#x3D;&quot;Geekcamp logo in 3D, with 3 Pac-Mans hanging out around a campfire&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot; loading&#x3D;&quot;lazy&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/logos/geekcamp-sg-3d-logo-pacman-campfire-singapore-island@2x.png&quot; alt&#x3D;&quot;Geekcamp logo in 3D, with 3 Pac-Mans hanging out around a campfire, on Singapore island&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot; loading&#x3D;&quot;lazy&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;h3&gt;TraceTogether otter&lt;/h3&gt;&lt;p&gt;I wanted to draw a 3D model of a cute animal and somehow &lt;a href&#x3D;&quot;https://support.tracetogether.gov.sg/hc/en-sg/articles/6369942748569-What-does-the-animated-otter-on-the-home-screen-green-pass-mean-&quot;&gt;TraceTogether&amp;apos;s&lt;/a&gt; &lt;a href&#x3D;&quot;https://www.tech.gov.sg/media/technews/how-otters-got-into-tracetogether&quot;&gt;oTTer&lt;/a&gt; &lt;a href&#x3D;&quot;https://www.straitstimes.com/singapore/designer-behind-otter-on-tracetogether-check-in-page-wanted-it-to-dance&quot;&gt;mascot&lt;/a&gt; came into &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1581267045240295424&quot;&gt;mind&lt;/a&gt; &amp;#x1F9A6;. It&amp;apos;s a conversion of 2D art to 3D art.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/fanart/oTTer-front-view@2x.png&quot; alt&#x3D;&quot;Otter in 3D, front view&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/fanart/oTTer-tilt-view@2x.png&quot; alt&#x3D;&quot;Otter in 3D, tilted view&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/fanart/oTTer-face@2x.png&quot; alt&#x3D;&quot;Otter&amp;apos;s face in 3D&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/fanart/oTTer-side-view@2x.png&quot; alt&#x3D;&quot;Otter in 3D, side view&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/fanart/oTTer-bottom-view@2x.png&quot; alt&#x3D;&quot;Otter in 3D, bottom view&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/fanart/oTTer-face-2@2x.png&quot; alt&#x3D;&quot;Otter&amp;apos;s face in 3D, again&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;p&gt;It&amp;apos;s also animated! &amp;#x1F929;&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/fanart/oTTer-animated.gif&quot; alt&#x3D;&quot;Otter in 3D, swimming, animated version&quot; width&#x3D;&quot;600&quot; height&#x3D;&quot;367&quot; loading&#x3D;&quot;lazy&quot;&gt;&lt;/figure&gt;&lt;p&gt;This sort of &amp;quot;went viral&amp;quot; on &lt;a href&#x3D;&quot;https://www.reddit.com/r/singapore/comments/y55n45/i_made_a_3d_model_of_tracetogether_otter/&quot;&gt;Reddit /r/singapore&lt;/a&gt; (2K+ upvotes), my &lt;a href&#x3D;&quot;https://www.tiktok.com/@cheeauntok/video/7154801101768822017&quot;&gt;TikTok video&lt;/a&gt; (34K+ plays) and my &lt;a href&#x3D;&quot;https://www.linkedin.com/feed/update/urn:li:activity:6987244528290205696/&quot;&gt;LinkedIn post&lt;/a&gt; (600+ reactions, 43K+ impressions) &amp;#x1F631;.&lt;/p&gt;&lt;h3&gt;Bun&amp;apos;s mascot&lt;/h3&gt;&lt;p&gt;After designing the otter, I wanted to &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1583785195668328449&quot;&gt;try another simple mascot&lt;/a&gt; to further spruce up my skills. &lt;a href&#x3D;&quot;https://bun.sh/&quot;&gt;Bun is a fast all-in-one JavaScript runtime&lt;/a&gt; and this is the mascot:&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/fanart/bun-mascot-animated.gif&quot; alt&#x3D;&quot;Bun&amp;apos;s mascot in 3D, animated&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;798&quot; loading&#x3D;&quot;lazy&quot;&gt;&lt;/figure&gt;&lt;p&gt;Cute.&lt;/p&gt;&lt;h3&gt;Monument Valley level 1&lt;/h3&gt;&lt;p&gt;I wanted to try something isometrical, especially ever since my attempt at &lt;a href&#x3D;&quot;/blog/2016/09/designing-artwork-reddotrubyconf-2016&quot;&gt;designing the artwork for RedDotRubyConf in 2016&lt;/a&gt;. &lt;a href&#x3D;&quot;https://www.monumentvalleygame.com/&quot;&gt;Monument Valley&lt;/a&gt; (game) is definitely something I &lt;em&gt;really, really, really&lt;/em&gt; want to try replicating &amp;#x1F924;.&lt;/p&gt;&lt;p&gt;This is a tad more challenging but I manage to &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1585627075477528576&quot;&gt;re-draw the whole Level 1 of Monument Valley game&lt;/a&gt; &amp;#x1F929;.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/fanart/monument-valley-level-1@2x.png&quot; alt&#x3D;&quot;Monument Valley level 1, in 3D&quot; width&#x3D;&quot;630&quot; height&#x3D;&quot;680&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/fanart/monument-valley-level-1-zoom-in@2x.png&quot; alt&#x3D;&quot;Monument Valley level 1, in 3D, zoomed-in view&quot; width&#x3D;&quot;748&quot; height&#x3D;&quot;658&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;p&gt;Okay, these probably look like screenshots from the game, right? &lt;strong&gt;Wrong.&lt;/strong&gt; The cross handle is clickable to rotate the path!&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/fanart/monument-valley-level-1-clickable-handle.gif&quot; alt&#x3D;&quot;Monument Valley level 1, in 3D, with a clickable handle that rotates the path&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;661&quot; loading&#x3D;&quot;lazy&quot;&gt;&lt;/figure&gt;&lt;p&gt;Rotatable too.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/fanart/monument-valley-level-1-rotatable.gif&quot; alt&#x3D;&quot;Monument Valley level 1, in 3D, rotatable&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;661&quot; loading&#x3D;&quot;lazy&quot;&gt;&lt;/figure&gt;&lt;p&gt;I&amp;apos;ve uploaded a &lt;a href&#x3D;&quot;https://www.youtube.com/watch?v&#x3D;UKfNzfKL1j8&quot;&gt;full 5-min time-lapse video of remaking the 3D models from Monument Valley on YouTube&lt;/a&gt;, to prove that I actually made them from scratch. &amp;#x1F4F9;&lt;/p&gt;&lt;h3&gt;My hand&lt;/h3&gt;&lt;p&gt;Okay, this is not a logo or a mascot. Just my hand because I wanted to draw something more complicated. I didn&amp;apos;t quite finish this one because there&amp;apos;s just too many details &amp;#x1F629;. I &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1586603224529707009&quot;&gt;got pretty close&lt;/a&gt; though. &amp;#x1F91A;&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/fanart/my-hand@2x.jpg&quot; alt&#x3D;&quot;My hand in 3D&quot; width&#x3D;&quot;1024&quot; height&#x3D;&quot;1366&quot; loading&#x3D;&quot;lazy&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/fanart/my-thumb@2x.jpg&quot; alt&#x3D;&quot;My thumb in 3D&quot; width&#x3D;&quot;1024&quot; height&#x3D;&quot;1366&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;p&gt;Look ma, one hand!&lt;/p&gt;&lt;h3&gt;Microsoft Windows&amp;apos; 3D Fluent Emoji&lt;/h3&gt;&lt;p&gt;I reverse-engineered (reverse-designed?) &lt;a href&#x3D;&quot;https://www.theverge.com/2022/8/10/23299527/microsoft-emoji-open-source-creators&quot;&gt;Microsoft&amp;apos;s&lt;/a&gt; &lt;a href&#x3D;&quot;https://github.com/microsoft/fluentui-emoji&quot;&gt;open-source 3D Fluent Emoji&lt;/a&gt;. They &lt;a href&#x3D;&quot;https://www.linkedin.com/pulse/making-fluent-emoji-nando-costa/&quot;&gt;designed&lt;/a&gt; it in 3D but &lt;a href&#x3D;&quot;https://github.com/microsoft/fluentui-emoji/issues/14&quot;&gt;didn&amp;apos;t really share&lt;/a&gt; the actual 3D files, possibly made in Maxon&amp;apos;s Cinema 4D.&lt;/p&gt;&lt;p&gt;I &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1587462133612130307&quot;&gt;took up&lt;/a&gt; the challenge to recreate them in 3D, by referencing the 2D artwork, starting with the most basic &amp;quot;&amp;#x1F600;&amp;quot; emoji.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/fanart/microsoft-windows-3d-fluent-emoji@2x.png&quot; alt&#x3D;&quot;Microsoft Windows 3D Fluent emoji; left one showing the 2D art of &amp;quot;&amp;#x1F600;&amp;quot; emoji, right one showing the 3D version of &amp;quot;&amp;#x1F600;&amp;quot; emoji&quot; width&#x3D;&quot;600&quot; height&#x3D;&quot;411&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/fanart/microsoft-windows-3d-fluent-emoji-zoom-in@2x.png&quot; alt&#x3D;&quot;The &amp;quot;&amp;#x1F604;&amp;quot; emoji in 3D, zoomed-in to the eyes&quot; width&#x3D;&quot;861&quot; height&#x3D;&quot;596&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/fanart/microsoft-windows-3d-fluent-emoji-zoom-in-another-angle@2x.png&quot; alt&#x3D;&quot;The &amp;quot;&amp;#x1F604;&amp;quot; emoji in 3D, zoomed-in above the eyes&quot; width&#x3D;&quot;1024&quot; height&#x3D;&quot;633&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;p&gt;The shadows look like freckles there. Subtle yet refined &amp;#x1F9D0;.&lt;/p&gt;&lt;p&gt;I made &lt;a href&#x3D;&quot;https://www.youtube.com/watch?v&#x3D;S9rbDP51Nxc&quot;&gt;a 11-minute time-lapse tutorial video on YouTube&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;UI-licious logo&lt;/h3&gt;&lt;p&gt;Back to another logo and this time it&amp;apos;s &lt;a href&#x3D;&quot;https://uilicious.com/&quot;&gt;UI-licious&lt;/a&gt;, a local startup working on a low-code tool for automating UI testing for your websites across browsers (This is not sponsored &amp;#x1F606;).&lt;/p&gt;&lt;p&gt;Their logo looks easy for me to test other things out, so &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1587745777081729029&quot;&gt;why not&lt;/a&gt;?&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/fanart/ui-licious-logo@2x.png&quot; alt&#x3D;&quot;UI-licious logo in 3D, front view&quot; width&#x3D;&quot;902&quot; height&#x3D;&quot;402&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/fanart/ui-licious-logo-tilt-view@2x.png&quot; alt&#x3D;&quot;UI-licious logo in 3D, tilted view&quot; width&#x3D;&quot;847&quot; height&#x3D;&quot;423&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;p&gt;Shiny! &amp;#x1F485;&amp;#x2728;&lt;/p&gt;&lt;p&gt;Again, I made &lt;a href&#x3D;&quot;https://www.youtube.com/watch?v&#x3D;KdUHKZteCXE&quot;&gt;a 6-minute time-lapse video&lt;/a&gt;.&lt;/p&gt;&lt;h3&gt;Golf game&lt;/h3&gt;&lt;p&gt;On September, &lt;a href&#x3D;&quot;https://twitter.com/splinetool/status/1575169493449338887&quot;&gt;Spline added physics&lt;/a&gt; and I really got to try it out! I made &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1588044067383803904&quot;&gt;an interactive golf game&lt;/a&gt; with a weird slope to prevent the golf ball from falling off the edge.&lt;/p&gt;&lt;figure&gt;&lt;video src&#x3D;&quot;/blog/videos/artwork/golf-game-3d.mp4#t&#x3D;0.1&quot; controls loop playsinline&#x3D;&quot;&quot;&gt;&lt;/video&gt;&lt;/figure&gt;&lt;p&gt;I accidentally learned how to name parts of a golf club like shaft, clubhead and grip. Even the thing that holds the the golf ball is called a &lt;a href&#x3D;&quot;https://en.wikipedia.org/wiki/Tee&quot;&gt;tee&lt;/a&gt;.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/objects/golf-game-3d-names-spline@2x.png&quot; alt&#x3D;&quot;Golf game in 3D, showing the UI for naming the 3D objects&quot; width&#x3D;&quot;810&quot; height&#x3D;&quot;501&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;p&gt;Yes, I name my layers properly &amp;#x1F609;.&lt;/p&gt;&lt;h3&gt;Conditional Logic&lt;/h3&gt;&lt;p&gt;On October, &lt;a href&#x3D;&quot;https://twitter.com/splinetool/status/1580260520300785665&quot;&gt;Spline introduced Conditional Logic&lt;/a&gt;, which feels like programming but for 3D objects! &amp;#x1F929; I played around with it and &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1589573334102347777&quot;&gt;made some sort of disk trying to make sure the ball doesn&amp;apos;t fall over&lt;/a&gt;.&lt;/p&gt;&lt;figure&gt;&lt;video src&#x3D;&quot;/blog/videos/artwork/spline-conditional-logic-disk-ball-3d.mp4#t&#x3D;0.1&quot; controls loop playsinline&#x3D;&quot;&quot;&gt;&lt;/video&gt;&lt;/figure&gt;&lt;p&gt;I made a &lt;a href&#x3D;&quot;https://www.youtube.com/watch?v&#x3D;aA-i2bhM7Aw&quot;&gt;6-min time-lapse video&lt;/a&gt;, basically just trying to keep the ball from falling over &amp;#x1F606;.&lt;/p&gt;&lt;p&gt;I probably should&amp;apos;ve written &lt;em&gt;another&lt;/em&gt; blog post dedicated to my 3D designs, but I had so much fun that I don&amp;apos;t even feel like writing anything. &amp;#x1F923;&lt;/p&gt;&lt;h2&gt;Looking back&lt;/h2&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/scenery/flower-dome-gardens-by-the-bay-night-singapore.jpg&quot; alt&#x3D;&quot;Flower Dome, Gardens by the Bay, at night in Singapore&quot; width&#x3D;&quot;1024&quot; height&#x3D;&quot;1365&quot;&gt;&lt;/figure&gt;&lt;p&gt;Instead of just this year, I start to look back further. I&amp;apos;ve been thinking about my whole career, my personal life, relationships, friendships and my passions.&lt;/p&gt;&lt;p&gt;I&amp;apos;ll be hitting the big four-oh in 3 years (well, actually 2).&lt;/p&gt;&lt;p&gt;It feels kind of scary.&lt;/p&gt;&lt;p&gt;As others have moved on, getting promoted, trying out new roles, gained more responsibilities, moved out from their parents&amp;apos; house, got married, had kids, migrated to other countries, bought a new house, joined another company or found a new one, I feel&amp;#x2026; stuck.&lt;/p&gt;&lt;p&gt;It&amp;apos;s hard to resist the urge to compare with other people&amp;apos;s lives, even though I&amp;apos;ve always been doing things at my own pace.&lt;/p&gt;&lt;p&gt;It was quite timely when I saw this post on Hacker News: &amp;quot;&lt;a href&#x3D;&quot;https://news.ycombinator.com/item?id&#x3D;34052201&quot;&gt;Ask HN: Has anyone here turned around their life in their 40s?&lt;/a&gt;&amp;quot;. Some responses mentioned that we&amp;apos;re not alone as everyone else are also having same thoughts in varying difficult situations. Some people had worse, managed to turn things around and having a better life now in their 50s.&lt;/p&gt;&lt;p&gt;This career break is like pressing the pause button for me to think about what to do now and what I want to do in the future. Honestly speaking, &lt;em&gt;nothing&lt;/em&gt; comes into mind, as I&amp;apos;m slowly re-adapting and maybe &lt;em&gt;undoing&lt;/em&gt; all the things that has changed in my life thanks to the pandemic. They are not really big changes, but small ones add up.&lt;/p&gt;&lt;p&gt;I do know that no matter what happens, I need to do &lt;em&gt;something&lt;/em&gt;. Nothing will change if I don&amp;apos;t take any actions. In fact, things around me are constantly changing while I&amp;apos;m doing &lt;em&gt;nothing&lt;/em&gt;, and these things will ultimately force or influence me to do &lt;em&gt;something&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;Oh well, looking forward to more uncertainties ahead.&lt;/p&gt;</content>
			<link rel="alternate" type="text/html" href="https://cheeaun.com/blog/2022/12/2022-in-review/" title="2022 in review"/>
		</entry>
		<entry>
			<id>https://cheeaun.com/blog/2022/02/chengyu-wordle-is-not-a-love-story/</id>
			<updated>2022-02-14T00:00:00Z</updated>
			<title type="text">Chengyu Wordle Is Not a Love Story</title>
			<summary type="text">From The New York Times article “Wordle Is a Love Story”, it began as a sweet love story of Josh Wardle building a game for his partner. It became…</summary>
			<content type="html">&lt;p&gt;From The New York Times article &amp;#x201C;&lt;a href&#x3D;&quot;https://www.nytimes.com/2022/01/03/technology/wordle-word-game-creator.html&quot;&gt;Wordle Is a Love Story&lt;/a&gt;&amp;#x201D;, it began as a sweet love &lt;a href&#x3D;&quot;https://youtu.be/X_e2IEaR4aA?t&#x3D;1019&quot;&gt;story&lt;/a&gt; of &lt;a href&#x3D;&quot;https://en.wikipedia.org/wiki/Josh_Wardle&quot;&gt;Josh Wardle&lt;/a&gt; building a game for his partner. It became super popular and now has &lt;a href&#x3D;&quot;https://en.wikipedia.org/wiki/Wordle&quot;&gt;its own Wikipedia page&lt;/a&gt;.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/wordle-brag.jpg&quot; alt&#x3D;&quot;Wordle brag on social media&quot; width&#x3D;&quot;800&quot; height&#x3D;&quot;600&quot;&gt;&lt;/figure&gt;&lt;p&gt;I first saw it on my Twitter timeline when people keep posting their Wordle results. I was honestly annoyed because they were just bragging and the results didn&amp;#x2019;t really tell much. At that time, I didn&amp;#x2019;t play Wordle yet, so I pretty much ignored them. They kind of pollute the social media timelines, &lt;em&gt;but&lt;/em&gt; at least they&amp;apos;re &lt;strong&gt;better&lt;/strong&gt; than ads. &amp;#x1F937;&amp;#x200D;&amp;#x2642;&amp;#xFE0F;&lt;/p&gt;&lt;p&gt;Due to peer pressure, I started playing it.&lt;/p&gt;&lt;p&gt;I also came across a few &amp;#x201C;forks&amp;#x201D; of Wordle:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://twitter.com/millerdl/status/1484286518005051394&quot;&gt;Primel, by David Lawrence&lt;/a&gt; - guess a 5 digit prime number.&lt;/li&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://twitter.com/pveyes/status/1484454960586579968&quot;&gt;Katla, by Fatih Kalifa&lt;/a&gt; - Wordle, in Indonesian language.&lt;/li&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://twitter.com/narze/status/1484596261277900810&quot;&gt;Thwordle, by Manassarn Manoonchai&lt;/a&gt; - Wordle, in Thai language.&lt;/li&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://amanz.my/2022322924/&quot;&gt;Katapat, by Eugene Low&lt;/a&gt; - Wordle, in Bahasa Malaysia.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;I&amp;apos;m like, &amp;#x201C;Hey, that&amp;apos;s pretty cool, but maybe I could try something else?&amp;#x201D;.&lt;/p&gt;&lt;p&gt;On 21 January 2022, I &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1484482726644183041&quot;&gt;tweeted&lt;/a&gt;:&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;Wordle, but for Chinese idioms.&lt;/p&gt;
&lt;p&gt;#idea&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;This was timely, because Chinese New Year was coming up.&lt;/p&gt;&lt;p&gt;I looked up some data from a few Google searches and realised that this is kind of doable.&lt;/p&gt;&lt;h2&gt;Finding the dataset&lt;/h2&gt;&lt;p&gt;For Wordle, one of the rules of the game is that each guess must be a valid 5-letter word. So Wordle needs a &lt;em&gt;huge&lt;/em&gt; list of valid 5-letter words in its database.&lt;/p&gt;&lt;p&gt;For Chinese idioms, I would need the same thing and I found a huge list of idioms from &lt;a href&#x3D;&quot;https://github.com/pwxcoo/chinese-xinhua&quot;&gt;pwxcoo/chinese-xinhua&lt;/a&gt; repository. They are the Chinese Xinhua Dictionary Database (&amp;#x4E2D;&amp;#x534E;&amp;#x65B0;&amp;#x534E;&amp;#x5B57;&amp;#x5178;&amp;#x6570;&amp;#x636E;&amp;#x5E93;) with a total of 31,648 idioms, where roughly 29,502 of them are 4-letter idioms.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;That&amp;#x2019;s a lot.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;I don&amp;#x2019;t think anyone will be able to remember that many idioms. I probably can filter out some common or well-known ones but I don&amp;#x2019;t really know how to do that.&lt;/p&gt;&lt;p&gt;A little googling lead me to another dataset from &lt;a href&#x3D;&quot;https://github.com/thunlp/THUOCL&quot;&gt;thunlp/THUOCL&lt;/a&gt; repository. It&amp;#x2019;s &lt;strong&gt;THUOCL&lt;/strong&gt; which stands for THU (&lt;a href&#x3D;&quot;https://www.tsinghua.edu.cn/&quot;&gt;Tsinghua University&lt;/a&gt;) Open Chinese Lexicon (&amp;#x6E05;&amp;#x534E;&amp;#x5927;&amp;#x5B66;&amp;#x5F00;&amp;#x653E;&amp;#x4E2D;&amp;#x6587;&amp;#x8BCD;&amp;#x5E93;).&lt;/p&gt;&lt;p&gt;It has roughly 8000+ idioms and contains word frequency statistics DF value (Document Frequency).&lt;/p&gt;&lt;p&gt;To be honest, I don&amp;#x2019;t know exactly how the frequency statistics are done. This is really not my domain expertise so I think I&amp;#x2019;ll just use whatever dataset available and focus on the game coding side of things instead &amp;#x1F602;.&lt;/p&gt;&lt;h2&gt;Building the game&lt;/h2&gt;&lt;p&gt;Generally speaking, the idea is &lt;a href&#x3D;&quot;https://twitter.com/JuanitoFatas/status/1484496229010599940&quot;&gt;not new&lt;/a&gt;.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/pinyincaichengyu-com@2x.png&quot; alt&#x3D;&quot;pinyincaichengyu.com, showing the &amp;#x201C;How to play&amp;#x201D; section&quot; width&#x3D;&quot;375&quot; height&#x3D;&quot;667&quot;&gt;&lt;/figure&gt;&lt;p&gt;There&amp;#x2019;s already the very popular &lt;a href&#x3D;&quot;https://pinyincaichengyu.com/&quot;&gt;&amp;#x62FC;&amp;#x97F3;&amp;#x731C;&amp;#x6210;&amp;#x8BED;&lt;/a&gt; (P&amp;#x12B;ny&amp;#x12B;n c&amp;#x101;i ch&amp;#xE9;ngy&amp;#x1D4;) made by &lt;a href&#x3D;&quot;https://limboy.me/&quot;&gt;Li Zhong&lt;/a&gt;, which uses &lt;a href&#x3D;&quot;https://en.wikipedia.org/wiki/Pinyin&quot;&gt;pinyin&lt;/a&gt; input to guess Chinese idioms. It&amp;#x2019;s using the same QWERTY keyboard as Wordle, but with &lt;em&gt;more&lt;/em&gt; than five letter tiles. It validates the words individually, generally the pinyin spelling &lt;em&gt;per&lt;/em&gt; Chinese character, so you can&amp;#x2019;t just randomly type invalid pinyin and throw in all the vowels &amp;#x1F602;.&lt;/p&gt;&lt;p&gt;I had a different idea.&lt;/p&gt;&lt;p&gt;Instead of constructing the pinyin to form an idiom, I feel that it would be better if there&amp;#x2019;s more focus on the Chinese characters themselves instead of alphabets.&lt;/p&gt;&lt;p&gt;JinGen &lt;a href&#x3D;&quot;https://twitter.com/jg_lim/status/1484506430711697412&quot;&gt;joked&lt;/a&gt; that the hypothetical keyboard would be massive &amp;#x1F923;:&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/wordle-chinese-keyboard@2x.png&quot; alt&#x3D;&quot;Wordle mock-up, with a massive Chinese keyboard&quot; width&#x3D;&quot;1280&quot; height&#x3D;&quot;666&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;p&gt;Of course, Chinese keyboards don&amp;#x2019;t really look like that. On iOS, there are two kinds; &lt;a href&#x3D;&quot;https://chinese.yabla.com/type-chinese-characters.php?platform&#x3D;ios&quot;&gt;pinyin keyboard and handwriting recognition&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I don&amp;#x2019;t know, I find them too much work, just to play a game.&lt;/p&gt;&lt;p&gt;In Wordle, a player tap 5 keys to get a 5-letter word. For Chinese characters, a player need to tap quite a lot of keys just to form one character. For example, the word &amp;#x201C;pinyin&amp;#x201D; consists of 6 alphabetical letters to form 2 Chinese characters (&amp;#x62FC;&amp;#x97F3;).&lt;/p&gt;&lt;p&gt;So I want one tap &#x3D; one character. But JinGen&amp;#x2019;s mockup above is ridiculous.&lt;/p&gt;&lt;p&gt;I thought about this. &amp;#x1F914;&lt;/p&gt;&lt;p&gt;Instead of showing &lt;em&gt;all&lt;/em&gt; characters like JinGen&amp;#x2019;s mockup, why not a subset of them? Maybe roughly 20 characters? (QWERTY keyboard has 26)&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/software/ios-keyboard-suggestions@2x.png&quot; alt&#x3D;&quot;iOS keyboard suggestions interface&quot; width&#x3D;&quot;368&quot; height&#x3D;&quot;332&quot;&gt;&lt;/figure&gt;&lt;p&gt;Instead of the full keyboard, why not emulate the suggestions a.k.a. Predictive Text at the top of the keyboard?&lt;/p&gt;&lt;p&gt;So for every idiom, I could generate a list of 20 characters. It&amp;#x2019;ll be minimum 20 characters and they could form a minimum of 6 idioms, because there are 6 chances. And it&amp;#x2019;s not just minimum 6 possible idioms, it&amp;#x2019;s minimum 6 possible &amp;#x201C;high-frequency&amp;#x201D; idioms, which could later form a few more &amp;#x201C;low-frequency&amp;#x201D; idioms.&lt;/p&gt;&lt;p&gt;At this point, I have no idea if this would work at all.&lt;/p&gt;&lt;p&gt;I coded it anyway &amp;#x1F937;&amp;#x200D;&amp;#x2642;&amp;#xFE0F;.&lt;/p&gt;&lt;p&gt;The &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1484482726644183041&quot;&gt;first prototype&lt;/a&gt; looks like this:&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/chengyu-wordle-first-prototype@2x.jpg&quot; alt&#x3D;&quot;Chengyu Wordle first prototype&quot; width&#x3D;&quot;320&quot; height&#x3D;&quot;568&quot;&gt;&lt;/figure&gt;&lt;p&gt;Not bad.&lt;/p&gt;&lt;p&gt;I use the &lt;a href&#x3D;&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/ruby&quot;&gt;HTML &lt;code&gt;ruby&lt;/code&gt; annotation element&lt;/a&gt; to display the pinyin above the Chinese characters. The specifications may have changed slightly but &lt;a href&#x3D;&quot;https://chenhuijing.com/blog/html-ruby/&quot;&gt;Hui Jing has explained them in depth&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Later on, I &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1484717109100032005&quot;&gt;found&lt;/a&gt; that I&amp;#x2019;m not the first person who came up with this idea. There&amp;#x2019;s another &lt;a href&#x3D;&quot;http://www.ddooo.com/softdown/44315.htm&quot;&gt;Android-based game&lt;/a&gt; that shows a list of characters as the keyboard:&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/software/fengkuang-cai-chengyu-anzhuo-ban-crazy-guess-idioms-android.jpg&quot; alt&#x3D;&quot;[&amp;#x75AF;&amp;#x72C2;&amp;#x731C;&amp;#x6210;&amp;#x8BED;&amp;#x5B89;&amp;#x5353;&amp;#x7248; (F&amp;#x113;ngku&amp;#xE1;ng c&amp;#x101;i ch&amp;#xE9;ngy&amp;#x1D4; &amp;#x101;nzhu&amp;#x14D; b&amp;#x1CE;n)](http://www.ddooo.com/softdown/44315.htm)&quot; width&#x3D;&quot;320&quot; height&#x3D;&quot;421&quot;&gt;&lt;/figure&gt;&lt;p&gt;It has 24 keys and even has an image illustration as hints &amp;#x1F92F;.&lt;/p&gt;&lt;p&gt;That&amp;#x2019;s quite impressive if the game really has illustrations for &lt;em&gt;every&lt;/em&gt; idiom. I mean, imagine hiring an artist drawing hints for all thousands of idioms &amp;#x1F92F;.&lt;/p&gt;&lt;p&gt;Anyway, I wasn&amp;#x2019;t deterred from this and decided to keep going with my implementation.&lt;/p&gt;&lt;h2&gt;Adapting to the viewports&lt;/h2&gt;&lt;p&gt;Wordle is actually responsive for different viewport dimensions.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/responsive-wordle@2x.png&quot; alt&#x3D;&quot;Responsive Wordle, in 3 viewport sizes&quot; width&#x3D;&quot;1000&quot; height&#x3D;&quot;625&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;ul&gt;
&lt;li&gt;The letter tiles will shrink in smaller viewports.&lt;/li&gt;
&lt;li&gt;The letter tiles will grow in larger viewports, but there&amp;#x2019;s a maximum width and height, so that the letters won&amp;#x2019;t be too big.&lt;/li&gt;
&lt;li&gt;The keyboard will &lt;em&gt;not&lt;/em&gt; shrink in smaller viewports because it&amp;#x2019;s where people type. No one likes small keypads.&lt;/li&gt;
&lt;li&gt;The keyboard will grow in larger viewports but there&amp;#x2019;s a maximum width and height too.&lt;/li&gt;
&lt;li&gt;In larger viewports, the keyboard will always stick to the bottom and there&amp;#x2019;ll be blank spaces &lt;em&gt;around&lt;/em&gt; the letters board.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Wordle uses a combination of CSS Flexbox and JavaScript code for this magic.&lt;/p&gt;&lt;p&gt;I manage to &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1484869992483295232&quot;&gt;re-implement&lt;/a&gt; this, with pure CSS.&lt;/p&gt;&lt;figure&gt;&lt;video controls src&#x3D;&quot;/blog/videos/web/chengyu-wordle-responsive-layout.mp4#t&#x3D;0.1&quot; playsinline&#x3D;&quot;&quot;&gt;&lt;/video&gt;&lt;/figure&gt;&lt;p&gt;Few tricks were used such as the &lt;a href&#x3D;&quot;https://developer.mozilla.org/en-US/docs/Web/CSS/aspect-ratio&quot;&gt;&lt;code&gt;aspect-ratio&lt;/code&gt; CSS property&lt;/a&gt; combined with &lt;code&gt;max-height&lt;/code&gt; on the tile rows.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/responsive-chengyu-wordle@2x.png&quot; alt&#x3D;&quot;Responsive Chengyu Wordle, in 5 viewport sizes&quot; width&#x3D;&quot;1500&quot; height&#x3D;&quot;794&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;p&gt;Unlike Wordle, the keyboard doesn&amp;#x2019;t need to be exactly 3 rows or match how a software keyboard looks like on mobile operating systems. In even smaller viewports, with smaller heights, the keyboard becomes a one-liner and horizontally scrollable!&lt;/p&gt;&lt;p&gt;Crazily enough, it even &lt;a href&#x3D;&quot;https://twitter.com/llun/status/1489498893452668935&quot;&gt;works on&lt;/a&gt; &lt;a href&#x3D;&quot;https://www.llun.me/posts/dev/2022-02-05-apple-watch-browser/&quot;&gt;Apple Watch&lt;/a&gt;! &amp;#x1F92F;&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/photos/objects/chengyu-wordle-browser-apple-watch.jpg&quot; alt&#x3D;&quot;Chengyu Wordle inside a browser on Apple Watch&quot; width&#x3D;&quot;480&quot; height&#x3D;&quot;640&quot;&gt;&lt;/figure&gt;&lt;h2&gt;Keyboard shortcuts&lt;/h2&gt;&lt;p&gt;Despite showing a software keyboard, Wordle also works with the hardware keyboard, which is usually meant for desktop players.&lt;/p&gt;&lt;p&gt;I think there are some Chinese (hardware) keyboards out there but I&amp;#x2019;ve never used them. I always use my Macbook&amp;#x2019;s QWERTY keyboard.&lt;/p&gt;&lt;p&gt;I &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1485254481348816897&quot;&gt;added&lt;/a&gt; some basic keyboard shortcuts.&lt;/p&gt;&lt;figure&gt;&lt;video controls src&#x3D;&quot;/blog/videos/web/chengyu-wordle-keyboard-shortcuts.mp4#t&#x3D;0.1&quot; playsinline&#x3D;&quot;&quot;&gt;&lt;/video&gt;&lt;/figure&gt;&lt;p&gt;Pressing a letter will match the first letter of the pinyin. For example, pressing &amp;#x2018;Q&amp;#x2019; will choose &amp;#x2018;qi&amp;#xE1;n&amp;#x2019;.&lt;/p&gt;&lt;p&gt;If the letter has many matches, pressing right or left arrow will cycle through them. For example, for &amp;#x2018;J&amp;#x2019;, the arrow keys will cycle through &amp;#x2018;ji&amp;#xE0;n&amp;#x2019; &amp;#x2018;j&amp;#xEC;n&amp;#x2019; and &amp;#x2018;j&amp;#x12B;ng&amp;#x2019;.&lt;/p&gt;&lt;p&gt;Pretty neat.&lt;/p&gt;&lt;h2&gt;Beta testing&lt;/h2&gt;&lt;p&gt;Since I have no idea if this would work at all, I &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1485981757644353539&quot;&gt;asked around&lt;/a&gt; for people to help beta test the game.&lt;/p&gt;&lt;p&gt;Surprisingly feedback has been quite interesting. Somehow the game becomes either &lt;em&gt;too easy&lt;/em&gt; or &lt;em&gt;too difficult&lt;/em&gt; for the players. There&amp;#x2019;s hardly a middle ground here &amp;#x1F605;. So it&amp;#x2019;s either the players knows a large vocabulary of idioms or just one or two of them &amp;#x1F602;.&lt;/p&gt;&lt;p&gt;Along the testing period, there were some &lt;em&gt;small&lt;/em&gt; issues.&lt;/p&gt;&lt;h2&gt;Pinyin&lt;/h2&gt;&lt;p&gt;Pinyin for some characters were wrong. My initial attempt was quite hacky, so I solved it by using the whole &lt;a href&#x3D;&quot;https://github.com/hotoo/pinyin&quot;&gt;&lt;code&gt;pinyin&lt;/code&gt;&lt;/a&gt; library, currently maintained by &lt;a href&#x3D;&quot;https://github.com/hotoo&quot;&gt;hotoo (&amp;#x95F2;&amp;#x8018;&amp;#x2122;)&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;I was honestly surprised that pinyin mapping doesn&amp;#x2019;t work one-to-one, but one-to-many. &amp;#x1F914;&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/pinyin-mapping@2x.png&quot; alt&#x3D;&quot;Pinyin mapping, from individual pinyin characters to many Chinese characters&quot; width&#x3D;&quot;603&quot; height&#x3D;&quot;287&quot;&gt;&lt;/figure&gt;&lt;p&gt;However, more than a week later, someone reported a bug to me:&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/software/player-feedback-twitter-dm-wrong-pin-yin-mou-liao@2x.png&quot; alt&#x3D;&quot;Player feedback on Twitter Direct Message about a wrong pinyin. The message includes a screenshot and a message &amp;#x201C;hi this word should be read as &amp;#x2018;mou&amp;#x2019; not &amp;#x2018;liao&amp;#x2019;&amp;#x201D;&quot; width&#x3D;&quot;562&quot; height&#x3D;&quot;618&quot;&gt;&lt;/figure&gt;&lt;p&gt;I was quite surprised to see this and turns out, this is &lt;strong&gt;heteronym&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Some Chinese characters are spelled and written the same way, but pronounced differently based on certain context.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/zdic-pinyin-mou-miu-miao-mu-liao@2x.png&quot; alt&#x3D;&quot;ZDIC web site showing the multiple pinyin for &amp;#x7F2A;&quot; width&#x3D;&quot;617&quot; height&#x3D;&quot;273&quot;&gt;&lt;/figure&gt;&lt;p&gt;I looked again at the &lt;a href&#x3D;&quot;https://github.com/hotoo/pinyin&quot;&gt;documentation for &lt;code&gt;pinyin&lt;/code&gt; package&lt;/a&gt; and realised that it serves a different dictionary for the web version compared to its Node version. The web version is &lt;em&gt;simpler&lt;/em&gt; and smaller in file size. The author encourages that this pinyin conversion should be done in the back-end instead of front-end &amp;#x1F914;.&lt;/p&gt;&lt;p&gt;Hmm, for this game, I don&amp;#x2019;t plan to do this on the server-side though.&lt;/p&gt;&lt;p&gt;So I tried a few ways to somehow &lt;em&gt;force&lt;/em&gt; the library to use the Node version but to no avail. I ended up using a different library called &lt;a href&#x3D;&quot;https://github.com/zh-lx/pinyin-pro&quot;&gt;&lt;code&gt;pinyin-pro&lt;/code&gt;&lt;/a&gt;, currently maintained by &lt;a href&#x3D;&quot;https://zlxiang.com/&quot;&gt;Zhou Li Xiang&lt;/a&gt;. It seems to have the whole dictionary and able to handle heteronyms too!&lt;/p&gt;&lt;p&gt;After some testing and &lt;a href&#x3D;&quot;https://github.com/zh-lx/pinyin-pro/issues/43&quot;&gt;a bug fix&lt;/a&gt;, I manage to implement a pretty good implementation of a multiple-pinyin interface.&lt;/p&gt;&lt;p&gt;The pinyin shown on the keyboard will be based on the whole idiom context instead of per-character.&lt;/p&gt;&lt;p&gt;Technically, &lt;code&gt;pinyin(&amp;apos;&amp;#x7F2A;&amp;apos;)&lt;/code&gt; returns &lt;code&gt;m&amp;#xF9;&lt;/code&gt; (from &lt;code&gt;pinyin-pro&lt;/code&gt; library) or &lt;code&gt;li&amp;#xE1;o&lt;/code&gt; (from the previous &lt;code&gt;pinyin&lt;/code&gt; library). But &lt;code&gt;pinyin(&amp;apos;&amp;#x672A;&amp;#x96E8;&amp;#x7EF8;&amp;#x7F2A;&amp;apos;)&lt;/code&gt; &lt;em&gt;should&lt;/em&gt; correctly return &lt;code&gt;w&amp;#xE8;i y&amp;#x1D4; ch&amp;#xF3;u m&amp;#xF3;u&lt;/code&gt; (notice that it&amp;#x2019;s &lt;code&gt;m&amp;#xF3;u&lt;/code&gt; now). So the pinyin on the keyboard should show &lt;code&gt;m&amp;#xF3;u&lt;/code&gt;.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/chengyu-wordle-keys-luo-mou-ping@2x.png&quot; alt&#x3D;&quot;Chengyu Wordle showing keys &amp;#x201C;&amp;#x7F57;&amp;#x201D; (lu&amp;#xF3;), &amp;#x201C;&amp;#x7F2A;&amp;#x201D; (m&amp;#xF3;u) and &amp;#x201C;&amp;#x5E73;&amp;#x201D; (p&amp;#xED;ng)&quot; width&#x3D;&quot;168&quot; height&#x3D;&quot;68&quot;&gt;&lt;/figure&gt;&lt;p&gt;But for some games, it&amp;#x2019;s possible that one character exhibits different pronunciations for different idioms. An example would be the character &amp;#x2018;&lt;strong&gt;&amp;#x6076;&lt;/strong&gt;&amp;#x2018; in the idioms &amp;#x6076;&amp;#x6027;&amp;#x5FAA;&amp;#x73AF; (&lt;strong&gt;&amp;#xE8;&lt;/strong&gt; x&amp;#xEC;ng x&amp;#xFA;n hu&amp;#xE1;n) and &amp;#x75DB;&amp;#x6DF1;&amp;#x6076;&amp;#x7EDD; (t&amp;#xF2;ng sh&amp;#x113;n &lt;strong&gt;w&amp;#xF9;&lt;/strong&gt; ju&amp;#xE9;). In this special case, the keyboard will show &lt;em&gt;both&lt;/em&gt; pinyins.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/chengyu-wordle-keys-dao-e-wu-gui@2x.png&quot; alt&#x3D;&quot;Chengyu Wordle showing keys &amp;#x201C;&amp;#x8E48;&amp;#x201D; (d&amp;#x1CE;o), &amp;#x201C;&amp;#x6076;&amp;#x201D; (&amp;#xE8; or w&amp;#xF9;) and &amp;#x201C;&amp;#x89C4;&amp;#x201D; (gu&amp;#x12B;)&quot; width&#x3D;&quot;186&quot; height&#x3D;&quot;104&quot;&gt;&lt;/figure&gt;&lt;p&gt;Then what happens to the pinyin on the game tiles? Well, they&amp;#x2019;ll dynamically change based on the whole constructed idiom as-you-type! &amp;#x1F92F;&lt;/p&gt;&lt;figure&gt;&lt;video controls src&#x3D;&quot;/blog/videos/web/chengyu-wordle-heteronym-support.mp4#t&#x3D;0.1&quot; playsinline&#x3D;&quot;&quot;&gt;&lt;/video&gt;&lt;/figure&gt;&lt;h2&gt;Idiom definitions&lt;/h2&gt;&lt;p&gt;I added an extra link that points to the definition or explanation of the hidden idiom. They will be shown in the results dialog when a player won or lost the game.&lt;/p&gt;&lt;p&gt;The first candidate was &lt;a href&#x3D;&quot;https://cc-cedict.org/editor/editor.php?handler&#x3D;Main&quot;&gt;CC-CEDICT&lt;/a&gt;. It&amp;#x2019;s &lt;a href&#x3D;&quot;https://cc-cedict.org/wiki/&quot;&gt;a project&lt;/a&gt; to create an online, downloadable public-domain Chinese-English dictionary.&lt;/p&gt;&lt;figure&gt;&lt;a href&#x3D;&quot;https://cc-cedict.org/editor/editor.php?handler&#x3D;QueryDictionary&amp;amp;querydictionary_search&#x3D;%E5%9D%9A%E5%AE%9A%E4%B8%8D%E7%A7%BB&quot;&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/idiom-definition-cc-cedict@2x.png&quot; alt&#x3D;&quot;Idiom definition on CC-CEDICT&quot; width&#x3D;&quot;662&quot; height&#x3D;&quot;571&quot;&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;Unfortunately, it doesn&amp;#x2019;t seem to have &lt;em&gt;all&lt;/em&gt; the idiom entries, and mostly return not-found results &amp;#x1F622;.&lt;/p&gt;&lt;p&gt;Then, one of the testers found &lt;a href&#x3D;&quot;https://hanyu.baidu.com/&quot;&gt;Baidu Hanyu (&amp;#x767E;&amp;#x5EA6;&amp;#x6C49;&amp;#x8BED;)&lt;/a&gt;.&lt;/p&gt;&lt;figure&gt;&lt;a href&#x3D;&quot;https://hanyu.baidu.com/s?wd&#x3D;%E5%9D%9A%E5%AE%9A%E4%B8%8D%E7%A7%BB&quot;&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/idiom-definition-baidu-hanyu@2x.png&quot; alt&#x3D;&quot;Idiom definition on Baidu Hanyu&quot; width&#x3D;&quot;794&quot; height&#x3D;&quot;404&quot; class&#x3D;&quot;large&quot;&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;Seems better, but some idiom entries were missing too &amp;#x1F605;.&lt;/p&gt;&lt;p&gt;Then, I found &lt;a href&#x3D;&quot;https://www.zdic.net/&quot;&gt;ZDIC&lt;/a&gt; from &lt;a href&#x3D;&quot;https://twitter.com/_limboy/status/1487769444541931521&quot;&gt;Li Zhong&amp;#x2019;s tweet&lt;/a&gt;, as he&amp;#x2019;s also adding idiom definitions on &lt;a href&#x3D;&quot;https://pinyincaichengyu.com/&quot;&gt;pinyincaichengyu.com&lt;/a&gt;.&lt;/p&gt;&lt;figure&gt;&lt;a href&#x3D;&quot;https://www.zdic.net/hans/%E5%9D%9A%E5%AE%9A%E4%B8%8D%E7%A7%BB&quot;&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/idiom-definition-zdic@2x.png&quot; alt&#x3D;&quot;Idiom definition on ZDIC&quot; width&#x3D;&quot;671&quot; height&#x3D;&quot;539&quot;&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;In the end, I use both Baidu and ZDIC links for the sake of completeness.&lt;/p&gt;&lt;p&gt;I&amp;#x2019;ve even included the definitions into the game itself.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/chengyu-wordle-won-jian-ding-bu-yi-idiom-definition@2x.png&quot; alt&#x3D;&quot;Chengyu Wordle&amp;#x2019;s dialog showing the player has won with inline idiom definition&quot; width&#x3D;&quot;315&quot; height&#x3D;&quot;268&quot;&gt;&lt;/figure&gt;&lt;h2&gt;Chinese font&lt;/h2&gt;&lt;p&gt;During the beta test period, the game uses the &lt;a href&#x3D;&quot;https://fonts.google.com/specimen/Ma+Shan+Zheng&quot;&gt;Ma Shan Zheng font&lt;/a&gt; from Google Fonts. It looks pretty nice.&lt;/p&gt;&lt;p&gt;One of the testers found a bug:&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/ma-shan-zheng-font-bug@2x.png&quot; alt&#x3D;&quot;Ma Shan Zheng font bug, incorrectly rendering a Chinese character&quot; width&#x3D;&quot;581&quot; height&#x3D;&quot;406&quot;&gt;&lt;/figure&gt;&lt;p&gt;The character &amp;#x201C;&amp;#x4E3C;&amp;#x201D; is rendered as &amp;#x201C;&amp;#x5F17;&amp;#x201D;?!?&lt;/p&gt;&lt;p&gt;This is &lt;em&gt;really&lt;/em&gt; weird. It&amp;#x2019;s probably due to the font not supporting all glyphs, so I researched a little and found that it&amp;#x2019;s &lt;em&gt;really&lt;/em&gt; difficult to find a good custom (and free) Chinese font. Even when I found one, the web font file sizes are seriously &lt;strong&gt;huge&lt;/strong&gt;! &amp;#x1F605;&lt;/p&gt;&lt;p&gt;There are some very detailed articles on this:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;http://kendraschaefer.com/2012/06/chinese-standard-web-fonts-the-ultimate-guide-to-css-font-family-declarations-for-web-design-in-simplified-chinese/&quot;&gt;Chinese Standard Web Fonts: A Guide to CSS Font Family Declarations for Web Design in Simplified Chinese&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://webdesign.tutsplus.com/articles/the-complete-beginners-guide-to-chinese-fonts--cms-23444&quot;&gt;The Complete Beginner&amp;#x2019;s Guide to Chinese Fonts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://minitheory.com/2015/04/06/5-high-quality-chinese-webfont-services-for-your-next-chinese-web-project/&quot;&gt;5 High Quality Chinese Webfont services for your next Chinese web project&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;As a quick fix, I removed the font. Will probably revisit this later.&lt;/p&gt;&lt;h2&gt;Start date for daily idioms&lt;/h2&gt;&lt;p&gt;On the original Wordle, a new word is available every day. It&amp;#x2019;s not timezone-specific and actually relies on the user&amp;#x2019;s device timezone (local timezone).&lt;/p&gt;&lt;p&gt;This is an interesting thought. Timezone specificity is not important here for this game, unlike an app or a web product. All players can start playing the next new word around the clock instead of everyone around the globe waiting for that specific hour in the day, which could be 4AM or something. It might seem &amp;#x201C;unfair&amp;#x201D; for some players that some could play a new word &lt;em&gt;earlier&lt;/em&gt; than players in the other timezone, but it doesn&amp;#x2019;t really matter as long as players only post the results without spoilers. For the more technical folks, they could actually skip to next day or any days by changing their operating system&amp;#x2019;s clock &amp;#x1F606;.&lt;/p&gt;&lt;p&gt;From the implementation side, it could be a list of words and every word is assigned to specific dates. The question is how are they assigned? Off the top of my head, I think that the first day of the year could be the first word, 2nd day is the 2nd word and so on, but that means it&amp;#x2019;s limited to 365 words (year 2022)? Should it overflow to next year, so 1st January 2023 will serve the 366th word?&lt;/p&gt;&lt;p&gt;During the time when I build Chengyu Wordle, it&amp;#x2019;s already a few days after 1st January 2022, so setting the first idiom to day 1 would mean no one will be able to play it &amp;#x1F605;.&lt;/p&gt;&lt;p&gt;My curiosity lead to digging in the code in Wordle.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/wordle-source-code-hardcoded-start-date-game-index-calculation@2x.png&quot; alt&#x3D;&quot;Wordle&amp;#x2018;s JavaScript source code, showing a hard-coded start date and the game index calculation&quot; width&#x3D;&quot;571&quot; height&#x3D;&quot;209&quot;&gt;&lt;/figure&gt;&lt;p&gt;Aha! The variable &lt;code&gt;Ha&lt;/code&gt; is a hard-coded start date! It&amp;#x2019;s &lt;strong&gt;19 June 2021&lt;/strong&gt;! (Months are zero-indexed in JavaScript)&lt;/p&gt;&lt;pre&gt;&lt;code class&#x3D;&quot;language-javascript&quot;&gt;function Na(e, a) {
  var s &#x3D; new Date(e)
    , t &#x3D; newDate(a).setHours(0, 0, 0, 0) - s.setHours(0, 0, 0, 0);
  return Math.round(t / 864e5)
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;There&amp;#x2019;s another function &lt;code&gt;Na&lt;/code&gt; that accepts two date values, which are supposedly the start date and today&amp;#x2019;s date, and returns the index. So if today&amp;#x2019;s date is 19 June 2021, it returns 0 (first word). 20 June 2021 returns 1 (second word) and so on.&lt;/p&gt;&lt;pre&gt;&lt;code class&#x3D;&quot;language-javascript&quot;&gt;function Da(e) {
  var a, s &#x3D; Ga(e);
  return a &#x3D; s % La.length,
  La[a]
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The next function &lt;code&gt;Da&lt;/code&gt; is a surprising find for me. It will cycle back to 0 once the index reaches the last word of the list. For example, if the game has a list of 100 words, what happens on the 101st day? Well, this logic will serve back the first word!&lt;/p&gt;&lt;p&gt;I think this is a pretty neat solution. It solves the problem of what if you&amp;#x2019;ve missed the last few days of words and thought that you can&amp;#x2019;t play them anymore. Once the list of words is exhausted, you&amp;#x2019;ll go back to the beginning of the list again &amp;#x267B;&amp;#xFE0F;.&lt;/p&gt;&lt;p&gt;For Chengyu Wordle, it started &lt;em&gt;without&lt;/em&gt; this daily game feature. To compensate, I added a button that allows players to play a random idiom. Few days after testing, I added this daily game feature and set day 1 to &lt;strong&gt;27 January 2022&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Mathematically speaking, with 8000+ idioms in Chengyu Wordle, if a player plays one idiom per day, it&amp;#x2019;ll &lt;strong&gt;take more than 21 years to finish all the idioms&lt;/strong&gt;. &amp;#x1F92F;&lt;/p&gt;&lt;h2&gt;Evaluation rules&lt;/h2&gt;&lt;p&gt;Guessing words on Wordle will show the letters in coloured tiles.&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;Green &#x3D; The letter is in the word and in the correct spot.&lt;/li&gt;
&lt;li&gt;Yellow &#x3D; The letter is in the word but in the wrong spot.&lt;/li&gt;
&lt;li&gt;Gray &#x3D; The letter is not in the word in any spot.&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;They might look simple at first, but oh boy, almost &lt;a href&#x3D;&quot;https://news.ycombinator.com/item?id&#x3D;30174386&quot;&gt;everyone&lt;/a&gt; &lt;a href&#x3D;&quot;https://news.ycombinator.com/item?id&#x3D;30233600&quot;&gt;fell&lt;/a&gt; &lt;a href&#x3D;&quot;https://news.ycombinator.com/item?id&#x3D;30086083&quot;&gt;into&lt;/a&gt; &lt;a href&#x3D;&quot;https://news.ycombinator.com/item?id&#x3D;29947881&quot;&gt;this&lt;/a&gt; &lt;a href&#x3D;&quot;https://news.ycombinator.com/item?id&#x3D;30103848&quot;&gt;trap&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;It&amp;#x2019;s explained in this page written by Alex Selby: &lt;a href&#x3D;&quot;http://sonorouschocolate.com/notes/index.php?title&#x3D;The_best_strategies_for_Wordle&quot;&gt;The best strategies for Wordle&lt;/a&gt;:&lt;/p&gt;&lt;blockquote&gt;
&lt;p&gt;I &lt;em&gt;think&lt;/em&gt; the colour scoring rules work like this, but would be happy to be corrected.&lt;/p&gt;
&lt;p&gt;Let&amp;apos;s refer to your guess as &lt;em&gt;testword&lt;/em&gt;, and the secret word as &lt;em&gt;hiddenword&lt;/em&gt;. Then I believe the scoring rules are these:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First determine all greens, and cross out these letters in &lt;em&gt;testword&lt;/em&gt; and &lt;em&gt;hiddenword&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Then from left to right in &lt;em&gt;testword&lt;/em&gt; see which letters correspond to a letter in &lt;em&gt;hiddenword&lt;/em&gt;. If you find one, then it&amp;apos;s a yellow, but you need to cross it off in &lt;em&gt;hiddenword&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Remaining positions are scored as black.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The second point means that you can&amp;apos;t reuse letters in &lt;em&gt;hiddenword&lt;/em&gt;, so for example the total number of green &amp;apos;T&amp;apos;s and yellow &amp;apos;T&amp;apos;s in &lt;em&gt;testword&lt;/em&gt; can&amp;apos;t exceed the number of &amp;apos;T&amp;apos;s in &lt;em&gt;hiddenword&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;So if &lt;em&gt;hiddenword&lt;/em&gt; is &lt;strong&gt;HOTEL&lt;/strong&gt; then the &lt;em&gt;testword&lt;/em&gt; &lt;strong&gt;SILLY&lt;/strong&gt; would score &lt;strong&gt;BBYBB&lt;/strong&gt;: the second &amp;apos;L&amp;apos; does not score because only one &amp;apos;L&amp;apos; can, and the earlier one takes precendence.&lt;/p&gt;
&lt;p&gt;But if &lt;em&gt;hiddenword&lt;/em&gt; were &lt;strong&gt;DAILY&lt;/strong&gt; then the same &lt;em&gt;testword&lt;/em&gt; &lt;strong&gt;SILLY&lt;/strong&gt; would score &lt;strong&gt;BYBGG&lt;/strong&gt;. This time it&amp;apos;s the first &amp;apos;L&amp;apos; that doesn&amp;apos;t score, because even though it is earlier than the &amp;apos;L&amp;apos; in fourth position, greens take priority over yellows.&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;The trap lies in repeated letters in a word.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Instead of just a single loop to mark which letter is green or yellow, the logic needs to keep track of repeated letters, loop through again and either mark some letters yellow or not.&lt;/p&gt;&lt;p&gt;Initially my code handled the above cases and I was quite proud. Until someone reported another bug:&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/chengyu-wordle-chu-chu-bug@2x.jpg&quot; alt&#x3D;&quot;Chengyu Wordle bug, showing only one character in yellow tile, instead of two&quot; width&#x3D;&quot;299&quot; height&#x3D;&quot;325&quot;&gt;&lt;/figure&gt;&lt;p&gt;On the second row, both of the character &amp;#x201C;&amp;#x695A;&amp;#x201D; (ch&amp;#x1D4;) should be in yellow because the hidden idiom is &amp;#x6E05;&amp;#x6E05;&amp;#x695A;&amp;#x695A; (q&amp;#x12B;ng q&amp;#x12B;ng ch&amp;#x1D4; ch&amp;#x1D4;)!&lt;/p&gt;&lt;p&gt;I was quite dumbfounded, got fed up and &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1490329731958734848&quot;&gt;started writing tests&lt;/a&gt;.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/software/chengyu-wordle-tests-idiom-states@2x.png&quot; alt&#x3D;&quot;Chengyu Wordle tests, in JavaScript, for idiom states; testing every possible cases for highlighting the green, yellow and gray tiles&quot; width&#x3D;&quot;613&quot; height&#x3D;&quot;426&quot;&gt;&lt;/figure&gt;&lt;p&gt;My logic fails when there are repeated letters in &lt;strong&gt;both&lt;/strong&gt; the &lt;em&gt;testword&lt;/em&gt; and &lt;em&gt;hiddenword&lt;/em&gt;. And now with this tests, this will finally be fixed once and for all!&lt;/p&gt;&lt;h2&gt;Finishing touches&lt;/h2&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/artwork/web/chengyu-wordle-banner@2x.jpg&quot; alt&#x3D;&quot;Chengyu Wordle banner, for the social media previews&quot; width&#x3D;&quot;600&quot; height&#x3D;&quot;314&quot;&gt;&lt;/figure&gt;&lt;p&gt;It&amp;#x2019;s almost done, and I added a little sprinkle of finishing touches to the game:&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href&#x3D;&quot;https://adactio.com/journal/9881&quot;&gt;Metacrap&lt;/a&gt;&lt;/strong&gt;: All the titles, descriptions, icons and social media preview images.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Idiom IDs&lt;/strong&gt;: Besides allowing players to play a random idiom, each idiom is also assigned its own unique ID that&amp;#x2019;s shareable. So if someone shares the results, a link below the results will include the ID that goes to this exact idiom instead of the idiom of the day.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hints&lt;/strong&gt;: I added a &amp;#x201C;I&amp;#x2019;m stuck&amp;#x201D; button at the bottom of the keyboard, after seeing some folks struggled hard at the game. Every time it&amp;#x2019;s tapped, it&amp;#x2019;ll show a different hint. Technically, the hints should be good enough to be unstuck. &amp;#x1F609;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hard mode&lt;/strong&gt;: While some players are having a hard time playing the game, some actually think that it&amp;#x2019;s &lt;em&gt;too easy&lt;/em&gt;. So, I introduced &amp;#x201C;&lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1491353605747908611&quot;&gt;Hard mode&lt;/a&gt;&amp;#x201D;, which works a bit differently than Wordle&amp;#x2019;s. In Wordle&amp;#x2019;s &amp;#x201C;Hard mode&amp;#x201D;, any revealed hints must be used in subsequent guesses. In Chengyu Wordle, the number of keys increase from minimum 20 to 40, thus increasing the number of possible idiom guesses in a game.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Localisation&lt;/strong&gt;: The game is available in both English and Simplified Chinese. The strings for Simplified Chinese were hastily translated via Google Translate, so help is pretty much needed. &amp;#x1F64F;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Old browsers support&lt;/strong&gt;: I use &lt;a href&#x3D;&quot;https://vitejs.dev/&quot;&gt;Vite&lt;/a&gt; to bundle the code and needed to use &lt;a href&#x3D;&quot;https://github.com/vitejs/vite/tree/main/packages/plugin-legacy&quot;&gt;@vitejs/plugin-legacy&lt;/a&gt; to create production builds for legacy browsers. For some reason, there are &lt;strong&gt;a lot&lt;/strong&gt; of folks using &lt;em&gt;really&lt;/em&gt; old Android phones with old browsers, as the errors are tracked via &lt;a href&#x3D;&quot;https://www.bugsnag.com/&quot;&gt;Bugsnag&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Analytics&lt;/strong&gt;: I took this chance to try a few privacy-friendly analytics like &lt;a href&#x3D;&quot;https://panelbear.com/&quot;&gt;Panelbear&lt;/a&gt;, &lt;a href&#x3D;&quot;https://pirsch.io/&quot;&gt;Pirsch&lt;/a&gt; and &lt;a href&#x3D;&quot;https://plausible.io/&quot;&gt;Plausible&lt;/a&gt;. In the end, I end up using Plausible for its better user interface and features.&lt;/li&gt;
&lt;/ul&gt;&lt;h2&gt;The launch&lt;/h2&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/figures/interface/chengyu-wordle-iphone-screenshot.jpg&quot; alt&#x3D;&quot;Chengyu Wordle on iPhone screenshot&quot; width&#x3D;&quot;1024&quot; height&#x3D;&quot;843&quot;&gt;&lt;/figure&gt;&lt;p&gt;I officially launched &lt;a href&#x3D;&quot;https://cheeaun.github.io/chengyu-wordle/&quot;&gt;Chengyu Wordle&lt;/a&gt; on &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1486655277516480527&quot;&gt;27 January 2022&lt;/a&gt;, just one week after my &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1484482726644183041&quot;&gt;first tweet&lt;/a&gt; and 4 days before Chinese New Year! &amp;#x1F680;&lt;/p&gt;&lt;p&gt;It&amp;#x2019;s &lt;a href&#x3D;&quot;https://github.com/cheeaun/chengyu-wordle&quot;&gt;open-sourced on GitHub&lt;/a&gt;, with complete documentation on the dataset, technical setup and localisation files.&lt;/p&gt;&lt;p&gt;I&amp;#x2019;ve also made sure to attribute to other similar attempts by other talented folks!&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://bryony.dev/chengyu/chengyu.html&quot;&gt;&amp;#x731C;&amp;#x6210;&amp;#x8BED; (C&amp;#x101;i ch&amp;#xE9;ngy&amp;#x1D4;)&lt;/a&gt; by &lt;a href&#x3D;&quot;https://twitter.com/nurupo_dev&quot;&gt;@nurupo_dev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://allanchain.github.io/chinese-wordle/&quot;&gt;&amp;#x62FC;&amp;#x6210;&amp;#x8BED; | Chinese Wordle&lt;/a&gt; by &lt;a href&#x3D;&quot;https://allanchain.github.io/blog/&quot;&gt;Allan Chain&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://pinyincaichengyu.com/&quot;&gt;&amp;#x62FC;&amp;#x97F3;&amp;#x731C;&amp;#x6210;&amp;#x8BED; (P&amp;#x12B;ny&amp;#x12B;n c&amp;#x101;i ch&amp;#xE9;ngy&amp;#x1D4;)&lt;/a&gt; by &lt;a href&#x3D;&quot;https://limboy.me/&quot;&gt;Li Zhong&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://handle.antfu.me/&quot;&gt;&amp;#x6C49;&amp;#x515C; (H&amp;#xE0;n d&amp;#x14D;u)&lt;/a&gt; by &lt;a href&#x3D;&quot;https://twitter.com/antfu7&quot;&gt;Anthony&lt;/a&gt; &amp;amp; &lt;a href&#x3D;&quot;https://twitter.com/iiiiiiines_____&quot;&gt;In&amp;#xE8;s&lt;/a&gt; (Another popular one!)&lt;/li&gt;
&lt;li&gt;&lt;a href&#x3D;&quot;https://t.me/unofficial_wordle_bot&quot;&gt;Telegram @unofficial_wordle_bot&lt;/a&gt; by &lt;a href&#x3D;&quot;https://www.facebook.com/iamohcy&quot;&gt;Oh Chin Yang&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Few days later, I &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1487275289516265475&quot;&gt;made a pull request&lt;/a&gt; for Chengyu Wordle to be added to &lt;a href&#x3D;&quot;https://rwmpelstilzchen.gitlab.io/wordles/&quot;&gt;&lt;strong&gt;Wordles of the World&lt;/strong&gt;&lt;/a&gt;, the most comprehensive list of Wordle-like games and resources online.&lt;/p&gt;&lt;p&gt;Later on, I added &lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1487766797994455044&quot;&gt;dark mode&lt;/a&gt; and made this pretty cool 3D-looking mock with &lt;a href&#x3D;&quot;https://morflax.com/things&quot;&gt;Morflax Things&lt;/a&gt;.&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/figures/interface/chengyu-wordle-light-dark-mode-iphones-mock.jpg&quot; alt&#x3D;&quot;Chengyu Wordle in light and dark mode on two iPhones mock-up&quot; width&#x3D;&quot;1007&quot; height&#x3D;&quot;830&quot;&gt;&lt;/figure&gt;&lt;p&gt;Chengyu Wordle got a quite few media coverage too! Some are &lt;em&gt;very&lt;/em&gt; small mentions while some are quite prominent &amp;#x1F60E;.&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;30 Jan 2022: &lt;a href&#x3D;&quot;https://blog.user.today/wordle-games-gallery/&quot;&gt;6&amp;#x7A2E;&amp;#x82F1;&amp;#x6587;&amp;#x548C;&amp;#x4E2D;&amp;#x6587;&amp;#x7684; Wordle &amp;#x731C;&amp;#x5B57;&amp;#x904A;&amp;#x6232; &amp;#x6253;&amp;#x767C;&amp;#x6642;&amp;#x9593;&amp;#x771F;&amp;#x597D;&amp;#x7528;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;30 Jan 2022: &lt;strong&gt;Sixth Tone&lt;/strong&gt; - &lt;a href&#x3D;&quot;https://www.sixthtone.com/news/1009586/wordle-like-games-slowly-gain-traction-on-chinese-social-media-&quot;&gt;Wordle-Like Games Slowly Gain Traction on Chinese Social Media&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;2 Feb 2022: &lt;strong&gt;Kotaku&lt;/strong&gt; - &lt;a href&#x3D;&quot;https://kotaku.com/games-like-wordle-subwaydle-nyct-mta-best-routes-1848461481&quot;&gt;A Sensational Wordle Clone Without Any Actual Words&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;4 Feb 2022: &lt;strong&gt;8world Entertainment Lifestyle&lt;/strong&gt; - &lt;a href&#x3D;&quot;https://entlife.8world.com/life/nerdle-nerdle-is-a-new-maths-based-wordle-clone-1718676&quot;&gt;&amp;#x5168;&amp;#x4E16;&amp;#x754C;&amp;#x90FD;&amp;#x5728;Wordle&amp;#xFF01;&amp;#x5FEB;&amp;#x8BD5;&amp;#x8BD5;&amp;#x6570;&amp;#x5B57;&amp;#x7248;Nerdle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;4 Feb 2022: &lt;strong&gt;Mothership&lt;/strong&gt; - &lt;a href&#x3D;&quot;https://mothership.sg/2022/02/pm-lee-says-wordle-a-fun-way-to-keep-the-mind-engaged-recommends-chinese-malay-versions/&quot;&gt;PM Lee says Wordle a fun way to keep the mind engaged, recommends Chinese &amp;amp; Malay versions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;6 Feb 2022: &lt;strong&gt;&amp;#x65B0;&amp;#x52A0;&amp;#x5761;&amp;#x773C;&lt;/strong&gt; &lt;a href&#x3D;&quot;https://www.yan.sg/lixinglongzholi/&quot;&gt;&amp;#x8FD9;&amp;#x6B3E;&amp;#x5C0F;&amp;#x6E38;&amp;#x620F;&amp;#x98CE;&amp;#x9761;&amp;#x5168;&amp;#x7403;&amp;#xFF0C;&amp;#x8BA9;&amp;#x674E;&amp;#x663E;&amp;#x9F99;&amp;#x603B;&amp;#x7406;&amp;#x90FD;&amp;#x201C;&amp;#x73A9;&amp;#x4E0A;&amp;#x763E;&amp;#x4E86;&amp;#x201D;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;10 Feb 2022: &lt;strong&gt;AsiaOne&lt;/strong&gt; - &lt;a href&#x3D;&quot;https://www.asiaone.com/lifestyle/want-more-wordle-here-are-13-spin-offs-try-including-singlish-version&quot;&gt;Want more Wordle? Here are 13 spin-offs to try, including a Singlish version&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;11 Feb 2022: &lt;strong&gt;&amp;#x7EA2;&amp;#x8682;&amp;#x8681;&lt;/strong&gt; &lt;a href&#x3D;&quot;https://www.redants.sg/good-reads/story20220211-5941&quot;&gt;&amp;#x8FDE;&amp;#x603B;&amp;#x7406;&amp;#x90FD;&amp;#x63A8;&amp;#x8350;&amp;#x7684;&amp;#x7206;&amp;#x7EA2;&amp;#x731C;&amp;#x5B57;&amp;#x6E38;&amp;#x620F;Wordle&amp;#x3000;&amp;#x4E3A;&amp;#x4F55;&amp;#x5728;&amp;#x5168;&amp;#x7403;&amp;#x75AF;&amp;#x72C2;&amp;#x5438;&amp;#x7C89;&amp;#xFF1F;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Honestly I haven&amp;apos;t felt so excited in a long while!&lt;/p&gt;&lt;p&gt;The &lt;strong&gt;craziest ever mention&lt;/strong&gt; has got to be &lt;a href&#x3D;&quot;https://www.facebook.com/leehsienloong/posts/484183366401131&quot;&gt;this&lt;/a&gt;:&lt;/p&gt;&lt;figure&gt;&lt;a href&#x3D;&quot;https://www.facebook.com/leehsienloong/posts/484183366401131&quot;&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/facebook-post-lee-hsien-loong-chengyu-wordle@2x.png&quot; alt&#x3D;&quot;Facebook post by Lee Hsien Loong, with the content &amp;#x201C;Many Singaporeans have joined in the fun of playing Wordle - an online word puzzle game, where the goal is to guess a five-letter word within six tries. This game has become such a viral sensation that it was recently purchased by The New York Times. I&amp;#x2019;ve even noticed some ministries and agencies using the green, yellow and grey squares to liven up government messaging! I was pleasantly surprised to find out that there are Chinese and Malay versions of the game. Give it a go &amp;#x2013; a simple but fun way to keep the mind engaged. Original https://www.powerlanguage.co.uk/wordle/ Chinese: https://cheeaun.github.io/chengyu-wordle/ Malay: https://www.projecteugene.com/katapat.html &amp;#x2013; LHL&amp;#x201D;&quot; width&#x3D;&quot;538&quot; height&#x3D;&quot;755&quot; loading&#x3D;&quot;lazy&quot;&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;On 3 February 2022, The Prime Minister of Singapore, &lt;a href&#x3D;&quot;https://en.wikipedia.org/wiki/Lee_Hsien_Loong&quot;&gt;Lee Hsien Loong&lt;/a&gt;, &lt;a href&#x3D;&quot;https://www.facebook.com/leehsienloong/posts/484183366401131&quot;&gt;made a post on Facebook&lt;/a&gt;, talked about how Singaporeans have joined in the fun of playing Wordle, linked to &lt;a href&#x3D;&quot;https://www.bbc.com/news/business-60208463&quot;&gt;BBC&amp;#x2019;s article&lt;/a&gt;, and mentioned the original Wordle, the Chinese version (mine) and the &lt;a href&#x3D;&quot;https://www.projecteugene.com/katapat.html&quot;&gt;Malay&lt;/a&gt; version! &amp;#x1F92F;&amp;#x1F92F;&amp;#x1F92F;&lt;/p&gt;&lt;p&gt;When this happened, I was just finishing up my dinner and got quite a bunch of notifications from friends tagging me and congratulating me &amp;#x1F605;.&lt;/p&gt;&lt;p&gt;Traffic shot up, from 7,000 visitors to 15,000 on the day itself and grew to 25,000 on the next day! &amp;#x1F4C8;&lt;/p&gt;&lt;figure&gt;&lt;img src&#x3D;&quot;/blog/images/screenshots/web/visitors-chart-shot-up-3-feb-2022-lee-hsien-loong-mention-facebook-plausible@2x.png&quot; alt&#x3D;&quot;Visitors chart shot up on 3 February 2022 when Lee Hsien Loong mention the game on Facebook. Chart is from Plausible.&quot; width&#x3D;&quot;1010&quot; height&#x3D;&quot;464&quot; class&#x3D;&quot;large&quot;&gt;&lt;/figure&gt;&lt;h2&gt;Learnings&lt;/h2&gt;&lt;figure&gt;&lt;a href&#x3D;&quot;https://twitter.com/cheeaun/status/1491749802023202816&quot;&gt;&lt;img src&#x3D;&quot;/blog/images/figures/interface/wordle-tiles-3d@2x.png&quot; alt&#x3D;&quot;Wordle tiles in 3D&quot; width&#x3D;&quot;512&quot; height&#x3D;&quot;288&quot; loading&#x3D;&quot;lazy&quot;&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;I have a lot of fun building this game.&lt;/p&gt;&lt;p&gt;From trying to reverse engineer the mechanics of Wordle, to listening to how &lt;a href&#x3D;&quot;https://youtu.be/X_e2IEaR4aA?t&#x3D;1019&quot;&gt;Josh Wardle made a prototype&lt;/a&gt; back in 2013. Instead of rebuilding the exact same clone, somehow I tried to build a different variant of it, with its own set of challenges that I didn&amp;#x2019;t know much about. I spent a lot of time polishing every single detail while trying to preserve the whole unobtrusive nature of Wordle. Perhaps similar to the original author, I did not expect this to become huge at all, though mine is still smaller scale compared to the original Wordle.&lt;/p&gt;&lt;p&gt;By building a variant of Wordle, I felt like I&amp;#x2019;m part of &lt;a href&#x3D;&quot;https://rwmpelstilzchen.gitlab.io/wordles/&quot;&gt;a whole family of developers&lt;/a&gt; who have done the same thing and experienced the same thing as I do. The author of &lt;a href&#x3D;&quot;https://www.subwaydle.com/&quot;&gt;Subwaydle&lt;/a&gt; &lt;a href&#x3D;&quot;https://kotaku.com/games-like-wordle-subwaydle-nyct-mta-best-routes-1848461481&quot;&gt;mentioned&lt;/a&gt; that he came across Chengyu Wordle and &lt;a href&#x3D;&quot;https://nerdlegame.com/&quot;&gt;Nerdle&lt;/a&gt; which made him wanting to make his own.&lt;/p&gt;&lt;p&gt;I see a lot of people posting their Chengyu Wordle results on Twitter and Facebook, &lt;em&gt;together&lt;/em&gt; with their Wordle results. On Facebook, I saw a woman &lt;a href&#x3D;&quot;https://www.facebook.com/TCKoays/posts/1185534145184481&quot;&gt;posting&lt;/a&gt; about playing Chengyu Wordle and it took her 3 kids on dictionaries, 4 clues, 45 minutes and a translation to traditional Chinese to solve their first play. Even a teacher &lt;a href&#x3D;&quot;https://www.linkedin.com/feed/update/urn:li:activity:6893768924618473472?commentUrn&#x3D;urn%3Ali%3Acomment%3A%28activity%3A6893768924618473472%2C6896231288982917120%29&quot;&gt;replied&lt;/a&gt; to me that the game is very popular among teachers, very well received and shared among their Facebook groups.&lt;/p&gt;&lt;p&gt;This is not the first time I create a web game. Chengyu Wordle is the third one after my first web game, &lt;a href&#x3D;&quot;https://github.com/cheeaun/pentagoo&quot;&gt;Pentagoo&lt;/a&gt; and second game, &lt;a href&#x3D;&quot;https://github.com/cheeaun/bubble-wrap&quot;&gt;Bubble Wrap&lt;/a&gt;. Both didn&amp;#x2019;t get popular but were very fun to build too. They gave me some good foundation on how to build games, though the funny thing is I&amp;#x2019;m actually not very good in playing them. &amp;#x1F923;&lt;/p&gt;&lt;p&gt;Yeah, I built Chengyu Wordle, but I can&amp;#x2019;t play it because I can&amp;apos;t actually read or write Chinese &amp;#x1F605;. I can speak Mandarin though, and the pinyin was actually to help &lt;em&gt;me&lt;/em&gt;, which in turn help others too. &amp;#x1F937;&amp;#x200D;&amp;#x2642;&amp;#xFE0F;&lt;/p&gt;&lt;p&gt;But heck, who cares, building a game is fun!&lt;/p&gt;&lt;p&gt;All of this happens within just &lt;strong&gt;two weeks&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Wow, what a ride.&lt;/p&gt;</content>
			<link rel="alternate" type="text/html" href="https://cheeaun.com/blog/2022/02/chengyu-wordle-is-not-a-love-story/" title="Chengyu Wordle Is Not a Love Story"/>
		</entry>
</feed>
