v0.2 · node ≥ 20 · mit
A local CLI for clean, retina-quality screenshots of Framer sites. Disables animations, hides sticky bars, primes lazy content, then captures full-page at 2×.
git clone https://github.com/granqvistsanna-web/frameshot.git
cd frameshot
npm install
Paste a Framer URL, hit capture. Good for one-offs.
node index.js # opens UI on :5173
node index.js serve -p 8080 # custom port, no auto-open
Repeatable, scriptable. Output paths are printed one per line to stdout, so you can grep or pipe.
node index.js capture config.yaml
node index.js capture config.yaml --smoke
name: my-site
baseUrl: https://example.framer.website
output: ./screenshots/{date}/{viewport}/{page}.png
deviceScaleFactor: 2
viewport:
width: 1440
height: 900
name: desktop
page:
path: /
name: home
prepare:
animations: true # framer-friendly
scrollPrime: true # load lazy content
extraDelay: 500
hide:
- 'nav.sticky'
- '#consent-banner'
Template placeholders: {date}, {viewport}, {page}, {time}.
Use plural viewports: — each name must be unique so {viewport} can’t collide:
viewports:
- { name: desktop, width: 1440, height: 900 }
- { name: mobile, width: 375, height: 667 }
viewport: (singular) and viewports: (plural) are mutually exclusive.
node index.js capture samples/deltaventure.yaml
# → ./screenshots/<today>/desktop/home.png (~12 MB retina)
Other fixtures in samples/: sample.yaml (annotated), smoke.yaml, smoke-multi.yaml. The smoke fixtures pair with node samples/serve-smoke.js &.
baseUrl must use http or https — strip javascript:/file:/data: schemes.page.path must start with / — write /, not home.viewports: duplicate name '<x>' — viewport names must be unique.