Posts in Web (20 found)
Abhinav Sarkar 2 weeks ago

Polls I Ran on Mastodon in 2025

In 2025, I ran ten polls on Mastodon exploring various topics, mostly to outsource my research to the hivemind. Here are the poll results organized by topic, with commentary. How do you pronounce JSON? January 15, 2025 I’m in the “Jay-Son, O as in Otter” camp, which is the majority response. It seems like most Americans prefer the “Jay-Son, O as in Utter” option. Thankfully, only one person in the whole world says “Jay-Ess-On”. If someone were to write a new compiler book today, what would you prefer the backend to emit? October 31, 2025 LLVM wins this poll hands down. It is interesting to see WASM beating other targets. Which is your favourite Haskell parsing library? November 3, 2025 I didn’t expect Attoparsec to go toe-to-toe with Megaparsec . I did some digging, and it seems like Megaparsec is the clear winner when it comes to parsing programming languages in Haskell. However, for parsing file formats and network protocols, Attoparsec is the most popular one. I think that’s wise, and I’m inclined to make the same choice. If you were to write a compiler in Haskell, would you use a lens library to transform the data structures? July 11, 2025 This one has mixed results. Personally, I’d like to use a minimal lens library if I’m writing a compiler in Haskell. What do you think is the right length of programming related blog posts (containing code) in terms of reading time? May 18, 2025 As a writer of programming related blog posts, this poll was very informative for me. 10 minute long posts seem to be the most popular option, but my own posts are a bit longer, usually between 15–20 minutes. Do you print blog posts or save them as PDFs for offline reading? March 8, 2025 Most people do not seem to care about saving or printing blog posts. But I went ahead and added (decent) printing support for my blog posts anyway. If you have a personal website and you do not work in academia, do you have your résumé or CV on your website? August 30, 2025 I don’t have a public résumé on my website either. I’d like to, but I don’t think anyone visiting my website would read it. Would people be interested in a series of blog posts where I implement the C compiler from “Writing a C Compiler” book by Nora Sandler in Haskell? November 11, 2025 Well, 84% people voted “Yes”, so this is (most certainly) happening in 2026! If I were to release a service to run on servers, how would you prefer I package it? December 30, 2025 Well, people surely love their Docker images. Surprisingly, many are okay with just source code and build instructions. Statically linked executable are more popular now, probably because of the ease of deployment. Many also commented that they’d prefer OS specify package like deb or rpm. However, my personal preference is Nix package and NixOS module. If you run services on Hetzner, do you keep a backup of your data entirely off Hetzner? August 9, 2025 It is definitely wise to have an offsite backup. I’m still figuring out the backup strategy for my VPS. That’s all for this year. Let’s see what polls I come up with in 2026. If you have any questions or comments, please leave a comment below. If you liked this post, please share it. Thanks for reading! This post was originally published on abhinavsarkar.net . If you liked this post, please leave a comment . General Programming JSON Pronunciation Compilers Compiler Backend Targets Haskell Parsing Libraries Compiler in Haskell with Lenses Blogging & Web Blog Post Length Preferences Blog Post Print Support Résumés on Personal Website “Writing a C Compiler” Blog Series Self-hosting Service Packaging Preferences Hetzner Backup Strategy

0 views
Chris Coyier 1 months ago

Ol’ Bob

My friend Jason came over as he’d just got a new MacBook and a new Black Lion audio interface he wanted to try out. We plugged my Ear Trumped Mabel into it and did a few songs. I dragged my web cam setup downstairs to do the video haha. The song is Ol’ Bob from Roger Netherton . There is a 2nd take at the end that I think I like a little better. The first take I did a 2-finger style which sometimes I like but is probably better suited when there is a guitar too. Clawhammer and fiddle is so classic.

0 views
j0nah.com 1 months ago

I failed to recreate the 1996 Space Jam Website with Claude

Link to the Hacker News post. Thanks everybody for all the engagement! Since writing this post, a few people have reached out to show me…

0 views
Manuel Moreale 1 months ago

Come on John

