Skip to content

Instantly share code, notes, and snippets.

🚫 <style>body { opacity: 0.2; filter: grayscale(1); font-size: 10em; font-family: sans-serif; display: flex; align-items: center; justify-content: center } h1 { display: none; }</style>
@4lun
4lun / useAPIForm.ts
Last active August 13, 2025 11:41
A (React) utility hook that is a drop in replacement for the useForm hook from Inertia.js, but for use with general API endpoints. Any page updates or navigation needs to be handled manually via onSuccess callback.
/**
* A utility hook that is a drop in replacement for the useForm hook from
* Inertia.js, for use with general API endpoints. Any page updates or
* navigation needs to be handled manually via onSuccess callback.
*
* Based on a combination of
* - https://gist.github.com/mohitmamoria/91da6f30d9610b211248225c9e52bebe
* - https://gist.github.com/mattiasghodsian/9b4ee07e805547aa13795dc3a28a206d
*
* Version 0.2
@4lun
4lun / 2024_05_16_152355_create_system_meta_table.php
Last active May 16, 2024 16:40
Laravel faux scheduler (i.e. faux cron), if running in an environment that lacks a decent scheduler/cron option (e.g. DigitalOcean App Platform). Primarily designed to be triggered via uptime checker, e.g. can hook into health check endpoint `Event::listen(function (DiagnosingHealth $event) { FauxScheduler::dispatch(); });`
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
@4lun
4lun / helpers.php
Created April 22, 2024 12:00
Laravel Route macros/helpers for serving multiple domains
<?php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
// Usage:
//
// Route::domain('domain.com', function () {
// Route::get('/', [DomainController::class, 'index']);
// });
@4lun
4lun / apache_app.conf
Last active April 18, 2024 16:32
Get access logs on DigitalOcean App Platform (with PHP via heroku-php-apache2) logging the forwarded Client IP by default on the "Runtime Logs" tab
# Update run_command in app spec to pass config, e.g. `run_command: heroku-php-apache2 -C apache_app.conf public/`
DirectoryIndex index.php index.html index.htm
# mod_remoteip should be loaded by default, but needs configuration
RemoteIPHeader DO-Connecting-IP
# Trust any private IPv4 ranges
RemoteIPTrustedProxy 10.0.0.0/8
RemoteIPTrustedProxy 172.16.0.0/12
@4lun
4lun / git-clone-different-ssh-key.sh
Created February 20, 2024 10:32
Clone a git repo using an alternative ssh key
GIT_SSH_COMMAND="ssh -i ~/.ssh/PRIVATE_KEY" git clone [email protected]:ORG/REPO.git
@4lun
4lun / gist:9a9bd9c3d195d22005216d71ec661b55
Created January 19, 2024 15:15
Nginx server block config lines for piping access_log and error_log to syslog (useful for then getting relayed to papertrail). Source: https://chabik.com/nginx-logging-to-syslog/
access_log syslog:server=unix:/dev/log,tag=nginx,nohostname,severity=info combined;
error_log syslog:server=unix:/dev/log,tag=nginx,nohostname,severity=error;
@4lun
4lun / toBlueprint.js
Created November 30, 2023 10:20
Generate a quick and dirty type "blueprint" of a JS object/array/variable
function toBlueprint(obj) {
if (!obj || typeof obj !== 'object') {
return obj;
}
if(Array.isArray(obj)) {
return obj.map(toBlueprint) // nit: won't unify common props
}
return Object.keys(obj).reduce((acc, key) => {
let blueprint = typeof obj[key];
if (blueprint === "object" && blueprint) {
@4lun
4lun / t480s-fix-trackpad.bashrc
Created June 14, 2023 09:28
Trackpad sometimes stops working on T480s under Ubuntu, this restarts the driver which "fixes" it (until it stops again) without a restart
alias fix_trackpad="sudo modprobe -r elan_i2c && sudo modprobe elan_i2c"
@4lun
4lun / useEffectDebug.ts
Created March 21, 2023 12:20
Simple useEffect debug hook for figuring out which dependencies have changed in React
import { DependencyList, EffectCallback, useEffect, useRef } from 'react';
const useEffectDebug = (
effect: EffectCallback,
deps: DependencyList,
label?: string,
) => {
const previous = useRef<DependencyList>();
useEffect(() => {
const changedDepIndexes: number[] = [];