Skip to content
Back to skills

Landing Page

ASecurity

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 vid...

  • 9 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 22, 2026
ai-agentspythongobashgitbackend

Works with

  • claude code
  • terminal
  • cli
  • mcp

Security analysis

A96/100
  • mediumUses curl or wget to download content

Pro shows the line behind each finding and how to fix it

Scanned September 22, 2026

npx -y skills add tandryukha/aidemo --skill landing-page --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Landing Page?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Landing Page
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/tandryukha-landing-page/badge)](https://www.skillsdirectory.com/skills/tandryukha-landing-page)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: landing-page
description: >
  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).
allowed-tools: Bash, Read, Write, Edit, Glob, Grep
metadata:
  internal: true
---

# 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 serves `docs/` verbatim from `main`.
- `docs/internal/` is **gitignored and private** — never link to it from the
  page, and read `docs/internal/INDEXING_PLAN.md` for 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:

```bash
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)

1. **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 `VoiceProvider` interface").
2. **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 `# planned` comment is the approved mechanism — currently none are).
3. **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. Set
   `width`/`height` attrs to the file's REAL dimensions (check with
   `ffprobe -v error -select_streams v:0 -show_entries stream=width,height
   -of csv=p=0 <file>`) and keep CSS `width:100%; height:auto;
   aspect-ratio: W / H` — a mismatched height attribute stretches the frame.
4. **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).
5. **FAQ and JSON-LD move together.** Every visible FAQ `<details>` has a
   matching entry in the `FAQPage` JSON-LD block, same wording. Question-shaped
   headings ("Can Claude Code record a demo video?") — LLM search lifts them
   verbatim. New claims also go into `llms.txt`.
6. **Respect the motion system.** Load stagger = `fade` + `d1..d5` classes;
   scroll fade-in/out = `reveal` class picked up by the IntersectionObserver
   at the bottom of the file; everything is disabled under
   `prefers-reduced-motion`. New sections: `class="reveal"` on the `h2` and on
   each card/step/details. Don't add per-element `transition-delay` that would
   lag hover states (`.reveal.in` resets 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-sm` class 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:

```bash
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: `--fast` runs 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 `#161a20` AND 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 card `h3` (alt="" aria-hidden). Customer logo marks
  use `class="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

1. `gh release download <tag> --repo tandryukha/aidemo -p '<asset>.mp4' -O docs/hero-demo.mp4`
2. 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`
3. Update the `aspect-ratio` / `width`/`height` attrs if dimensions changed.
4. 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.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.