All blogs / JavaScript / TypeScript
Christian Fei's Blog
Christian Fei's blog - Software Developer and hobbyist maker - A blog about Programming, DIY and personal ramblings
JavaScript / TypeScriptWeb developmentElectronicsDev tools / editors / IDEsGeneral
- Posts
- 318 from 1 May 2020 to 24 Jun 2026
- Posting
- now and then (2 in the last year)
- Kind
- personal blog
- Feed
- https://cri.dev/rss.xml
2026 2
2025 3
2024 18
- Crazy CSS experiments
- Visualize Bitcoin buys on Google Sheets - cri.dev
- Wanna learn something? Recreate it
- How to install Epic Games store on iPad with iOS 18
- Exclude specific tags in Eleventy using a custom filter
- Start Kindle script on system boot with init.d
- Converting my Kindle to a digital photo frame
- Display jailbroken Kindle info using lipc-get-prop
- Displaying RTSP stream on a jailbroken Kindle Paperwhite
- No ImageMagick? No problem, use FFmpeg!
- Display IP address on a jailbroken Kindle using eips
- Rooted / Jailbroke my Kindle Paperwhite
- How to add a TP-link Tapo camera to homeassistant
- PETG I love you, but you're bringing me down
- Google domains / Squarespace transfer (using Porkbun and Cloudflare)
- Google Sheets got fixed on iPad
- Google Sheets on iPad? More like 'Google Shiits' 💩
- Today is my Lucky Backup Day
2023 41
- ZenGPT: a simple ChapGPT alternative frontend
- htmx and Alpine.js are actually pretty awesome
- Using pure functions as views (with htmx and alpine.js)
- iPad can now control the audio when connected to an external monitor
- My iPad/iOS 17 wish list for 2024
- 3d printed stuff over the years
- Improving my tags using OpenAI's Chat completions API
- ChatGPT for learning Jamaican Patois
- A stupid web component
- Apple watch personal use cases
- htmx is just too much - cri.dev
- Protonmail iOS team seems super reactive to user feedback
- Southworking
- Learning about Web Components
- MiCA pizza e fichi
- Unblock single domain in AdGuard Home
- Airtag battery still low after replacing with new CR 2032 batteries
- Opinions on working fully remotely
- Favorite music while programming
- WebAuthn and Secure Payments Confirmation (SPC)
- Ti ricordi di Jumpy?
- About 1:1s
- Modern frontend apps with ES modules and import maps
- My impractical RSS reader in Google Sheets
- Provisioning a Raspberry Pi with Ansible (and an iPad)
- Node.js 20 is here
- ChatGPT practical use cases and examples
- Self-hosting miniflux with docker and provisioning with Ansible
- How to add Node.js & npm to jekyll in GitHub Codespaces
- Programming on an iPad - cri.dev
- Minimal Ansible Playbook to provision a server - cri.dev
- 3D printing with an iPad, Raspberry Pi and OctoPrint - cri.dev
- Update Node.js version on CloudFlare Pages - cri.dev
- malicious chrome extension - cri.dev
- yubikey spare keys - cri.dev
- 'Being agile' vs 'Doing Agile' - cri.dev
- How I edit this site on an iPad - cri.dev
- I cannot wait for the passwordless authentication future of the web - cri.dev
- How to become a better Software Developer - cri.dev
- OpenAI iOS Shortcut: Siri-like ChatGPT - cri.dev
- Artificial "intelligence" - cri.dev
2022 13
- Voracious RSS - cri.dev
- Escaping the bullshit web - cri.dev
- minimal-analytics, one year later - cri.dev
- Did an ES module migration, and it was okay - cri.dev
- Self-hosting nitter with docker-compose and nginx - cri.dev
- Fix node command not found using nvm - cri.dev
- Screen Wake Lock API - cri.dev
- Elixir GenServer name registration - cri.dev
- Web Workers + search index = decent blog search - cri.dev
- Barcode Detection API - cri.dev
- Kernel.===/3 - cri.dev
- WebTransport - cri.dev
- Productive macOS tricks - cri.dev
2021 64
- elixir alias __module__ - cri.dev
- cons - cri.dev
- Aggregates in domain driven design - cri.dev
- Domain events in domain driven design - cri.dev
- My Domain-Driven-Design study path - cri.dev
- Pattern matching with Enum.map in Elixir - cri.dev
- elixir mix test --stale --listen-to-stdin - cri.dev
- cqrs es with commanded in elixir - cri.dev
- osint framework - cri.dev
- Elixir Ecto guides and tutorials - cri.dev
- redirect route in phoenix - cri.dev
- Most useful mac keyboard shortcut - cri.dev
- What is a charlist in Elixir - cri.dev
- Vex, a validation library in Elixir - cri.dev
- exploring the github cli - cri.dev
- Spoonerism - cri.dev
- QR code - cri.dev
- 4 rules of simple design - cri.dev
- Useful homebrew formulas for Mac - cri.dev
- How to execute a remote script with Ansible - cri.dev
- 7 Visual Studio Code extensions I regularly use - cri.dev
- Spotlight not working on Big Sur: how to fix Spotlight index on MacOS Big Sur - cri.dev
- duckduckgo short url - cri.dev
- mallet operator - cri.dev
- queueMicrotask - cri.dev
- manjaro connect bluetooth keyboard at login screen - cri.dev
- Experiment: Navigating the web with JavaScript disabled - cri.dev
- Discontinuing comments - cri.dev
- scroll-behaviour - cri.dev
- How many visitors block ads and web analytics? - cri.dev
- How to solve manjaro different login, missing plasma desktop package - cri.dev
- nmtui - cri.dev
- CAPTCHA - cri.dev
- Self-hosting with nginx + docker-compose - cri.dev
- Lazy loading images in 11ty/eleventy - cri.dev
- Simple Server-sent events example in Node.js/JavaScript - cri.dev
- How to test a function that works with time - cri.dev
- Making Minimal Analytics - cri.dev
- Beware of Monero mining attack through GitHub Actions and malicious Pull requests - cri.dev
- Switching to CloudFlare Pages, from AWS S3 + CloudFlare DNS - cri.dev
- Simple Static site/blog search in 14 Lines of JavaScript - cri.dev
- Cos’è e com’è stato sviluppato il Lean Validation Playbook - cri.dev
- What apps I'm currently self-hosting - cri.dev
- Manage multiple network connections in Manjaro (Wireguard VPN + Pi-hole) - cri.dev
- Self-hosted Miniflux + Wallabag - cri.dev
- Tracking RSS subscriptions with UTM parameters - cri.dev
- Learn Elixir - A study path - cri.dev
- Beware of new Ledger phishing emails from myledgerlive - cri.dev
- Read mbox file with mutt or Thunderbird - cri.dev
- Bitcoin is trademarked. Is it really? - cri.dev
- 3D-printed Bitcoin desk watcher - cri.dev
- My reading stack with Miniflux/RSS & Pocket - cri.dev
- My notes while learning Elixir - cri.dev
- 5$/month Self Hosted VPN with WireGuard - cri.dev
- Let's learn some Elixir, again - cri.dev
- Comments on cri.dev are BACK - cri.dev
- Put that in the URL, please - cri.dev
- A retrospective of 100k yearly pageviews - cri.dev
- Getting started with Mastodon - cri.dev
- About donations, free and paid content - cri.dev
- Pair AirPods with Linux Ubuntu - cri.dev
- Experimenting with Webmention - cri.dev
- From Mac to Linux - cri.dev
- 2020 - A retrospective - cri.dev
2020 59
- How to convert Pandas Series column values to lowercase - cri.dev
- GreeMta Madrid Green Sustainability challenge - cri.dev
- Notes on 'Blogging for Business' - cri.dev
- Node.js 15 is here - cri.dev
- What is technical debt? - cri.dev
- Cleanup docker dangling images - cri.dev
- Indie makers and the Sunk Cost Fallacy - cri.dev
- Test driving a HackerNews scraper with Node.js - cri.dev
- Tracking HackerNews history in git - cri.dev
- How to make Polls with Plausible Analytics - cri.dev
- Fix npm process killed during npm install - cri.dev
- Communicating with Bangle.js Watch over BLE with Node.js - cri.dev
- Bangle watch as an accelerometer mouse - cri.dev
- How to fix xcode-select no developer tools found - cri.dev
- Top resources for Bangle.js Watch Development - cri.dev
- The High Privacy Cost of a “Free” Website - cri.dev
- Show realtime visitors on your website with Plausible Analytics and CloudFlare Workers - cri.dev
- Notes "Edward Snowden interviewed by Ron Paul" - cri.dev
- Why privacy matters - Glenn Greenwald - cri.dev
- Fast virtual scrolling with preact - cri.dev
- Get things done for real - cri.dev
- Notes on “I've got nothing to hide” - cri.dev
- What is a retrospective? - cri.dev
- Raspberry Pi as a local server for self hosting applications - cri.dev
- 'But I have nothing to hide.' - cri.dev
- DIY IoT door monitor with ESP8266 - cri.dev
- Simple Time-lapse with a Raspberry Pi - cri.dev
- Watermark images with montage (ImageMagick) - cri.dev
- 4 Most powerful Mini-PCs in 2020 - cri.dev
- Don't buy the AirPods Pro - Another Rattlegate story - cri.dev
- Simple email trick to manage your newsletters - cri.dev
- Techniques to improve SEO for a static website or blog - cri.dev
- Made 13 Dollars with Brave and Basic Attention token - cri.dev
- How to fix possible EventEmitter memory leak detected - cri.dev
- Simple event tracking with Plausible Analytics - cri.dev
- Notes on 'Marketing for Developers' - devmarketing.xyz - cri.dev
- Aggregations with sub-documents in MongoDB - cri.dev
- Get distinct field names of sub documents in MongoDB - cri.dev
- How to solve Docker 'Incompatible CPU detected' - cri.dev
- How to solve Docker 'docker-credential-desktop not installed or not available in PATH' - cri.dev
- Most valuable developer linux notebooks in 2020 - cri.dev
- Install Homeassistant on Raspberry Pi - cri.dev
- Notes on "Code BEAM V 2020" - cri.dev
- Solve Verdaccio EINTEGRITY error - cri.dev
- Authenticated uplinks with verdaccio - cri.dev
- Upgrade HTTP requests with X-Forwarded-Proto Header in HAProxy - cri.dev
- Upgrading MongoDB 3.6 to 4.2 with brew - cri.dev
- Clean up Mac OS: How I freed 35GB of space - cri.dev
- Testing in Node.js by example using the SOLID principles - cri.dev
- Fixing 431 Request Header Fields Too Large in Node.js - cri.dev
- Setting up a Verdaccio npm registry - cri.dev
- Privacy-friendly alternatives to popular services and tools - cri.dev
- Elixir trick: start an Observer window with mix - cri.dev
- Minimal dark mode with CSS and JavaScript - cri.dev
- Validate your RSS feed - cri.dev
- Ad blocking with Raspberry Pi and Pi-hole - cri.dev
- Using µcompress to dramatically optimize static assets - cri.dev
- Nullish coalescing in Node.js 14 and JavaScript - cri.dev
- Optional chaining in Node.js 14 and JavaScript - cri.dev
Undated 118
- 2020 04 28 Road to Elixir: Monitor Crypto assets
- 2020 04 24 Resuming Elixir by self hosting plausible analytics
- 2020 04 23 How to exclude Google Analytics in your Cypress E2E tests
- 2020 04 19 devblog yet another static site generator seriously
- 2020 04 07 Preferred Visual Studio Code theme in 2020
- 2020 04 05 Boring software development
- 2020 04 04 Full list of Chromium Puppeteer flags
- 2020 03 30 How to connect puppeteer to a Proxy
- 2020 03 30 How to solve Puppeteer Chrome Error ERR INVALID ARGUMENT
- 2020 03 27 How to solve Please specify which branch you want to rebase against
- 2020 03 09 Crawling a web site with browserless, puppeteer and Node.js
- 2020 03 08 Ultimate web scraping with browserless, puppeteer and Node.js
- 2020 03 07 How to create a Twitter application for user login
- 2020 03 07 Twitter OAuth Login with fastify and Node.js
- 2020 03 05 Twitter OAuth Login by example with Node.js
- 2020 03 04 Send a Telegram message with Darklang
- 2020 03 02 First steps with Darklang
- 2020 03 01 About Cloudflare's support for ccTLDs and gTLDs
- 2020 02 29 Take a photo with raspistill on a Raspberry Pi
- 2020 02 25 Simple npmrc management
- 2020 02 15 Twitter OAuth by example in Nodejs
- 2020 02 13 So Long and Thanks for All the Veggies
- 2020 02 08 Connect to mongo with monk in Node.js
- 2020 02 08 Minimal environments with dotenv and Node.js
- 2020 02 08 Simplest Vanilla JavaScript static site blog search for Jekyll, Hugo, 11.ty eleventy
- 2020 02 05 Lazy loading images in 2020
- 2020 01 29 How to recover from failed lerna publish
- 2020 01 28 The cleanest way to maintain connect express middlewares in node js
- 2020 01 03 Raspberry SSH connect over Wi Fi Wireless not working host not found
- 2019 12 12 the color fe1
- 2019 12 11 better web scraping with nodejs
- 2019 12 08 completed hacktoberfest 2019
- 2019 10 27 my blogging stack in 2020
- 2019 08 31 Run Cypress Integration Tests with GitHub Actions Workflow
- 2019 08 30 AWS Lambda S3 ffmpeg Timelapse
- 2019 08 29 Deploy Eleventy site with Github Actions on AWS S3
- 2019 08 29 Preferred way of defining flags in bash
- 2019 08 29 Simple telegram message with GitHub Actions
- 2019 08 26 Simple ad and trackers blocking with DNS
- 2019 08 25 Build for a slow connection
- 2019 07 19 Fun with single letter commands
- 2019 07 16 Upgrade MongoDB 3 to 4 on Ubuntu
- 2019 04 07 Get last non empty cell value in a spreadsheet
- 2019 04 04 How to fix Ansible error The task includes an option with an undefined variable
- 2018 12 09 Notes about Crash course in Machine Learning
- 2018 11 28 Publishing org scoped npm packages with travis
- 2018 10 31 my current blogging stack
- 2018 10 18 Start an npm script with pm2
- 2018 10 06 Make Anaconda executables available in your PATH fish shell
- 2018 07 11 clean android device storage move files to sd card remove junk files
- 2018 07 03 pm2 deploy shallow git repository with depth also known as fetch fast
- 2018 04 18 Fix Python 2 7 issue on OSX bad interpreter
- 2018 04 12 Easy rate limit API calls with p limit
- 2018 04 12 Notes about Blockchain for Smart Communities trentosmart TSCW18
- 2018 04 09 Fix issue with Pandoc MacOS Sierra and pdflatex xelatex
- 2018 04 05 Offloading my Inbox items to discover
- 2018 02 07 setup nginx as a reverse proxy with basic auth for an upstream
- 2018 01 31 a story about npm publish unpublish
- 2017 12 11 Mapping historic market data
- 2017 10 21 Building the new version of pomodoro.cc in the open
- 2017 10 13 Keeping an eye on your Crypto currency trades with Uebersicht
- 2017 04 15 Loop jekyll data directory files
- 2017 03 30 My dotfiles
- 2017 03 27 Prevent accidental quit of iTerm
- 2017 03 24 how i deploy my site
- 2017 03 23 how i build my site
- 2017 03 22 npm package kata
- 2017 02 24 Trying out Redash
- 2017 02 22 Chaining and indenting after the return statement
- 2017 02 10 How to read Hacker Newsletter
- 2017 02 05 Use Simple Jekyll Search on your blog in these easy steps
- 2016 05 28 discourse first installation steps
- 2016 02 03 i was at fosdem 2016 and it was awesome
- 2016 01 07 Forking is a commitment
- 2015 11 23 Using a daily activity log to keep track of your studies and bookmarks
- 2015 10 25 Elixir Plug order matters
- 2015 10 24 Jekyll new post script
- 2015 10 20 Introduction to AngularJS
- 2015 10 19 What Elixir and Angular have in common
- 2015 10 18 Favor Viewmodel over $scope
- 2015 10 15 Always $digest after you expect
- 2015 08 12 How to invalidate app cache
- 2015 07 07 The simplest way to set vagrant default directory
- 2015 07 05 Backup mongodb database from docker container to host
- 2015 07 04 Conforming to protocols in JavaScript
- 2015 05 09 Functional JavaScript write your negate not function
- 2015 05 24 write a damn readme
- 2015 04 27 About business value and confidence in legacy projects
- 2015 04 23 Angular ui router same url different state
- 2015 03 06 Cache speed up docker node modules
- 2015 03 04 How to pull request from command line
- 2015 02 23 How to use morgan with node simple router
- 2015 02 21 start your kata the right way
- 2015 01 17 Write your Protractor tests in Cucumber
- 2015 01 16 How to zsh and hub auto completition
- 2015 01 09 Debugging acceptance tests with Angular and Cucumber
- 2014 12 23 keep docker container running with upstart and dockers restart policy
- 2014 10 27 a list of angular style guides
- 2014 08 22 Angular Filter already selected items from ng options
- 2014 08 20 Solution to PhoneGap issue device ready has not fired after 5 seconds
- 2014 08 03 How to configure Drone behind an nginx proxy on a subdomain
- 2014 08 02 How to setup Drone CI on your server
- 2014 07 05 A practical workflow for resizing images with ImageMagick
- 2014 06 30 DRY dependency injection in Angular with gulp ng annotate
- 2014 05 26 A closer look at Angular's dependency injection
- 2014 03 04 updating dynamic fields and nested arrays in mongodb
- 2014 01 19 node and sudo now kiss
- 2014 01 18 simplest apache configuration for hosting multiple sites
- 2014 01 05 create a new github repository from the command line
- 2014 01 04 about vanity metrics and social media bullshit
- 2013 10 12 simple templating with regular expressions
- 2013 09 17 keep ssh connection alive
- 2013 07 16 how to gzip compression of css and js files on s3 with s3cmd
- 2013 06 06 how to lazy load disqus comments
- 2013 05 08 auto mount partitions on linux the easy way
- 2013 04 21 berlin april 2013
- 2013 03 29 replace links in files with regular expressions
- 2012 12 23 enable indexing of ntfs partition on mac