{
  "markdown": "# screenci\n\nYour UI changed. Your demo videos didn't. screenci fixes that.\n\nRecord product walkthroughs as code. When the UI ships, run\n`npx screenci export` and your videos regenerate. You keep the Playwright\nmental model, but the output is a maintainable product video instead of a\ntest report.\n\nLearn more at [screenci.com](https://screenci.com).\n\n## Get started\n\n```bash\nnpm init screenci@latest\n# or\npnpm create screenci\n```\n\nThis scaffolds a self-contained `screenci/` directory with its own\ndependencies and installs Chromium. The directory is isolated from the\nsurrounding workspace, which keeps installation reliable inside monorepos.\n\nThen write a video, run it locally, refine it, and export the final output:\n\n```bash\nnpx screenci test      # author the video\nnpx screenci preview   # record live previews and print the link\nnpx screenci export    # render and download the finished video\n```\n\nFull docs:\n\n- [Getting started](https://screenci.com/docs)\n- [Writing scripts](https://screenci.com/docs/video-script-basics)\n- [CLI reference](https://screenci.com/docs/reference/cli)\n\n## Write a video\n\nVideo scripts are Playwright-style files with a `.screenci.ts` extension. If you\nalready know Playwright locators, navigation, and waiting, you already know\nmost of the automation layer.\n\n```ts\n// recordings/onboarding.screenci.ts\nimport { hide, speed, time, video } from 'screenci'\n\nvideo('Onboarding flow', async ({ page }) => {\n  await hide(async () => {\n    await page.goto('https://app.example.com/signup')\n  })\n\n  await page.getByLabel('Email').fill('jane@example.com')\n  await page.getByRole('button', { name: 'Create account' }).click()\n  await speed(0.5, async () => {\n    await page.getByRole('button', { name: 'Open dashboard tour' }).click()\n  })\n  await time(1000, async () => {\n    await page.getByRole('button', { name: 'Skip tutorial' }).click()\n  })\n  await page.getByRole('heading', { name: 'Dashboard' }).waitFor()\n})\n```\n\nEach `video()` call becomes one output video. The title becomes the filename\nand the remote video identity. Inside `video()`, `page` is a `ScreenCIPage`: a\nPlaywright `Page` with animated cursor movement and visible typing layered on\ntop of normal Playwright behavior.\n\n`hide()` removes setup entirely. `speed()` and `time()` keep a section visible\nbut remap its rendered duration.\n\n## Authoring helpers\n\n| Export            | What it does                                                 |\n| ----------------- | ------------------------------------------------------------ |\n| `defineConfig`    | Wraps Playwright config with ScreenCI defaults               |\n| `video`           | Declares a video recording test                              |\n| `video.narration` | Declares narration cues (per language or shared) for a video |\n| `hide`            | Cuts setup or cleanup out of the visible recording           |\n| `autoZoom`        | Smooth camera follow for an interaction block                |\n| `zoomTo`          | Manual camera framing for a locator or point                 |\n| `resetZoom`       | Returns from manual framing to the full viewport             |\n| `createOverlays`  | Inserts timed media overlays into the recording timeline     |\n| `voices`          | Available voice constants such as `voices.Ava`               |\n| `modelTypes`      | Narration model constants                                    |\n\nSee the [docs](https://screenci.com/docs) for configuration, narration,\ncamera, and CI setup.\n\n## Community\n\nQuestions, ideas, or want to show off your videos? Join us on\n[Discord](https://discord.gg/DyjSRFzeBc).\n",
  "bytes": 3591,
  "sha": "472e3581ee41a63b47c9727ddc46f6f13c92db71c030ceb2088abacae3fdcfd1",
  "repo_slug": "screenci/screenci",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/skl_screenci_screenci_screenci_569006de/readme"
}