JesterDemi

(function () { if (window.__kofiFloatingChatLoaded) return; window.__kofiFloatingChatLoaded = true; function load(src, cb) { var s = document.createElement('script'); s.src = src; s.async = true; s.onload = cb; document.head.appendChild(s); } function init() { if (!window.kofiWidgetOverlay || !window.kofiWidgetOverlay.draw) { setTimeout(init, 100); return; } window.kofiWidgetOverlay.draw('jesterdemi', { 'type': 'floating-chat', 'floating-chat.donateButton.text': 'Tip Me', 'floating-chat.donateButton.background-color': '#323842', 'floating-chat.donateButton.text-color': '#fff' }); } load('https://storage.ko-fi.com/cdn/scripts/overlay-widget.js', function () { if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } }); })();

🧠 ABOUT ME

I’m a digital solutions architect, creative producer, and multidisciplinary builder working across systems, design, automation, and community infrastructure. With 15+ years of experience and a strong creative instinct, I challenge assumptions, think beyond conventional limits, and transform bold ideas into structured systems that actually work.

Drawn to solving problems that need both logic and imagination to work, figuring out how ideas actually come to life… usually with a bowl of popcorn nearby.

🧩 CURRENT PROJECTS

🎮 SKILLS

PLATFORMPROFICIENCY
Discord⭐⭐⭐⭐⭐
Multi-Platform Integrations⭐⭐⭐⭐⭐
Domain Management⭐⭐⭐⭐⭐
Strategic Problem Solving⭐⭐⭐⭐⭐
Web & Bot Development⭐⭐⭐⭐
Workflow Design⭐⭐⭐⭐
Carrd⭐⭐⭐⭐
Google Workspace⭐⭐⭐⭐
Customer Service⭐⭐⭐⭐
Nonprofit Digital Management⭐⭐⭐
SharePoint Lists & Security⭐⭐⭐
Zapier⭐⭐⭐

© Jester Demi 2026 | All Rights Reserved.

JesterDemi

My Passions

I design adaptable digital ecosystems that connect data, workflows, and people into one cohesive structure. From automation frameworks and collaborative platforms to branded digital experiences, every solution is built around how you actually operate, not how a tool assumes you should.But building systems is not just what I do. It is how I think, and that is why the projects I take on naturally become passions.The foundation of any strong system begins with asking the right questions. Before architecture, before automation, before code, there is clarity. What is actually broken? What needs to scale? What must remain stable no matter what changes? The outcome is only as strong as the questions that shaped it.Whether enhancing environments like SharePoint, Zapier, Power Automate, or Discord, or introducing new systems where they genuinely create impact, I focus on clarity, scalability, and long term flexibility. The goal is simple: build structured systems that feel intuitive, manageable, and ready to evolve.When I am not deep in a project, I am usually out building memories. A few of those interests are below:

© Jester Demi 2026 | All Rights Reserved.

JesterDemi

A curated selection of products used and recommended by Jester Demi.

Disclosure: This page contains affiliate links. If you make a purchase through them, I may earn a commission at no additional cost to you.As an Amazon Associate, I earn from qualifying purchases.

