Daily
Catch visual changes on your key pages every day
Each page in your sheet is compared with how it looked before, and real visual changes become Linear issues for your team.
- Runs
- Daily
- Apps
- Google Sheets, Linear
- AI
- Yes, uses the built-in AI allowance
- Access
- Sheets read; Linear write
Send this to your assistant
Create a ClickRuntime automation: every day, take a screenshot of each URL in my Pages sheet, compare it with the last approved screenshot using AI, and create a Linear issue when something has visibly changed.
First time? Adding ClickRuntime to your assistant takes about two minutes.
Why use it
Why teams use this automation
A web team ships several times a week. Automated tests check that pages load and buttons work, but nobody notices when a CSS change pushes the pricing table under the footer or a banner covers the signup button on the landing page. These problems tend to be found by customers or by the marketing team days later, after traffic has already been lost.
This automation looks at each important page once a day, compares it with the last known good version and opens a Linear issue only when something has visibly changed in a way worth checking. Your team gets a short, reviewable list instead of a manual click-through of every page.
What you get out of it
Layout breaks are found the next morning
A broken page is reported within a day of the change that caused it. That makes the cause easy to find, because only a few deploys need checking.
Only meaningful changes become issues
AI compares the two screenshots and ignores small differences such as a rotating testimonial or a new date. Your backlog is not filled with noise from pages that change on purpose.
The page list lives in a sheet
Marketing, design and engineering can all add pages they care about without touching code. A new campaign page is covered as soon as its row is added.
Issues arrive where the work happens
Each finding becomes a Linear issue with the page and a description of what changed. It can be assigned, prioritised and closed like any other bug.
How it works
What happens, step by step
Every day, ClickRuntime reads the list of pages from your Google Sheet.
A fresh screenshot of each page is taken and set next to the last approved one.
AI compares the two images and decides whether anything has visibly changed in a way that matters.
For each real change, an issue is created in Linear with the page address and a short description of the difference.
Pages that already have an open issue are not reported again until it is closed.
Before it runs live
- Connect your Google Sheets account and pick the spreadsheets it may use
- Connect Linear
What you get
Build your own
Need it to work differently?
Your own rules
Conditions, thresholds, filters and exceptions, written the way you'd explain them to a colleague.
Any number of apps
One automation can read from one app and update several others. Over 248 apps are ready, and anything with an API works too.
AI where it helps
Summaries, classification, extraction and drafts use ClickRuntime's built-in AI, with no extra key.
On a schedule or on each event
Runs as often as every 5 minutes, or the moment an app sends an event, and keeps track of what it already handled.
Changes you can ask for
- Run it at a different time, more or less often, or only on weekdays
- Change what the AI looks for, or how it writes the result
- Add another app, for example also send it to Slack
- Combine it with other Google Sheets and Linear steps into one automation
Under the hood
The code that runs this automation
from google.oauth2.credentials import Credentials
from googleapiclient.discovery import build
from clickruntime import on_trigger, credentials, http, ai, state, log
SHEET_ID = "your-spreadsheet-id"
LINEAR_TEAM_ID = "your-team-id"
SHOT_API = "https://api.screenshot-service.example/v1/compare"
@on_trigger
def run(event):
sheets = build("sheets", "v4", credentials=Credentials(credentials.connection("google", "work")), cache_discovery=False)
urls = [r[0] for r in sheets.spreadsheets().values().get(spreadsheetId=SHEET_ID, range="Pages!A2:A")
.execute().get("values", []) if r]
open_issues = state.get("open") or {}
created = 0
for url in urls:
if url in open_issues:
continue
diff = http.post(SHOT_API, json={"url": url}, headers={"Authorization": credentials.secret("SCREENSHOT_API_KEY")}).json()
try:
verdict = ai.generate(f"Visual differences found on {url}:\n{diff.get('summary', '')[:1500]}\n"
"Ignore dates, counters and rotating images. Reply 'none' or one sentence on what broke.",
max_output_tokens=80).text.strip()
except ai.AIError as e:
log.warning("AI unavailable", {"code": e.code})
break
if verdict.lower().startswith("none"):
continue
http.post("https://api.linear.app/graphql", headers={"Authorization": credentials.secret("LINEAR_API_KEY")},
json={"query": "mutation($i:IssueCreateInput!){issueCreate(input:$i){success}}",
"variables": {"i": {"teamId": LINEAR_TEAM_ID, "title": f"Visual change on {url}", "description": verdict}}})
open_issues[url] = True
created += 1
state.set("open", open_issues)
return {"checked": len(urls), "issues": created}FAQ
Common questions
Where do the screenshots come from?
How do I accept an intended change as the new baseline?
Will dynamic content cause false alerts?
What permissions does it need?
Does it need AI?
How many runs does it use?
Can I change how it works?
Related
You might also like
Get a Linear issue before an SSL certificate expires
Each morning the domains in your sheet are checked, and any certificate expiring within 30 days gets one Linear issue and a Slack message.
See how it worksScore your product sheet for missing data every week
Every Monday you get an email scorecard of how complete your product sheet is, and a Linear issue for each product with gaps.
See how it worksGet a daily news digest in Slack
Each morning your team gets a short summary of what's new on the sites and blogs you follow.
See how it worksKeep exploring
Set up “Catch visual changes on your key pages every day” from your assistant
Copy the prompt above, or connect your assistant first. Free plan, no credit card.