Skip to content

Instantly share code, notes, and snippets.

View htunnicliff's full-sized avatar
🌲

Hunter Tunnicliff htunnicliff

🌲
View GitHub Profile
@htunnicliff
htunnicliff / cloud-init.yaml
Created March 8, 2025 23:54 — forked from NatElkins/cloud-init.yaml
cloud-init script for VPS
#cloud-config
# Enable automatic package updates and upgrades during cloud-init execution
package_update: true
package_upgrade: true
packages:
# Security and Hardening
- ufw
- fail2ban

Browser Extensions

DNS

  • NextDNS
    • Configure router to point at NextDNS
  • Install app on devices
@htunnicliff
htunnicliff / react-solid-flow.tsx
Created September 7, 2023 21:41
Show, Switch, and Match for React – borrowed from Solid.js
import { Children, ReactNode, isValidElement, useMemo } from 'react';
type ShowProps<T> = {
when: T;
fallback?: ReactNode;
children: ReactNode | ((item: NonNullable<T>) => ReactNode);
};
/**
* Concept borrowed from Solid: https://www.solidjs.com/docs/latest/api#show
type HttpStatus = {
// 2xx
200: 'Ok';
201: 'Created';
202: 'Accepted';
203: 'Non-Authoritative Information';
204: 'No Content';
205: 'Reset Content';
// 4xx
400: 'Bad Request';

GitHub Copilot Miracles

Whenever Copilot writes a script that does exactly what I was hoping it to do, I will record them here.

Rename all movies in a directory from "YYYY - Title.ext" to "Title (YYYY).ext"

import fs from "fs/promises";

async function renameMovies(dir) {
@htunnicliff
htunnicliff / generate-api-types.mjs
Created September 16, 2021 21:21
CLI script for generaterating TypeScript declaration files using an OpenAPI spec
#!/usr/bin/env node
import NextEnv from "@next/env";
import axios from "axios";
import chalk from "chalk";
import dtsgenerator from "dtsgenerator";
import fs from "node:fs/promises";
import path from "node:path";
import { oraPromise } from "ora";
import prettier from "prettier";
@htunnicliff
htunnicliff / _app.tsx
Created September 16, 2021 21:15
Next.js Auth0 AuthGate Strategy
import AppProviders from "@/components/AppProviders";
import AppShell from "@/components/AppShell";
import { withAuth } from "@/lib/auth0/with-auth";
import { AppProps } from "next/app";
import { ReactNode } from "react";
interface MyAppProps extends AppProps {
err: Error;
Component: AppProps["Component"] & {
displayAppShell?: boolean;
@htunnicliff
htunnicliff / knex-snowflake-dialect.ts
Created September 30, 2020 22:12
WIP Knex dialect for Snowflake in
import Knex, { MySqlConnectionConfig } from "knex";
import * as Snowflake from "snowflake-sdk";
import { promisify } from "util";
const Dialect = require("knex/lib/dialects/mysql/index.js");
Dialect.prototype._driver = () => Snowflake;
Dialect.prototype.wrapIdentifierImpl = (value: string) => value;
Dialect.prototype.validateConnection = () => true;
@htunnicliff
htunnicliff / turbolink-it.js
Last active May 28, 2020 22:39
Make any site use turbolinks