SMF Works — AI Solutions for Small Business
← Back to all skills
Freewebsite-checker

Website Checker

Monitor website health and performance metrics. Check if sites are online and responding, verify SSL certificate validity and expiration dates, measure response times, and detect common configuration issues that affect accessibility.

Key Features

  • HTTP status code checking
  • SSL certificate validation
  • Response time measurement
  • DNS resolution checking
  • Redirect chain analysis

Common Use Cases

  • Verify your website is online
  • Check SSL certificate expiration dates
  • Monitor competitor site uptime
  • Debug website accessibility issues

Custom Workflow Integration

This skill can be customized for your specific workflow as part of an SMF Works services engagement. Whether you need custom automation rules, integrations with your existing tools, or specialized configurations for your team, we can tailor this skill to fit your exact requirements.

Explore Services

Installation

# Install the skill (via TUI or CLI)

smfw install website-checker

# Get help

smfw run website-checker --help

💡 Tip: Install via the OpenClaw TUI skill manager for an interactive experience, or use the CLI command above.

Setup Guide

Website Checker — Setup Guide

Estimated setup time: 5 minutes
Difficulty: Easy
Tier: Free — no subscription, no API keys required


What You'll Need

RequirementDetailsCost
Python 3.8+Built into macOS 12+, available on LinuxFree
pipPython package managerFree
requestsPython HTTP libraryFree
smfworks-skills repositoryCloned via gitFree
Internet connectionRequired for checking URLs

Step 1 — Verify Python

python3 --version

Expected: Python 3.9.x or newer.


Step 2 — Get the Repository

git clone https://github.com/smfworks/smfworks-skills ~/smfworks-skills

Step 3 — Install the requests Package

pip install requests

Expected output:

Collecting requests
  Downloading requests-2.31.0-py3-none-any.whl (62 kB)
Installing collected packages: requests
Successfully installed requests-2.31.0

Step 4 — Navigate to the Skill

cd ~/smfworks-skills/skills/website-checker

Step 5 — Verify the Skill

python3 main.py

Expected:

Usage: python main.py <command> [options]

Commands:
  check <url> [--timeout N]            - Check single URL
  ssl <domain> [port]                  - Check SSL certificate
  bulk <url1> <url2> ...               - Check multiple URLs

Verify Your Setup

Run a real check on a known-good site:

python3 main.py check https://google.com

Expected:

✅ https://google.com
   Status: 200
   Response time: 187.42ms

If you see a status code and response time, setup is complete.


Configuration Options

No configuration file or environment variables needed. All options are passed as command arguments.

Security notes: The skill blocks requests to localhost, private IP ranges (192.168.x.x, 10.x.x.x), and non-HTTP schemes. This is intentional SSRF protection and cannot be disabled.


Troubleshooting

requests not installed — Run pip install requests.

pip: command not found — Try pip3 install requests or python3 -m pip install requests.

Connection refused on first test — Check your internet connection. The skill requires internet access to check URLs.


Next Steps

Setup complete. See HOWTO.md for:

  • How to check a single site
  • How to verify SSL certificates
  • How to monitor a list of sites
  • How to schedule automatic checks with cron
cat HOWTO.md

How-To Guide

Website Checker — How-To Guide

Prerequisites: Setup complete (see SETUP.md). requests installed. Internet connection active.


Table of Contents

  1. How to Check if a Website is Up
  2. How to Check an SSL Certificate
  3. How to Monitor Multiple Sites at Once
  4. How to Check a Slow or Unreliable Site
  5. How to Verify a Redirect is Working
  6. Automating with Cron
  7. Combining with Other Skills
  8. Troubleshooting Common Issues
  9. Tips & Best Practices

1. How to Check if a Website is Up

What this does: Makes an HTTP GET request to the URL and reports the response status and time.

When to use it: After a deployment, when a user reports your site is down, or as a quick sanity check.

Steps

Step 1 — Navigate to the skill directory.

cd ~/smfworks-skills/skills/website-checker

Step 2 — Run the check command.

python3 main.py check https://yourwebsite.com

Output (site is up):

✅ https://yourwebsite.com
   Status: 200
   Response time: 243.17ms

Output (site is down):

