diff --git a/0001-fox.patch b/0001-fox.patch
new file mode 100644
index 0000000..ffda811
--- /dev/null
+++ b/0001-fox.patch
@@ -0,0 +1,102 @@
+From 3ae6cca154ced7cbfe74abb03d5a633461bc5c63 Mon Sep 17 00:00:00 2001
+From: MathMan05 <mathmanrm@gmail.com>
+Date: Sun, 21 Sep 2025 19:14:11 -0500
+Subject: [PATCH] fox
+
+---
+ src/d2m/converters/pins-to-list.js | 47 +++++++++++++++++-------------
+ 1 file changed, 27 insertions(+), 20 deletions(-)
+
+diff --git a/src/d2m/converters/pins-to-list.js b/src/d2m/converters/pins-to-list.js
+index 3e890ea..a4b7fe7 100644
+--- a/src/d2m/converters/pins-to-list.js
++++ b/src/d2m/converters/pins-to-list.js
+@@ -1,31 +1,38 @@
+ // @ts-check
+
+-const {select} = require("../../passthrough")
++const { select } = require("../../passthrough");
+
+ /**
+- * @param {import("discord-api-types/v10").RESTGetAPIChannelPinsResult} pins
++ * @param {import("discord-api-types/v10").RESTGetAPIChannelMessagesPinsResult} pins
+ * @param {{"m.room.pinned_events/"?: {pinned?: string[]}}} kstate
+ */
+ function pinsToList(pins, kstate) {
+- let alreadyPinned = kstate["m.room.pinned_events/"]?.pinned || []
++ let alreadyPinned = kstate["m.room.pinned_events/"]?.pinned || [];
+
+- // If any of the already pinned messages are bridged messages then remove them from the already pinned list.
+- // * If a bridged message is still pinned then it'll be added back in the next step.
+- // * If a bridged message was unpinned from Discord-side then it'll be unpinned from our side due to this step.
+- // * Matrix-only unbridged messages that are pinned will remain pinned.
+- alreadyPinned = alreadyPinned.filter(event_id => {
+- const messageID = select("event_message", "message_id", {event_id}).pluck().get()
+- return !messageID || pins.find(m => m.id === messageID) // if it is bridged then remove it from the filter
+- })
++ // If any of the already pinned messages are bridged messages then remove them from the already pinned list.
++ // * If a bridged message is still pinned then it'll be added back in the next step.
++ // * If a bridged message was unpinned from Discord-side then it'll be unpinned from our side due to this step.
++ // * Matrix-only unbridged messages that are pinned will remain pinned.
++ alreadyPinned = alreadyPinned.filter((event_id) => {
++ const messageID = select("event_message", "message_id", { event_id })
++ .pluck()
++ .get();
++ return !messageID || pins.items.find((m) => m.message.id === messageID); // if it is bridged then remove it from the filter
++ });
+
+- /** @type {string[]} */
+- const result = []
+- for (const message of pins) {
+- const eventID = select("event_message", "event_id", {message_id: message.id, part: 0}).pluck().get()
+- if (eventID && !alreadyPinned.includes(eventID)) result.push(eventID)
+- }
+- result.reverse()
+- return alreadyPinned.concat(result)
++ /** @type {string[]} */
++ const result = [];
++ for (const { message } of pins.items) {
++ const eventID = select("event_message", "event_id", {
++ message_id: message.id,
++ part: 0,
++ })
++ .pluck()
++ .get();
++ if (eventID && !alreadyPinned.includes(eventID)) result.push(eventID);
++ }
++ result.reverse();
++ return alreadyPinned.concat(result);
+ }
+
+-module.exports.pinsToList = pinsToList
++module.exports.pinsToList = pinsToList;
+--
+2.51.0
+
+ssageID = select("event_message", "message_id", { event_id })
++ .pluck()
++ .get();
++ return !messageID || pins.items.find((m) => m.message.id === messageID); // if it is bridged then remove it from the filter
++ });
+
+- /** @type {string[]} */
+- const result = []
+- for (const message of pins) {
+- const eventID = select("event_message", "event_id", {message_id: message.id, part: 0}).pluck().get()
+- if (eventID && !alreadyPinned.includes(eventID)) result.push(eventID)
+- }
+- result.reverse()
+- return alreadyPinned.concat(result)
++ /** @type {string[]} */
++ const result = [];
++ for (const { message } of pins.items) {
++ const eventID = select("event_message", "event_id", {
++ message_id: message.id,
++ part: 0,
++ })
++ .pluck()
++ .get();
++ if (eventID && !alreadyPinned.includes(eventID)) result.push(eventID);
++ }
++ result.reverse();
++ return alreadyPinned.concat
\ No newline at end of file
diff --git a/default.nix b/default.nix
index 20385a4..ec2439d 100644
--- a/default.nix
+++ b/default.nix
@@ -17,6 +17,8 @@ buildNpmPackage {
npmDepsHash = "sha256-TzXkgBzGYegtmhC2ZaBpyNBKmezO+AHM/jUa9HN+IsQ=";
dontNpmBuild = true;
+ patches = [ ./0001-fox.patch ];
+
nativeBuildInputs = [ makeWrapper ];
installPhase =
|