RSSAmplifier

Blog

grooovinger

A home for Martin Grubinger on the web.

grooovinger.comRSS feed ↗42 posts

Latest posts

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.

Import Props Types from a Svelte 5 Component in JSDoc

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'…

Refreshed neo:lights:out

My game neo:lights:out has gotten a little face-lift.

Define the Theme Color for Safari 26

With theme_color unshipped, what are our options to control the background color of Safari 26 browser UI?

Style sticky elements when they are stuck

It is now possible to detect if a position: sticky element is stuck with CSS.

Import Types from other modules in JSDoc

Forget @typedef for existing types, use @import instead.

Editing my Astro site with Astro Editor

Better editing experience for astro sites

Run code for incoming emails with Cloudflare Email Workers

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…

PWA install experience is top-notch (on desktop)

…when using Chromium-browsers…on Mac OS.

Prevent virtual keyboard overlaying content with the Interactive Widget meta tag

Control how the layout adapts when the virtual keyboard is shown.

Talk: Svelte at Geizhals (@ Svelte Vienna)

My talk at the Svelte Vienna meetup on 23rd of June 2025

How to deploy Fusion RSS Reader on Coolify

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'…

Add Forgejo custom Gitlens Remote in VS Code

How to link Forgejo web interface to VS Code as a Gitlens remote

Add Space to MacOS dock

Organize MacOS dock with spaces

Svelte 5 Props @typedef with restProps

How to combine restProps with a typed Props object

Inspired by Good Enough

A breath of fresh air in a world of VC-funded website-lookalikes.

The single most effective Cypress trick to improve accessibility

Find and fix accessibility issues while writing Cypress tests.

Easy screen orientation management with the ScreenOrientation API

No more matchMedia to check screen orientation

Create a bruno collection from an Open API document

Using an intermediate Postman collection, we can create a bruno collection based on an Open API document

Multiple popovers with Popover API

use popover=manual to show multiple popovers at a time

Quickly serve a html document via https

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…

Automatic resizing of textareas and inputs using CSS

field-sizing: content lands in Chrome 123

Export JSDoc Types from Svelte 4 Components

How to export/import JSDoc @typedef definitions in Svelte

CSS media query to check for JavaScript support

Use CSS to conditional styles depending if JavaScript is enabled

Pitch black darkness and the degradation of end user experience

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?…

Svelte Tricks Collection

A collection of tricks and niceties you might find useful when working with Svelte.

Form with multiple submit buttons

How to handle HTML Forms with multiple submits

Editing Database in VS Code via SQLTools Plugin

Stay in the editor while working on your database.

CSS Background Position Offsets

Improved positioning of CSS background images

Submit forms in dialogs

using method=dialog

npm: only install production dependencies

Faster npm ci installs

Sort strings/numbers while respecting special characters

using localeCompare

<template> element

... for dynamic content

Group all DOM elements by font-size

Debug the distribution of font-size of DOM elements on the page

Mock navigator.share

For testing in non-secure environments

Was the page navigated to using back or forward button?

using PerformanceNavigationTiming.type

Import and Export a JS Module in one line

export { namedImport } from './path/to/module';

Detect if the tab is hidden or visible

using document.hidden

Make an element stick to top and bottom!

Useful CSS to make an element stick to the top and bottom of a scroll container!

How to add a Leaflet map to a Gatsby site

Let's fix `window is not defined`

Trigger download of remote images with Next.js

When the `download` attribute on an HTML anchor is not enough. Also: how to zip on the fly with Next.js API routes.

Cypress Testing Library Custom Error Message

How to reduce logging noise when using Cypress Testing Library