Skip to content

Instantly share code, notes, and snippets.

View jillesvangurp's full-sized avatar

Jilles van Gurp jillesvangurp

View GitHub Profile
@jillesvangurp
jillesvangurp / reveal-js-export-pdf.md
Created March 16, 2026 15:01
How to get a perfect PDF export from your reveal.js presentation

Perfect Reveal.js PDF Export

When Reveal.js print mode breaks slide layouts, a reliable fallback is to render the live deck in a headless browser, capture each slide as a screenshot, and stitch those screenshots into a one-page-per-slide PDF.

This preserves the on-screen deck exactly, including custom runtime layout behavior that may not survive ?print-pdf.

What It Does

  • Starts from a served Reveal.js deck URL
  • Opens the deck in headless Chrome via Playwright
@jillesvangurp
jillesvangurp / es-rolling-restart.md
Created March 12, 2026 13:56
Elasticsearch Rolling Restart skill
name elasticsearch-rolling-upgrade
description Run a zero-downtime rolling Elasticsearch upgrade in the environment by upgrading one node at a time with Ansible and systemd. Use when planning or executing Elasticsearch version upgrades (for example 9.1.x to 9.3.1), including preflight checks, per-node allocation control, strict health gates, and abort-on-failure handling.

elasticsearch-rolling-upgrade

Use this skill for deterministic, guarded Elasticsearch rolling upgrades.

Related skill

@jillesvangurp
jillesvangurp / yt-opml-export.md
Last active March 17, 2026 01:28
Beat the Algorithm - Download Youtube Subscriptions as OPML

Export Your YouTube Subscriptions to OPML (and Use Any RSS Reader)

YouTube doesn't make it easy to take your subscriptions elsewhere. But every channel still has a public RSS feed.

This guide lets you:

  • Export all your subscriptions
  • Generate a valid OPML file
  • Import them into any RSS reader
@jillesvangurp
jillesvangurp / gist:c6923ac3c6f17fa36dd02300e7f95548
Created April 2, 2025 10:27
indexed db based object store for kotlin js - uses kotlinx serialization and co-routines
@file:Suppress("unused")
package indexeddb
import com.jillesvangurp.serializationext.DEFAULT_JSON
import kotlin.coroutines.resume
import kotlin.coroutines.resumeWithException
import kotlin.time.Duration.Companion.milliseconds
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.channels.Channel
@jillesvangurp
jillesvangurp / build.gradle.kts
Last active August 25, 2020 03:01
Release 3.1.4 for geogeometry logs
plugins {
kotlin("multiplatform") version "1.3.72"
id("com.github.ben-manes.versions") version "0.28.0" // gradle dependencyUpdates -Drevision=release
id("org.jmailen.kotlinter") version "2.4.1"
`maven-publish`
}
repositories {
mavenCentral()
maven(url = "https://jitpack.io")
@jillesvangurp
jillesvangurp / berlin.geojson
Last active May 20, 2021 09:44
Polygon for berlin covered by geohashes
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Uncaught exception com.google.gwt.event.shared.UmbrellaException: Exception caught: undefined
at Unknown.Ub(https://console.aws.amazon.com/cloudfront/home?region=eu-west-1 line 9 > scriptElement)
at Unknown.Tb(https://console.aws.amazon.com/cloudfront/home?region=eu-west-1 line 9 > scriptElement)
at Unknown.ac(https://console.aws.amazon.com/cloudfront/home?region=eu-west-1 line 9 > scriptElement)
at Unknown.Iyd(https://console.aws.amazon.com/cloudfront/home?region=eu-west-1 line 9 > scriptElement)
at Unknown.Myd(https://console.aws.amazon.com/cloudfront/home?region=eu-west-1 line 9 > scriptElement)
at Unknown.Txd(https://console.aws.amazon.com/cloudfront/home?region=eu-west-1 line 9 > scriptElement)
at Unknown.Dp(https://console.aws.amazon.com/cloudfront/home?region=eu-west-1 line 9 > scriptElement)
at Unknown.Np(https://console.aws.amazon.com/cloudfront/home?region=eu-west-1 line 9 > scriptElement)
at Unknown.Ync(https://console.aws.amazon.com/cloudfront/home?region=eu-west-1 line 9 > scriptElement)
@jillesvangurp
jillesvangurp / docker-compose.yml
Created August 14, 2018 11:11
postgres with ssl cerficiates workaround for initdb and non empty data dir
# generate certificate and key with openssl and then mount them
version: '2.3'
postgres:
image: postgres:alpine
# specify location to the keys explicitly
command: -c ssl=on -c ssl_cert_file=/var/lib/postgresql/server.crt -c ssl_key_file=/var/lib/postgresql/server.key
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: secret
@jillesvangurp
jillesvangurp / log.txt
Last active January 9, 2018 09:55
gradle debug log of jcenter upload. Build successfull but no jar file anywhere to be seen on jcenter.
jillesvangurp@ip-192-168-1-3 ~/git/inbot/inbot-eth-contracts[master]*
$ gradle -PjcenterApiKey=XXXXXXX -PpgpPassword=XXXXXXX bintrayUpload --debug
10:18:51.303 [INFO] [org.gradle.internal.nativeintegration.services.NativeServices] Initialized native services in: /Users/jillesvangurp/.gradle/native
10:18:51.462 [DEBUG] [org.gradle.launcher.daemon.client.DaemonClient] Executing build c24372db-ffd5-4c01-84c8-895e18d07acc.1 in daemon client {pid=65514}
10:18:51.469 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding IP addresses for network interface en5
10:18:51.470 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Is this a loopback interface? false
10:18:51.470 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Is this a multicast interface? true
10:18:51.472 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Adding remote address /fe80:0:0:0:aede:48ff:fe00:1122%en5
10:18:51.472 [DEBUG] [org.gradle.internal.remote.internal.inet.InetAddresses] Addin

Keybase proof

I hereby claim:

  • I am jillesvangurp on github.
  • I am jillesvangurp (https://keybase.io/jillesvangurp) on keybase.
  • I have a public key ASCWZzL3Ou4D9nzEIsWt9PT4KHd0thkFfmEDNzVPLsRCygo

To claim this, I am signing this object: