All blogs / DevOps / SRE / infrastructure
Tuan-Anh Tran
Recent content on Tuan-Anh Tran
DevOps / SRE / infrastructureSoftware / engineering practiceLinux / Unix
- Posts
- 341 from 13 Jul 2013 to 6 Jun 2026
- Posting
- monthly (17 in the last year)
- Kind
- personal blog
- Feed
- https://tuananh.net/feed.xml
2026 16
- Some concerns about Ladybird's bylaws
- My tech stack (2026)
- Why your next mobile app is probably headless
- Relicensing with AI-assisted rewrite
- BuildKit: Docker's Hidden Gem That Can Build Almost Anything
- A Bug is a Bug, but a Patch is a Policy: The Case for Bootable Containers
- Hope Is Not a Security Strategy: Why Secure-by-Default Beats Hardening
- Shifting Left of CI
- The Post-Agentic World: The Economics of Abundant Intelligence
- I was wrong about AI agent sandboxing
- Achieving a 0-CVE OS for VMs: The End of Traditional Patching
- What has Docker become?
- Digital Footprint in the AI Era
- All Flash NAS Upgrade
- Phần mềm gõ tay
- Architecture for Disposable Systems
2025 10
- Fix Battle.net agent went to sleep BLZBNTBNA00000005
- Execution is cheap(er)
- On MCP security
- AI không còn là điểm khác biệt chiến lược của sản phẩm nữa
- Download view-only Google Sheets
- Writing your first Arch Linux package
- Lite Youtube Embed for Hugo
- OBS - Fedora fiasco
- In market for a new TV in 2025
- How to install Cursor CLI on Linux
2024 8
2023 2
2022 1
2021 10
- Public ECR and private subnets
- Shure MV7 working on Linux
- Using k8s kind "rootlessly" without Docker
- Làm quen với Pod Security Admission (PSA)
- My blogging setup these days
- How to write Node modules with Rust
- What the fuck is even GitOps
- Distributed tracing is the new structured logging
- The state of Linux on desktop (2020)
- Using Cloudflare Warp on Linux
2020 17
- An extremely fast streaming SAX parser for Node.js
- camaro v6
- From Zsh to Fish on macOS
- kubectl run generators removed
- Using Synology NFS as external storage with Kubernetes
- Debugging Kubernetes: Unable to connect to the server: EOF
- How to setup reverse proxy for homelab with Caddy server
- Tips for first time rack buyer
- How to setup a home VPN with Synology NAS
- How to adopt UniFi Security Gateway to an existing network
- Dynamic DNS with CloudFlare
- Traffic from #1 post on Hacker News
- The story behind my talk: Cloud Cost Optimization at Scale: How we use Kubernetes and spot instances to reduce EC2 billing up to 80%
- Thoughts on Workers KV
- Reader
- Experiment with Cloudflare Workers
- Brag document
2019 13
- Debugging with git bisect
- The state of tiling window manager on Windows 10
- A beginner guide to CPU air cooling
- Advanced filtering and sorting with redis (part 2)
- Pi-hole
- Microsoft Sculpt Ergonomic Desktop review
- Optimal team size
- From macOS to Windows 10
- Tips on reducing WASM file size with Emscripten
- Choosing a wireless router in 2019
- Some lessons learnt after converting a native module to WebAssembly
- How to delete Redis keys using pattern
- Autocomplete at speed of light
2018 13
- 2018: year in review
- My keyboard layout
- Favorite QMK hacks
- Fastest way to transform XML to JSON in Node.js
- Sharding and IDs
- Advanced filtering and sorting with redis (part 1)
- Notes on GraphQL
- Kubernetes Meetup #2 slide
- The Birth & Death of JavaScript
- Advice to new managers
- DejaLu - a new open source email client by Sparrow's author
- Series and parallel execution with async/await
- 2017: year in review
2017 29
- Building containers in pure Bash and C
- A better way to go through terminal command history
- The silence of the Lambda
- Traits of a good leader
- node-prune
- kompression - koa compression middleware with support for brotli
- Docker Containers on the Desktop
- If Your Boss Could Do Your Job, You’re More Likely to Be Happy at Work
- Kubernetes-hosted application checklist (part 1)
- Kubernetes-hosted application checklist (part 2)
- Minimal Node.js docker container
- Non-privileged containers FTW
- Recent Node.js TSC fuss
- node-pre-gyp and CI
- Tldr
- Getting started with WebAssembly
- The power of 2 random choices
- Camaro
- Parsing XML at the Speed of Light
- Redisearch - full text search with Redis
- minideb - a small base image based on Debian
- Using alpine as base Docker image
- Running twemproxy on kubernetes
- Setting up traefik as Ingress controller for Kubernetes
- n-api: add support for abi stable module API
- codis - proxy based redis cluster
- Redis as a JSON store
- Spot instances best practices
- Debugging why k8s autoscaler wouldn't scale down
2016 47
- smaz.js - a Node.js module binding for smaz
- Setting up fluentd log forwarding from Kubernetes to AWS Cloudwatch Logs
- GopherCon 2016: Kelsey Hightower - Building a custom Kubernetes scheduler
- Kubernetes spot termination notice handler
- Fix Terminal no longer uses keychain in MacOS Sierra
- Why we choose Kubernetes over ECS
- Bring in the Goddamn Adults Already
- Using ioredis with twemproxy
- kube-monkey
- Automate Let's Encrypt certificate genernation for Kubernetes Ingress
- Mycli
- Sharing secret data in Kubernetes
- Distelli - Your DevOps Dashboard for Kubernetes
- Using squid proxy to bypass 3rd party API IP whitelisting
- Getting started with Kubernetes
- Should I use yarn?
- The state of tiling window manager for OS X
- Amped
- Breaking changes between v4 LTS and v6 LTS
- Mincss
- Xbox Scorpio vs PS Neo
- Do’s and Don’ts of AWS Lambda
- How to import csv file in MySQL
- No More Vietnam
- Mildly interesting npm modules
- AWS Lambda
- Flynn 1.0
- Open-source PaaS on AWS
- Work hard and go home
- Refined Twitter
- Geo dynamic upstream with nginx
- Build command line tools with Node.js
- Classic Programmer Paintings
- Google kick-starts engineering team in Singapore
- Why JSON doesn't support comments
- Concurrency and parallelism
- Implement autocomplete with redis
- Welcome the second Pom to my family
- Setting up SSL certificate with Deis
- Search airport by city name
- How to install Discourse without Docker
- A look back at 2015
- MariaDB Raises $9M More, Michael Howard Named New CEO, Monty Widenius CTO
- Chuyện tiền nong
- Better MySQL pagination
- Performance at Rest
- Qmail
2015 54
- Explicit over clever
- Step by step how to install Deis on AWS
- Metalsmith - a static site generator written in Node.js
- Possibly the easiest way to setup rtorrent/rutorrent
- Snapp
- Stuff you may not know about console
- Node.js happy coding
- ES6 in Node.js
- Go Native - Calling C++ From NodeJS
- Atom is slow but that's okay
- Efficient branching workflow with git flow
- Hello, HotelQuickly!
- Cancelling $http request in AngularJS
- How to install ZeroMQ on Ubuntu
- My first Hackathon
- Vì sao tôi thích xài email hơn là điện thoại
- Markdown table sucks. Let's use jekyll's data files instead
- Tắt tiếng của tab ở Chrome
- A collective list of Manchester United players' autobiographies
- MusicBrainz Picard
- The Codeless Code - Fables and Kōans for the Software Engineer
- Đặc quyền con người qua trò ném giấy vào thùng
- Về một thách thức trong quá trình học hỏi
- Love
- Managing multiple SSH tunnels is easy with Secure Pipes
- Official Oracle driver for Node.JS
- Atom switches to io.js
- BitTorrent Sync as an alternate backup solution
- Incremental regeneration in latest jekyll build
- Theming Apache's mod_autoindex directory listing
- Some of the most useful tips I learn when working with NodeJS
- Install io.js on Mac OS X
- How the Other Half Works: an Adventure in the Low Status of Software Engineers
- Things software developers wish they had known in their 20s
- How movies could change your perception
- Fix WELD-001408 unsatisfied dependencies for type error when deploying to GlassFish
- REST APIs made easy with StrongLoop
- Microsoft HoloLens
- Create a contact form with jekyll
- Fuck callbacks! Let's use generators
- IO performance benchmark on RamNode
- bluebird - a promise library with unmatched performance
- So I upgraded my VPS
- Scaling node.js application with cluster
- io.js v1.0.0 released
- Using AngularJS with jekyll
- A minimal iTerm2 setup
- AngularJS diary - Day 4
- Pretender - a mock server library
- The next bullet on my resume: AngularJS
- How to setup rtorrent, rutorrent on Ubuntu
- Using GitHub issue tracker as comment system for your static blog
- Resume-driven developer
- Shower thought about movie recommedation
2014 71
- Inline Google fonts to further reduce number of blocking CSS resources
- Contexts is the perfect companion app for Amethyst
- How to burn a bootable ISO file to USB stick on OS X
- Awesome maching learning
- Deferred font loading and using localStorage as cache
- How to fix `Logon failed for login 'username' due to trigger execution` error with mssql
- nodejs: callback vs promise
- How to setup Sublime-IJulia with Sublime Text
- A conversation with stranger
- Social sharing button without embedding sharing script crap
- When static website isn't fast enough
- New theme
- BAT script to execute commands on remote Unix machine with PuTTY
- youtube-dl - A must have little gem in your toolbelt
- Shorter code is better?
- Where is the safest seat on airplane?
- Filco Majestouch 2 Ninja Italian Red (TKL) review
- Filco Majestouch 2 Italian Red (TKL) with blue switches
- How to find table name when knowing column name and column value in Oracle
- Some useful use cases for Java Reflection
- Poker 2 keyboard with Granite and Dolch keycaps
- Force Safari to refresh website's favicon
- How to setup your VPS as a seedbox in under 15 mins
- A poor man's seedbox for $15 a year
- LaunchRocket
- Download accelerators, managers for Mac
- How to lazy-load CSS with JavaScript
- Java 9 is coming with money API
- SafariTabSwitching
- Maxel - a native download accelerator for OS X
- A better sitemap for jekyll
- jQuery Tips and Tricks
- Is Mailbox (for Mac) the last email client you ever need?
- Fix unable to download huge files with varnish
- Lift - an app that put your goals into action
- Localization with jekyll
- My favorite tiling window manager for OS X
- How to setup Discourse local dev environment on OS X
- Post scheduling with jekyll
- CloudFlare to offer free-SSL by mid-October
- jekyll full-text search without jQuery or plugin
- Another attempt at regular blogging
- jekyll plugin directory
- Make your jekyll blog a little bit more SEO-friendly
- Paginated post plugin for jekyll
- How to use jekyll plugins with GitHub Pages
- Writing your first jekyll plugin
- Embedding Liquid code snippet with jekyll
- Monthly/yearly post archive generator plugin for jekyll
- Blogging with jekyll
- BetterTube - A jekyll plugin for embedding YouTube videos
- Optimizing the hell out of your site for PageSpeed
- Static assets combine with jekyll
- Things you may not know about JavaScript array
- How to connect to remote Postgres DB through ssh tunnel
- Returning query result as json array with Oracle 10G
- Setup custom error page for jekyll on nginx
- Speed up jekyll site generation with rsync
- Hydra - an open-source window manager for OS X written in Lua
- Clean code/dirty code
- How to use SSH tunnel to access blocked websites
- How to code like a dick in JS
- Cakebrew
- Matias Laptop Pro review
- Programming is like writing a book
- How to install Discourse on DigitalOcean
- Tự do ngôn luận
- Be happy
- Matias Quiet Pro black matte case mod
- My must-have Cydia tweaks/apps
- Matias Ergo Pro
2013 50
- GasMask keycap
- Features vs. Benefits
- Google Nexus 5 review
- Phân tâm
- IntelliJ IDEA 13 released
- If humans evolved from monkeys, then why are there still monkeys?
- Who Needs Stored Procedures, Anyways? (2004 post)
- IntelliJ IDEA 13 to be released with Java 7 Bundled Mac Installer
- How to use Source Code Pro font with JetBrains IDE
- FastR - an implementation of R in Java
- What goes into what in MVC
- How to group posts by month in Jekyll archive page
- The six most common species of code
- History of the browser user-agent string
- Hyde
- Humble New Tab Page
- Letter to a young programmer
- Pinboard tab sets
- Nexus 5 and Android KitKat
- Snip - another screenshot capture/annotation tool
- Flamingo for Mac
- Free OCR solution on OS X
- Amethyst - A tiling window manager for OS X
- Fixing Mac App Store error 100 when purchasing app
- FACEMATH
- Dropshelf
- FileBot
- Why We Hate Infographics And Why You Should
- Liquid
- Minbox
- Volume Scroll
- namebench
- Contexts for Mac
- Droplr Draw
- Link Post in Jekyll
- Nginx Plus
- Shiori - A Pinboard & Delicious Client for OS X
- Korean Buses Now Wirelessly Charge as They Drive
- Magic
- Z type
- How Koreans Solve Their Parking Issue and Saving Oil
- How To Fake Database Design
- homebrew-cask
- Daring Fireball User Custom Style
- Layouts v2.0
- MailDrop.cc - Free Throwaway Email Address
- Trolling Or Just Pure Stupidity!?
- Effeckt.css
- A Proposal to A Better Format for Research Paper
- Finally