For all I know, John O'Nolan is a cool dude. He’s the founder of Ghost , a project that is also really cool. You know what’s also cool? RSS. And guess what, John just announced he’s working on a new RSS app (Reader? Tool? Service?) called Alcove and he blogged about it . All this is nice. All this is cool. The more people build tools and services for the open web, the better. Having said all that though, John: If you want to follow along with this questionable side project of undefined scope, I'm sharing live updates of progress on Twitter, here. You are on your own blog, your own corner of the web, powered by the platform you’re the CEO of, a blog that also serves content via RSS, the thing you’re building a tool for, and you’re telling people to follow the progress on fucking Twitter? Come on John. Thank you for keeping RSS alive. You're awesome. Email me :: Sign my guestbook :: Support for 1$/month :: See my generous supporters :: Subscribe to People and Blogs

69 views
Kix Panganiban 1 months ago

Utteranc.es is really neat

It's hard to find privacy-respecting (read: not Disqus) commenting systems out there. A couple of good ones recommended by Bear are Cusdis and Komments -- but I'm not a huge fan of either of them: Then I realized that there's a great alternative that I've used in the past: utteranc.es . Its execution is elegant: you embed a tiny JS file on your blog posts, and it will map every page to Github Issues in a Github repo. In my case, I created this repo specifically for that purpose. Neat! I'm including utteranc.es in all my blog posts moving forward. You can check out how it looks below: Cusdis styling is very limited. You can only set it to dark or light mode, with no control over the specific HTML elements and styling. It's fine but I prefer something that looks a little neater. Komments requires manually creating a new page for every new post that you make. The idea is that wherever you want comments, you create a page in Komments and embed that page into your webpage. So you can have 1 Komments page per blog post, or even 1 Komments page for your entire blog.

0 views
fLaMEd fury 1 months ago

Personal Websites Aren’t Dead

What’s going on, Internet? This post “ Personal Websites Are Dead ” has been making the rounds this week and it’s as dumb as it sounds. Naturally, I disagree. Strongly. “Personal websites are dying because platforms got better.” “Your Substack profile is a website.” The post boils down to this: platforms are easier, reach is outsourced, maintenance is annoying, and feeds have replaced homepages. Sure. But that’s not proof personal websites are obsolete. It’s proof most people stopped valuing ownership. The web didn’t change. People did. The tradeoff is simple. You either own your space or you rent one. Renting is convenient until the landlord changes the locks, rewrites the rules, or decides you don’t fit the algorithm today. A personal website isn’t about traffic spikes or “momentum”. It’s about autonomy. It’s about opting out of surveillance feeds, tracking, friction, and platform churn. It’s about having a corner of the internet that isn’t trying to convert, optimise, or harvest anything. If anything, the personal web movement shows the opposite of what this post shared on Medium (lol) claims. More people are tired of platform dependency. More people are building small, simple sites again. Not for reach. For identity. For community. For longevity. For personal archives and homes on the web that don’t disappear when a company pivots. Maintenance can be a burden depending on your skill level, but it’s all part of the craft. If someone finds updating a theme (easy example - I know) too hard, fine. But it’s not evidence the personal web is dying. It’s evidence they were never that invested in the web to begin with. Which brings me back to a question I keep asking: why isn’t making websites easier by now ? Personal websites aren’t dead. They’re just not fashionable. And that’s fine. The open web has always thrived on the people who keep publishing, keep tinkering, and keep owning their corner without needing permission. The future of the web doesn’t belong to platforms. It belongs to whoever shows up and keeps building. Hey, thanks for reading this post in your feed reader! Want to chat? Reply by email or add me on XMPP , or send a webmention . Check out the posts archive on the website.

0 views
Susam Pal 1 months ago

Nerd Quiz #2

Nerd Quiz #2 is the second release of Nerd Quiz, a single-page HTML application that invites you to gauge your nerd level through short, focused quiz sets. Each question is carefully crafted from everyday moments of reading, writing, thinking, learning and exploring. This release introduces five new questions drawn from a range of topics such as chess, graph theory and linguistics. To try the quiz, visit nq.html . Read on website | #web | #miscellaneous | #game

0 views
Kev Quirk 2 months ago

Giving My Jekyll Site a CDN Front End

