Progressive Web Apps – mostly – rock
A compilation of reasons why I think Progressive Web Apps (PWAs) rock in many regards – and still suck in others.
A home for Martin Grubinger on the web.
A compilation of reasons why I think Progressive Web Apps (PWAs) rock in many regards – and still suck in others.
Heads-up: the following code is for Svelte 5. See Export JSDoc Types from Svelte 4 Components for a similar note if you use Svelte 4. Sometimes in JSDoc, we need to get the type of a Svelte component’s props in a different module. Svelte provides ComponentProps to achieve that goal: // other-module.js /** * @import { ComponentProps } from 'svelte' * @import ListComponent from 'path/to/List.svelte'…
My game neo:lights:out has gotten a little face-lift.
With theme_color unshipped, what are our options to control the background color of Safari 26 browser UI?
It is now possible to detect if a position: sticky element is stuck with CSS.
Forget @typedef for existing types, use @import instead.
Better editing experience for astro sites
Cloudflare has a feature called Email Workers , that lets you execute a worker as part of an email workflow. This is pretty niche, but I recently used it to create a waitlist and I think it is both very niche and pretty awesome. Here’s the gist: User sends an email to a specific email adress, like waitlist@mycoolthing.io The Cloudflare Email Worker which is attached to the email adress gets called…
…when using Chromium-browsers…on Mac OS.
Control how the layout adapts when the virtual keyboard is shown.
My talk at the Svelte Vienna meetup on 23rd of June 2025
Here is how I set up Fusion RSS reader on my Coolify : (This assumes you already have Coolify installed, otherwise refer to the installation docs ) Log on to your Coolify dashboard Add a project select production environment Add new Resource Select “Docker Compose Empty” Add Docker Compose config: version : '3' services : fusion : image : 'rook1e404/fusion:latest' ports : - '127.0.0.1:3000:8080'…
How to link Forgejo web interface to VS Code as a Gitlens remote
Organize MacOS dock with spaces
How to combine restProps with a typed Props object
A breath of fresh air in a world of VC-funded website-lookalikes.
Find and fix accessibility issues while writing Cypress tests.
No more matchMedia to check screen orientation
Using an intermediate Postman collection, we can create a bruno collection based on an Open API document
use popover=manual to show multiple popovers at a time
I just needed to quickly serve a simple html document on a remote machine. Usually I would go for npx serve in the directory where the .html file resides. But serve does not support https, so I found this fork of vercels serve package: https://github.com/warren-bank/node-serve Just hit npx @warren-bank/serve --ssl If no certificate is provided, you’ll need to do the “this page is insecure but I…
field-sizing: content lands in Chrome 123
How to export/import JSDoc @typedef definitions in Svelte
Use CSS to conditional styles depending if JavaScript is enabled
Yesterday I rode my bike home in pitch black darkness, because the bike lamps ran out of battery. Luckily I was able to go almost all the way on backcountry gravel roads and/or cycle paths. No way I would have survived had I ridden on the main road without lights. I felt helpless without those lamps. I thought: wouldn’t it be great if we had bike lamps powered by the circular motion of the wheels?…
A collection of tricks and niceties you might find useful when working with Svelte.
How to handle HTML Forms with multiple submits
Stay in the editor while working on your database.
Improved positioning of CSS background images
using method=dialog
Faster npm ci installs
using localeCompare
... for dynamic content
Debug the distribution of font-size of DOM elements on the page
For testing in non-secure environments
using PerformanceNavigationTiming.type
export { namedImport } from './path/to/module';
using document.hidden
Useful CSS to make an element stick to the top and bottom of a scroll container!
Let's fix `window is not defined`
When the `download` attribute on an HTML anchor is not enough. Also: how to zip on the fly with Next.js API routes.
How to reduce logging noise when using Cypress Testing Library