Storage devices such as hard disk drives (HDDs), solid-state drives (SSDs), and NVMe drives are reaching increasingly ridiculous prices and becoming more difficult to obtain. With hosting services raising prices throughout 2026 and possibly more increases coming in 2027, I have to ask: why aren't hosting providers doing more to support newer and more efficient formats such as AVIF and WebP for images and AV1 and AV2 for video?
Hetzner, for example, has already raised prices multiple times in 2026, citing rising hardware costs, and other hosting providers have also increased their prices. With the growing demand for hardware driven in part by the AI boom, I don't see these problems disappearing overnight. Even if prices eventually come back down, it could take some time for supplies to return to normal.
I think AVIF would be one of the best choices for image storage, and services such as Mastodon, Bluesky, and web hosting providers should be doing more to support it wherever possible. AVIF generally offers better compression than WebP while maintaining comparable image quality, which means smaller files without sacrificing how an image looks. When you consider how many images are uploaded and stored across the internet every day, even modest savings could add up to something substantial.
I know that encoding AVIF images is more CPU-intensive, but why not encourage people to use their own hardware to convert images before uploading them? That would reduce the processing burden on hosting services, especially if they preserved the original format instead of converting it back into something less efficient. Some processing will still be necessary for thumbnails and compatibility, but surely we can make better use of the formats we already have. I have already switched to AVIF on every platform I use that supports it, and WebP where AVIF isn't supported. Personally, I would rather standardize on AVIF because I don't see much sense in continuing to use larger files when smaller ones can accomplish the same thing.
Even YouTube is preparing to move beyond AV1 and begin streaming video using AV2, potentially as early as 2027. If a company handling the enormous amount of video that YouTube does sees the benefits of a more efficient format, shouldn't the rest of the internet be taking a closer look at what we can do with images and video too?
As an internet community, we need to work collectively to counterbalance these ridiculous hardware shortages and rising prices. Supporting more efficient formats could reduce unnecessary storage and bandwidth consumption, benefiting hosting providers, independent websites, and the people who use them. Switching formats won't solve the hardware shortages, but it could help us make better use of the resources we already have, especially for smaller hosting providers and independent services that don't have the financial resources of larger companies.
Is it really that hard for everyone to come together on something that could benefit all of us? WebP is fine, but AVIF generally offers better compression, so let's work toward supporting it wherever it makes sense. And phone manufacturers, please do your part too. I would love to see AVIF become a more widely supported option for taking and storing photos directly on our phones. While we're improving compatibility, let's also have better native support for Apple's HEIC format, not instead of AVIF, but alongside it. I get so tired of having to convert images back and forth just to use them on different devices, browsers, or websites.
Even if the AI hardware boom eventually goes bust, I still think these improvements would benefit the internet long after the current shortages are over. We should be making better use of what we have, regardless of what happens to hardware prices.
Just my 2 cents.
';
}
return;
}
var likes = [];
var reposts = [];
var replies = [];
mentions.forEach(function(mention) {
var type = mention['wm-property'];
if (type === 'like-of') {
likes.push(mention);
} else if (type === 'repost-of') {
reposts.push(mention);
} else if (type === 'in-reply-to' || type === 'mention-of') {
replies.push(mention);
}
});
// Update counts
if (likes.length > 0) {
var likesEl = document.getElementById('likes-count');
if (likesEl) {
likesEl.style.display = 'block';
likesEl.innerHTML = '' + likes.length + ' Like' + (likes.length !== 1 ? 's' : '');
}
}
if (reposts.length > 0) {
var retweetsEl = document.getElementById('retweets-count');
if (retweetsEl) {
retweetsEl.style.display = 'block';
retweetsEl.innerHTML = '' + reposts.length + ' Repost' + (reposts.length !== 1 ? 's' : '');
}
}
if (replies.length > 0) {
var repliesCountEl = document.getElementById('replies-count');
if (repliesCountEl) {
repliesCountEl.style.display = 'block';
repliesCountEl.innerHTML = '' + replies.length + ' Repl' + (replies.length !== 1 ? 'ies' : 'y');
}
}
// Webmention.io reports every reply's in-reply-to as the page it was sent
// to, so a reply to another reply arrives looking top-level. Michael's own
// reply pages live on this site and name their real parent, so read it.
function replyKey(u) {
try {
var x = new URL(String(u || ''), window.location.href);
return x.hostname.toLowerCase().replace(/^www\./, '') + x.pathname.replace(/\/+$/, '') + x.search;
} catch (error) {
return '';
}
}
function isOwnReplyPage(u) {
try {
var x = new URL(String(u || ''));
return x.origin === window.location.origin && x.protocol === 'https:'
&& replyKey(x.href) !== replyKey(window.location.href);
} catch (error) {
return false;
}
}
// Oldest first, and a reply to another reply sits right under it.
function orderReplies(list) {
list.sort(function(a, b) {
return new Date(a.published || a['wm-received']) - new Date(b.published || b['wm-received']);
});
var keys = list.map(function(r) { return replyKey(r.url); });
function parentKey(r) {
var own = replyKey(r.url);
return [].concat(r.declaredParents || [], r['in-reply-to'] || []).map(replyKey).filter(function(k) {
return k && k !== own && keys.indexOf(k) !== -1;
})[0];
}
var ordered = [];
list.forEach(function(r) {
if (parentKey(r)) return;
ordered.push(r);
list.forEach(function(c) {
if (parentKey(c) === replyKey(r.url)) { c.isChild = true; ordered.push(c); }
});
});
list.forEach(function(r) { if (ordered.indexOf(r) === -1) ordered.push(r); });
return ordered;
}
function readDeclaredParents(list) {
var own = list.filter(function(r) { return isOwnReplyPage(r.url); }).slice(0, 5);
return Promise.all(own.map(function(r) {
var controller = window.AbortController ? new AbortController() : null;
var timer = controller ? setTimeout(function() { controller.abort(); }, 5000) : null;
return fetch(r.url, {credentials: 'omit', signal: controller ? controller.signal : undefined})
.then(function(res) {
if (!res.ok) throw new Error('reply page ' + res.status);
return res.text();
})
.then(function(text) {
var doc = new DOMParser().parseFromString(text, 'text/html');
r.declaredParents = Array.prototype.map.call(
doc.querySelectorAll('.u-in-reply-to[href]'),
function(a) { return a.getAttribute('href'); });
})
.catch(function() {})
.then(function() { if (timer) clearTimeout(timer); });
}));
}
// Display replies
return readDeclaredParents(replies).then(function() {
if (replies.length > 0) {
var repliesEl = document.getElementById('webmention-replies');
if (repliesEl) {
var repliesHTML = '';
replies = orderReplies(replies);
// Show each reply with its real formatting (paragraphs, quotes, links),
// keeping only safe tags. Titles, signatures and timestamps that some
// sites put inside the reply are left out.
var KEEP = {P:1, BR:1, BLOCKQUOTE:1, A:1, EM:1, STRONG:1, B:1, I:1, U:1, S:1, DEL:1, Q:1, CITE:1, CODE:1, PRE:1, UL:1, OL:1, LI:1, SUP:1, SUB:1};
var DROP = {SCRIPT:1, STYLE:1, IFRAME:1, OBJECT:1, EMBED:1, FORM:1, INPUT:1, BUTTON:1, TEXTAREA:1, SELECT:1, SVG:1, MATH:1, TEMPLATE:1, NOSCRIPT:1};
function hasClass(n, name) {
return (' ' + (n.getAttribute('class') || '') + ' ').indexOf(' ' + name + ' ') !== -1;
}
function copySafe(from, to) {
Array.prototype.forEach.call(from.childNodes, function(n) {
if (n.nodeType === 3) { to.appendChild(document.createTextNode(n.nodeValue)); return; }
if (n.nodeType !== 1) return;
var tag = n.tagName.toUpperCase();
var heading = /^H[1-6]$/.test(tag);
if (DROP[tag] || hasClass(n, 'p-author') || hasClass(n, 'dt-published')) return;
if (heading && hasClass(n, 'p-name')) return;
if (heading) tag = 'P';
if (!KEEP[tag]) { copySafe(n, to); return; }
var el = document.createElement(tag);
if (tag === 'A') {
var href = n.getAttribute('href') || '';
if (!/^https?:\/\//i.test(href)) { copySafe(n, to); return; }
el.setAttribute('href', href);
el.setAttribute('target', '_blank');
el.setAttribute('rel', 'nofollow ugc noopener noreferrer');
}
copySafe(n, el);
to.appendChild(el);
});
}
function cleanReplyHtml(html) {
var doc = new DOMParser().parseFromString(String(html), 'text/html');
var box = document.createElement('div');
copySafe(doc.body, box);
return box.textContent.trim() ? box.innerHTML : '';
}
function textToHtml(text) {
var box = document.createElement('div');
String(text).split(/\n\s*\n/).forEach(function(para) {
para = para.trim();
if (!para) return;
var p = document.createElement('p');
para.split('\n').forEach(function(line, i) {
if (i) p.appendChild(document.createElement('br'));
p.appendChild(document.createTextNode(line.trim()));
});
box.appendChild(p);
});
return box.innerHTML;
}
function esc(s) {
var d = document.createElement('div');
d.textContent = String(s);
return d.innerHTML.replace(/"/g, '"');
}
// A display name is not proof of identity. Mark Michael only when
// both the parsed h-card and the reply itself are on his site.
function isSiteAuthor(author, sourceUrl) {
try {
var profile = new URL(String((author && author.url) || ''));
var source = new URL(String(sourceUrl || ''));
var profileHost = profile.hostname.toLowerCase().replace(/^www\./, '');
var sourceHost = source.hostname.toLowerCase().replace(/^www\./, '');
return profile.protocol === 'https:'
&& source.protocol === 'https:'
&& profileHost === 'michaelponders.com'
&& sourceHost === 'michaelponders.com'
&& profile.pathname === '/'
&& !profile.username && !profile.password && !profile.port
&& !profile.search && !profile.hash
&& !source.username && !source.password && !source.port;
} catch (error) {
return false;
}
}
replies.forEach(function(reply) {
var author = reply.author || {};
var authorName = author.name || 'Someone';
var sourceUrl = reply.url || reply['wm-source'] || '#';
if (!/^https?:\/\//i.test(sourceUrl)) sourceUrl = '#';
var authorPhoto = /^https:\/\//i.test(author.photo || '') ? author.photo : '';
if (!authorPhoto && /^https?:\/\/(www\.)?michaelponders\.com\//i.test(author.url || '')) {
authorPhoto = 'https://media.mitchelltribe.xyz/profile_stipple_images/mestipple1.png';
}
var content = '';
if (reply.content && reply.content.html) content = cleanReplyHtml(reply.content.html);
if (!content && reply.content && reply.content.text) content = textToHtml(reply.content.text);
var published = reply.published ? new Date(reply.published) : null;
var dateStr = '';
if (published) {
var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
var hours = published.getHours();
var minutes = published.getMinutes();
var ampm = hours >= 12 ? 'PM' : 'AM';
hours = hours % 12 || 12;
dateStr = published.getDate() + ' ' + months[published.getMonth()] + ' ' + published.getFullYear() +
' at ' + (hours < 10 ? '0' : '') + hours + ':' + (minutes < 10 ? '0' : '') + minutes + ampm;
}
repliesHTML += '';
repliesHTML += ' ';
if (content) {
repliesHTML += '