Slamet Hendry


NodeJS installs a lot of files

I just re-installed NodeJS. And here's what I got.

🍺 /opt/homebrew/Cellar/node/19.0.1: 1,991 files, 50.9MB

That is a lot of files.


macOS Safari has vertical tabs

I have no clue when it started, but I only found out this morning that Safari 16.1 (macOS 13 / Ventura) can do vertical tabs.

Maybe this is old news to you, but maybe some of you are as unaware as I was, so I am sharing this here.

Steps (updated):

  1. Show Sidebar
  2. On the top of the Bookmarks sidebar, there is a “<” button to the left of “Bookmarks”; click the “<” button
  3. You will see tab grouping; click the “>” character (button)
  4. The tabs are listed vertically in addition to the horizontal tabs


Tech stack decision making

Photo: unsplash

At the start of building my previous startup attempt, I made bleeding-edge decisions (at least bleeding-edge to me personally, since I “bled” in the process).

You probably are familiar with “tech debt” and “choose boring technology”, but this post is not about those. I am happy with the technical stack that I ended up shipping and this post is about the journey and the decision making process.

A common thread is this: I prioritised business goal over technical familiarity.

Old history

In 2011/2012 period, I tried building a startup on the side. Go language was pre-1.0, but I chose Go over the languages that I already knew at the time: Python and Ruby.

My business goal was to have a product that would not cost prohibitively to run with fast performance. Server cost back then was not as affordable as now, so Go ticked the boxes for me, although that meant I had to learn a new language. Fortunately, Go was really easy to pick up and be productive in.

Recent history

Fast forward to end of 2021 / early 2022 – a different startup attempt. I wanted to use Go again and this time my business goal was to minimise operations and this led me to 'serverless'.

There were several options for serverless + Go and Google Cloud Functions gave me a fairly balanced trade-off. Initial trial worked well, but then I found out that the networking side of thing added operational friction to get going.

At around the same time, I was experimenting with Cloudflare Workers and Pages. They worked beautifully and simple to set up. But I was not comfortable with Javascript. It was possible to use another language in Workers and transpile it, but that would not work too well for me either.

Another consideration was that for the functionality that I wanted to build on the client side, the product would have better interactivity if I used a lot of JS on the browser. And to build that, I had to upgrade my rudimentary JS skill.

So if I had to use a lot of JS anyway, I might as well switched to JS and Cloudflare. And with that, I focused backend development in JS for Cloudflare Workers and frontend development in JS + React for Cloudflare Pages.

When I had built sufficient functionality for a minimum viable product, I had my doubts about the sustainability of what I had built. Was it robust enough to meet my goal of minimising operations?

Uh oh

At about the same time, the React library that I depended on switched from JS to Typescript in its new version. My web app could still work with the old version, but that got me into investigating TS.

Interesting. How hard can it be to rewrite into TS? (*)

I rewrote the code that was relevant to the aforementioned library from JS to TS in roughly a week. Given that I was learning as I stumbled along, I was happy with the one week delay.

And then I sort of “saw the light at the end of the tunnel”: migrating my app from JS to TS would minimise potential operations issue for me.


The business trade off was clear, improving the robustness of the product can pay back for itself in the long run, despite the schedule change.

So I rewrote the MVP in TS while deprioritising the rest of the product backlog. Unexpected benefit was that I was more productive coding in TS than when I was in JS.

A bit later in the project and being more comfortable with TS, I could confidently refactored the codebase into microservice-like model.

Additional tech

Data was at Supabase. Documentation was a bit lacking in a handful of places, but their product served me really well.

Cloudflare had everything else I needed but I added AWS Cloudfront as my image CDN and Imagekit to serve video. I added Cloudfront because Supabase object storage was in AWS and it was simpler to set up than Cloudflare. I used Imagekit, because it was also easier to use than Cloudflare. I wrote about Imagekit here.

That's it for the most part. Happy building!

#design #learningorg

(*) Related but completely different context: How hard can it be?

The Great Bubble Barrier

The Great Bubble Barrier is a cool idea! Below video gives a brief overview of how it works and its benefits.

Visit their website to learn more:

#reblog #design

Goodbye Microsoft OneDrive

I was an early adopter of MS OneDrive and never had any concern with it. Until a few days ago.

It was the first time I needed to download a folder containing files, since I did not have OneDrive synchronised with the machine's storage; it's not my main machine.

