diff --git a/apps/web/src/components/AppFooter.tsx b/apps/web/src/components/AppFooter.tsx
index 30a7e16..eb32777 100644
--- a/apps/web/src/components/AppFooter.tsx
+++ b/apps/web/src/components/AppFooter.tsx
@@ -1,4 +1,4 @@
-// One centered line: libreble · GitHub · Report an issue · build version. Colours come from the
+// One centered line: libreble · GitHub · Report an issue · Ko-fi · build version. Colours come from the
// zinc ramp, which index.css mirrors per theme; the libreble accent opts in via `dark:`.
const REPO = 'https://github.com/libreble/multimeter';
@@ -7,6 +7,16 @@ const RELEASE = /^v\d+\.\d+\.\d+$/.test(__APP_VERSION__)
? `${REPO}/releases/tag/${__APP_VERSION__}`
: null;
+/** The Ko-fi link wears a different joke each page load; its title/aria-label says what it is. */
+const KOFI_JOKES = [
+ 'Buy me a 9V battery',
+ 'Buy me a 10A fuse',
+ 'Buy me new test leads',
+ 'Buy me some electrical tape',
+];
+const KOFI_JOKE = KOFI_JOKES[Math.floor(Math.random() * KOFI_JOKES.length)];
+const KOFI_TITLE = 'Support libreble on Ko-fi';
+
const LINK = 'inline-flex items-center gap-1.5 hover:text-zinc-300';
export function AppFooter() {
@@ -34,6 +44,17 @@ export function AppFooter() {
>
Report an issue
+
+
+ {KOFI_JOKE}
+
{RELEASE ? (
+
+
+
+
+ );
+}
+
function GitHubMark() {
return (