I've managed to get my Jekyll based site working behind Bunny CDN, while maintaining my .htaccess redirects. Here's how I did it... Since switching back to Jekyll recently, I’ve been running this site on a Ionos-hosted VPS, then using a little deploy script to build the site and rsync it up. This all worked fine, but I really wanted to use Bunny CDN for more than just hosting a few images and my custom font. Being a static site, I could have dumped everything onto their storage platform, but I have a metric tonne of redirects in a file from various platform migrations over the years . Bunny’s Edge Platform could have handled these, but with the number of redirects I have, it would have been a slog to maintain. So I assumed I’d never be able to put Bunny in front of my Jekyll site easily and went about my business. 💡 Then I had an epiphany. What if I created a Bunny pull zone that uses as the public domain, then set up a separate domain on my VPS, host the site there, and use that as the pull zone origin? My theory was that Bunny would still be requesting content from the VPS, so my redirects might still work. …turns out, they did. I duplicated my live site so I could experiment safely. The setup looked like this: The first thing I had to do was update the field in my Jekyll from to , rebuild the site, and upload it to . Now, you might be thinking, “Kev, why build the site with the wrong domain?” But I haven’t. By building the site with the test domain, all links point to . If I built it with the origin domain, all internal links would lead to the wrong place. They would still work, but the site would be served from , which is not what I want. Next up was redirect testing. I visited , which should hit and redirect to . The redirect worked fine, but the resulting URL was being served from the origin domain. So instead of seeing I saw . This happened because Bunny requested the file from the origin using its own hostname, not the hostname I typed. In simple terms: So Apache went: “Oh, you want ? Sure. That’s at . Here ya go…” This would not break anything for visitors, but I didn’t want appearing anywhere. It looked messy. Two changes fixed it: Forward Host Headers makes Bunny tell the VPS the hostname the visitor used. So instead of: “I’m asking for this on behalf of .” Bunny says: “I’m asking for this on behalf of , not .” The domain alias ensures Apache accepts that hostname and serves it correctly. The other thing to double-check is that every page sets a proper URL. The origin domain is publicly accessible, so crawlers need to know which domain is the real one. That should always be the Bunny pull zone domain. In Jekyll this is simple. Add the following to the section of your layout: With the redirect behaviour sorted, the last step was to add a purge step to my deploy script so Bunny knows to fetch the latest version whenever I publish a new post or update something. Here’s the snippet I added: I set my Bunny API key and Pull Zone ID as variables at the top of the script. The statement simply says, “If the response isn’t 200 or 204, tell Kev what went wrong.” And that is it. Last night I flipped the switch. Bunny CDN now sits in front of the live site. I also moved the VPS from Ionos to Hetzner because Ionos now charge extra for a Plesk licence. I went with Hestia as the control panel on the new server. If you spot any bugs, please do let me know, but everything should be hopping along nicely now. (See what I did there? God I’m funny!) Thanks for reading this post via RSS. RSS is great, and you're great for using it. ❤️ Reply to this post by email - the domain configured in the Bunny pull zone - the origin domain on my VPS, where the site actually lives I visited . Bunny checked its cache. It wasn’t there, so it asked my origin for the file. But Bunny made that request using its own hostname ( ), not the one I typed. Apache saw the request coming from and applied the redirect to . Apache then rebuilt the redirect URL using the hostname it was given, which was . Enable Forward Host Headers in my Bunny pull zone. Add as a domain alias of on my VPS.

0 views
Circus Scientist 2 months ago

Tools For Developers

I have been meaning to do a blog post about this for some time. The list I have is not going to be long – I don’t need to talk about Git, VSCode or Docker for example, everybody knows those. This is for things that I think might not be so well known – that I use every day. I honestly don’t know how I used a terminal before without this tool. It’s a history manager for your terminal – providing instant access to recent commands with adaptive text completion and search. Ctrl+R … type … Enter! https://atuin.sh/ If you look at my blog you will see this come up again and again. It’s the AI Coding assistant for Power Users! https://github.com/dwash96/aider-ce Previously I used Ngrok, but Cloudflared Tunnels are so much more intuitive to use. Just run your local web service on your own laptop, type one command to securely share it with the client. Let them see the updates in real time! https://developers.cloudflare.com/cloudflare-one/networks/connectors/cloudflare-tunnel/do-more-with-tunnels/trycloudflare/ – requires zero project setup (unlike Ngrok). That’s it, I told you it was a short list! I have no idea why anyone subscribes to Spotify or Youtube Music when we have radio (OK I’m just old) . Seriously though, this Android app has thousands of online radio stations from all genres. Get it on F-Droid On the Desktop: use Clementine music player, just set up the IceCast plugin and the Internet of Radio is yours! I have a ton of websites I host on my own VPS at DigitalOcean . Some of them I manage for other people, others are for my own entertainment businesses. Needless to say, I am invested in keeping them all up and running. Website Monitor is an Android app that checks periodically to see if a given set of websites is up and running. You get alerts if one is offline. It just works! Get Website Monitor on F-Droid The post Tools For Developers appeared first on Circus Scientist .

