
PongHub is an open-source service status monitoring website designed to help users track and verify service availability. It supports:

Star and Fork PongHub
Modify the config.yaml file in the root directory to configure your service checks.
Modify the CNAME file in the root directory to set your custom domain name.
If you do not need a custom domain, you can delete the
CNAMEfile.
[!TIP] By default, GitHub Actions runs every 30 minutes. If you need to change the frequency, modify the
cronexpression in the.github/workflows/deploy.ymlfile.Please do not set the frequency too high to avoid triggering GitHub's rate limits.
[!IMPORTANT] If GitHub Actions does not trigger automatically, you can manually trigger it once.
Please ensure that GitHub Pages is enabled and that you have granted notification permissions for GitHub Actions.
The config.yaml file follows this format:
| Field | Type | Description | Required | Notes |
|---|---|---|---|---|
display_num |
Integer | Number of services displayed on the homepage | ✖️ | Default is 72 services |
timeout |
Integer | Timeout for each request in seconds | ✖️ | Units are seconds, default is 5 seconds |
max_retry_times |
Integer | Number of retries on request failure | ✖️ | Default is 2 retries |
max_log_days |
Integer | Number of days to retain logs | ✖️ | Default is 3 days |
cert_notify_days |
Integer | Days before SSL certificate expiration to notify | ✖️ | Default is 7 days |
services |
Array | List of services to monitor | ✔️ | |
services.name |
String | Name of the service | ✔️ | |
services.endpoints |
Array | List of endpoints to check for the service | ✔️ | |
services.endpoints.url |
String | URL to request | ✔️ | |
services.endpoints.method |
String | HTTP method for the request | ✖️ | Supports GET/POST/PUT, default is GET |
services.endpoints.headers |
Object | Request headers | ✖️ | Key-value pairs, supports custom headers |
services.endpoints.body |
String | Request body content | ✖️ | Used only for POST/PUT requests |
services.endpoints.status_code |
Integer | Expected HTTP status code in response (default is 200) |
✖️ | Default is 200 |
services.endpoints.response_regex |
String | Regex to match the response body content | ✖️ | |
notifications |
Object | Notification configuration | ✖️ | See Custom Notifications |
Here is an example configuration file:
display_num: 72
timeout: 5
max_retry_times: 2
max_log_days: 3
cert_notify_days: 7
services:
- name: "GitHub API"
endpoints:
- url: "https://api.github.com"
- url: "https://api.github.com/repos/wcy-dt/ponghub"
method: "GET"
headers:
Content-Type: application/json
Authorization: Bearer your_token
status_code: 200
response_regex: "full_name"
- name: "Example Website"
endpoints:
- url: "https://example.com/health"
response_regex: "status"
- url: "https://example.com/status"
method: "POST"
body: '{"key": "value"}'
ponghub now supports powerful parameterized configuration functionality, allowing the use of various types of dynamic variables in configuration files. These variables are generated and resolved in real-time during program execution.
Click to expand and view supported parameter types
Use {{%format}} format to define date and time parameters:
{{%Y-%m-%d}} - Current date, format: 2006-01-02 (e.g., 2025-09-22){{%H:%M:%S}} - Current time, format: 15:04:05 (e.g., 17:30:45){{%s}} - Unix timestamp (e.g., 1727859600){{%Y}} - Current year (e.g., 2025){{%m}} - Current month, format: 01-12{{%d}} - Current date, format: 01-31{{%H}} - Current hour, format: 00-23{{%M}} - Current minute, format: 00-59{{%S}} - Current second, format: 00-59{{%B}} - Full month name (e.g., September){{%b}} - Short month name (e.g., Sep){{%A}} - Full weekday name (e.g., Monday){{%a}} - Short weekday name (e.g., Mon){{rand}} - Generate random number in range 0-1000000{{rand_int}} - Generate large range random integer{{rand(min,max)}} - Generate random number in specified range{{rand(1,100)}} - Generate random number between 1-100{{rand(1000,9999)}} - Generate 4-digit random number{{rand_str}} - Generate 8-character random string (letters + numbers){{rand_str(length)}} - Generate random string of specified length{{rand_str(16)}} - Generate 16-character random string{{rand_str_secure}} - Generate 16-character cryptographically secure random string{{rand_hex(length)}} - Generate hexadecimal random string of specified length{{rand_hex(8)}} - Generate 8-character hexadecimal string{{rand_hex(32)}} - Generate 32-character hexadecimal string{{uuid}} - Generate standard UUID (with hyphens)bf3655f7-8a93-4822-a458-2913a6fe4722{{uuid_short}} - Generate short UUID (without hyphens)14d44b7334014484bb81b015fb2401bf{{env(variable_name)}} - Read environment variable value{{env(API_KEY)}} - Read API_KEY environment variable{{env(VERSION)}} - Read VERSION environment variableEnvironment variables can be set through GitHub Actions Repository Secrets
{{seq}} - Time-based sequence number (6 digits){{seq_daily}} - Daily sequence number (seconds since midnight){{hash_short}} - Short hash value (6-character hexadecimal){{hash_md5_like}} - MD5-style long hash value (32-character hexadecimal){{local_ip}} - Get system local IP address{{hostname}} - Get system hostname{{user_agent}} - Generate random User-Agent string{{http_method}} - Generate random HTTP method (GET, POST, PUT, DELETE, etc.){{base64(content)}} - Base64 encode the provided content{{base64(hello world)}} - Encode "hello world" to Base64{{url_encode(content)}} - URL encode the provided content{{url_encode(hello world)}} - URL encode "hello world"{{json_escape(content)}} - JSON escape the provided content{{json_escape("test")}} - Escape quotes and special characters for JSON{{add(a,b)}} - Add two numbers{{add(10,5)}} - Returns 15{{sub(a,b)}} - Subtract two numbers{{sub(10,5)}} - Returns 5{{mul(a,b)}} - Multiply two numbers{{mul(10,5)}} - Returns 50{{div(a,b)}} - Divide two numbers{{div(10,5)}} - Returns 2{{upper(text)}} - Convert text to uppercase{{upper(hello)}} - Returns "HELLO"{{lower(text)}} - Convert text to lowercase{{lower(HELLO)}} - Returns "hello"{{reverse(text)}} - Reverse text{{reverse(hello)}} - Returns "olleh"{{substr(text,start,length)}} - Extract substring from text{{substr(hello world,0,5)}} - Returns "hello"{{color_hex}} - Generate random hexadecimal color code#FF5733{{color_rgb}} - Generate random RGB color valuergb(255, 87, 51){{color_hsl}} - Generate random HSL color valuehsl(120, 50%, 75%){{mime_type}} - Generate random MIME typeapplication/json, image/png, text/html{{file_ext}} - Generate random file extension.jpg, .pdf, .txt{{fake_email}} - Generate realistic fake email addressjohn.smith@example.com{{fake_phone}} - Generate fake phone number+1-555-0123{{fake_name}} - Generate fake person nameJohn Smith{{fake_domain}} - Generate fake domain nameexample-site.com{{time_add(duration)}} - Add specified duration to current time{{time_add(1h)}} - Add 1 hour to current time{{time_add(30m)}} - Add 30 minutes to current time{{time_sub(duration)}} - Subtract specified duration from current time{{time_sub(1d)}} - Subtract 1 day from current time{{time_sub(2h30m)}} - Subtract 2 hours 30 minutes from current timeHere is an example configuration file:
services:
- name: "Parameterized Service"
endpoints:
- url: "https://api.example.com/data?date={{%Y-%m-%d}}&rand={{rand(1,100)}}"
- url: "https://api.example.com/submit"
method: "POST"
headers:
Content-Type: application/json
X-Request-ID: "{{uuid}}"
body: '{"session_id": "{{rand_str(16)}}", "timestamp": "{{%s}}"}'
PongHub now supports multiple notification methods. When services have issues or certificates are about to expire, alerts can be sent through multiple channels.
Click to expand and view supported notification types
PongHub supports the following notification methods:
To use, add a notifications configuration block in your config.yaml file:
notifications:
enabled: true # Enable notification functionality
methods: # Notification methods to enable
- email
- webhook
# Specific configuration for each notification method...
By default, PongHub will send notifications when GitHub Actions workflows fail.
Default notification is automatically enabled when:
notifications field is configurednotifications.enabled: true but no methods specified or only non-email/webhook methods are specifiedmethods: ["default"]If notifications is configured with email or webhook methods, default notification is disabled by default unless explicitly enabled in notifications.default.enabled.
```yaml email: smtp_host: "smtp.gmail.com" # SMTP server host smtp_port: 587 # SMTP port, default is 587 from: "alerts@yourdomain.com" # Sender email address to: # Recipient email addresses - "admin@yourdomain.com" - "ops@yourdomain.com" sub
$ claude mcp add ponghub \
-- python -m otcore.mcp_server <graph>