And OneDrive had NO option to download a folder as-is when connecting to it via the browser (nor through the app – which I installed to check).

OneDrive would always try to compress the folder into a zip format while downloading. There was no other alternative aside from downloading the file one at a time.

Even on very high broadband speed, the effective download time amounted to 120'something kb/s. This translated to hours for my download.

And nearing the end of the download, it FAILED and I had to redo it. To avoid another fail, I ended up downloading in pieces.

Oddly enough, if using the OneDrive Windows app, it will queue up the downloads, i.e. ONLY one download at a time. It cannot do something as simple as simultaneous downloads. Seriously. Doing it from the browser, it acts like typical browser download, except for the really slow zipping while downloading part.

My take on this is that I cannot rely on Microsoft OneDrive to be my online storage. Goodbye OneDrive.


Comparing cloud

I update my cloud providers global footprint comparison from time-to-time. For this update, I remove Heroku and add OVH. So the current cloud providers that I track are: Alibaba, AWS, Azure, Digital Ocean, Fly, Google Cloud, Linode, OVH, Tencent, UpCloud, and Vultr.


Learning React

In the past month, I have been learning React JS on my own. There are many tutorials on the internet and create-react-app also has hundreds of templates.

But I could not find one that specifically do what I wanted, so I had to do a lot of trial and error. How hard can it be? Harder than I thought, but eventually I got it working. 😎

Maybe there is another fellow learner out there who has the same need: web app that is protected by login and is multi-language. So I shared my codebase for others to copy and use as a starter template. The codebase is on my GitHub repo.

I hope it is useful.


Vivaldi 4.3

My go-to browser has always been Firefox. It is technically good. In parallel, I also use multiple other browsers. It is a bit of a nuisance sometimes to switch around, but I manage.

Lately, I have been using a specific web app more and more and it needs to use a specific feature that, at the moment, is supported only in chrome engine. My options are Brave and Vivaldi.

I like Brave's design a lot, but Vivaldi offers more than just browsing, so I have been experimenting with it. And recently, there was a new update and I like the privacy improvements. Below are two recent examples of Vivaldi's proactive privacy measures.

Vivaldi 4.3

I am also impressed that Vivaldi is employee owned with no outside investor. I hope they can stay that way.

Check them out here.


Update: Despite Vivaldi's various built-in blocking, seems that I can do MS Teams video meeting on Vivaldi smoothly.

Huawei Watch Fit conclusion

I have been using the Watch Fit for about seven months and this is my final follow up on it. To get some context, you can read the second review and the first review.


Huawei Watch Fit follow up review

I have been using the Watch Fit for sometime now, so this is a follow up to my initial review.

The watch strap is made of soft rubber; it is really nice. However, unlike Garmin Vivosmart and Xiao Mi Band that use a clipping mechanism, Watch Fit uses traditional buckle mechanism. And for hours and hours typing on keyboard, traditional buckle does not sit too well for my typing comfort. Thus during the day, I stay with my mechanical watch which does not use traditional buckle.

So I only wear it at night and for running.

Sleep tracking turns out to be interesting. Whenever I feel lacking energy, the sleep tracker confirms that I did not get a lot of “deep sleep” the night before.

The Watch Fit does not have any setting to turn GPS on or off, which I thought odd initially. But then I realise that it is actually set by choosing the exercise mode. Initially I thought: why does it have “Running Outdoor” and “Running Indoor” modes? The answer, obviously, “outdoor” mode turns on GPS. Likewise with other outdoor exercises in the list.

Acquiring GPS signal is a bit slow most of the times. I don't know if this is a factor of my neighbourhood's location or not. To date, I have not used it elsewhere.

The GPS distance measurement is not consistent. This is a bit annoying if I run a fixed route. I now understand why there is a wide price range for GPS-enabled fitness trackers. If precision is important for your regime, I can see why you will want to buy high end fitness tracking models.

As for my current need, I am learning to not worry about it.

Battery life is as advertised by Huawei. When it is down to 10%, it will alert me. The recharge time is fast. It takes 25 minutes from 10% to 80%. Give it 10 more minutes and it reaches 90%.

The system has been stable for me. I did not run into any issue at all, but Huawei updated the firmware twice already for minor enhancements.

In closing, if you want GPS and not too demanding about it, Huawei Watch Fit is a good value for casual fitness tracking.

Have fun with your exercise.