0 views
Jim Nielsen 2 months ago

Leveraging a Web Component For Comparing iOS and macOS Icons

Whenever Apple does a visual refresh in their OS updates, a new wave of icon archiving starts for me. Now that “Liquid Glass” is out, I’ve begun nabbing the latest icons from Apple and other apps and adding them to my gallery. Since I’ve been collecting these icons for so long, one of the more interesting and emerging attributes of my collection is the visual differences in individual app icons over time. For example: what are the differences between the icons I have in my collection for Duolingo? Well, I have a page for that today . That’ll let you see all the different versions I’ve collected for Duolingo — not exhaustive, I’m sure, but still interesting — as well as their different sizes . But what if you want to analyze their differences pixel-by-pixel? Turns out, There’s A Web Component For That™️. Image Compare is exactly what I was envisioning: “A tiny, zero-dependency web component for comparing two images using a slider” from the very fine folks at Cloud Four . It’s super easy to use: some HTML and a link to a script (hosted if you like, or you can vendor it ), e.g. And just like that, boom, I’ve got a widget for comparing two icons. For Duolingo specifically, I have a long history of icons archived in my gallery and they’re all available under the route for your viewing and comparison pleasure . Wanna see some more examples besides Duolingo? Check out the ones for GarageBand , Instagram , and Highlights for starters. Or, just look at the list of iOS apps and find the ones that are interesting to you (or if you’re a fan of macOS icons, check these ones out ). I kinda love how easy it was for my thought process to go from idea to reality: And I’ve written the post, so this chunk of work is now done. Reply via: Email · Mastodon · Bluesky “It would be cool to compare differences in icons by overlaying them…“ “Image diff tools do this, I bet I could find a good one…“ “Hey, Cloud Four makes a web component for this? Surely it’s good…” “Hey look, it’s just HTML: a tag linking to compiled JS along with a custom element? Easy, no build process required…“ “Done. Well that was easy. I guess the hardest part here will be writing the blog post about it.”

1 views
JSLegendDev 2 months ago

I'm Making a Tiny RPG and I Need Feedback Regarding Performance

This past month, I’ve been working secretly on a small RPG game. While the game is not ready at all and I didn’t plan on talking about it, I’m now kind of forced to. I’ve been using JavaScript + the KAPLAY game library to make this game but I’ve been experiencing performance issues. However, it seems that others aren’t experiencing them so now I wonder, is it just my machine? I’m using a Macbook Air M3 with 16GB of RAM. Normally, things should be smooth and they are when playing the game in the browser via Firefox. However, since I’m making this game with Steam in mind, it’s especially important that the game performs well when wrapped as a desktop app. For this reason, I decided to reach out to you, my audience, for feedback. I have included a build of the unfinished game for Windows, Mac and Linux. It would be very nice if you could try it out on your machine. Additionally, recording gameplay and sharing the link in the comment section of this post would be greatly appreciated. Here is the link to the game in its unfinished current form : https://jslegend.itch.io/small-rpg-performance-playtest Below is a gameplay video to give you an idea of how the game is supposed to be played. You can move around with arrow keys and enter battle by overlapping with a star in the overworld. Performance issues, if any, occur mostly during battles. Thanks in advance! UPDATE 7/11/2025 : It seems that this post was shared on Hacker News and is getting more attention than usual! If you’re new to my Substack and are potentially interested in updates regarding this project, I recommend subscribing. Subscribe now In the meantime, you can read some of my previous posts!

0 views
./techtipsy 2 months ago

Why Nextcloud feels slow to use

