aleahim-new-post

star 0

Scaffold, hero-image, build, and deploy a new blog post on aleahim.com (TileDown + GitHub Pages). Pauses to generate an Apple Creator Studio image prompt matched to the post topic, waits for the Keynote-exported PNG/JPG in ~/Downloads, then builds with the TileDown engine and deploys. Use when the user asks to "new blog post", "publish to aleahim", "add post", "ship blog post", "create blog post <title>", or hands you a draft markdown file/path to publish.

mihaelamj By mihaelamj schedule Updated 6/13/2026

name: aleahim-new-post description: Scaffold, hero-image, build, and deploy a new blog post on aleahim.com (TileDown + GitHub Pages). Pauses to generate an Apple Creator Studio image prompt matched to the post topic, waits for the Keynote-exported PNG/JPG in ~/Downloads, then builds with the TileDown engine and deploys. Use when the user asks to "new blog post", "publish to aleahim", "add post", "ship blog post", "create blog post ", or hands you a draft markdown file/path to publish. argument-hint: <draft.md path | "Post Title"></h2> <h2>aleahim-new-post</h2> <p>End-to-end workflow for a new aleahim.com post. The site is built with the TileDown engine: content is authored under <code>TileDown/content/</code> and built into the repo root, which GitHub Pages serves. There is no generator step and no conversion.</p> <h2>0. Always do first — repo guard</h2> <pre><code class="language-bash">ROOT="$(git rev-parse --show-toplevel 2>/dev/null)" || { echo "abort: not in a git repo"; exit 1; } cd "$ROOT" git remote get-url origin | grep -q "github.com[:/]mihaelamj/aleahim.com" \ || { echo "abort: origin is not github.com:mihaelamj/aleahim.com"; exit 1; } test -z "$(git status --porcelain | grep -v '^??')" \ || { echo "abort: working tree has uncommitted modifications"; git status --short; exit 1; } test -d "${TILEDOWN_REPO:-../TileDown/tile-down}/Packages" \ || { echo "abort: TileDown engine not at ${TILEDOWN_REPO:-../TileDown/tile-down}; set TILEDOWN_REPO"; exit 1; } </code></pre> <p>Every subsequent step assumes pwd is the aleahim.com repo root and the tree is clean.</p> <h2>Inputs</h2> <ul> <li>Path to a draft markdown file, OR a title + body pasted in chat, OR a brief. Ask before drafting; never invent technical content.</li> </ul> <p>Always confirm: slug, title, description, date (default today), tags, body source.</p> <h2>Slug + paths</h2> <ul> <li>Slug = kebab-case from the title unless the user provides one.</li> <li>Post: <code>TileDown/content/blog/<slug>/index.md</code></li> <li>Images: <code>TileDown/content/images/blog/<slug>/</code>, hero at <code>hero.<ext></code> (PNG or JPG, matching the source; no recompression beyond optional optimisation).</li> </ul> <h2>Frontmatter template</h2> <pre><code class="language-yaml">--- slug: blog/<slug> title: "<Title>" description: <one-line listing description, no period, no em dashes> date: <YYYY-MM-DD> image: /images/blog/<slug>/hero.<ext> draft: false tags: <Tag, Tag> --- </code></pre> <p><code>slug:</code> MUST be <code>blog/<slug></code>. The <code>image:</code> extension must match the hero file. Start the body with <code># <Title></code> (an H1 matching the frontmatter title), then the post.</p> <h2>Workflow</h2> <p>Speak each major step: <code>say -v "Ava" "Ava: <8-word update>"</code>. Bash blocks abort on non-zero exit.</p> <h3>1. Confirm inputs</h3> <p>Print proposed slug, title, description, date, tags. Wait for confirmation. If the slug collides:</p> <pre><code class="language-bash">test ! -d "TileDown/content/blog/<slug>" || { echo "abort: blog/<slug> exists, ask before overwriting"; exit 1; } </code></pre> <h3>2. Scaffold post</h3> <pre><code class="language-bash">mkdir -p "TileDown/content/blog/<slug>" "TileDown/content/images/blog/<slug>" </code></pre> <p>Write <code>TileDown/content/blog/<slug>/index.md</code> with the frontmatter block above and the body. No em dashes (commas, colons, periods only).</p> <h3>3. Generate Apple Creator Studio prompt</h3> <p>Read the body. Pick a style by topic:</p> <table> <thead> <tr> <th>Post type</th> <th>Style</th> </tr> </thead> <tbody><tr> <td>Release / launch / version bump</td> <td>Bold</td> </tr> <tr> <td>Technical deep-dive / architecture</td> <td>Illustration</td> </tr> <tr> <td>Product showcase / feature demo</td> <td>Photorealistic</td> </tr> <tr> <td>Reflective / personal / process</td> <td>Watercolor</td> </tr> <tr> <td>Code / diagram / system flow</td> <td>Line</td> </tr> <tr> <td>Numbers / performance / benchmark</td> <td>Bold</td> </tr> <tr> <td>Tutorial / how-to / explanatory</td> <td>Illustration</td> </tr> </tbody></table> <p>Always: View = Any, Aspect = Landscape (16:9). Image model: OpenAI (ChatGPT) via Apple Creator Studio in Keynote. The model reads style from the prompt text, so fold the style word into one rich free-form paragraph, no text, no logos, no readable letters.</p> <p>Output in this exact block:</p> <pre><code>HERO IMAGE PROMPT (Apple Creator Studio) ──────────────────────────────────────── Style: <picked style> (folded into the prompt) View: Any Aspect: Landscape (16:9) Model: OpenAI (ChatGPT) Prompt: <one rich free-form paragraph. Subject, mood, colour cues, composition. Fold the style word into the sentence. No text, no logos, no readable letters. Reference the post's central concrete idea. No em dashes.> Why this style: <one sentence> ──────────────────────────────────────── Next: in Keynote, insert an image via Apple Creator Studio → OpenAI (ChatGPT) model → paste the Prompt → generate → place on a 16:9 slide → export PNG/JPG to ~/Downloads. Then tell me "image ready" (or "use <filename>"). </code></pre> <p>HARD PAUSE. Speak: <code>say -v "Ava" "Ava: Prompt ready. Waiting for hero image."</code></p> <h3>4. Pick up the image</h3> <pre><code class="language-bash">CANDIDATE=$(find ~/Downloads -maxdepth 1 -type f \( -iname "*.png" -o -iname "*.jpg" -o -iname "*.jpeg" \) -mmin -1440 -print0 \ | xargs -0 ls -t 2>/dev/null | head -1) test -n "$CANDIDATE" || { echo "abort: no recent png/jpg in ~/Downloads"; exit 1; } echo "Candidate: $CANDIDATE" </code></pre> <p>On confirmation, preserve the source format:</p> <pre><code class="language-bash">SRC="<confirmed source path>" case "$SRC" in *.png|*.PNG) EXT="png" ;; *.jpg|*.jpeg|*.JPG|*.JPEG) EXT="jpg" ;; *) echo "abort: unsupported source extension ($SRC)"; exit 1 ;; esac DEST="TileDown/content/images/blog/<slug>/hero.$EXT" cp "$SRC" "$DEST" || { echo "abort: cp failed"; exit 1; } sed -i "" "s|^image: /images/blog/<slug>/hero\\.[a-z]*$|image: /images/blog/<slug>/hero.$EXT|" \ "TileDown/content/blog/<slug>/index.md" case "$EXT" in png) which optipng >/dev/null && optipng -o2 "$DEST" || true ;; jpg) which jpegoptim >/dev/null && jpegoptim --all-progressive --strip-all "$DEST" || true ;; esac sips -g pixelWidth -g pixelHeight "$DEST" | grep pixel </code></pre> <h3>4b. Bump the site version</h3> <p>Edit <code>TileDown/content/tiledown.yml</code> and increment <code>versionName</code> (for example v1.19 to v1.20). The header subtitle shows this on every page.</p> <h3>5. Preview</h3> <pre><code class="language-bash">make tiledown-preview # serves http://localhost:8098 (blocking; run in its own terminal) </code></pre> <p>Open <code>http://localhost:8098/blog/<slug>/</code> and spot-check the post page and the homepage card. Wait for "looks good" / "ship it" before step 6.</p> <h3>6. Build + deploy</h3> <pre><code class="language-bash">HERO_PATH=$(grep "^image:" "TileDown/content/blog/<slug>/index.md" | sed 's/^image: *//') HERO_FILE="TileDown/content${HERO_PATH}" test -f "$HERO_FILE" || { echo "abort: hero file $HERO_FILE missing"; exit 1; } grep -q "^draft: false" "TileDown/content/blog/<slug>/index.md" || { echo "abort: draft not false"; exit 1; } make tiledown-check || { say -v "Ava" "Ava: Build failed."; echo "abort: make tiledown-check failed"; exit 1; } test -f TileDown/dist/index.html || { echo "abort: TileDown/dist/index.html missing"; exit 1; } cp -R TileDown/dist/* . || { echo "abort: cp from TileDown/dist failed"; exit 1; } test -f "blog/<slug>/index.html" || { echo "abort: blog/<slug>/index.html missing at root"; exit 1; } test "$(grep -c localhost index.html)" = "0" || { echo "abort: localhost leaked into index.html"; exit 1; } grep -qx "aleahim.com" CNAME || { echo "abort: root CNAME is not aleahim.com"; exit 1; } grep -q "blog/<slug>/" rss.xml || { echo "abort: new post missing from rss.xml"; exit 1; } git add . git status git commit -m "deploy: add \"<Title>\" (vX.Y)" || { echo "abort: git commit failed (hook?)"; exit 1; } git push origin main || { say -v "Ava" "Ava: Push failed."; echo "abort: git push failed"; exit 1; } # Always tag the site: one lightweight vX.Y tag per deploy, matching versionName. VER=$(grep "^versionName:" TileDown/content/tiledown.yml | sed 's/^versionName: *//') git tag "$VER" || { echo "abort: tag $VER already exists or failed"; exit 1; } git push origin "$VER" || { echo "abort: tag push failed"; exit 1; } </code></pre> <p>Speak: <code>say -v "Ava" "Ava: Pushed to main. Pages will publish soon."</code></p> <h3>7. Verify (post-deploy)</h3> <pre><code class="language-bash">sleep 45 CODE=$(curl -s -o /dev/null -w "%{http_code}" "https://aleahim.com/blog/<slug>/") echo "GET /blog/<slug>/ → $CODE" [ "$CODE" = "200" ] || { sleep 30; echo "retry → $(curl -s -o /dev/null -w '%{http_code}' https://aleahim.com/blog/<slug>/)"; } LI=$(curl -s https://aleahim.com/rss.xml | grep -c "<item>"); LF=$(curl -s https://aleahim.com/rss.xml | grep -c "<content:encoded>") echo "live RSS: $LI items, $LF content:encoded"; test "$LI" = "$LF" || echo "warning: RSS full-text mismatch" </code></pre> <p>Final voice: <code>say -v "Ava" "Ava: Post is live. Aleahim dot com."</code></p> <h2>Hard rules</h2> <ul> <li>ALWAYS tag the site on every deploy: a lightweight <code>vX.Y</code> tag matching <code>versionName</code>, pushed to origin. Backfill any missing version tags.</li> <li>NEVER push anywhere other than <code>origin/main</code> on <code>github.com:mihaelamj/aleahim.com</code>.</li> <li>NEVER push to a GitLab remote (global rule).</li> <li>The live site comes from <code>TileDown/dist/</code> only. Copy that to the root.</li> <li>NEVER add AI attribution to the commit (global rule).</li> <li>NEVER use em dashes in post body, frontmatter <code>description</code>, or commit message.</li> <li>NEVER assume the post body. Ask if the user only supplied a title.</li> <li>NEVER deploy without the hero image (step 6 asserts it).</li> <li>NEVER silently overwrite an existing slug (step 1 blocks it).</li> <li>NEVER hand-edit <code>CNAME</code>. It ships from <code>TileDown/content/CNAME</code>; step 6 asserts it stays <code>aleahim.com</code>.</li> </ul> <h2>Files this skill touches</h2> <ul> <li><code>TileDown/content/blog/<slug>/index.md</code> (new)</li> <li><code>TileDown/content/images/blog/<slug>/hero.<png|jpg></code> (new)</li> <li><code>TileDown/content/tiledown.yml</code> (version bump)</li> <li><code>TileDown/dist/...</code> and the root site (rebuilt by the engine, copied to root)</li> </ul> <h2>Idempotency</h2> <ul> <li>If <code>TileDown/content/blog/<slug>/index.md</code> exists, step 1 aborts.</li> <li>If only the hero is missing, re-enter at step 3.</li> <li>If build succeeded but push failed, re-run step 6 from <code>git push</code>.</li> </ul> <h2>Cross-Mac install</h2> <p>Canonical file: <code>aleahim.com/skills/aleahim-new-post/SKILL.md</code> (git-tracked). After <code>git pull</code> on another Mac, create the global symlink:</p> <pre><code class="language-bash"># Studio ln -s /Volumes/Code/DeveloperExt/public/aleahim.com/skills/aleahim-new-post ~/.claude/skills/aleahim-new-post # MacBook Air ln -s ~/Developer/personal/public/aleahim.com/skills/aleahim-new-post ~/.claude/skills/aleahim-new-post # Claw Mini ln -s /Volumes/ClawSSD/Developer/personal/public/aleahim.com/skills/aleahim-new-post ~/.claude/skills/aleahim-new-post # Torrent Mini ln -s /Volumes/Scratch/DeveloperEx/public/aleahim.com/skills/aleahim-new-post ~/.claude/skills/aleahim-new-post # Work MBP ln -s /Users/mihaemih.mac/Developer/public/aleahim.com/skills/aleahim-new-post ~/.claude/skills/aleahim-new-post </code></pre> </article> </div> <!-- Right: Metadata & Command Sidebar --> <div class="w-full lg:w-80 shrink-0 flex flex-col gap-6" data-astro-cid-7zzsworf> <!-- Install Card --> <div class="p-6 rounded-xl bg-surface-container border border-border/80 flex flex-col gap-4 shadow-sm" data-astro-cid-7zzsworf> <span class="text-xs font-bold uppercase tracking-widest text-on-surface-variant/60 font-mono" data-astro-cid-7zzsworf>Install via CLI</span> <div class="flex flex-col gap-2" data-astro-cid-7zzsworf> <div id="detail-install-cmd" class="font-mono text-[11px] p-3 rounded-lg bg-black/40 border border-border select-all break-all text-primary font-bold leading-relaxed" data-astro-cid-7zzsworf> npx skills add https://github.com/mihaelamj/aleahim.com --skill aleahim-new-post </div> <button id="detail-copy-btn" class="w-full py-2.5 rounded-lg bg-primary hover:bg-primary-hover text-on-primary font-sans font-bold text-sm shadow transition-all active:scale-95 flex items-center justify-center gap-1.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px]" data-astro-cid-7zzsworf>content_copy</span> <span data-astro-cid-7zzsworf>Copy Command</span> </button> </div> </div> <!-- Details & Stats Card --> <div class="p-6 rounded-xl bg-surface-container border border-border/80 flex flex-col gap-4 shadow-sm text-on-surface" data-astro-cid-7zzsworf> <span class="text-xs font-bold uppercase tracking-widest text-on-surface-variant/60 font-sans" data-astro-cid-7zzsworf>Repository Details</span> <div class="flex flex-col gap-3.5" data-astro-cid-7zzsworf> <div class="flex justify-between items-center text-sm" data-astro-cid-7zzsworf> <span class="text-on-surface-variant/70 flex items-center gap-1.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px] text-on-surface-variant/60" data-astro-cid-7zzsworf>star</span> Stars </span> <span class="font-mono font-bold text-on-surface" data-astro-cid-7zzsworf>0</span> </div> <div class="flex justify-between items-center text-sm" data-astro-cid-7zzsworf> <span class="text-on-surface-variant/70 flex items-center gap-1.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px] text-on-surface-variant/60" data-astro-cid-7zzsworf>call_split</span> Forks </span> <span class="font-mono font-bold text-on-surface" data-astro-cid-7zzsworf>0</span> </div> <div class="flex justify-between items-center text-sm" data-astro-cid-7zzsworf> <span class="text-on-surface-variant/70 flex items-center gap-1.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px] text-on-surface-variant/60" data-astro-cid-7zzsworf>navigation</span> Branch </span> <span class="font-mono bg-surface border border-border px-2 py-0.5 rounded text-[11px] text-on-surface-variant" data-astro-cid-7zzsworf>main</span> </div> <div class="flex justify-between items-start text-sm" data-astro-cid-7zzsworf> <span class="text-on-surface-variant/70 flex items-center gap-1.5 mt-0.5" data-astro-cid-7zzsworf> <span class="material-symbols-outlined text-[16px] text-on-surface-variant/60" data-astro-cid-7zzsworf>article</span> Path </span> <span class="font-mono bg-surface border border-border px-2 py-0.5 rounded text-[11px] text-on-surface-variant truncate max-w-[150px]" title="SKILL.md" data-astro-cid-7zzsworf>SKILL.md</span> </div> </div> </div> <!-- Occupations Tag Card --> <!-- Related Creators Card --> <div class="p-6 rounded-xl bg-surface-container border border-border/80 flex flex-col gap-3 shadow-sm" data-astro-cid-7zzsworf> <span class="text-xs font-bold uppercase tracking-widest text-on-surface-variant/60 font-sans" data-astro-cid-7zzsworf>More from Creator</span> <div class="flex items-center gap-2" data-astro-cid-7zzsworf> <img class="w-8 h-8 rounded-full border border-border" src="https://avatars.githubusercontent.com/u/1407900?u=13261468a49c6d313234cdbbdfd6ec9e981533ef&v=4" alt="mihaelamj" onerror="this.src='https://avatars.githubusercontent.com/u/9919?v=4'" data-astro-cid-7zzsworf> <div class="flex flex-col min-w-0" data-astro-cid-7zzsworf> <span class="font-bold text-sm truncate text-on-surface" data-astro-cid-7zzsworf>mihaelamj</span> <a href="/?creator=mihaelamj" class="text-xs text-primary hover:underline font-semibold transition-all" data-astro-cid-7zzsworf>Explore all skills →</a> </div> </div> </div> </div> </div> </div> </div> <script> const copyBtn = document.getElementById("detail-copy-btn"); const installCmd = document.getElementById("detail-install-cmd"); if (copyBtn && installCmd) { copyBtn.addEventListener("click", () => { const cmd = installCmd.textContent.trim(); navigator.clipboard.writeText(cmd).then(() => { const originalText = copyBtn.innerHTML; copyBtn.innerHTML = ` <span class="material-symbols-outlined text-[16px]">check</span> <span>Copied!</span> `; copyBtn.style.background = "#10b981"; copyBtn.style.borderColor = "#10b981"; setTimeout(() => { copyBtn.innerHTML = originalText; copyBtn.style.background = ""; copyBtn.style.borderColor = ""; }, 1500); }); }); } </script> </div> <!-- Footer --> <footer class="border-t border-border bg-surface-container-low text-on-surface-variant py-8 px-gutter mt-16 rounded-xl"> <div class="max-w-container-max mx-auto flex flex-col md:flex-row justify-between items-center gap-6"> <div class="flex items-center gap-2"> <div class="w-6 h-6 rounded bg-primary bg-opacity-20 flex items-center justify-center"> <span class="material-symbols-outlined text-primary text-sm">code_blocks</span> </div> <span class="font-bold text-on-surface text-sm">SkillMD</span> </div> <div class="flex flex-wrap justify-center gap-6 text-sm"> <a href="/about" class="hover:text-primary transition-colors">About Us</a> <a href="/contact" class="hover:text-primary transition-colors">Contact Us</a> <a href="/privacy" class="hover:text-primary transition-colors">Privacy Policy</a> <a href="/terms" class="hover:text-primary transition-colors">Terms of Service</a> <a href="/support" class="hover:text-primary transition-colors">Support</a> </div> <div class="text-xs text-on-surface-variant/80"> © 2026 SkillMD. All rights reserved. </div> </div> </footer> </main> <!-- Script for Theme Toggle, Mobile Menu, and Sidebar Filter Redirection --> <script> // Theme setup const savedTheme = localStorage.getItem("theme") || "dark"; function applyTheme(theme) { document.documentElement.classList.remove("dark", "green", "dracula", "nord"); if (theme === "dark") { document.documentElement.classList.add("dark"); } else if (theme === "green") { document.documentElement.classList.add("dark", "green"); } else if (theme === "dracula") { document.documentElement.classList.add("dark", "dracula"); } else if (theme === "nord") { document.documentElement.classList.add("dark", "nord"); } document.documentElement.setAttribute("data-theme", theme); const themeMoon = document.getElementById("theme-moon"); const themeSun = document.getElementById("theme-sun"); const themeLeaf = document.getElementById("theme-leaf"); const themeDracula = document.getElementById("theme-dracula"); const themeNord = document.getElementById("theme-nord"); if (themeMoon && themeSun && themeLeaf && themeDracula && themeNord) { themeMoon.style.display = theme === "dark" ? "inline" : "none"; themeSun.style.display = theme === "light" ? "inline" : "none"; themeLeaf.style.display = theme === "green" ? "inline" : "none"; themeDracula.style.display = theme === "dracula" ? "inline" : "none"; themeNord.style.display = theme === "nord" ? "inline" : "none"; } } applyTheme(savedTheme); const themeToggleBtn = document.getElementById("theme-toggle-btn"); if (themeToggleBtn) { themeToggleBtn.addEventListener("click", () => { const currentTheme = document.documentElement.getAttribute("data-theme") || "dark"; let newTheme = "dark"; if (currentTheme === "dark") { newTheme = "light"; } else if (currentTheme === "light") { newTheme = "green"; } else if (currentTheme === "green") { newTheme = "dracula"; } else if (currentTheme === "dracula") { newTheme = "nord"; } else { newTheme = "dark"; } applyTheme(newTheme); localStorage.setItem("theme", newTheme); }); } // Mobile menu toggle and sidebar logic const mobileMenuToggle = document.getElementById("mobile-menu-toggle"); const sidebarMenu = document.getElementById("sidebar-menu"); const sidebarOverlay = document.getElementById("sidebar-overlay"); function isMobile() { return window.innerWidth < 768; // 768px is the 'md' breakpoint in Tailwind } function openSidebar() { if (sidebarMenu) { sidebarMenu.classList.remove("-translate-x-full"); } if (sidebarOverlay) { sidebarOverlay.classList.remove("hidden"); } } function closeSidebar() { if (sidebarMenu && isMobile()) { sidebarMenu.classList.add("-translate-x-full"); } if (sidebarOverlay) { sidebarOverlay.classList.add("hidden"); } } if (mobileMenuToggle && sidebarMenu) { mobileMenuToggle.addEventListener("click", (e) => { e.stopPropagation(); if (isMobile()) { const isClosed = sidebarMenu.classList.contains("-translate-x-full"); if (isClosed) { openSidebar(); } else { closeSidebar(); } } }); document.addEventListener("click", (e) => { if (isMobile()) { if (!sidebarMenu.contains(e.target) && !mobileMenuToggle.contains(e.target)) { closeSidebar(); } } }); if (sidebarOverlay) { sidebarOverlay.addEventListener("click", () => { if (isMobile()) { closeSidebar(); } }); } // Collapse sidebar when clicking a filter button, creator button, or nav item inside it sidebarMenu.addEventListener("click", (e) => { if (isMobile()) { const clickTarget = e.target.closest("button, a"); if (clickTarget) { closeSidebar(); } } }); // Sync sidebar state on window resize window.addEventListener("resize", () => { if (!isMobile()) { // Desktop: sidebar should be visible, no overlay if (sidebarMenu) { sidebarMenu.classList.remove("-translate-x-full"); } if (sidebarOverlay) { sidebarOverlay.classList.add("hidden"); } } else { // Mobile: start collapsed if (sidebarMenu) { sidebarMenu.classList.add("-translate-x-full"); } if (sidebarOverlay) { sidebarOverlay.classList.add("hidden"); } } }); } // If not on homepage, redirect on sidebar filter click const isHomepage = window.location.pathname === "/"; document.querySelectorAll("#occupation-filters .filter-btn").forEach(btn => { btn.addEventListener("click", (e) => { const occ = e.currentTarget.getAttribute("data-occupation"); if (!isHomepage) { window.location.href = occ ? `/?occupation=${encodeURIComponent(occ)}` : "/"; } }); }); document.querySelectorAll("#creator-filters .creator-btn").forEach(btn => { btn.addEventListener("click", (e) => { const creator = e.currentTarget.getAttribute("data-creator"); if (!isHomepage) { window.location.href = `/?creator=${encodeURIComponent(creator)}`; } }); }); </script> </body> </html>