<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" >
	<generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator>
	<link href="https://sumukhprasad.github.io/feed.xml" rel="self" type="application/atom+xml" />
	<link href="https://sumukhprasad.github.io/" rel="alternate" type="text/html" />
	<updated>2026-07-04T19:22:03+05:30</updated>
	<id>https://sumukhprasad.github.io/feed.xml</id>

	<title type="html">Sumukh Prasad's Writing</title>
		<author>
				<name>Sumukh Prasad</name>
		</author>

	
	
	
	
		<entry>
			

			<title type="html">Hello, world: Artemis</title>
			<link href="https://sumukhprasad.github.io/blog/2026/04/04/artemis-picture.html" rel="alternate" type="text/html" title="Hello, world: Artemis" />
			<published>2026-04-04T05:45:24+05:30</published>
			<updated>2026-04-04T05:45:24+05:30</updated>
			<id>https://sumukhprasad.github.io/blog/2026/04/04/artemis-picture</id>
				<content type="html" xml:base="https://sumukhprasad.github.io/blog/2026/04/04/artemis-picture.html"><![CDATA[<p>Commander Reid Wiseman’s photograph of the Earth is a perspective we haven’t had since Apollo 17’s “Blue Marble” in 1972:</p>

<p><img src="/assets/blog/images/2026/04/helloworld.jpg" alt="Earth From the Perspective of Artemis II" />
<em>NASA/Commander Reid Wiseman, (<a href="https://images.nasa.gov/details/art002e000192">original</a>)</em></p>

<h2 id="on-scientific-progress">On Scientific Progress</h2>

<p><img src="/assets/blog/images/2026/04/inside.jpg" alt="Hello, world!" />
<em>NASA/Commander Reid Wiseman, (<a href="https://images.nasa.gov/details/art002e000191">original</a>)</em></p>

<p>This view from inside the Orion spacecraft certainly evokes a special feeling. This is the Earth, this is our home – but we’ve (at least my generation) never seen it like this, not out of a spacecraft. In my opinion, it represents the pinnacle of human endeavour, taking flight again after a 50-odd year break.</p>

<p>I certainly hope that this launch creates the same influx of kids into STEM as the Apollo and Saturn launches did decades ago. It’s easy to question the cost and necessity of these things, especially with all that’s happening back home, but I don’t think we can put a price on scientific progress. Reid Wiseman, Victor Glover, Christina Koch, Jeremy Hansen, along with everybody else who worked on this program, are pushing us closer towards the Moon than we’ve been in the past 5 decades: that’s certainly a feat of humanity worth admiring.</p>

<p><img src="/assets/blog/images/2026/04/launch.jpg" alt="Artemis II Launch" />
<em>NASA/Eric Bordelon, (<a href="https://images.nasa.gov/details/SLS_MAF_20260401_ArtemisII-Launch-epb_001">original</a>)</em></p>]]></content>

			<author>
					<name>Sumukh Prasad</name>
			</author>

			
			
				<summary type="html"><![CDATA[Commander Reid Wiseman’s photograph of the Earth is a perspective we haven’t had since Apollo 17’s “Blue Marble” in 1972:]]></summary>
			
		</entry>
	
		<entry>
			

			<title type="html">Addendum: Apple@50</title>
			<link href="https://sumukhprasad.github.io/blog/2026/04/02/addendum-apple-50.html" rel="alternate" type="text/html" title="Addendum: Apple@50" />
			<published>2026-04-02T18:33:13+05:30</published>
			<updated>2026-04-02T18:33:13+05:30</updated>
			<id>https://sumukhprasad.github.io/blog/2026/04/02/addendum-apple-50</id>
				<content type="html" xml:base="https://sumukhprasad.github.io/blog/2026/04/02/addendum-apple-50.html"><![CDATA[<h2 id="apple-turns-50">Apple turns 50!</h2>

<p>In this world of almost blink-and-you-miss-it startups touting their products as definitely the future one second and wiped off the map the next, 50 years sure is a long time.</p>

<p>But that’s where Apple shines the most – try as you might, you really can’t imitate your way to maturity. Technology moves at a rapid pace, but people with the tenacity to think of what that technology can do for regular human beings are few and far between. In the past fifty years, computers have gone from being niche hobby build-it-yourself kits to being mass manufactured in giant factories and put into nearly everything, including perhaps your microwave and washing machine. The ubiquity of these devices, however, doesn’t really negate what makes a product truly wonderful. Maybe I’m idealistic, but I still believe that technology serves as the great equalizer.</p>

<p>Technology for me is a tool for thought. A <em>bicycle for the mind</em>, as Jobs might’ve put it. But since the days of the Apple ][, technology has become the most powerful tool we have. Whether it’s how the original Lisa and Macintosh changed how we thought about interfaces, or how the iPod and iTunes changed how we listened to music, or how the MacBook Air changed what we expected out of laptops, or how the iPhone changed how we communicate with each other – each of these devices was simply a new way to augment our own thinking. Apple’s real impact has never been these devices, but rather what they’ve made impossible to ignore. The greatest trick has always been restraint, hiding just enough to make everything feel like magic.</p>

<p>It’s impossible to predict what the next 50 years will look like for Apple, or even for the tech world in general. But if Apple’s last 50 are anything to go by, I’m more than certain they’ll continue making wonderful tools for thought.</p>]]></content>

			<author>
					<name>Sumukh Prasad</name>
			</author>

			
			
				<summary type="html"><![CDATA[Apple turns 50!]]></summary>
			
		</entry>
	
		<entry>
			

			<title type="html">Happy birthday, Apple.</title>
			<link href="https://sumukhprasad.github.io/blog/2026/04/01/happy-birthday-apple.html" rel="alternate" type="text/html" title="Happy birthday, Apple." />
			<published>2026-04-01T20:40:54+05:30</published>
			<updated>2026-04-01T20:40:54+05:30</updated>
			<id>https://sumukhprasad.github.io/blog/2026/04/01/happy-birthday-apple</id>
				<content type="html" xml:base="https://sumukhprasad.github.io/blog/2026/04/01/happy-birthday-apple.html"><![CDATA[<p>Apple turns 50!</p>

<p>I’ve always been really into computers, and I’ve loved writing code and making computers do things since I was a kid. This infatuation started off innocently enough, with MSWLOGO.</p>

<p>When I was 9 I taught myself BASIC, and a few years later moved on to Scratch. The computer I had at the time, an old Lenovo, wasn’t really equipped to run Scratch, with its whole three gigabytes of RAM and a spinning hard disk. This was still a time when Scratch relied on Flash to work – but I pressed on.</p>

<p>A couple years later I got my first Mac.</p>

<h2 id="my-2017-macbook-air">My 2017 MacBook Air</h2>

<p><img src="/assets/blog/images/2026/04/mac1.jpg" alt="image" /></p>

<p>Sure, I started with Scratch, but the amount of things I’ve done on this little computer is insane. Nobody really finds the best tool on the first try. Neither does anyone serious about their work use their first set of tools particularly well. No no, obsession doesn’t work like that. Obsession does not make you neatly write down some requirements and use the correct tools for the job, obsession makes you work with whatever’s available, no matter how absurd the gap between theory and reality might be. Of course I knew it was the wrong computer for what I wanted to do with it, but when is this really going to stop an overly ambitious kid?</p>

<p>I should know this, because on this computer, in no particular order, I: ran Blender, edited videos with Final Cut Pro, made music with GarageBand, ran a whole bunch of VMs with VirtualBox, made a bunch of software with a whole catalog’s worth of tools and frameworks and languages, designed useless things with Fusion 360, made schematics with EAGLE, wrote silly apps with Xcode… basically whatever I could get my hands on. I even wrote software to teach kids how to code.<sup id="fnref:1"><a href="#fn:1" class="footnote" rel="footnote" role="doc-noteref">1</a></sup> I’ve probably forgotten a lot of what I did, really, but you get the idea.</p>

<p>I think it’s worth noting that on multiple occasions this machine was cooled by ice packs placed underneath it. I’ve also probably used it as a space heater on cold winter days.<sup id="fnref:2"><a href="#fn:2" class="footnote" rel="footnote" role="doc-noteref">2</a></sup> A friend and I joked often about “Flying Laptop-shaped UFO Sighted: Local Residents Worried”.</p>

<p>Granted, I still think it’s a great laptop. Probably more than it had any right to be.</p>

<h3 id="sidenote-my-original-ipad">Sidenote: My original iPad</h3>

<p><img src="/assets/blog/images/2026/04/ipad.jpg" alt="image" /></p>

<p>This was my first “real” Apple device, after the iPod Nano 3G. It was the first time I’d ever interacted with a touch screen, and I still love how iOS 5 looks today.</p>

<p>But arguably what’s more important to me than what I did on these devices is what I learnt from pushing them beyond their limits. Even today, my sense of design, my preference for simple technology, my interest in human-computer interaction, my love for the UNIX philosophy, and rather more important my love for computer science – all stem at least in some way from my using these devices.</p>

<p>It’s hard to understate how much Apple devices have impacted me. I’ve had the privilege to enjoy using a whole bunch of Apple devices: the iPod Nano I slung around as a kid, the first-generation iPad, the iPad Air I used through school (and still do today), the woefully underpowered late-2017 13-inch MacBook Air, its M2 successor (coincidentally the one this post is being written on), my iPhone… certainly more than my fair share of them, to be honest.</p>

<p>So happy birthday, Apple! Here’s to another 50.</p>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1">
      <p>This is referring to <a href="../../../../projects/blockjam">BlockJam</a>. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:2">
      <p>Of course this is not true, but it sure did come very close to that distinction. <a href="#fnref:2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content>

			<author>
					<name>Sumukh Prasad</name>
			</author>

			
			
				<summary type="html"><![CDATA[Apple turns 50!]]></summary>
			
		</entry>
	
		<entry>
			

			<title type="html">Compiling Textmate 2: Rendering Boogaloo</title>
			<link href="https://sumukhprasad.github.io/blog/2025/07/30/compiling-textmate-ii.html" rel="alternate" type="text/html" title="Compiling Textmate 2: Rendering Boogaloo" />
			<published>2025-07-30T00:00:00+05:30</published>
			<updated>2025-07-30T00:00:00+05:30</updated>
			<id>https://sumukhprasad.github.io/blog/2025/07/30/compiling-textmate-ii</id>
				<content type="html" xml:base="https://sumukhprasad.github.io/blog/2025/07/30/compiling-textmate-ii.html"><![CDATA[<p><img class="unselectable" src="/assets/blog/images/2025-07-30/textmate-new.png" /></p>
<div class="caption unselectable">TextMate, fresh in 2025, on macOS Tahoe</div>

<blockquote>
  <p>TextMate has been a mainstay of my development tool belt for a while now, and it’s one of the last truly native macOS editors still around. But development stalled, and with no updates since 2021, I figured – <em>“How hard could it be to compile it myself?”</em></p>
</blockquote>

<h2 id="the-case-of-the-missing-gutter">The Case of the Missing Gutter</h2>

<p>Last time, we arrived at this compiled product:</p>

<p><img class="unselectable" src="/assets/blog/images/2025-03-05/textmate-compiled.png" /></p>

<p>One glaring issue here was the gutter… or lack thereof. In the previous post in this series, I said:</p>

<blockquote>
  <p>… but notice how the gutter is completely missing? And how the file browser’s background isn’t quite right? I’m not sure what’s causing that, but I want to assume it’s some <code class="language-plaintext highlighter-rouge">NSColor</code> deprecation thing that’s causing it to behave this way. Although, it’s just a hunch, and I’m not sure what to think yet. Some… creative… debugging with Apple’s <em>Quartz Debug</em> tool and its “<em>Flash screen updates</em>” toggle tells me that whatever’s rendering the gutter, <em>is</em>, in fact, updating the right bits on screen at the right time – it’s just completely invisible for some reason.</p>

  <p>Gutter aside, some more digging led me to line 72 in the FileBrowser framework:</p>

  <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Frameworks/FileBrowser/src/FileBrowserView.mm : 72

_outlineView.backgroundColor = NSColor.clearColor;
</code></pre></div>  </div>

  <p>Changing <code class="language-plaintext highlighter-rouge">clearColor</code> to something like <code class="language-plaintext highlighter-rouge">redColor</code> showed up immediately, and using <code class="language-plaintext highlighter-rouge">windowBackgroundColor</code> fixed the issue. But I’m not sure if this is the fix – I figure that it was set to <code class="language-plaintext highlighter-rouge">clearColor</code> to let the window background show through, but for some reason the window itself is stuck in this gray color. Although, I could be completely wrong here and the issue could be something else entirely.</p>
</blockquote>

<p>But why would changing the background colour fix the issue at all? And why were bits on screen being updated, even though the updates weren’t really visual?</p>

<p>Some more debugging later, where I changed the themes around, I realised that that the gutter’s divider was being rendered across the entire window, instead of within its own bounds. After changing that to <code class="language-plaintext highlighter-rouge">redColor</code> instead of having it pick it up from the theme, this bug was caught <em>red</em> handed. (pun intended)</p>

<p><img class="unselectable" src="/assets/blog/images/2025-07-30/textmate-red.png" /></p>
<div class="caption unselectable">A-ha, gotcha!</div>

<p>So, to clip this to bounds, it was quite simple: `</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Frameworks/OakTextView/src/OakDocumentView.mm

    87: gutterDividerView = OakCreateVerticalLine(OakBackgroundFillViewStyleNone);
</code></pre></div></div>
<p><span style="color: green"><code class="language-plaintext highlighter-rouge">(+) 88: gutterDividerView.clipsToBounds = YES;</code></span></p>

<p>… and here’s the result:</p>

<p><img class="unselectable" src="/assets/blog/images/2025-07-30/textmate-red-fixed.png" /></p>

<p>And changing it back to pick up the theme’s settings, this issue is completely fixed:</p>

<p><img class="unselectable" src="/assets/blog/images/2025-07-30/textmate-normal.png" /></p>

<p><sup><em>This was solved in <a href="https://github.com/sumukhprasad/textmate/commit/fed17e96d04f67308c1402465531799a2edbd867"><code class="language-plaintext highlighter-rouge">fed17e9</code></a> <strong>fixed gutter not showing up</strong></em></sup></p>

<h2 id="fixing-the-tabs">Fixing the tabs</h2>

<p>Look closely at the tabs in the last image – the text seems to be hugging the bottom of the tabs. This somehow wasn’t the case last time, so I assume this is because macOS Tahoe increases the height of <code class="language-plaintext highlighter-rouge">NSTitlebarAccessoryView</code>.</p>

<p>This was quite simple to fix, I just had to change the hard-coded constraints…</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Frameworks/OakTabBarView/src/OakTabBarView.mm

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[close]-(4)-|" 
options:0 metrics:nil views:views]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[title]-(3)-|" 
options:0 metrics:nil views:views]];
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[overflow]|" 
options:0 metrics:nil views:views]];
</code></pre></div></div>

<p>… to automatic ones:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Frameworks/OakTabBarView/src/OakTabBarView.mm


[self addConstraint:[NSLayoutConstraint constraintWithItem:self.closeButton
                                                 attribute:NSLayoutAttributeCenterY
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:self
                                                 attribute:NSLayoutAttributeCenterY
                                                multiplier:1
                                                  constant:0]];

[self addConstraint:[NSLayoutConstraint constraintWithItem:self.textField
                                                 attribute:NSLayoutAttributeCenterY
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:self
                                                 attribute:NSLayoutAttributeCenterY
                                                multiplier:1
                                                  constant:0]];

[self addConstraint:[NSLayoutConstraint constraintWithItem:self.overflowButton
                                                 attribute:NSLayoutAttributeCenterY
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:self
                                                 attribute:NSLayoutAttributeCenterY
                                                multiplier:1
                                                  constant:0]];
</code></pre></div></div>

<p>Et voila, fixed.</p>

<p><sup><em>This was solved in <a href="https://github.com/sumukhprasad/textmate/commit/ba00428da4bfeaa5693bab1828ee50a4e0813155"><code class="language-plaintext highlighter-rouge">ba00428</code></a> <strong>fixed OakTabView constraints to visually center tab bar content on macOS Tahoe</strong></em></sup></p>

<h2 id="what-next-then">What next then?</h2>

<p>Honestly… no clue. There’s a few aesthetic changes I want to make in certain places, but that’s about it. TextMate is fully working and completely functional on macOS Tahoe, newly compiled.</p>]]></content>

			<author>
					<name>Sumukh Prasad</name>
			</author>

			
			
				<summary type="html"><![CDATA[TextMate, fresh in 2025, on macOS Tahoe]]></summary>
			
		</entry>
	
		<entry>
			

			<title type="html">Writing an Operating System from Scratch</title>
			<link href="https://sumukhprasad.github.io/blog/2025/07/14/writing-an-operating-system.html" rel="alternate" type="text/html" title="Writing an Operating System from Scratch" />
			<published>2025-07-14T00:00:00+05:30</published>
			<updated>2025-07-14T00:00:00+05:30</updated>
			<id>https://sumukhprasad.github.io/blog/2025/07/14/writing-an-operating-system</id>
				<content type="html" xml:base="https://sumukhprasad.github.io/blog/2025/07/14/writing-an-operating-system.html"><![CDATA[<blockquote>
  <p><em>This is a blog-ified version of <a href="/projects/boink-kernel-project">this technical document</a>.</em></p>
</blockquote>

<p>You have to be all kinds of crazy to build a kernel from scratch. Much less build a kernel, a bootloader, a filesystem, a libc implementation, and a text pager and an image viewer for that kernel, from scratch.</p>

<p>No, for that you have to be both stupid and stupidly naive.</p>

<p><br /></p>
<h2 id="why">Why?</h2>

<p>Technology today is layers and layers of software all folded in on itself. Not really simple, and not really easy to understand the entire stack, top to bottom. So I decided to build my own everything, from bootloader to C Standard Library, just to understand how things work.</p>

<p><br /></p>
<h2 id="what">What?</h2>

<p><em>BoinkOS</em>, or more formally the <em>Boink Kernel Project</em>, aims to provide a reasonable abstraction for every single layer between user and bare metal –</p>

<ul>
  <li>filesystem (GLFS)</li>
  <li>bootloader (Boink Interactive Bootloader)</li>
  <li>kernel (BoinkOS)</li>
  <li>text pager (with <em>Included Search Function (tm)</em>)</li>
  <li>image viewer</li>
  <li>syscall interface</li>
  <li>custom libc</li>
</ul>

<p><br /></p>
<h2 id="allegedly-good-features-i-added-that-definitely-did-not-start-as-dumb-ideas">“Allegedly Good Features” I added that definitely did not start as dumb ideas</h2>

<p>Of course, starting from scratch gives you ideas for features that you don’t see often, and Boink has two such features:</p>

<ul>
  <li><strong>kernel scratchpad</strong><br />
  provides 16kb of “scratchpad” space for the kernel to use — avoids page management where it may not be needed.</li>
  <li><strong>panic debug shell</strong><br />
  provides a way to easily debug programs when a panic state is entered. really helpful when you don’t have gdb.</li>
</ul>

<p><br /></p>
<h2 id="milestones">Milestones</h2>

<p>Some (overkill) milestones were (slowly and tediously) achieved on this platform.</p>

<ul>
  <li>custom 32-bit protected mode bootloader with VESA graphics</li>
  <li>paging and frame allocation</li>
  <li>syscalls + userland mode (ring3) context switching</li>
  <li>ELF binary loading and execution</li>
  <li>basic shell with file viewing, image viewing, and app execution</li>
  <li>interrupt handling with IRQs, ISRs, PIT, and keyboard input</li>
  <li>simple framebuffer-based graphics output</li>
  <li>GLFS — a simple loadable filesystem baked into the boot process</li>
</ul>

<p><br /></p>
<h2 id="a-wild-filesystem-appears">A Wild Filesystem Appears</h2>

<p>GLFS (good little (luck) file system) is an extremely simple filesystem spec that Boink uses.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[sector 0] GLFS SUPERBLOCK
----------
- magic GLFS+version identifier

[sector 1+] DIRECTORY TABLE
-----------
     [entry 0] filename: string
               start sector: int
	       size: int (bytes)

     [entry 1] filename: string
               start sector: int
	       size: int (bytes)
     (...)

[end of table marker]
----------
[file data]
(...)
</code></pre></div></div>

<p>Yes, that’s it. Just a superblock, a directory table, and files. No folders, no journaling, no metadata, no permissions… just data.</p>

<p><br /></p>
<h2 id="coda">Coda</h2>

<p>OS dev is one of those weird hobbies where you can go weeks without your system doing anything at all, end up backtracking days of work just to implement everything again, and then you fix a random paging bug and it suddenly boots a shell and you feel like god. I definitely did not spend a day debugging the VESA graphics after writing VESA info to one location and trying to read it from a completely different location. Definitely.</p>

<p>Next up at some unspecified date in the vague future: <strong>Boink 2: UNIX Boogaloo</strong></p>

<p><em>“How did you do it?”</em><br />
<em>“It’s very simple — you read the protocol and write the code.”</em> — Bill Joy, definitely forgetting the mental spiraling bit</p>

<hr style="margin-top: 100px" />

<h2 id="screenshots">Screenshots</h2>

<p><b>First Steps — printing to the screen in VGA text mode</b><br />
<img src="/assets/projects/boink-kernel-project/1.png" style="width: 50%" />
<br /><br /><br /></p>

<p><b>GLFS disk reads</b><br />
<img src="/assets/projects/boink-kernel-project/2.png" style="width: 50%" />
<br /><br /><br /></p>

<p><b>VGA framebuffer graphics</b><br />
<img src="/assets/projects/boink-kernel-project/3.png" style="width: 50%" />
<br /><br /><br /></p>

<p><b>Less-inspired Text Pager</b><br />
<img src="/assets/projects/boink-kernel-project/4.png" style="width: 49.5%" />
<img src="/assets/projects/boink-kernel-project/5.png" style="width: 49.5%" />
<br /><br /><br /></p>

<p><b>Panic diagnostic shell</b><br />
<img src="/assets/projects/boink-kernel-project/6.png" style="width: 50%" />
<br /><br /><br /></p>

<p><b>Boink Interactive Bootloader</b><br />
<img src="/assets/projects/boink-kernel-project/7.png" style="width: 50%" />
<br /><br /><br /></p>

<p><b>Bitmap Image Viewer</b><br />
<img src="/assets/projects/boink-kernel-project/8.png" style="width: 50%" />
<br /><br /><br /></p>

<p><b>ring3 context switching</b><br />
<img src="/assets/projects/boink-kernel-project/9.png" style="width: 50%" />
<br /><br /><br /></p>

<p><b>Custom libc with basic I/O support</b><br />
<img src="/assets/projects/boink-kernel-project/10.png" style="width: 50%" />
<br /><br /><br /></p>

<p><img src="/assets/projects/boink-kernel-project/cover.png" style="width: 100%" /></p>]]></content>

			<author>
					<name>Sumukh Prasad</name>
			</author>

			
			
				<summary type="html"><![CDATA[This is a blog-ified version of this technical document.]]></summary>
			
		</entry>
	
		<entry>
			

			<title type="html">RIP, Bill Atkinson</title>
			<link href="https://sumukhprasad.github.io/blog/2025/06/08/bill-atkinson.html" rel="alternate" type="text/html" title="RIP, Bill Atkinson" />
			<published>2025-06-08T00:00:00+05:30</published>
			<updated>2025-06-08T00:00:00+05:30</updated>
			<id>https://sumukhprasad.github.io/blog/2025/06/08/bill-atkinson</id>
				<content type="html" xml:base="https://sumukhprasad.github.io/blog/2025/06/08/bill-atkinson.html"><![CDATA[<p>It’s wild how someone who shaped our digital world so deeply stayed out of the general public’s spotlight. The marching ant selection boxes we take for granted, selection lassos, the menu bar, the idea of using a computer as a canvas, the slick user interfaces on Macs that have inspired so many for so long… all carry his legacy. He didn’t just build things — he made them feel human. Fun and beautiful and creative, even.</p>

<p>Unfortunately though, pancreatic cancer has taken from us yet another pioneer.</p>

<p><em>Rest in peace.</em></p>

<p><img class="unselectable" src="/assets/blog/images/2025-06-08/billbadge.jpg" style="margin: auto; max-height: 274px; max-width: 380px; display: block;" /></p>
<div class="caption unselectable">folklore.org, CC-BY-NC</div>]]></content>

			<author>
					<name>Sumukh Prasad</name>
			</author>

			
			
				<summary type="html"><![CDATA[It’s wild how someone who shaped our digital world so deeply stayed out of the general public’s spotlight. The marching ant selection boxes we take for granted, selection lassos, the menu bar, the idea of using a computer as a canvas, the slick user interfaces on Macs that have inspired so many for so long… all carry his legacy. He didn’t just build things — he made them feel human. Fun and beautiful and creative, even.]]></summary>
			
		</entry>
	
		<entry>
			

			<title type="html">Unwritten</title>
			<link href="https://sumukhprasad.github.io/writing/2025-05-13-unwritten.html" rel="alternate" type="text/html" title="Unwritten" />
			<published>2025-05-14T00:00:00+05:30</published>
			<updated>2025-05-14T00:00:00+05:30</updated>
			<id>https://sumukhprasad.github.io/writing/unwritten</id>
				<content type="html" xml:base="https://sumukhprasad.github.io/writing/2025-05-13-unwritten.html"><![CDATA[<p>What is it about the future that makes us question the present? <em>Where do we come from? What are we? Where are we going?<sup class="unselectable"><a href="#1">1</a></sup></em></p>

<p>It seems we think of the future as a place, a destination to get to and stop, an end to something. To me, though, it isn’t a place – it’s more a feeling. A question without punctuation, a blank page on which to write with tomorrow’s ink, a door with no handle.</p>

<p>It’s quite strange how something so abstract, that doesn’t exist yet, can feel so heavy. So present. It manages to sit on our shoulders like an invisible valise of sorts – a valise with the size of a pea and the weight of an elephant. A white elephant, perhaps. Indisposable, unavoidable, yet an inescapable burden.</p>

<p>Still, we carry it willingly. We obsess over it. We let go of the past because we know it’s unchangeable – and we hold tight the future we know is unwritten. Why do we place hope in the unwritten? Why do we use the unwritten to measure the present? Measuring by not what it is, but what it is not yet?</p>

<p>We’re all just standing at the edge of now, peering keenly into an abyss we call the future, trying to make out the shapes we surely see in the fog. When those shapes come true, we rename them. We call them “now.” And yet again they aren’t enough – we search for more. And when it doesn’t, we stumble through time like children playing dress-up in grown-up dreams.</p>

<p>Still, we dream anyway. Because there’s comfort in the unwritten. It can’t disappoint me yet. It hasn’t failed me yet. It hasn’t come undone. And maybe that’s why we romanticize it so hard — not because of what it is, but because of what it isn’t. But the thing is… we never really get to the future. We only ever get to now. And then another now. And another.</p>

<div style="text-align: center">
	<img class="unselectable" src="/assets/writing/images/2025-05-14/P4290023.jpg" style="max-width: 300px;" />
</div>
<div class="caption unselectable">A raindrop suspended in air.</div>

<p>Maybe that’s why we romanticize it so much. Hoping that we can write the unwritten, even when it’s writing itself. We like to pretend like the future is waiting – patient, polite – sitting cross-legged just across the bridge of time. It feels so close, we can almost reach out to her, but she’s impatient, really. She crashes in through the windows, scribbling over my plans. And tomorrow she’ll wear yesterday’s clothes and a new name.</p>

<p>What’s unwritten holds every possibility – and that’s terrifying. Freeing, too. It’s the part of the book where anything can still happen. The lines flow, page to page, but there’s nothing on them yet. Yet. We can imagine what the words will be, but they’ll write themselves in due time.</p>

<p>But also… nothing’s happened yet. And that’s what makes it enticing to sit and ponder about. Not the expectation, not the hope – but rather the way we stand in the present, imagining what those words might be.</p>

<div style="font-size: 0.5em; margin-top: 50px;">
	<i>Feel the rain on your skin,</i><br />
	<i>no-one else can feel it for you,</i><br />
	<i>only you can let it in...</i>
	<div style=" margin-top: 10px;">— <a href="https://en.wikipedia.org/wiki/Natasha_Bedingfield" target="_blank">Natasha Bedingfield</a>, Unwritten</div>
</div>

<div style="font-size: 0.5em; margin-top: 50px;">
	<div id="1"><sup>1</sup> <a href="https://en.wikipedia.org/wiki/Where_Do_We_Come_From%3F_What_Are_We%3F_Where_Are_We_Going%3F" target="_blank"><i>"Where Do We Come From? What Are We? Where Are We Going?,"</i></a> Paul Gauguin (1897–98)</div>
</div>]]></content>

			<author>
					<name>Sumukh Prasad</name>
			</author>

			
			
				<summary type="html"><![CDATA[What is it about the future that makes us question the present? Where do we come from? What are we? Where are we going?1]]></summary>
			
		</entry>
	
		<entry>
			

			<title type="html">Cataloging my books with ISBN barcodes and Google Books</title>
			<link href="https://sumukhprasad.github.io/blog/2025/04/21/isbn-cataloging.html" rel="alternate" type="text/html" title="Cataloging my books with ISBN barcodes and Google Books" />
			<published>2025-04-21T00:00:00+05:30</published>
			<updated>2025-04-21T00:00:00+05:30</updated>
			<id>https://sumukhprasad.github.io/blog/2025/04/21/isbn-cataloging</id>
				<content type="html" xml:base="https://sumukhprasad.github.io/blog/2025/04/21/isbn-cataloging.html"><![CDATA[<h2 id="as-with-most-things-why">As with most things, why?</h2>

<p>Over the years I’ve added many books to my arsenal – but never kept track of them. I fully blame child-me for lack of foresight. :/</p>

<p>In any case, I wanted to have a list of what books I had. But cataloging 4 shelves worth of books wouldn’t be easy.</p>

<p><br /></p>
<h2 id="enter-isbn">Enter ISBN</h2>

<p>ISBN stands for <em>International Standard Book Number</em>, and is what’s represented by the barcodes you’ll find on the backs of most books. Here’s what a standard 13-digit ISBN is comprised of –</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ISBN 978-93-5333-371-3
      a   b   c   d  e

a - GS1 prefix
b - registration group
c - registrant
d - publication
e - check digit
</code></pre></div></div>

<p><br /></p>
<h2 id="right-but-">Right, but… ???</h2>

<p>What I did with this number was this – I had a script look it up on Google Books.</p>

<ul>
  <li>Most (~100) books were already there on Google Books – only took around 45 minutes.</li>
  <li>Some (~20) books, that were from smaller publishers or, this was annoying, that had other stickers stuck on top of the barcode, I had to find the information manually. This took nearly an hour and a half.</li>
</ul>

<p>I added a way for me to select what camera I wanted to use, and I turned over my iPhone and used Continuity Camera to use it as a webcam. There, then I was able to just hover books over my table and have them be scanned in.</p>

<p><img class="unselectable" src="/assets/blog/images/2025-04-21/scanning.png" /></p>
<div class="caption unselectable">Scanning barcodes like I'm in a library</div>
<div class="caption unselectable"><sup>I don't actually have "Louie (The Puppy Place #51)," -- that's because <code>pyzbar</code> kept reading some 1s as 7s.</sup></div>

<p><br /></p>
<h2 id="should-you-do-this">Should you do this?</h2>

<p>Here’s what actually went down behind the scenes: the script uses <code class="language-plaintext highlighter-rouge">pyzbar</code> and <code class="language-plaintext highlighter-rouge">opencv</code> to extract the ISBN from the camera feed. Then it pipes that ISBN into a function that calls the Google Books API, grabs all the metadata (title, author, publisher, dates), and dumps it all into a CSV file. End result? A searchable, sortable catalog of all my books. Hey, I even found some books I thought I’d lost along the way!</p>

<p>Frankly, you should do this. If you have any amount of books that you want to keep track of, you absolutely should do this. It’s just so much cleaner and easier to refer to a spreadsheet to search for things than to go digging in the wrong shelf twice.</p>

<p><a href="https://gist.github.com/sumukhprasad/dc5b7c9014a2b4528a20f08105efdf27">Get the code &gt;</a></p>]]></content>

			<author>
					<name>Sumukh Prasad</name>
			</author>

			
			
				<summary type="html"><![CDATA[As with most things, why?]]></summary>
			
		</entry>
	
		<entry>
			

			<title type="html">Redesigning this website</title>
			<link href="https://sumukhprasad.github.io/blog/2025/04/10/redesign.html" rel="alternate" type="text/html" title="Redesigning this website" />
			<published>2025-04-10T00:00:00+05:30</published>
			<updated>2025-04-10T00:00:00+05:30</updated>
			<id>https://sumukhprasad.github.io/blog/2025/04/10/redesign</id>
				<content type="html" xml:base="https://sumukhprasad.github.io/blog/2025/04/10/redesign.html"><![CDATA[<h2 id="first-why">First, Why?</h2>
<blockquote>
  <p>Creating your own online presence is a tough job. When you’re both client and designer, the highest standards apply. It has to be top notch, unique and inspiring on every level.</p>
  <div style="text-align: right;">— Jorn van Dijk, <a href="http://madebysofa.com/archive/blog/georgia-on-my-mind/index.html" target="_blank">Made by Sofa</a></div>
</blockquote>

<p>This was the basis for me redesigning this website. The old one was sleek and clean, sure, but it lacked the charm I wanted it to have. I’ve always loved those old-web blogs that seem to have some character to them, like <a href="https://daringfireball.net">Daring Fireball</a>, <a href="https://thebloggess.com">The Blogess</a>, <a href="https://mjtsai.com">Michael Tsai</a> and a whole host of others — so I wanted to have some of that charm shine here as well.</p>

<p><br /></p>
<h2 id="georgia-on-my-mind--and-verdana-too-maybe">Georgia on my mind (… and Verdana too, maybe)</h2>
<p>One of the first things I did was to take out the Lato, Source Serif, and IBM Plex Mono fonts in favour of Georgia, Verdana, and Courier New. I have nothing against those fonts, heck, they’re still my favourite fonts to use on other projects — but I wanted to keep this site “classic,” so to speak. They scream “old web” but in a warm, unpretentious way — these fonts are web-safe and will still render beautifully on basically everything.</p>

<p><br /></p>
<h2 id="theme-color">Theme color</h2>
<p>Now there’s a theme colored body that replaces the white nothingness of yore. It’s subtle, but it serves to emphasize the 640px content width and also makes it feel a lot more cozier and less like a printout.</p>

<p><br /></p>
<h2 id="pagination">Pagination</h2>
<p>This one’s purely for technical reasons, end of reasons. I am not interested in an unmanagable list of links.</p>

<p><br /></p>
<h2 id="dates-before-titles">Dates before titles</h2>
<p>Purely for the aesthetic. Again, charm is what I’m going for. Also I don’t know, it just feels more <em>blog-ish</em> to me for some reason.</p>

<p><img class="unselectable" src="/assets/blog/images/2025-04-10/old-1.png" style="width: 315px" />
<img class="unselectable" src="/assets/blog/images/2025-04-10/old-2.png" style="width: 315px" /></p>
<div class="caption unselectable">Before: clean, minimal, beautiful, but way too clean.</div>

<p><img class="unselectable" src="/assets/blog/images/2025-04-10/new-1.png" style="width: 315px" />
<img class="unselectable" src="/assets/blog/images/2025-04-10/new-2.png" style="width: 315px" /></p>
<div class="caption unselectable">After: less clean, maybe not as beautiful, but way more "me".</div>

<p>At the end of the day, it’s not beautiful that I’m after — I want a place on the web that feels like me and not a prim-ified me.</p>]]></content>

			<author>
					<name>Sumukh Prasad</name>
			</author>

			
			
				<summary type="html"><![CDATA[First, Why? Creating your own online presence is a tough job. When you’re both client and designer, the highest standards apply. It has to be top notch, unique and inspiring on every level. — Jorn van Dijk, Made by Sofa]]></summary>
			
		</entry>
	
		<entry>
			

			<title type="html">A Billion-dollar EdTech Company Left API Keys in Their App. That’s Not Security – That’s Sloppy.</title>
			<link href="https://sumukhprasad.github.io/blog/2025/04/03/allen-security.html" rel="alternate" type="text/html" title="A Billion-dollar EdTech Company Left API Keys in Their App. That’s Not Security – That’s Sloppy." />
			<published>2025-04-03T00:00:00+05:30</published>
			<updated>2025-04-03T00:00:00+05:30</updated>
			<id>https://sumukhprasad.github.io/blog/2025/04/03/allen-security</id>
				<content type="html" xml:base="https://sumukhprasad.github.io/blog/2025/04/03/allen-security.html"><![CDATA[<blockquote>
  <p>Cybersecurity 101: Never trust your users.</p>
</blockquote>

<p>How many times have we heard that phrase? Well, to be honest, far too many times to count. But that doesn’t stop some people from trusting their users with their most sensitive secrets.</p>

<p><br /></p>
<h3 id="tldr-someone-just-taped-their-keys-to-the-front-door">TL;DR: Someone Just Taped Their Keys to the Front Door</h3>
<p>Taping your keys to your door when you leave your house might be a great way for you to remember where you put them – they’re literally taped to your door!</p>

<p>But that’s not exactly secure, is it? So if a billion dollar giant did exactly that while storing data about people under the age of 18 in the house… would you trust them?</p>

<p><br /></p>
<h3 id="whats-wrong-here">What’s wrong here?</h3>
<p><a href="https://www.allen.ac.in">Allen</a>’s iOS app bundle reveals multiple sensitive credentials found in plain-text within .plist files. A simple right-click&gt;Show Package Contents leads to more than 10 sensitive API keys and other sensitive secrets from CleverTap, Google Cloud, DataDog and others.</p>

<p>Here’s what’s exposed:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">CLIENT_ID</code></li>
  <li><code class="language-plaintext highlighter-rouge">REVERSED_CLIENT_ID</code></li>
  <li><code class="language-plaintext highlighter-rouge">ANDROID_CLIENT_ID</code></li>
  <li><code class="language-plaintext highlighter-rouge">API_KEY</code></li>
  <li><code class="language-plaintext highlighter-rouge">GCM_SENDER_ID</code></li>
  <li><code class="language-plaintext highlighter-rouge">STORAGE_BUCKET</code></li>
  <li><code class="language-plaintext highlighter-rouge">PROJECT_ID</code></li>
  <li><code class="language-plaintext highlighter-rouge">BUNDLE_ID</code></li>
  <li><code class="language-plaintext highlighter-rouge">GOOGLE_APP_ID</code></li>
  <li><code class="language-plaintext highlighter-rouge">CleverTapToken</code></li>
  <li><code class="language-plaintext highlighter-rouge">APPSFLYER_KEY</code></li>
  <li><code class="language-plaintext highlighter-rouge">DATADOG_KEY</code></li>
  <li><code class="language-plaintext highlighter-rouge">MIXPANEL_API_KEY</code></li>
  <li><code class="language-plaintext highlighter-rouge">CleverTapAccountID</code></li>
</ul>

<p>It is, once again, important to note that no reverse engineering, decryption, or tampering was performed to obtain these credentials. Only a right click and a quick perusal of the .plist files in the app bundle’s root directory. While not all of these are sensitive on their own, e.g., <code class="language-plaintext highlighter-rouge">BUNDLE_ID</code>, they are dangerous to have lying around in the context of everything else that’s also accessible. While no active attempts were made to exploit these keys due to ethical reasons, based on security best practices, their exposure represents a serious risk.</p>

<p><br /></p>
<h3 id="timeline">Timeline</h3>
<ul>
  <li><b>prior to 19th March</b>
    <ul>
      <li>keys discovered and report prepared</li>
    </ul>
  </li>
  <li><b>19th March</b>
    <ul>
      <li>email notifications sent to info@allen.in, allendigital@allen.ac.in, bengaluru@allen.in; physical copy of report handed over to Allen Jayanagar, Bangalore; 15-day notice is provided before public disclosure</li>
    </ul>
  </li>
</ul>

<p><img class="unselectable" src="/assets/blog/images/2025-04-03/mail1.png" style="width: 315px" />
<img class="unselectable" src="/assets/blog/images/2025-04-03/mail2.png" style="width: 315px" /></p>
<div class="caption unselectable">The 2 emails I sent to Allen</div>

<ul>
  <li><b>23rd March</b>
    <ul>
      <li>report sent via WhatsApp on request of Mr. Rajat Bhargava after a friendly reminder was provided</li>
    </ul>
  </li>
</ul>

<p><img class="unselectable" src="/assets/blog/images/2025-04-03/whatsapp.png" /></p>
<div class="caption unselectable">WhatsApp message to Mr. Rajat Bhargava</div>

<ul>
  <li><b>3rd April</b>
    <ul>
      <li>proceed to public disclosure as stated on the report</li>
    </ul>
  </li>
</ul>

<p><strong>Allen was given a fair warning – they chose to ignore it.</strong></p>

<p>Allen was given 15 days’ time to fix this – and they have done nothing. Not even an acknowledgement.</p>

<p><br /></p>
<h3 id="coda">Coda</h3>
<p>Allen prides itself on academic excellence, but when it comes to security, they’ve failed their own test.</p>

<p><strong>What should I do now?</strong></p>

<ul>
  <li><strong>Students:</strong> be aware that your data may not be secure. Ask Allen how they plan to protect it.</li>
  <li><strong>Parents:</strong> ask Allen why a billion-dollar coaching empire can’t follow basic security practices.</li>
  <li><strong>Everyone else:</strong> this is a serious data security issue affecting minors. Spread the word.</li>
</ul>

<p><br /><br />
<em>To the best of my knowledge, Allen has not taken action to remediate this issue as of the time of publishing. If they have done so without acknowledgment, I welcome updates and will note them accordingly.</em></p>

<p><a href="/assets/blog/allen-security-report.pdf">Read the full report (PDF) (redacted)</a><br />
<i>or</i><br />
<a href="/blog/2025/04/03/allen-security-coda.html">Read my personal opinion on this</a><br /></p>]]></content>

			<author>
					<name>Sumukh Prasad</name>
			</author>

			
			
				<summary type="html"><![CDATA[Cybersecurity 101: Never trust your users.]]></summary>
			
		</entry>
	
</feed>