(() => { const GALLERY_ID = "affiliateGallery"; const norm = (s) => (s || "") .toString() .toLowerCase() .replace(/\s+/g, " ") .trim(); const parseCats = (alt) => { if (!alt) return []; const idx = alt.indexOf("|"); if (idx === -1) return []; const after = alt.slice(idx + 1).trim(); if (!after) return []; // allow comma separated categories return after.split(",").map(x => x.trim()).filter(Boolean); }; const ui = document.getElementById("agUI"); const filtersEl = ui.querySelector(".ag-filters"); const searchEl = ui.querySelector(".ag-search"); const clearEl = ui.querySelector(".ag-clear"); const countEl = ui.querySelector(".ag-count"); const debugEl = document.getElementById("agDebug"); const state = { cat: "All", q: "" }; const setDebug = (msg) => { debugEl.textContent = msg; }; function findInnerContainer(gallery) { // Carrd commonly uses .inner inside elements, but not always. return gallery.querySelector(".inner") || gallery; } function findItemWrapper(img, inner) { // Walk up until the direct child of "inner" that contains this img. let el = img; while (el && el.parentElement && el.parentElement !== inner) el = el.parentElement; // If we found a direct child of inner, that is our wrapper. if (el && el.parentElement === inner) return el; // Fallback: pick something reasonable return img.closest("a, figure, li, div, span") || img; } function buildDataset(gallery) { const inner = findInnerContainer(gallery); const imgs = Array.from(gallery.querySelectorAll("img")); const items = imgs.map(img => { const alt = img.getAttribute("alt") || ""; const wrapper = findItemWrapper(img, inner); // searchable text: alt + any visible text in wrapper const text = norm(alt + " " + (wrapper.textContent || "")); // categories: from alt after | const cats = parseCats(alt); return { wrapper, img, alt, cats, text }; }); // Deduplicate items in case multiple imgs exist per item (rare, but Carrd likes chaos) const seen = new Set(); const unique = []; for (const it of items) { if (!it.wrapper) continue; if (seen.has(it.wrapper)) continue; seen.add(it.wrapper); unique.push(it); } const catSet = new Set(); unique.forEach(it => it.cats.forEach(c => catSet.add(c))); const cats = Array.from(catSet).sort((a,b) => a.localeCompare(b)); return { inner, items: unique, cats }; } function renderButtons(cats, onPick) { filtersEl.innerHTML = ""; const makeBtn = (label) => { const b = document.createElement("button"); b.type = "button"; b.className = "ag-btn"; b.textContent = label; b.setAttribute("role", "tab"); b.setAttribute("aria-selected", label === state.cat ? "true" : "false"); b.addEventListener("click", () => onPick(label)); return b; }; filtersEl.appendChild(makeBtn("All")); cats.forEach(c => filtersEl.appendChild(makeBtn(c))); } function apply(items) { const q = norm(state.q); const cat = state.cat; let shown = 0; for (const it of items) { const matchCat = (cat === "All") ? true : it.cats.includes(cat); const matchQ = q ? it.text.includes(q) : true; const show = matchCat && matchQ; it.wrapper.style.display = show ? "" : "none"; if (show) shown++; } countEl.textContent = `${shown} / ${items.length} shown`; } function initOnce() { const gallery = document.getElementById(GALLERY_ID); if (!gallery) { setDebug(`Status: cannot find #${GALLERY_ID}`); return false; } const data = buildDataset(gallery); if (!data.items.length) { setDebug(`Status: found #${GALLERY_ID} but detected 0 items`); return false; } // Insert UI just above the gallery element once if (!ui.dataset.inserted) { gallery.parentNode.insertBefore(ui, gallery); ui.dataset.inserted = "true"; } ui.hidden = false; renderButtons(data.cats, (picked) => { state.cat = picked; renderButtons(data.cats, arguments.callee); // refresh aria-selected apply(data.items); }); let t = null; searchEl.addEventListener("input", () => { clearTimeout(t); t = setTimeout(() => { state.q = searchEl.value || ""; apply(data.items); }, 60); }); clearEl.addEventListener("click", () => { searchEl.value = ""; state.q = ""; apply(data.items); searchEl.focus(); }); state.cat = "All"; state.q = ""; searchEl.value = ""; apply(data.items); setDebug(`Status: ok (items: ${data.items.length}, categories: ${data.cats.length})`); return true; } function start() { if (initOnce()) return; // Carrd sometimes finishes building after DOMContentLoaded. // So we observe and retry. const obs = new MutationObserver(() => { if (initOnce()) obs.disconnect(); }); obs.observe(document.documentElement, { childList: true, subtree: true }); let tries = 0; const iv = setInterval(() => { tries++; if (initOnce() || tries > 40) clearInterval(iv); }, 250); } if (document.readyState === "loading") { document.addEventListener("DOMContentLoaded", start); } else { start(); } })();

© Jester Demi 2026 | All Rights Reserved.