Keep the books you read in sync with your GitHub profile README

In this post I’d like to show you how to use GitHub Actions to automatically sync your Goodreads books you read in your GitHub profile README.

I created goodreads-profile-workflow for devs that love to read and like to share what they read. You can customise the input parameters to your liking: list the books you’re currently reading, last 5 books you read and even add your personal ratings, too.

GitHub Repo:

GitHub Action Name: Goodreads Profile Workflow

Leave a star on the repo if you think it’s cool!

GitHub Actions and Profile READMEs

Npm comes with a neat tool called npx that lets you directly execute packages from the npm registry. It temporarily downloads it behind the scene and won’t pollute your local or global npm environment.

In this post I’ll skip useful packages that are bound to libraries and frameworks like Angular’s ng, react’s create-react-app or capacitor’s cap.

I focus on packages that have helped me through my daily life as a developer.

npx kill-port

I’ve used Google Fonts in prototypes and in 10M+ MAU products. It’s incredibly easy to get started with and provides an amazing font discovery. That’s also why it’s currently still used on over 42M websites!

This convenience has its price: Performance. Many have already pointed out the cost of multiple requests. If you want the remaining speed boost, then you’re best off downloading your used Google Fonts and self-host them.

This is nothing new. In fact it’s been advocated already for years. Even Google themselves advised others to self-host fonts in their Google I/O ’18 talk about web performance.

Self-hosting fonts vs Google Fonts


I love reading books — I read through 1–4 books a month. That wasn’t always the case. If you saw my home just two years ago you wouldn’t have found any books. Back then I read a few blog posts online and that was it. I never felt the need to read pieces of paper bundled together.

…Until I tried it. I first tried it with a book called Factfulness by Hans Rosling. Backed with studies, science and nice graphs it gives you a great insight in the developed and developing world. That was ideal for me to get my…

I launched Notyfy on Product Hunt on 7th of May.

My first Product Hunt Launch 🎉—a lot of time went into the preparation together with my friend Peter 👋. Read on to see what stats and learnings finishing #11 on Product Hunt brings.


Let me quickly run you through what the product is that I launched on Product Hunt:

Notyfy is a browser extension that aggregates web notifications from Twitter, Reddit, Facebook and many more in one place. It is able to see which of the supported platforms you are already logged in — without requiring sensitive credentials like passwords—and does the checking for new notifications for you. Super seamless…

…and other things I’ve heard regarding Hybrid App development.

Let’s talk about the elephant in the room: Performance. Let me just show you how fast and smooth Hybrid apps can be based on this footage of my last work: JustWatch, a streaming search engine with 12M monthly active users. It’s been recorded on a OnePlus 6 (May 2018).

App boots fast and runs smoothly.

“Hybrid Apps will never be faster than native”

Yes, this is true. But they also don’t need to be. With current hardware and browser engines the performance of Hybrid Apps is already way beyond what Facebook’s Hybrid App debacle delivered in 2012. …

MARCH 2020 UPDATE: The new Firebase JS SDK Alpha makes your bundle up to 80% smaller! It now fully adopts tree-shaking and lets you import only what you truly need.

In a lot of tutorials I came across the comfortable solution of just adding import * as firebase from 'firebase' for your firebase import. As it turns out, there are 4 modular packages for Firebase. Here they are along with their sizes:

  • firebase/app: 22.1kb .initializeApp(firebaseConfig)
  • firebase/auth: 147.6kb .auth()
  • firebase/database: 139.8kb .database()
  • firebase/storage: 51.2kb .storage()

Usually you might not need all of these Firebase services and can require() or import just…

Nearly all evergreen browsers support Async/Await natively

Async/Await has been around the block already some time. Now that it is in stage-4 since July 2016 (stage finished in the ECMAScript proposals) and nearly all evergreen browsers support it natively, too (except IE is late to the party as usual 😪) — it’s definitely time to take a second look.


  • use babel-preset-env
  • yarn add regenerator or npm install regenerator
  • add node_modules/regenerator-runtime/runtime.js (10.7kb minified) into your bundle

#1 Requirements

#1.1 Babel

Forget preset-stage-0, babel-plugin-syntax-async-functions or whatever you can still find on outdated resources. Just use babel-preset-env.

Your .babelrc could look like this for the bare minimum to work (add your fancy plugins and…

service workers, offline-first, cache busting

New Update available popup.

PWAs are getting more and more coverage and support. They improve the web experience and can load your app instantly with their great ability for HTTP caching (among other things, but this post only covers caching).

The thing with Offline-First is, that you cache all the resources that are needed for launching up the webapp — even your index.html!

Note: No sweat! Browser implementations prevent you from deploying a version that will be cached for all eternity. For instance Chrome treats max-age of 1 day or 1 week or 1 year as 24 hours.

#1 Structure


Lately I encountered some native build errors that slowed me down quite a bit. Here is an overview of some of them, their issue and solution which might save you some time if you come across one of the following native errors:

  • iOS: ‘GoogleCloudMessaging.h’ file not found
  • iOS: Duplicate Symbols
  • Android: safeparcel.AbstractSafeParcelable not found
  • Android: Force Close due to phonegap-push-plugin

iOS: ‘GoogleCloudMessaging.h’ file not found

error: ‘GoogleCloudMessaging.h’ file not found
#import “GoogleCloudMessaging.h”
Lexical or Preprocessor Issue
> ‘GoogleCloudMessaging.h’ file not found
> PushPlugin.m


Cordova supports CocoaPods since 4.3.0. The issue here is that 2 pods don’t load correctly and you need to add them manually…

Simon Wicki

💬 Tech, frontend & non-fiction books 👨‍💻 Ex maker at 🔔 Creator of 🧙‍♂️ Freelancer

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store