Skip to content

Instantly share code, notes, and snippets.

View gsuberland's full-sized avatar

Graham Sutherland gsuberland

View GitHub Profile
@gsuberland
gsuberland / mastodon_reinstate_title_text.user.js
Created July 22, 2025 22:18
Greasemonkey / Tampermonkey script to bring back hoverable alt text in Mastodon 4.4
// ==UserScript==
// @name Mastodon 4.4 - Reinstate title text!
// @namespace http://tampermonkey.net/
// @version 2025-07-22
// @description Restores alt text in the title attribute of images and videos, allowing the alt text to be viewed in a tooltip while hovering with the mouse. See https://github.com/mastodon/mastodon/issues/33799
// @author Graham Sutherland
// @match https://chaos.social/*
// @icon https://mastodon.social/favicon.ico
// @grant none
// ==/UserScript==
@gsuberland
gsuberland / mastodon_feed_link_reorder.user.js
Created July 20, 2025 08:49
Mastodon feed link reordering userscript.
@gsuberland
gsuberland / HarmonyStubGenerator.cs
Last active July 31, 2024 23:07
C# code to generate Harmony prefix and postfix stubs against a target type
public class Target
{
private void Test1()
{
}
private string Test2()
{
return "";
@gsuberland
gsuberland / mastodon_local_link.user.js
Last active January 25, 2025 01:38
Tampermonkey script that adds a link to view remote posts locally.
@gsuberland
gsuberland / ClusterFunctionsByFID.java
Created May 7, 2023 20:05
Ghidra script to cluster functions by their function ID, applying tags to functions in clusters of size >1. Helps identify functions that have identical or very similar behaviour.
// Clusters functions by their function ID and applies tags to functions in clusters with a size larger than 1.
//@category FunctionID
//@author Graham Sutherland
import java.io.IOException;
import java.util.*;
import ghidra.app.script.GhidraScript;
import ghidra.feature.fid.hash.FidHashQuad;
import ghidra.feature.fid.plugin.HashLookupListMode;
@gsuberland
gsuberland / forced_alignment_srt.cs
Last active October 12, 2022 05:50
Automatic forced alignment transcription for creating timed SRT subtitles from a script document, using speech recognition.
/*
works in LinqPad 5 (.NET Framework)
requires System.Speech.dll to be loaded
*/
string script = @"
This is a test of automatic forced alignment transcription.
When I read these words, the program will automatically follow along and output SRT subtitle entries.
The code also handles situations where two lines in the script are the same.
For example, I can repeat the first line of this script:
@gsuberland
gsuberland / mastodon_unlist_replies.user.js
Created May 21, 2022 19:45
Tampermonkey / Greasemonkey script to automatically set the privacy of replies to unlisted by default on Mastodon.
// ==UserScript==
// @name Mastodon Unlisted Replies
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Sets the privacy of replies to unlisted by default on Mastodon.
// @author Graham Sutherland (@[email protected])
// @match https://chaos.social/* https://mastodon.social/*
// @icon https://www.google.com/s2/favicons?sz=64&domain=chaos.social
// @grant none
// @run-at document-idle
@gsuberland
gsuberland / dump_windows_productpolicy.cs
Last active April 7, 2022 12:55
Dump Windows ProductPolicy Structure in C#
// dump ProductPolicy data structure from Windows
// ref: https://www.geoffchappell.com/studies/windows/km/ntoskrnl/api/ex/slmem/productpolicy.htm
using (var pok = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(@"SYSTEM\ControlSet001\Control\ProductOptions", false))
{
byte[] policy = (byte[])pok.GetValue(@"ProductPolicy");
using (var ms = new MemoryStream(policy))
using (var br = new BinaryReader(ms))
{
Console.WriteLine("total license data size (including header): {0}", br.ReadUInt32());
@gsuberland
gsuberland / MoveDisplays.cs
Created November 25, 2021 04:08
Move displays programmatically on Windows in C#
// quick bit of code to move displays to specific locations in C#
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct DEVMODE
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
public string dmDeviceName;
public short dmSpecVersion;
public short dmDriverVersion;
@gsuberland
gsuberland / twitter_video_hq_tampermonkey.js
Created November 7, 2021 14:45
Tampermonkey / Greasemonkey script to force high quality video on Twitter
// ==UserScript==
// @name Load HQ Video on Twitter
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Forces Twitter to always load the highest bitrate video available.
// @author Graham Sutherland
// @match https://twitter.com/*
// @icon https://www.google.com/s2/favicons?domain=twitter.com
// @grant none
// ==/UserScript==