❌ Failed to check https://yourwebsite.com
   Error: Request failed: ConnectionError: HTTPSConnectionPool(host='yourwebsite.com', port=443): Max retries exceeded

Step 3 — Interpret the status code.

Status CodeMeaning
200Site is up and working normally
301/302Redirect — the skill follows it and shows the final URL
403Forbidden — site is up but this URL requires authentication
404Page not found — site is up but the URL is wrong
500–503Server error — site is up but something is broken on it

Result: You know definitively whether the site is reachable and what it returned.


2. How to Check an SSL Certificate

What this does: Connects to a domain over SSL and reports the certificate's issuer, expiration date, days remaining, and TLS version.

When to use it: Before your certificate expires (Let's Encrypt certificates expire every 90 days). Or when users report browser security warnings.

Steps

Step 1 — Navigate to the skill directory.

cd ~/smfworks-skills/skills/website-checker

Step 2 — Run the ssl command.

Important: Pass only the domain name, not the full URL.

python3 main.py ssl yourwebsite.com

Output (certificate is healthy):

✅ SSL Certificate: yourwebsite.com
   Issuer: ((('organizationName', "Let's Encrypt"),),)
   Expires: Jun 14 12:00:00 2024 GMT
   Days until expiry: 91
   TLS Version: TLSv1.3

Output (expiring in 10 days — warning):

⚠️ SSL Certificate: yourwebsite.com
   Issuer: ((('organizationName', "Let's Encrypt"),),)
   Expires: Mar 25 12:00:00 2024 GMT
   Days until expiry: 10
   TLS Version: TLSv1.3

Step 3 — Act on the result.

  • 91+ days: No action needed
  • 10–29 days: Schedule renewal this week
  • Under 7 days: Renew immediately — browsers will show security warnings when it expires

Step 4 — For non-standard ports (e.g., internal services):

python3 main.py ssl internal-service.example.com 8443

Result: You have the certificate status and exact expiry date — no need to dig through hosting dashboards.


3. How to Monitor Multiple Sites at Once

What this does: Checks a list of URLs in sequence and prints one status line per URL.

When to use it: You manage multiple websites for clients or internal services and need a quick overview of all of them.

Steps

Step 1 — Navigate to the skill directory.

cd ~/smfworks-skills/skills/website-checker

Step 2 — Run bulk with your sites.

python3 main.py bulk https://client1.com https://client2.com https://client3.com https://my-api.example.com

Output:

Checking 4 URLs...

✅ https://client1.com - 200 (143ms)
✅ https://client2.com - 200 (287ms)
⚠️ https://client3.com - 403 (88ms)
❌ https://my-api.example.com - DOWN (Request failed: ConnectionError: ...)

Step 3 — Investigate the ones that aren't 200.

A 403 may be expected (protected endpoint). A DOWN needs investigation.

Step 4 — Save your site list for easy reuse.

Create a shell alias or script:

# Add to ~/.bashrc or ~/.zshrc
alias check-all-sites='python3 ~/smfworks-skills/skills/website-checker/main.py bulk https://client1.com https://client2.com https://client3.com'

Result: Full status overview in one command.


4. How to Check a Slow or Unreliable Site

What this does: Uses a longer timeout for sites that normally take more than 10 seconds to respond.

When to use it: The default check returns a timeout error for a site you know is sometimes just slow.

Steps

Step 1 — Try with default timeout first.

python3 main.py check https://slow-api.example.com

Output:

❌ Failed to check https://slow-api.example.com
   Error: Request failed: ReadTimeout: HTTPSConnectionPool(host='slow-api.example.com', port=443): Read timed out. (read timeout=10)

Step 2 — Retry with a longer timeout.

python3 main.py check https://slow-api.example.com --timeout 60

Output:

✅ https://slow-api.example.com
   Status: 200
   Response time: 34,821.43ms

Step 3 — Interpret the result.

34 seconds is extremely slow. This is either a performance problem worth investigating or expected for that endpoint.

Result: You confirmed the site is up, just slow, and measured exactly how slow.


5. How to Verify a Redirect is Working

What this does: When you redirect http:// to https:// or an old domain to a new one, this confirms the redirect is in place.

When to use it: After setting up a domain redirect, changing your site URL, or migrating to HTTPS.

Steps

Step 1 — Check the old URL.

python3 main.py check http://old-domain.com

Output (redirect working):

✅ http://old-domain.com
   Status: 200
   Response time: 312.55ms
   Redirected to: https://www.new-domain.com/

Output (redirect not set up):

✅ http://old-domain.com
   Status: 200
   Response time: 89.12ms

(No "Redirected to" line means no redirect happened.)

Result: The "Redirected to" line confirms the redirect is working correctly.


6. Automating with Cron

Schedule regular site checks and log results. Review the log for downtime history.

Open the cron editor

crontab -e

Example: Check your main site every 30 minutes

*/30 * * * * python3 /home/yourname/smfworks-skills/skills/website-checker/main.py check https://yoursite.com >> /home/yourname/logs/site-check.log 2>&1

Example: Check SSL certificate every morning

0 8 * * * python3 /home/yourname/smfworks-skills/skills/website-checker/main.py ssl yoursite.com >> /home/yourname/logs/ssl-check.log 2>&1

Example: Check all client sites every hour

0 * * * * python3 /home/yourname/smfworks-skills/skills/website-checker/main.py bulk https://client1.com https://client2.com https://client3.com >> /home/yourname/logs/bulk-check.log 2>&1

Cron Expression Reference

ExpressionMeaning
*/30 * * * *Every 30 minutes
0 * * * *Every hour at :00
0 8 * * *Every day at 8 AM
0 8 * * 1Every Monday at 8 AM

Create the log directory

mkdir -p ~/logs

Check for downtime in logs

grep "❌" ~/logs/site-check.log | tail -20

7. Combining with Other Skills

Website Checker + Email Campaign: Check that your landing page is up before sending a campaign:

python3 ~/smfworks-skills/skills/website-checker/main.py check https://landing-page.com
# If ✅, proceed with campaign

Website Checker + System Monitor: Morning routine script — check both system health and site status:

#!/bin/bash
python3 ~/smfworks-skills/skills/system-monitor/main.py health
python3 ~/smfworks-skills/skills/website-checker/main.py bulk https://site1.com https://site2.com

8. Troubleshooting Common Issues

requests not installed. Run: pip install requests

The package is missing.
Fix: pip install requests


Request failed: ConnectionError: Max retries exceeded

The site is unreachable from your network.
Fix: 1) Confirm you have internet access. 2) Try opening the URL in a browser. 3) Check DNS: nslookup yourdomain.com.


