The Curious Engineer

All blogs / Web development

Stefan Judis Web Development

stefanjudis.com

I love building things for the web. And I love writing sharing things about the web.

Web developmentJavaScript / TypeScriptFrontend / CSS / browsers

Posts
321 from 29 Jan 2020 to 18 Oct 2026
Posting
weekly (44 in the last year)
Kind
personal blog
Feed
https://www.stefanjudis.com/rss.xml

2026 35

  1. Blake Watson on the state of the industry (#note)
  2. Web Weekly #201 (#blogPost)
  3. Web Weekly #200 (#blogPost)
  4. Sally Hall on being proud of doing the work (#blogPost)
  5. Web Weekly #199 (#blogPost)
  6. Web Weekly #198 (#blogPost)
  7. Web Weekly #197 (#blogPost)
  8. Michelle Barker on Stage Fright (#note)
  9. Web Weekly #196 (#blogPost)
  10. Escape from Average (#note)
  11. Web Weekly #195 (#blogPost)
  12. Web Weekly #194 (#blogPost)
  13. Web Weekly #193 (#blogPost)
  14. Web Weekly #192 (#blogPost)
  15. Web Weekly #191 (#blogPost)
  16. Web Weekly #190 (#blogPost)
  17. Web Weekly #189 (#blogPost)
  18. Web Weekly #188 (#blogPost)
  19. Intl can localize units, too! (#tilPost)
  20. The scope of type guards and assertion functions (#tilPost)
  21. Web Weekly #187 (#blogPost)
  22. Web Weekly #186 (#blogPost)
  23. Web Weekly #185 (#blogPost)
  24. New lines are removed from WHATWG URLs (#tilPost)
  25. Nobody owes you anything (#blogPost)
  26. How to scale elements and their layout with CSS "zoom"
  27. Notes on relying on the ARIA Authoring Practices Guide
  28. How to style the found search / "find in page" substrings
  29. Clean up your Mac with open source
  30. ARIA roles can remove their children’s semantics
  31. The Trust Equation
  32. Firefox DevTools hides unreferenced CSS variables
  33. If you don't care, I don't care...
  34. Automatically load .env files in Node.js scripts
  35. A ready-to-use diff component

2025 49

  1. Feature detection of View Transition Types
  2. Simon Willison on delivering AI generated code
  3. light-dark() isn't always the same as prefers-color-scheme
  4. Three conditional border-radius CSS snippets
  5. Syntax-highlighting for JS template strings in VS Code
  6. A Raycast confetti shell command
  7. How to "officially" deprecate methods with Node.js utilities
  8. pathLength makes makes SVG path animations easier to manage
  9. Chrome supports split views (behind a flag)
  10. Stop citing AI
  11. Quoting Pablo Enoc
  12. Turn off macOS Liquid Glass via the CLI
  13. field-sizing isn't only about growing textareas
  14. Header & footer elements change their roles when they're inside of sectioning content
  15. I disabled my YouTube "Home" feed and I might like it
  16. Node.js includes a native glob utility
  17. Keyframe animations have a special role in the CSS cascade
  18. When AI will browse the web for me
  19. How I record, edit and publish YouTube videos
  20. Tag, you're it
  21. IntelliSense in the VS Code terminal
  22. Node.js supports import maps
  23. Talking about the Polypane browser with Kilian Valkhof
  24. Quoting Jeffrey Zeldman
  25. Open new tabs next to the current one in Firefox
  26. The Internet Archive opt out itch
  27. Stringly Typed
  28. Forbidden headers can't be set in "fetch" requests
  29. WCAG success criteria that can't be autmatically tested
  30. The macOS inline dictionary has a shortcut
  31. Query "newly" available baseline features in Node.js
  32. Thoughts on close requests for dialogs
  33. parseInt parses anything starting with a number
  34. TypeScript "strictFunctionTypes" is ignored for method syntax
  35. Rerun commands with the built-in "r" command
  36. How to iterate over TypeScript union types
  37. How to apply a global Git commit template
  38. A well-known avatar URL would be dang cool.
  39. The difference between @ts-ignore and @ts-expect-error
  40. How to load images in a spreadsheet
  41. Playwright has an experimental CLI watch mode
  42. Load the default OS font with CSS
  43. A "section" without an accessible name is nothing but a "div"
  44. Open a new project in the same VS Code window
  45. Template Literal Types for validating files names
  46. Static initialization blocks in JavaScript classes
  47. Use "translate" to turn off element translations
  48. Default Apps 2024
  49. Duplicated CSS @keyframes properties are valid

2024 44

  1. To blog something to show
  2. Hide object properties with JavaScript symbols
  3. How to open a local file from the URL bar in VS Code
  4. An API to access browser support and baseline data
  5. Earlier function parameters are available to default parameters
  6. Navigate your shell history with CTRL keys
  7. A web component to show browser support and baseline status
  8. How to search for strings in Git commit additions or deletions
  9. Notes on the vanishing .io toplevel domain
  10. Set the default time zone in Node.js
  11. Processes and rules make code review less intimidating
  12. On being a "JavaScript framework developer"...
  13. The order of accessible name computation steps
  14. A shortcut to edit long shell commands in your $EDITOR
  15. Space shuttle style coding
  16. Forms without an accessible name are not exposed as ARIA landmarks
  17. Construct query strings from FormData
  18. Web content, the social contract and copyrights
  19. Safari 18 — what web features are usable across browsers?
  20. Support your local content dealers
  21. Investigating INP issues
  22. Target=_blank implies rel=noopener
  23. VS Code's new minimap section headers
  24. Disable Angular's scroll position restoration for specific routes
  25. Reveal an image with smart padding
  26. Index images, videos and news with specialized sitemaps
  27. Why do I fail at achieving personal goals?
  28. Bun's trusted dependencies
  29. Unit testing AI apps
  30. Reasons for opening links in a new tab
  31. Timestamped Git yolo commits
  32. disabled vs aria-disabled on form elements
  33. Auto-margin works with absolute positioned elements
  34. A list of design inspiration lists
  35. The death of custom media queries
  36. Readonly files in VSCode
  37. Forever projects
  38. htmz — a 176 bytes htmx alternative
  39. How to type fixed string value combinations with template literal types
  40. Fading out text with CSS
  41. How to turn off password managers for fields
  42. Accessible notifications
  43. How to exclude elements from being shown in Google Search results
  44. How to do math in shell environments (bash, zsh, ...)

2023 43

  1. Local link targets must be focusable to prevent accessibility issues
  2. CSS only "scroll-to-top"
  3. A web component to make your text sparkle
  4. oklch() retains perceived lightness for different hue angles
  5. Too small touch targets
  6. JS surprise: Array.every() always returns true for empty arrays
  7. How to style element descendants with Tailwind CSS
  8. How to escape CSS selectors in JavaScript
  9. How to validate URLs in JavaScript (2023 edition)
  10. Conversation closure
  11. Fancy SVG filters
  12. How to remove all event listeners from a DOM element
  13. How to use headless Chrome in serverless functions with a 50MB limit
  14. How to show TypeScript type annotations in code snippets
  15. Copy an array and replace one element at a specific index with modern JavaScript
  16. How to prerender Tweets without using the official Twitter APIs
  17. Why do visually hidden CSS classes define a size of 1x1?
  18. Self-closing tags are mostly meaningless in HTML
  19. The "DomInteractive" event and a browser metrics deep dive
  20. How to use EventTarget as a web-native event emitter
  21. A ::selection web compatibility issue
  22. Safari allows to configure password autofilling
  23. Resumability, compilers and event delegation
  24. The lie of YouTube's privacy-enhanced embed mode
  25. Slice — an app to remove variable font axes
  26. Glyphhanger — a tool to subset and optimize fonts
  27. How to show more than ten results per page on Google Search
  28. The relative font weight axis — how variable fonts ease font weight transitions
  29. New on the web: How to detect disabled JavaScript in CSS
  30. Make a PDF look like it was manually scanned
  31. Size container queries can detect landscape / portrait orientation
  32. VS Code extensions to ease navigating code
  33. Cool URIs don't change
  34. YAML provides 9 ways to handle strings
  35. The problem of breaking changes and version numbers
  36. How to safely remove untracked files from Git repos
  37. A userland React hook for managing global state
  38. Git-based dotfile management without symlinks
  39. How to narrow and secure types with const assertions
  40. macOS offers a tool to remove backgrounds from images
  41. How to fail function calls with undefined arguments with a one-liner (sorta)
  42. Why doesn't JSON support comments?
  43. A CSS-based background grid generator

2022 70

  1. How to disable Google sign-in prompts on other sites
  2. How to animate an element's height with CSS grid
  3. Viewport units can consider the writing mode
  4. How to use Raycast snippet auto expansion
  5. How to split JavaScript strings into sentences, words or graphemes with "Intl.Segmenter"
  6. Elements can be visible even though their parent has set "visibility: hidden"
  7. Should responsive images work with container queries?
  8. Top-level promise handling in Node.js ES modules
  9. The missing bridge in web development – JSON forms
  10. CSS clip-path can go outside of an element
  11. How to flip characters and words in your terminal
  12. A native shell alternative to the trash-cli
  13. A JavaScript-free custom element implementation
  14. A centered CSS grid with full-width components
  15. How to find all render-blocking resources with JavaScript
  16. Web Almanac Highlights 2022
  17. An app to open your current finder directory in VS Code
  18. Why custom properties don't work with the url() CSS function
  19. Overwriting an element's accessible name can break speech recognition
  20. How to detect if a font is supported
  21. All browsers adopted :focus-visible in their UA stylesheets
  22. Disabled JavaScript turns off native lazy loading
  23. How to force push git branches without the --force flag
  24. How to exclude commits from git blame
  25. New in VS Code – Sticky Scroll
  26. How to create a module-based Node.js executable
  27. Import maps will improve cache busting
  28. The CSS quantity query with :nth-last-child()
  29. em and strong are not announced by screen readers
  30. How to select the previous sibling of an element
  31. Suffix aliases (-s) in Zsh
  32. How to create an API wrapper using a JavaScript proxy
  33. "fetch" supports a "keepAlive" option to make it outlive page navigations
  34. Firefox DevTools provide a multiline JavaScript console
  35. How to specify the start of an ordered HTML list
  36. Should browsers offer site-specific user preference controls? (yes!)
  37. How to navigate to the git root directory
  38. How to enforce pinch-to-zoom on Firefox/Chrome on Android
  39. Table cells support a "headers" HTML attribute
  40. A clipboard magic trick - how to use different MIME types with the Clipboard API
  41. Keyboard button clicks with Space and Enter behave differently
  42. Global fetch landed in Node 18
  43. How to measure network quality (download/upload) on macOS
  44. Google Docs supports Markdown syntax
  45. Twitter started to mess with embedded content on your site
  46. The "inert" attribute is finally coming to the web
  47. APIs to generate random user avatars
  48. How to match HTML elements with an indeterminate state
  49. How to align the text of the last paragraph line
  50. Packages with high download numbers that nobody wanted to install
  51. New in VS Code: Surround code with Snippets
  52. VS Code supports JSDoc-powered type checking
  53. A look at the dialog element's super powers
  54. Readable JavaScript conditions
  55. Array.prototype.reduce's initial value is optional
  56. Google displays table of contents and anchor links
  57. reportError – a method to report to global event handlers
  58. You can't override !important user agent CSS declarations
  59. Emojis and cultural differences
  60. Coding in the cloud – CodeSwing on github.dev
  61. How to preserve separators in the result of String.prototype.split()
  62. Multiline mode in JavaScript regular expressions
  63. JavaScript numeric separators are cross-browser supported
  64. How to override your dependency's dependencies (Node.js)
  65. An extension to boost your VS Code JavaScript productivity
  66. New on the web: programmatically open a native date picker
  67. rcmd – an alternative to "active app tabbing"
  68. Different background animations on mouseenter and leave
  69. TLDraw – keyboard-first annotations on your screen
  70. Filter and map Array values with a flatMap one-liner

2021 76

  1. Recursive directory creation with shell brace expansion
  2. How to hide Microsoft Edge's password reveal button
  3. Code golfing at its best
  4. hwb() – a color notation for humans?
  5. Why accessibility design should be a thing
  6. How to define your relationship to sites you link to
  7. "await.ops" – less typing, more promise-handling
  8. git supports global gitignore files
  9. A browser extension to make Wikipedia look modern
  10. What are idempotent scripts?
  11. Mozilla's positions on all the new web specifications
  12. Highlights of the Web Almanac 2021
  13. Three Markdown tricks I just learned
  14. How to define dark/light mode images in GitHub Markdown
  15. The surprising behavior of "important CSS custom properties"
  16. New in CSS: relative colors
  17. New in JavaScript: Array.findLast and Array.findLastIndex
  18. How to detect Emojis in JavaScript strings
  19. A directory-dependent and interactive command history
  20. How to correctly load SVG favicons
  21. How to load Medium posts without all the "Medium stuff"
  22. Every emoji has a very particular meaning, or doesn't it?
  23. "npm root" locates the global node modules directory
  24. Cross-origin module scripts require CORS response headers
  25. How to control the used Gmail account when using slides.new, docs.new, etc.
  26. Conditional border-radius and three future CSS features
  27. How to disable Chrome's URL bar autosuggestions
  28. ARIA in HTML authoring rules
  29. How to define progressive web app (PWA) screenshots and shortcuts
  30. Three exciting Chromium DevTools experiments
  31. CodeSwing – a VS Code extension for quick prototyping
  32. How to color the browser scrollbar across browsers
  33. How to use a serverless function as image/caching proxy
  34. A UI for managing your Node.js dependencies in VS Code
  35. rgba() and hsla() are legacy functions and aliases in modern browsers
  36. How to enable beautiful cursive fonts in your VS Code theme
  37. How to enable semantic highlighting in VS Code
  38. How to discard tabs to save resources in Chrome, Edge and Firefox
  39. How to configure VS Code Bracket Colors
  40. Chrome and Edge provide a highly visible focus outlines
  41. How to focus an already open browser tab (Chromium and macOS)
  42. How to apply directory dependent git configuration using conditional imports
  43. Promises-based timer functions are supported in Node.js 16
  44. Safari only supports image formats macOS/iOS support, and that's good for some users
  45. A better way to navigate/search your CLI history – McFly
  46. Can we have custom media queries, please?
  47. How to extract text from an image via the CLI
  48. User preference feature queries have a boolean context
  49. How to detect media query support
  50. Automatic hyphenation depends on the defined document language
  51. An SVG filter to pixelate images
  52. A VSCode extension to understand function parameters
  53. How to access the your sites' Google cache from the URL bar
  54. A natural shadow with SVG filters
  55. How to run apps in low-resolution on macOS
  56. How to run copied CLI commands with a leading "$" sign
  57. Multi-colored text in CSS
  58. Input-wrapping labels are not supported by Dragon
  59. Mobile Safari doesn't zoom into form inputs with minimum 16px
  60. How to visualize the tab order without using an extension in Firefox
  61. How to find all internal pages in Chromiums and Firefox
  62. How to import JSON files in ES modules
  63. CSS defines color values that follow system preferences
  64. How to add a directory but ignore included files in git
  65. How parameter expansion helps to not accidentally delete all the files on your machine
  66. A custom "dev" command with auto-completion
  67. How to import JSON files in ES modules (Node.js)
  68. How to start using all the aliases you set up (and forgot)
  69. CSS "inset" is supported across all major browsers
  70. How to define Open Graph / Twitter image alt text (and why it might not matter...)
  71. Firefox support selection of multiple text areas
  72. Should DevTools teach the CSS cascade?
  73. A CSS-only typewriter effect
  74. How to disable scaling for stroke width
  75. How to read an entire document using VoiceOver
  76. How to style radio and checkbox inputs with accent-color

2020 4

  1. How to force yourself to leave the computer using the leave command
  2. Say goodbye to resource-caching across sites and domains
  3. Git commit accepts several message flags (-m) to allow multiline commits
  4. There is an MDN short URL to access the docs