Skip to content

Instantly share code, notes, and snippets.

View berstend's full-sized avatar
⊂(◉‿◉)つ b̡͉̙̞͙͔͔̺̉͌̽̽͂̿͂͝erstend͔͝

berstend̡̲̫̹̠̖͚͓̔̄̓̐̄͛̀͘ berstend

⊂(◉‿◉)つ b̡͉̙̞͙͔͔̺̉͌̽̽͂̿͂͝erstend͔͝
  • Berlin, Germany
View GitHub Profile
berstend /
Last active July 16, 2023 14:26
The best ES6 Promise.delay functions

Hello future self, here's the TypeScript version for your copy/pasting pleasure:

const delay = (ms: number) => new Promise(_ => setTimeout(_, ms))

and your favorite JS version:

const delay = ms => new Promise(_ => setTimeout(_, ms))
berstend / hcaptcha.ts
Created April 15, 2021 13:56 — forked from prescience-data/hcaptcha.ts
HCaptcha Solver
import { IncomingMessage, RequestListener, ServerResponse } from "http"
import { createServer, Server } from "https"
import puppeteer, {
} from "puppeteer-core"
import { Page } from "./types"
import Cookie = Protocol.Network.Cookie
berstend / chromiumVersion.js
Last active March 27, 2021 20:21
Parse chrome/chromium version from user agent string and semver compare
const chromiumVersion = (() => {
const compare = (newVer = "", oldVer = "") => {
const oldParts = oldVer.split(".");
const newParts = newVer.split(".");
for (let i = 0; i < newParts.length; i++) {
const a = ~~newParts[i]; // parse int
const b = ~~oldParts[i]; // parse int
if (a > b) return 1;
if (a < b) return -1;
berstend /
Last active May 15, 2024 19:31
Mass unfollow users on Instagram (no app needed)
  • Go to your profile on (sign in if not already)
  • Click on XXX following for the popup with the users you're following to appear
  • Open Chrome Devtools and Paste the following into the Console and hit return:
(async function(){
  const UNFOLLOW_LIMIT = 800
  const delay = (ms) => new Promise(_ => setTimeout(_, ms))
  const findButton = (txt) => [...document.querySelectorAll("button").entries()].map(([pos, btn]) => btn).filter(btn => btn.innerHTML === txt)[0]
berstend / graphiql_dark_0.11.11.css
Created November 4, 2019 14:47
Dark mode for GraphiQL extracted from Dark Reader
[data-darkreader-inline-bgcolor] {
background-color: var(--darkreader-inline-bgcolor) !important;
[data-darkreader-inline-bgimage] {
background-image: var(--darkreader-inline-bgimage) !important;
[data-darkreader-inline-border] {
border-color: var(--darkreader-inline-border) !important;
[data-darkreader-inline-border-bottom] {
berstend /
Created March 5, 2019 12:19
Make a monorepo with existing repos
#!/usr/bin/env bash
# Before:
# (Assuming you standard branch is development in the mono repo)
# git checkout -b add-services
repoList="api backend-service frontend"
serviceDir=services # local directory to pull the other repos in
berstend / foobar.yaml
Created January 22, 2019 16:56
Restart (rolling updates) pods recurringly on GKE
kind: Role
namespace: default
name: restart-pods
- apiGroups:
- extensions
- apps
berstend / bayesian_ranking.js
Created December 16, 2018 19:18
Given star ratings and votes, calculate bayesian estimate ratings to sort by popularity (taking number of votes into consideration)
bayesian rating = (v ÷ (v+m)) × R + (m ÷ (v+m)) × C
R = stars for the entry
v = number of votes for the entry
m = minimum votes required to be listed (eg. 10)
C = the mean stars across the whole list (eg. 4.1)
This rating only includes entries that have at least 10 votes.
The bayesian estimate is a statistical technique used to reduce the noise
berstend /
Last active August 15, 2018 10:11
Prisma GraphQL Introspection Automation (Extract Postgres schema to datamodel.graphql and deploy to prisma server)

Prisma is amazing but unfortunately in it's early days and I got tired of having to manually enter my database info each time I ran prisma introspect.

With a little help of autoexpect this task is now automated.

Hint: On macOS you might need to install expect from brew, as the macOS version doesn't include autoexpect.


Modify script.exp to use your Postgres credentials.

This file has been truncated, but you can view the full file.
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){
(function (global){
const csso = require('csso');
const shrthnd = require('shrthnd');
const specificity = require('specificity');
const postcss = require('postcss');
const cssDeclarationSorter = require('css-declaration-sorter');
const postCssMergeLonghand = require('postcss-merge-longhand');
const extension_styles = `