All blogs / Frontend / CSS / browsers
phpied.com
Stoyan's blog
Frontend / CSS / browsersPerformance / optimizationJavaScript / TypeScriptPHP
- Posts
- 559 from 7 Mar 2005 to 4 Oct 2026
- Posting
- monthly (11 in the last year)
- Kind
- personal blog
- Feed
- https://www.phpied.com/feed/
2026 11
- Debugging download initiator
- llms.txt: agent-optimization wishful thinking
- I am now an Instagram Micro-Influencer
- Starting in the Analog domain
- Quick and dirty linting
- Measuring SVG rendering time
- Minimum viable image optimization
- Oops, I build.js’d it again
- Type checking without the muck
- Do It Yourself: code coverage and testing
- Maximally minimal build process
2025 3
2024 19
- A quick WordPress Super Cache fix
- Turn an animated GIF into a <video>
- AI’s “streaming text” UIs: a how-to
- Inverse font subsetting
- Web font sizes: a more complete data set
- @supports and @font-face troubles
- Letter frequency in the Bulgarian language
- Web font file size study: a variable font addition
- The zebra jumps quickly over a fence, vexed by a lazy ox
- Lessons learned from 222,557 font file subsets?
- Font-face toggler bookmarklet v2
- “Your app crashes my browser” talk
- Chrome extension: Open in this tab
- Minimal SVG Favicon
- Capturing web page video with a couple of bookmarklets
- The Truth(tm) about encoding SVG in data URIs
- How many bytes is “normal” for a web font: a study using Google fonts
- Font-face toggler bookmarklet
- Image requests in hidden content
2023 9
- Minimum viable no-image image src
- Perfplanet calendar ’23 call for articles
- A quick study of PDF optimization
- Running JPEG-XL tools on shared Dreamhost
- Fixing INP with a VIEWPORT tag
- A circle of web performance innovation
- Lighthouse diff + WebPageTest
- Jehl’s Law of Web Performance
- Quick BPP (image entropy) check
2022 3
2021 3
2020 5
2019 13
- WebAudio Deep Note, part 5: gain node
- WebAudio Deep Note, part 5: nodes
- WebAudio Deep Note, part 4: multiple sounds
- WebAudio Deep Note, part 3: loop and change pitch
- WebAudio Deep Note, part 2.1: Boots and Cats
- A bookmarklet: dataURI, please!
- WebAudio Deep Note, part 2: play a sound
- WebAudio Deep Note, part 1: intro
- Exploring prefers-reduced-motion
- Integrating React Profiler
- Prettier in TextMate
- Asynchronous inline scripts via data: URIs
- Defining user styles
2018 8
2017 20
- Minimum Viable Sharing Meta Tags
- Taking Mozilla’s DeepSpeech for a spin
- Performance calendar ’17 call to all
- Browser remembers your password, but you don’t? Take it back!
- hg revert a single file from the repo
- Stylelint + TextMate integration
- Hello Stylelint
- PSA: always add a generic font-family backup
- Font Fiddling
- Quick stats on html/js/css sizes
- Intercepting new Image().src requests
- WebMIDI test page
- Batch convert image formats with imagemagick
- Intervals
- Photocreep
- The last line-height you’ll ever need
- HTTPS migration: a WordPress blog hosted on Dreamhost
- When did blog comments die?
- #protip: Terminal to Finder and back again
- create-react-app + sw-precache = PWA
2016 10
2015 6
2014 8
2013 14
- ReActiveTable bookmarklet
- NYC.bind(me)
- Server-side React with PHP – part 2
- Borrowing typography tricks from the masters
- Server-side React with PHP
- Installing v8js for PHP on a Mac
- Reactive table
- Remarkable React
- Here’s to a faster Recommendations plugin
- CSS animations off the UI thread
- C3PO: Common 3rd-party objects
- Speed geek’s guide to Facebook buttons
- Run jsperf tests in a bunch of WebPagetest browsers
- webkit css-on-demand issues
2012 27
- Digging into the HTTP archive #2
- Digging into the HTTP archive
- Deck the Halls 2012
- WebAudio: live input
- WebAudio: oscillator in JS
- In Public
- Non-onload-blocking async JS
- 3po
- <style> tag to inline style=”” attrrib
- YSlow development: custom rulesets
- YSlow development: setup
- YSlow development: getting started
- Anaconda Limousine: the guitar parts
- 3PO#fail
- getUserMedia in Opera 12
- CSS variables
- Canvas pixels #3: getUserMedia
- Canvas pixels #2: convolution matrix
- Pixel manipulation in canvas
- Web Performance Daybook vol. 2
- CSS and the critical path
- Async JavaScript callbacks
- Ajax with images
- Update a far-future expiring component
- 5 years later: print CSS still sucks
- Simple music player
- The Truth about semicolons in JavaScript
2011 29
- Wish You a Merry Christmas 2011
- Imagine
- Velocity Europe discount
- Imagemagick crop and center
- Social button BFFs
- x-webkit-speech input and textareas
- Overlooked Optimizations: Images
- Sultans of Speed
- Book of Speed
- YSlow 2.0: the first sketches
- Perfplanet.com is open
- Preload in visual search suggestions
- Lazy HTML evaluation
- Velocity countdown
- There was a dude who liked to write code
- Simple Sharding Logic
- Silicon Valley (roughest place I’ve ever been)
- Audio sprites
- A rounded corner
- HTTPWatch automation with JavaScript
- YSlow/Chrome hacking
- JavaScript-style object literals in PHP
- When is a stylesheet really loaded?
- Velocity online conference March 2011
- Automating HTTPWatch with PHP #3
- Automating HTTPWatch with PHP #2
- Automating HTTPWatch with PHP
- Command-line CSS spriting
- Another LOC
2010 24
- CSS railroad diagrams
- CSS Lexer
- CSS minifiers comparison
- cssmin.js in windows shell
- Preload, then execute
- Inline MHTML+Data URIs
- The proper MHTML syntax
- The European Tour 2010
- JavaScript JS Array Documentation (#jsonf, #promotejs)
- Web Testing Framework
- Conditional comments block downloads
- YUI CSS min – part 3 – hacks
- YUI CSS Min – part 2
- Top 5 reasons to send your resume to Yahoo! Search today
- 15 minutes could save you…
- 10 more search results
- Browser sniffing with conditional comments
- Preload CSS/JavaScript without execution
- IE9 and JPEG-XR: first impressions
- Publishing 5 books this year
- YUICompressor’s CSSMin
- Uncompressed data in base64? Probably not
- One-click Minifier Gadget (OMG) – initial checkin
- Performance job offers
2009 70
- Feliz Navidad Merry Christmas 2009
- The performance business pitch
- CSS performance: UI with fewer images
- iPhone caching
- Progressive rendering via multiple flushes
- Extreme JavaScript optimization
- The new game show: “Will it reflow?”
- DOM access optimization
- Rendering: repaint, reflow/relayout, restyle
- How To Measure Web Site Performance
- JavaScript loading strategies
- Free-falling waterfalls
- Give PNG a chance
- Big list of image optimization tools
- Reducing the payload: compression, minification, 204s
- Caching vs. inlining
- Duplicates and near-duplicates
- Collecting web data with a faster, free server
- Data URIs, MHTML and IE7/Win7/Vista blues
- The pain points of having fewer components
- Reducing the number of page components
- Psychology of performance
- Required reading
- Performance tools
- The performance roadmap
- Performance Advent Calendar 2009
- Statsy – more data points for markup quality
- Flipity flop – mmm.phpied.com
- Open source CMS award 2009
- @font-face gzipping – take II
- Browser’s implied globals
- Gzip your @font-face files
- CSS munging – a FAILed experiment
- cssmin.js
- Help write the lyrics to “Give PNG a chance”
- JavaScript shell scripting
- Ignite Velocity: Image Weight Loss Clinic
- Giving an Ignite talk
- Sorting CSS to reduce gzip file sizes?
- The art and craft of postload preloads
- “Don’t make me wait” – slides from my eBay tech talk
- Prayer to the God of Programming
- Test post from YQL
- The star hack in IE8 and dynamic stylesheets
- Installing a bunch of PNG tools on the Mac
- Book things
- Slides from JSConf
- MHTML – when you need data: URIs in IE7 and under
- data:urls – what are they and how to use them
- Welcome SitePoint.com readers
- Relative to absolute links with JavaScript
- FireEagle and geo-location fun
- 204 No Content
- Installing PHP and Apache on Mac OSX – that was (pretty) easy
- Picassa’s progressive photo rendering
- Content-to-markup ratio bookmarklet
- The 5 Laws of the Website Anything
- Replace the Home button with a script
- Search site bookmarklet with YUI and BOSS
- JSLint on Mac + TextMate integration
- Installing Rhino on Mac
- Blog-to-podcast with ffmpeg
- Hide broken images
- FTP on the command line
- OpenSearch-enabling your blog
- >>> $$(selector)
- Random MySQL date
- Installing JPEGTRAN on a Mac or Unix/Linux
- Image optimization – in Chinese
- Countries visited in 2008
2008 81
- Merry Christmas 2008!
- Paint.NET is cool…
- Installing ExifTool on Dreamhost
- PNG optimization tools
- Start wearing purple
- image diff
- php|works Atlanta
- Social network marketing – lessons from the elected president
- Best open-source PHP CMS 2008
- smush.it update
- Short Amazon affiliate links – a bookmarklet
- Javascript console in IE
- JavaScript’s class-less objects
- Smush.it presentations
- smush.it is a smash hit
- OOJS book free chapter 8 on YUIblog
- php|works and pyWorks
- Installing pngcrush at dreamhost
- At the (Java)Ranch this week
- Vote for my SXSW 2009 panel
- Advertising and privacy
- ppt to pdf to slideshare via imagemagick
- Today’s mail: a box full of … my book!
- Seeing stars
- Yahoo Music API
- first book review and a new instrumental piece
- Now available: “Object-Oriented JavaScript” by Stoyan Stefanov on Amazon.com
- location=location
- When PNG8 is not the right choice
- a DOCTYPE is all it takes
- fun: front-end performance vs back-end performance
- Making money with templates
- The book, the book
- HttpFox
- My online footprint lately
- The JavaScript book is almost there
- Steppn
- Image optimization – 7 mistakes
- Happy Download Day
- no mo’ adsense
- Half-a**ed Adsense
- Kiss alive
- www vs no-www and cookies
- Bookmarklet maker tool
- Back to Bulgaria
- Load a photo in a canvas, then flip
- Firefox/Firebug extension creator wizard
- Editing made easy: 6 words to cut out
- Sancta Simplicitas: minimalistic WordPress theme using YUI CSS
- strftime() in JavaScript
- A collection of writing tips
- Rules for fast web pages
- When client-only validation is good for business
- Santa Monica apartment hunting
- Background repeat and CSS sprites
- you’ve been blogging too much when you…
- Crowes and Crows
- The PHP QC presentation featured on slideshare’s homepage
- JSPatterns.com up again
- JoJo: Javascript Junk generator
- sleep() in JavaScript
- 20 new performance best practices
- PHP-style $GLOBALS in Javascript?
- Canvas pie with tooltips
- replace selected text (Firefox)
- Simultaneuos HTTP requests in PHP with cURL
- There will be junk
- Sharpenning those flamenco skillz
- Canvas pie
- Audacity + Starcaster
- Google docs bookmaklet to format code
- Zlatina = 4
- MP3 player from Yahoo! – bookmarklet
- YUI pie chart example
- Just another church in LA
- Table to chart via JavaScript
- Starcaster
- 7 habits for a highly effective performance optimization effort
- Project management for the rest of us
- PEAR site minor redesign
- Text_Highlighter 0.7.1 and hiliteme.com updates
2007 59
- Netflix – how many movies you’ve rented
- Fancy formatting
- Browser Wars 2.0?
- How to write computer books
- YSlow-er?
- Story of stuff
- 3 additional Web 1.0 tips and tricks
- Patch’d
- Blogroll updated
- Image fun with PHP – part 2
- My recent Maui trip
- Maui, PHP Quebec, etc
- On Raymond Chandler’s writing
- The Front-end Cerberus
- My performance article up on SitePoint
- JS/PHP string concatenation mistype
- “Save AnyThing” offline with a Google Gears bookmarklet
- She has it all figured out
- IE has a problem with getElementsByName
- 5 domain names – 5 CMS’s
- The “best programmer ever”
- Quick CSSSprites.com stats
- file_put_contents() for PHP4
- 12 questions to ask your host-to-be
- Make your javascript a Windows .exe
- JavaScript: Calling the unnamed
- Order of execution of event listeners
- YSlow performance extension for Firebug
- LA Web devs meetup at Yahoo
- JavaScript patterns (dot com)
- No! to pagerank
- csssprites.com update
- A JavaScript implementation of the Decorator pattern
- CMS award nominations open
- PHP/Javascript dev tools for TextPad
- phpBB front-end optimization – 1 hour workshop
- On a publishing diet
- CSS Sprites generation tool
- Weird attempt for flicker-free rendering solution
- Smart browsers don’t download unneeded images
- Good PHP CMS?
- Delay loading your print CSS
- YUI anywhere (bookmarklet)
- Really simple Really Simple Syndication syndication
- My 5 strenghts
- Image_Text 0.6 beta is out
- YUI good for your performance
- Two bookmarklets for debugging in IE
- Center an image with CSS
- JSON data island
- Check/toggle ’em all
- AJAX-MCV in Russian
- Dynamic SCRIPT and STYLE elements in IE
- User stylesheet in IE
- Performance tunning with PEAR::DB
- DB-2-MDB2 in Portuguese
- Canadian
- Using PEAR and AWS to keep an eye on Amazon
- Reusing an existing database connection with MDB2
2006 65
- MySQL Events scenario (and a funky subquery)
- MySQL events
- Laziest image resize in PHP
- MySQL Views
- Quick MySQL 5 penetration survey
- Performance tuning with MDB2
- MySQL triggers
- Firebug console for IE
- Y! homepage – CSS sprites in action
- Charlotte and Beck
- Microsoft’s IIS and PHP
- (almost) Canadian
- Personal news update Nov/06
- JSON renderer for Text_Highlight
- JS includes – the saga continues…
- Deferring scripts for faster rendering
- When is a JavaScript include ready?
- The PEAR book
- Yahoo API search with JavaScript alone
- OPML to HTML via JavaScript
- RSS feeds
- Rendering styles
- 3 ways to define a JavaScript class
- Uncategorized
- JSON JavaScript cookies
- Exploring Web1.0 kitsch – YUI snowflakes
- quirks or no quirks bookmarklet
- ABAP code syntax highlighting
- AJAX MVC (so to speak)
- HTML2DOM
- The PEAR book is on it’s way
- HiLiteMe.com updated
- Greasemonkey – execute custom javascripts on any page
- HiLiteMe.com
- Parent’s styles in an iframe
- SAP container for PEAR::Auth
- Hello POV-Ray
- What’s $this?
- phpbb and security
- phpDoc clip library for TextPad
- News update
- Bulgaria, IPM, quick update
- Amazon Connect blog
- Form auto-fill bookmarklet
- Enumerating with MySQL
- PHP fun
- Opacity for the thumbs
- JavaScript to find your Yahoo! ranking
- Suddenly structured articles
- Curly underline
- The Focus and The Pocus
- Fly Yahoo UI
- Happy birthday and a new book
- Form auto-fill toolbars and the colors of the inputs
- Getting an RSS feed with the Zend framework 0.1.1.
- toAjax() in about 6 hours 49 mins
- Bitwise operations in JavaScript
- RGB color parser in JavaScript
- coComment
- Light color fonts in inputs
- AJAX banner rotation
- Better time input
- DB-2-MDB2
- Chicken Soup for the Programmer’s Soul
- Running JSDoc on Windows
2005 72
- phpBB old topics locker
- Car accident
- Hosted blog at wordpress.com
- Found in translation
- phpBB book review
- XAJAX intro and more from Marco
- The Invisible Ad
- Marquee search-engine spam
- Hacking the hacker’s (Paul Graham’s) page
- Nielsen’s list of blog usability issues and me
- Everybody is gay, er… spammer
- IE script tag problem
- WebConsole – Take command (line) with AJAX
- Audioslave live in Montreal
- CSS coding conventions
- Pearl Jam live
- Texas hold’em
- Image fun
- Resources are passed by reference
- Proposal for PEAR::Structures_DataGrid column formatter
- Discount on the Zend PHP certification exam
- Coldplay live
- My certification story
- Working for a small company
- 30 seconds AJAX
- Wikimania
- Javascript includes – yet another way of RPC-ing
- PacktPub donates royalties to open-source projects
- Open source – BBC and Google
- What a Wonderful World!
- Another PHP cert blog
- Certification press release from Zend
- HTML entities converter
- toLowerCase() bookmarklet
- getElementById(‘description’) in IE
- The phpBB book is out
- ZCE certificate
- Nathalie
- Building Online Communities with phpBB – coming soon
- PHP certification books – sample chapters
- Alexa 500 server stats (the code)
- Alexa 500 server stats
- Zend Certified Engineer
- Source highlighting article at SP
- Strcmp
- serializing
- A character from a string
- Array sorting options
- Walking the array
- Array keys and case sensitivity
- The old superglobals
- Redefine $this?
- Static methods and performance
- Static methods and $this
- Modulus
- Superglobals
- Variable scope
- Function parameters passed by reference
- Evaluating expressions in for-loops
- Breaking out of the loops
- lat2cyr on phpbbhacks.com
- booleans casted to strings
- highlighting php source code in WordPress
- alternative if-then-else syntax
- if-then-else
- prefix/postfix increment/decrement
- Assignment by reference
- Smart quotes in WP
- About the PHP constants
- Smart quotes
- First off – some links
- Let’s get, let’s get, let’s get started