Nextcloud. I really want to like it, but it’s making it really difficult. I like what Nextcloud offers with its feature set and how easily it replaces a bunch of services under one roof (files, calendar, contacts, notes, to-do lists, photos etc.), but no matter how hard I try and how much I optimize its resources on my home server, it feels slow to use, even on hardware that is ranging from decent to good. Then I opened developer tools and found the culprit. It’s the Javascript. On a clean page load, you will be downloading about 15-20 MB of Javascript, which does compress down to about 4-5 MB in transit, but that is still a huge amount of Javascript. For context, I consider 1 MB of Javascript to be on the heavy side for a web page/app. Yes, that Javascript will be cached in the browser for a while, but you will still be executing all of that on each visit to your Nextcloud instance, and that will take a long time due to the sheer amount of code your browser now has to execute on the page. A significant contributor to this heft seems to be the bundle, which based on its name seems to provide some common functionality that’s shared across different Nextcloud apps that one can install. It’s coming in at 4.71 MB at the time of writing. Then you want notifications, right? is here to cover you, at 1.06 MB . Then there are the app-specific views. The Calendar app is taking up 5.94 MB to show a basic calendar view. Files app includes a bunch of individual scripts, such as ( 1.77 MB ), ( 1.17 MB ), ( 1.09 MB ), ( 0.9 MB which I’ve never used!) and many smaller ones. Notes app with its basic bare-bones editor? 4.36 MB for the ! This means that even on an iPhone 13 mini, opening the Tasks app (to-do list), will take a ridiculously long time. Imagine opening your shopping list at the store and having to wait 5-10 seconds before you see anything, even with a solid 5G connection. Sounds extremely annoying, right? I suspect that a lot of this is due to how Nextcloud is architected. There’s bound to be some hefty common libraries and tools that allow app developers to provide a unified experience, but even then there is something seriously wrong with the end result, the functionality to bundle size ratio is way off. As a result, I’ve started branching out some things from Nextcloud, such as replacing the Tasks app with using a private Vikunja instance, and Photos to a private Immich instance. Vikunja is not perfect, but its 1.5 MB of Javascript is an order of magnitude smaller compared to Nextcloud, making it feel incredibly fast in comparison. However, with other functionality I have to admit that the convenience of Nextcloud is enough to dissuade me from replacing it elsewhere, due to the available feature set comparing well to alternatives. I’m sure that there are some legitimate reasons behind the current state, and overworked development teams and volunteers are unfortunately the norm in the industry, but it doesn’t take away the fact that the user experience and accessibility suffers as a result. I’d like to thank Alex Russell for writing about web performance and why it matters, with supporting evidence and actionable advice, it has changed how I view websites and web apps and has pushed me to be better in my own work. I highly suggest reading his content, starting with the performance inequality gap series. It’s educational, insightful and incredibly irritating once you learn how crap most things are and how careless a lot of development teams are towards performance and accessibility.

0 views
David Bushell 2 months ago

Better Alt Text

It’s been a rare week where I was able to (mostly) ignore client comms and do whatever I wanted! That means perusing my “todo” list, scoffing at past me for believing I’d ever do half of it, and plucking out a gem. One of those gems was a link to “Developing an alt text button for images on [James’ Coffee Blog]” . I like this feature. I want it on my blog! My blog wraps images and videos in a element with an optional caption. Reduced markup example below. How to add visible alt text? I decided to use declarative popover . I used popover for my glossary web component but that implementation required JavaScript. This new feature can be done script-free! Below is an example of the end result. Click the “ALT” button to reveal the text popover (unless you’re in RSS land, in which case visit the example , and if you’re not in Chrome, see below). To implement this I appended an extra and element with the declarative popover attributes after the image. I generate unique popover and anchor names in my build script. I can’t define them as inline custom properties because of my locked down content security policy . Instead I use the attribute function in CSS. Anchor positioning allows me to place these elements over the image. I could have used absolute positioning inside the if not for the caption extending the parent block. Sadly using means only one thing… My visible alt text feature is Chrome-only! I’ll pray for Interop 2026 salvation and call it progressive enhancement for now. To position the popover I first tried but that sits the popover around/outside the image. Instead I need to sit inside/above the image. The allows that. The button is positioned in a similar way. Aside from being Chrome-only I think this is a cool feature. Last time I tried to use anchor positioning I almost cried in frustration… so this was a success! It will force me to write better alt text. How do I write alt text good? Advice is welcome. Thanks for reading! Follow me on Mastodon and Bluesky . Subscribe to my Blog and Notes or Combined feeds.

1 views
Susam Pal 3 months ago

