Building a Serverless Watchdog: Monitoring Framer 404s with Node.js and AWS Lambda

April 7, 2026Web101 by Han

Technical breakdown of a serverless link-checking system designed to solve the 'silent 404' problem in Framer CMS workflows using Node.js, Linkinator, and AWS EventBridge.

Building a Serverless Watchdog: Monitoring Framer 404s with Node.js and AWS Lambda

The Friction of Static-ish Frameworks

Framer offers incredible design velocity, but its abstraction layer can hide 'silent 404s'—links that break during CMS slug migrations or manual updates. Without a built-in health check, these dead ends hurt SEO and user trust. This article details the architecture of a custom serverless watchdog I built to automate this validation process.

System Architecture & Logic

The system is built on a serverless event-driven architecture. A Node.js runtime executes a recursive crawl of the target domain. The logic filters for internal links only, validates the HTTP status codes, and aggregates failures into a POST request sent to a Slack Incoming Webhook. By using AWS Lambda, the system runs in isolation without needing a dedicated server.

Technical Implementation: The Crawler

I utilized the 'linkinator' library for its high-performance asynchronous crawling capabilities. Unlike basic regex scrapers, it handles the DOM properly to find nested links. ```javascript const { LinkChecker } = require('linkinator'); const checker = new LinkChecker(); const results = await checker.check({ path: 'https://web101byhan.dev', recurse: true, concurrency: 5 }); ``` This setup ensures we don't overwhelm the Framer CDN while maintaining a fast execution time for the Lambda function.

System Constraints & Resource Management

During implementation, I hit a significant bottleneck: memory exhaustion. Crawling a site with 50+ pages and JS-heavy assets requires more than the default 128MB of Lambda RAM. I reconfigured the system to 512MB and increased the timeout to 120 seconds. This is a crucial trade-off between execution cost and system reliability.

Automated Alerting Logic

To avoid 'notification fatigue,' the script only triggers a Slack payload if the broken link array is non-empty. The payload is formatted using Slack's Block Kit to include the specific URL and the returned HTTP status code, allowing for immediate debugging directly from the mobile app.

Deployment via AWS EventBridge

The final piece is automation. Using AWS EventBridge (formerly CloudWatch Events), I scheduled the function to run via a cron expression: `cron(0 10 * * ? *)`. This ensures a full system health check is performed every morning at 10:00 AM UTC, providing a daily 'all-clear' or an actionable bug report.

Conclusion: Moving Toward Proactive Development

Shifting from reactive fixing to proactive monitoring is key to maintaining high-quality technical systems. By bridging a design-heavy tool like Framer with a custom backend script on AWS, we create a more resilient web presence that scales without manual oversight.

POSTED IN
Web DevelopmentServerlessNode.jsAWS LambdaAutomationDevOpsSystem Monitoring

Related stories

Curated reads to continue the thread.