Landing page
Maintain the aidemo marketing/landing page (docs/index.html, served by GitHub Pages at https://tandryukha.github.io/aidemo/) and its indexing plumbing (llms.txt, robots.txt, sitemap.xml). Use when the user says "update the landing page", "add a section to the site", "change the hero", "update positioning", "fix the site", or asks to reflect a new feature/integration on the page. Do NOT use for: the GitHub README (separate, hand-curated), the docs/internal/ planning docs, or recording demo videos (that's record-demo).From its SKILL.md
npx -y skills add tandryukha/aidemo --skill landing-pageAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 22 stars22 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
8.2 KB, as published. Nobody here has run it
landing-page
You maintain aidemo's public landing page. It is the project's pitch to humans AND its primary machine-readable source for LLM search (GEO). Every edit must serve both audiences.
Where things live
docs/index.html— the entire site: one self-contained file (inline CSS/JS).docs/llms.txt— curated map for LLM crawlers; MUST stay in sync with any positioning/feature claims changed on the page.docs/robots.txt— AI-crawler allowlist.docs/sitemap.xml— single URL.docs/hero-demo.mp4(1280×800 h264, copy of the release asset) +docs/hero-poster.jpg(poster frame, also the og:image).docs/icons/*.webp— card icons (176px, shown at 44px) + real customer logo marks;docs/favicon.png(64px, from the clapper icon). See "Icon system" below before adding one.docs/.nojekyll— keep; Pages servesdocs/verbatim frommain.docs/internal/is gitignored and private — never link to it from the page, and readdocs/internal/INDEXING_PLAN.mdfor strategy/decisions (domain-swap checklist lives there).
Deploy = push to main
Commit straight to main and push (no PRs in this repo). GitHub Pages
rebuilds in ~30–60 s. Always verify after pushing:
until curl -sL https://aidemo.top/ | grep -q "<distinctive new string>"; do sleep 6; done
(-L matters: tandryukha.github.io/aidemo now 301s to aidemo.top, so a bare
curl -s there greps a redirect stub and never matches.)
Run that check with Bash run_in_background: true, never a bare foreground sleep.
Hard rules (learned, do not relearn)
- Only claim what ships. No named future integrations or roadmap promises
on the page. (History: ElevenLabs was removed while planned, then claimed
once it shipped; the old "Codex/Gemini planned" exception is obsolete —
since v0.6.0 they work today via the built-in MCP server, as do the
ElevenLabs provider and the in-process local voice, and the page claims all
of them as shipped.) Describe extensibility via what's true in code
("swappable
VoiceProviderinterface"). - Positioning (approved): built for coding agents to autonomously record
product demos — landing-page hero videos, GitHub README walkthroughs,
what-shipped videos for customer release notes. Open-source alternative to
Screen Studio / Clueso / Demosmith. Keep this framing consistent across
hero sub, meta description, og:description, JSON-LD, and llms.txt.
Audience = developers (owner directive): write dev-to-dev — terminal-first
examples with real, runnable commands and real paths, no marketing fluff.
When showing an assistant/integration, show the actual command a developer
would type (if a genuinely unshipped integration ever needs showing, a
muted
# plannedcomment is the approved mechanism — currently none are). - Video, never GIF, for the hero. GIFs are 256-color mush (the old
560×350 GIF looked terrible upscaled). Use
<video autoplay muted loop playsinline preload="metadata" poster=...>with a same-origin MP4. Setwidth/heightattrs to the file's REAL dimensions (check withffprobe -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0 <file>) and keep CSSwidth:100%; height:auto; aspect-ratio: W / H— a mismatched height attribute stretches the frame. - Self-contained page. No CDN scripts, external fonts, or third-party
requests. Inline everything. Both color schemes must work
(
prefers-color-scheme+ the CSS variables at the top of the file). - FAQ and JSON-LD move together. Every visible FAQ
<details>has a matching entry in theFAQPageJSON-LD block, same wording. Question-shaped headings ("Can Claude Code record a demo video?") — LLM search lifts them verbatim. New claims also go intollms.txt. - Respect the motion system. Load stagger =
fade+d1..d5classes; scroll fade-in/out =revealclass picked up by the IntersectionObserver at the bottom of the file; everything is disabled underprefers-reduced-motion. New sections:class="reveal"on theh2and on each card/step/details. Don't add per-elementtransition-delaythat would lag hover states (.reveal.inresets it to 0s for this reason).
Design system (match, don't reinvent)
- CSS variables in
:root(+ light-mode override block):--bg, --panel, --border, --text, --muted, --accent(#d97757 coral),--accent-2(#b07aff violet),--shadow. - Building blocks already styled:
.term(terminal window w/ traffic-light bar),.cards/.card(grid + hover lift),.steps/.step(numbered gradient chips),.faq details,.pill,.btn primary|ghost,.halo(blurred accent glow behind the hero video). - Max content width 920px (
.wrap); wide content scrolls in its own container, the body never scrolls horizontally. - Section order: hero → How it works → Why it's built this way →
Made with aidemo (#examples) → Integrations → Quickstart → FAQ → footer.
New sections get a nav link (
hide-smclass hides it on mobile).
Icon system (no emojis)
Card icons, the nav brand mark, and the favicon are locally generated matte-clay badge tiles (own dark backdrop → theme-proof), NOT emojis and NOT transparent cutouts. Rendered with the dropshipping-irondust SDXL backend:
HF_HUB_DOWNLOAD_TIMEOUT=20 ~/.venvs/sdxl/bin/python \
~/dropshipping-irondust/scripts/blog/sdxl_backend.py --fast --jobs jobs.jsonl
- Job =
{"prompt", "negative", "out", "seed", "width":1024, "height":1024}; prompt is used verbatim. Locked style prompt: "3D icon of {subject}, minimalist matte clay style, soft rounded shapes, smooth studio product render, centered, floating on a plain dark charcoal background, coral orange and violet purple rim lighting, gentle top light, soft shadow, high detail, square composition" — matches--accent/--accent-2. Keep it for new icons or the set stops matching. Note:--fastruns guidance 1.0, so the negative prompt has little effect and CLIP truncates at 77 tokens — the positive prompt must carry the style. - Generate 2–3 seeds per subject, pick at ACTUAL size (44px and 24px composited
on
#161a20AND white) before shipping — subjects that come out crumbly or abstract get re-rolled, not shipped. Object subjects work; abstract marks don't. - Post-process: crop ~6% margins → 176×176 webp q85 (44px @4x) →
docs/icons/{name}.webp; wire as<img class="ic" ... width="44" height="44">above the cardh3(alt="" aria-hidden). Customer logo marks useclass="ic brand"(transparent, no tile). Favicon = 64px PNG of the clapper icon. - Raw seeds/jobs live in the session scratchpad only; committed output is the small webps. One GPU job at a time (Metal contention).
When swapping the hero video
gh release download <tag> --repo tandryukha/aidemo -p '<asset>.mp4' -O docs/hero-demo.mp4- Regenerate the poster:
ffmpeg -y -v error -ss <good-second> -i docs/hero-demo.mp4 -frames:v 1 -q:v 3 docs/hero-poster.jpg - Update the
aspect-ratio/width/heightattrs if dimensions changed. - Keep the "watch the narrated version" link pointing at the release asset URL (the page's video is muted).
When the custom domain lands
Follow the swap checklist in docs/internal/INDEXING_PLAN.md §4: Pages
custom-domain setting, find-replace the tandryukha.github.io/aidemo URLs in
index.html (canonical, og:url, og:image), robots.txt (Sitemap line),
sitemap.xml, package.json homepage, repo website field; then Search
Console + Bing Webmaster Tools verification and sitemap submission.