Nerd Quiz #1

Nerd Quiz #1 is the first release of Nerd Quiz, a single-page HTML application that lets you test your nerd level through short, focused quiz sets. Each question in the quiz is handcrafted from everyday moments of reading, writing, thinking, learning and exploring. To try the quiz now, visit nq.html . The source code of Nerd Quiz is available at github.com/susam/nq under the terms of the MIT licence. Read on website | #web | #miscellaneous | #game

0 views
A Working Library 4 months ago

We, the Heartbroken

“Heartbreak is the heart of all revolutionary consciousness. How can it not be? Who can imagine another world unless they have already been broken apart by the world we are in?” Gargi Bhattacharyya sees our grief for a broken world as the tool we use to weave a new one. View this post on the web , subscribe to the newsletter , or reply via email .

0 views
Loren Stewart 5 months ago

A Progressive Complexity Manifesto

A manifesto for progressive web complexity. Reject the false binary between static sites and SPAs. Embrace the powerful middle ground with server-rendered HTML, HTMX, and intentional complexity escalation.

0 views
Cassidy Williams 7 months ago

Generating open graph images in Astro

Something that always bugged me about this blog is that the open graph/social sharing images used this for every single post: I had made myself a blank SVG template (of just the rainbow-colored pattern) for each post literally years ago, but didn’t want to manually create an image per blog post. There are different solutions out there for this, like the Satori library, or using a service like Cloudinary , but they didn’t fit exactly how I wanted to build the images, and I clearly have a problem with control. So, I built myself my own solution! Last year, I made a small demo for Cosynd with Puppeteer that screenshotted websites and put it into a PDF for our website copyright offering, aptly named screenshot-demo . I liked how simple that script was, and thought I could follow a similar strategy for generating images. My idea was to: And then from there, I’d do this for every blog title I’ve written. Seemed simple enough? Reader, it was not. BUT it worked out in the end! Initially, I set up a fairly simple Astro page with HTML and CSS: With this, I was able to work out what size and positioning I wanted my text to be, and how I wanted it to adjust based on the length of the blog post title (both in spacing and in size). I used some dummy strings to do this pretty manually (like how I wanted it to change ever so slightly for titles that were 4 lines tall, etc.). Amusing note, this kind of particular design work is really fun for me, and basically impossible for AI tools to get right. They do not have my eyes nor my opinions! I liked feeling artistic as I scooted each individual pixel around (for probably too much time) and made it feel “perfect” to me (and moved things in a way that probably 0 other people will ever notice). Once I was happy with the dummy design I had going, I added a function to generate an HTML page for every post, so that Puppeteer could make a screenshot for each of them. With the previous strategy, everything worked well. But, my build times were somewhat long, because altogether the build was generating an HTML page per post (for people to read), a second HTML page per post (to be screenshotted), and then a screenshot image from that second HTML page. It was a bit too much. So, before I get into the Puppeteer script part with you, I’ll skip to the part where I changed up my strategy (as the kids say) to use a single page template that accepted the blog post title as a query parameter. The Astro page I showed you before is almost exactly the same, except: The new script on the page looked like this, which I put on the bottom of the page in a tag so it would run client-side: (That function is an interesting trick I learned a while back where tags treat content as plaintext to avoid accidental or dangerous script execution, and their gives you decoded text without any HTML tags. I had some blog post titles that had quotes and other special characters in them, and this small function fixed them from breaking in the rendered image!) Now, if you wanted to see a blog post image pre-screenshot, you can go to the open graph route here on my website and see the rendered card! In my folder, I have a script that looks mostly like this: This takes the template ( ), launches a browser, navigates to the template page, loops through each post, sizes it to the standard Open Graph size (1200x630px), and saves the screenshot to my designated output folder. From here, I added the script to my : I can now run to render the images, or have them render right after ! This is a GitHub Gist of the actual full code for both the script and the template! There was a lot of trial and error with this method, but I’m happy with it. I learned a bunch, and I can finally share my own blog posts without thinking, “gosh, I should eventually make those open graph images” (which I did literally every time I shared a post). If you need more resources on this strategy in general: I hope this is helpful for ya!

0 views

Lost Computation

Read on the website: We keep losing context and computation when running programs. But we don't have to. Let’s see how this lost compute can be avoided.

0 views