patx/afterdarklabs
Add advertising assets and update Google footer label
Commit 5aedeb5 · patx · 2026-09-21T20:47:09-04:00
Comments
No comments yet.
Diff
diff --git a/ads/ad1.png b/ads/ad1.png
new file mode 100644
index 0000000..8c13ce4
Binary files /dev/null and b/ads/ad1.png differ
diff --git a/ads/ad10.png b/ads/ad10.png
new file mode 100644
index 0000000..00d486e
Binary files /dev/null and b/ads/ad10.png differ
diff --git a/ads/ad11.png b/ads/ad11.png
new file mode 100644
index 0000000..d7c4d5c
Binary files /dev/null and b/ads/ad11.png differ
diff --git a/ads/ad12.png b/ads/ad12.png
new file mode 100644
index 0000000..4eb3be2
Binary files /dev/null and b/ads/ad12.png differ
diff --git a/ads/ad13.png b/ads/ad13.png
new file mode 100644
index 0000000..01f88df
Binary files /dev/null and b/ads/ad13.png differ
diff --git a/ads/ad15.png b/ads/ad15.png
new file mode 100644
index 0000000..b4bd92b
Binary files /dev/null and b/ads/ad15.png differ
diff --git a/ads/ad16.png b/ads/ad16.png
new file mode 100644
index 0000000..17fa917
Binary files /dev/null and b/ads/ad16.png differ
diff --git a/ads/ad17.png b/ads/ad17.png
new file mode 100644
index 0000000..30cad65
Binary files /dev/null and b/ads/ad17.png differ
diff --git a/ads/ad18.png b/ads/ad18.png
new file mode 100644
index 0000000..ca19230
Binary files /dev/null and b/ads/ad18.png differ
diff --git a/ads/ad19.png b/ads/ad19.png
new file mode 100644
index 0000000..51d238b
Binary files /dev/null and b/ads/ad19.png differ
diff --git a/ads/ad2.png b/ads/ad2.png
new file mode 100644
index 0000000..87598e1
Binary files /dev/null and b/ads/ad2.png differ
diff --git a/ads/ad20.png b/ads/ad20.png
new file mode 100644
index 0000000..3f838e8
Binary files /dev/null and b/ads/ad20.png differ
diff --git a/ads/ad21.png b/ads/ad21.png
new file mode 100644
index 0000000..dd25447
Binary files /dev/null and b/ads/ad21.png differ
diff --git a/ads/ad23.png b/ads/ad23.png
new file mode 100644
index 0000000..08ccaf3
Binary files /dev/null and b/ads/ad23.png differ
diff --git a/ads/ad24.png b/ads/ad24.png
new file mode 100644
index 0000000..0c529d7
Binary files /dev/null and b/ads/ad24.png differ
diff --git a/ads/ad25.png b/ads/ad25.png
new file mode 100644
index 0000000..ec3a873
Binary files /dev/null and b/ads/ad25.png differ
diff --git a/ads/ad26.png b/ads/ad26.png
new file mode 100644
index 0000000..556d2e2
Binary files /dev/null and b/ads/ad26.png differ
diff --git a/ads/ad27.png b/ads/ad27.png
new file mode 100644
index 0000000..81d6255
Binary files /dev/null and b/ads/ad27.png differ
diff --git a/ads/ad28.png b/ads/ad28.png
new file mode 100644
index 0000000..7516870
Binary files /dev/null and b/ads/ad28.png differ
diff --git a/ads/ad29.png b/ads/ad29.png
new file mode 100644
index 0000000..c41daac
Binary files /dev/null and b/ads/ad29.png differ
diff --git a/ads/ad3.png b/ads/ad3.png
new file mode 100644
index 0000000..47f760c
Binary files /dev/null and b/ads/ad3.png differ
diff --git a/ads/ad31.png b/ads/ad31.png
new file mode 100644
index 0000000..f68c1e0
Binary files /dev/null and b/ads/ad31.png differ
diff --git a/ads/ad32.png b/ads/ad32.png
new file mode 100644
index 0000000..63fe20a
Binary files /dev/null and b/ads/ad32.png differ
diff --git a/ads/ad34.png b/ads/ad34.png
new file mode 100644
index 0000000..ae5bb27
Binary files /dev/null and b/ads/ad34.png differ
diff --git a/ads/ad35.png b/ads/ad35.png
new file mode 100644
index 0000000..df2af14
Binary files /dev/null and b/ads/ad35.png differ
diff --git a/ads/ad4.png b/ads/ad4.png
new file mode 100644
index 0000000..777066c
Binary files /dev/null and b/ads/ad4.png differ
diff --git a/ads/ad5.png b/ads/ad5.png
new file mode 100644
index 0000000..e69c174
Binary files /dev/null and b/ads/ad5.png differ
diff --git a/ads/ad6.png b/ads/ad6.png
new file mode 100644
index 0000000..50c706f
Binary files /dev/null and b/ads/ad6.png differ
diff --git a/ads/ad7.png b/ads/ad7.png
new file mode 100644
index 0000000..d4fd206
Binary files /dev/null and b/ads/ad7.png differ
diff --git a/ads/ad9.png b/ads/ad9.png
new file mode 100644
index 0000000..71594cf
Binary files /dev/null and b/ads/ad9.png differ
diff --git a/ads/assets/ad1.html b/ads/assets/ad1.html
new file mode 100644
index 0000000..9b0dae0
--- /dev/null
+++ b/ads/assets/ad1.html
@@ -0,0 +1,60 @@
+<!doctype html>
+<html lang="en">
+
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<title>After Dark Labs | Custom websites & apps</title>
+<link rel="preconnect" href="https://fonts.googleapis.com">
+<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+<link href="https://fonts.googleapis.com/css2?family=Ubuntu:wght@400;700&display=swap" rel="stylesheet">
+<style>
+html {
+ background: #000;
+}
+
+body {
+ position: relative;
+ display: grid;
+ place-items: center;
+ width: 100%;
+ max-width: 1000px;
+ aspect-ratio: 1;
+ margin: 0 auto;
+ padding: clamp(1rem, 5vw, 3rem);
+ box-sizing: border-box;
+ overflow: hidden;
+ background: #000;
+ color: #fff;
+ font-family: "Ubuntu", sans-serif;
+}
+
+p {
+ max-width: 400px;
+ margin: 0;
+ font-size: clamp(2.5rem, 6vw, 4rem);
+ line-height: 1.15;
+ text-align: left;
+}
+
+h1 {
+ position: absolute;
+ right: clamp(1rem, 5vw, 3rem);
+ bottom: clamp(1rem, 5vw, 3rem);
+ margin: 0;
+ font-size: clamp(1.25rem, 3vw, 2.5rem);
+ line-height: 1;
+ text-align: right;
+}
+</style>
+</head>
+
+<body>
+
+<h1>AfterDarkLabs.io</h1>
+
+<p>Get a custom website built around your business and operating procedures.</p>
+
+</body>
+
+</html>
diff --git a/ads/assets/ads.txt b/ads/assets/ads.txt
new file mode 100644
index 0000000..25d9c62
--- /dev/null
+++ b/ads/assets/ads.txt
@@ -0,0 +1,35 @@
+Need a website? We’ll build it for you.
+Need a better website? We can build it.
+Need a new website? Let’s build it.
+We build websites for businesses like yours.
+Need a website that actually works? We can help.
+You run the business. We’ll build the website.
+Have a business? Let’s build you a website.
+Your business deserves a better website.
+We make websites for real businesses.
+Need a website? Get one built right.
+We build websites. You run your business.
+Ready for a better website?
+Need a website built? Talk to us.
+Custom websites without the hassle.
+No website? We can fix that.
+Out-dated website? We can fix that.
+Custom websites built around how your business actually works.
+Your business isn’t a template. Your website shouldn’t be either.
+Websites built around your business, not the other way around.
+Custom websites designed for the way you do business.
+A website made for your business—not someone else’s template.
+Custom websites for businesses that need more than a template.
+We build websites & apps that fit the way your business works.
+Your workflow. Your customers. Your website. Built around all three.
+Turn the way you do business into a better website.
+A better website starts with understanding how your business works.
+Custom-built websites that work the way your business does.
+Websites designed around what your business actually needs.
+Built for your customers. Built around your business.
+More than a website. A system built around your business.
+Websites that do more than look good.
+Stop forcing your business into someone else’s template.
+Your website should work as hard as your business does.
+Custom websites. No templates. No compromises.
+Built from scratch for the way you work.
\ No newline at end of file
diff --git a/ads/assets/generate_ads.mjs b/ads/assets/generate_ads.mjs
new file mode 100644
index 0000000..726515c
--- /dev/null
+++ b/ads/assets/generate_ads.mjs
@@ -0,0 +1,162 @@
+import { spawnSync } from "node:child_process";
+import { readFileSync, writeFileSync } from "node:fs";
+import { resolve } from "node:path";
+import { pathToFileURL } from "node:url";
+
+const projectDir = process.cwd();
+const chrome = process.env.CHROME_BIN || "/usr/bin/google-chrome";
+const messages = readFileSync(resolve(projectDir, "ads.txt"), "utf8")
+ .split(/\r?\n/)
+ .map((line) => line.trim())
+ .filter(Boolean);
+
+if (messages.length !== 35) {
+ throw new Error(`Expected 35 messages in ads.txt, found ${messages.length}.`);
+}
+
+const escapeHtml = (value) => value
+ .replaceAll("&", "&")
+ .replaceAll("<", "<")
+ .replaceAll(">", ">")
+ .replaceAll('"', """)
+ .replaceAll("'", "'");
+
+function formatCopy(message) {
+ const separator = message.indexOf("? ");
+
+ if (separator === -1) {
+ return { className: "copy", html: escapeHtml(message) };
+ }
+
+ const question = message.slice(0, separator + 1);
+ const answer = message.slice(separator + 2);
+
+ // Short Q&A concepts read as two distinct beats. Longer questions retain
+ // natural wrapping so the type never has to become smaller than the brand.
+ if (Math.max(question.length, answer.length) > 26) {
+ return { className: "copy", html: escapeHtml(message) };
+ }
+
+ return {
+ className: "copy qa",
+ html: `<span>${escapeHtml(question)}</span><span>${escapeHtml(answer)}</span>`,
+ };
+}
+
+function buildHtml(message, number) {
+ const copy = formatCopy(message);
+
+ return `<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<title>After Dark Labs Ad ${number}</title>
+<link rel="preconnect" href="https://fonts.googleapis.com">
+<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
+<link href="https://fonts.googleapis.com/css2?family=Ubuntu:wght@400;700&display=swap" rel="stylesheet">
+<style>
+html {
+ background: #000;
+}
+
+body {
+ position: relative;
+ width: 100%;
+ max-width: 1000px;
+ aspect-ratio: 1;
+ margin: 0 auto;
+ padding: 36px;
+ box-sizing: border-box;
+ overflow: hidden;
+ background: #000;
+ color: #fff;
+ font-family: "Ubuntu", sans-serif;
+}
+
+.copy {
+ max-width: 400px;
+ margin: 0;
+ font-size: 64px;
+ font-weight: 400;
+ line-height: 1.15;
+ text-align: left;
+}
+
+.copy.qa {
+ max-width: calc(100% - 72px);
+}
+
+.copy.qa span {
+ display: block;
+ white-space: nowrap;
+}
+
+.brand {
+ position: absolute;
+ right: 40px;
+ bottom: 18px;
+ margin: 0;
+ font-size: 40px;
+ font-weight: 700;
+ line-height: 1;
+ text-align: right;
+}
+</style>
+</head>
+<body>
+<h1 class="brand">AfterDarkLabs.io</h1>
+<p class="${copy.className}">${copy.html}</p>
+<script>
+const copy = document.querySelector(".copy");
+let fontSize = 64;
+
+function copyFits() {
+ if (copy.classList.contains("qa")) {
+ const availableWidth = document.body.clientWidth - 72;
+ return [...copy.children].every((line) => line.scrollWidth <= availableWidth);
+ }
+
+ return copy.getBoundingClientRect().bottom <= 625;
+}
+
+function fitCopy() {
+ while (!copyFits() && fontSize > 44) {
+ fontSize -= 1;
+ copy.style.fontSize = fontSize + "px";
+ }
+}
+
+fitCopy();
+document.fonts.ready.then(fitCopy);
+</script>
+</body>
+</html>
+`;
+}
+
+for (const [index, message] of messages.entries()) {
+ const number = index + 2;
+ const htmlPath = resolve(projectDir, `ad${number}.html`);
+ const pngPath = resolve(projectDir, `ad${number}.png`);
+
+ writeFileSync(htmlPath, buildHtml(message, number));
+
+ const result = spawnSync(chrome, [
+ "--headless=new",
+ "--disable-gpu",
+ "--hide-scrollbars",
+ "--force-device-scale-factor=1",
+ "--run-all-compositor-stages-before-draw",
+ "--virtual-time-budget=1000",
+ `--screenshot=${pngPath}`,
+ "--window-size=723,754",
+ pathToFileURL(htmlPath).href,
+ ], { encoding: "utf8" });
+
+ if (result.status !== 0) {
+ throw new Error(`Chrome failed while rendering ad${number}.png:\n${result.stderr}`);
+ }
+
+ process.stdout.write(`Created ad${number}.html and ad${number}.png\n`);
+}
diff --git a/ads/next.txt b/ads/next.txt
new file mode 100644
index 0000000..1bc60ff
--- /dev/null
+++ b/ads/next.txt
@@ -0,0 +1,39 @@
+• I can help you get the setup ready, but Meta requires you to personally sign in, accept its terms, choose the business identity, and add a payment method. I’m using the plugin-management guidance again to
+ confirm the account-access boundary, then I’ll verify Meta’s current official setup flow and give you the shortest safe path.
+
+• Explored
+ └ Read SKILL.md (plugin-management:plugin-management skill)
+
+• Searching the web
+
+• Searched the web for site:facebook.com/business/help create Meta Business Portfolio ad account Facebook Page official ...
+
+• Searching the web
+
+• Searched the web for site:facebook.com/help "Create a Facebook Page" ...
+
+────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
+
+• I can’t create the accounts directly because this workspace has no Meta connection or browser-control access. Meta also requires you to personally authenticate, accept its terms, and enter payment details.
+
+ Use these suggested values:
+
+ - Page: After Dark Labs
+ - Category: Web Designer
+ - Bio: Custom websites and apps built around how your business actually works.
+ - Website: https://AfterDarkLabs.io
+ - Ad account: After Dark Labs Ads
+ - Time zone: America/New_York
+ - Currency: USD
+
+ First, sign in and create the Facebook Page. Then open Meta Business Suite to create the business/ad account. Meta confirms that Page access is what permits ad management in its Page access documentation.
+
+ Don’t send me your password or payment-card information. Once you’ve completed the Page and ad-account setup, send me a screenshot of Ads Manager and I’ll guide the campaign configuration.
+
+─ Worked for 5m 49s ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
+
+─ Conversation recap ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
+
+ Objective: create a Meta ads account despite having no Facebook Page; “After Dark Labs” was suggested as the Page name. Nothing was created because Meta access is unavailable here; you must create the Page,
+ authenticate, accept terms, and add payment details.
+Token usage: total=119,322 input=97,367 (+ 1,927,680 cached) output=21,955 (reasoning 14,761)
diff --git a/docs/index.html b/docs/index.html
index 9200cd9..99dfcd0 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -182,7 +182,7 @@
</main>
<footer>
- <p class="footer"><a href="https://share.google/ZQj8plqi7MWZ8bfwU" target="_blank" rel="noopener noreferrer">More on Google</a></p>
+ <p class="footer"><a href="https://share.google/ZQj8plqi7MWZ8bfwU" target="_blank" rel="noopener noreferrer">★★★★★ Google</a></p>
</footer>
<script>(()=>{const e=document.querySelector("#work-scroller"),t=window.matchMedia("(max-width: 767px)");if(!e)return;const c=[...e.querySelectorAll(":scope > article")],s=()=>c.forEach(e=>e.classList.remove("is-active"));e.addEventListener("click",c=>{if(!t.matches||c.target.closest(".portfolio-live-link"))return;const r=c.target.closest("article");if(!r||r.parentElement!==e)return;const i=r.classList.contains("is-active");s(),i||r.classList.add("is-active")}),document.addEventListener("click",e=>{t.matches&&!e.target.closest("#work-scroller > article")&&s()}),t.addEventListener?.("change",s)})();</script>