Request failed: ReadTimeout: Read timed out. (read timeout=10)

The site didn't respond within 10 seconds.
Fix: Try with a longer timeout: --timeout 30. If still failing, the site is very slow or overloaded.


SSL Error: CERTIFICATE_VERIFY_FAILED

The site's SSL certificate is invalid, expired, or self-signed.
Fix: If it's your site, renew the certificate immediately. If it's someone else's, they have an SSL problem.


SSRF Protection: Access to localhost is not allowed

You tried to check http://localhost or a private IP address.
Fix: This is intentional security protection. The skill only checks public internet URLs.


Error: bulk requires at least 2 URLs

You used bulk with only one URL.
Fix: Use check for a single URL. Use bulk when you have two or more.


9. Tips & Best Practices

Check SSL monthly for all production sites. Let's Encrypt certificates expire every 90 days. A monthly check gives you ample warning. At 30 days or less, renew immediately.

Use bulk for regular monitoring. Build a list of your critical URLs and run bulk daily via cron. Review the log periodically for patterns.

A 403 doesn't mean the site is down. HTTP 403 (Forbidden) means the server responded — it's up — but this particular endpoint requires authentication. This is often expected.

Response times over 2,000ms are worth investigating. Sub-200ms is great. 200–1000ms is normal. Over 2000ms is slow enough to hurt user experience and bounce rates.

Use absolute paths in cron. Cron doesn't expand ~. Use /home/yourname/ instead of ~/ in crontab entries.

Save your bulk URL list as a script. If you check the same sites repeatedly, create a short shell script instead of retyping the URLs:

#!/bin/bash
python3 ~/smfworks-skills/skills/website-checker/main.py bulk \
  https://site1.com \
  https://site2.com \
  https://site3.com