{"id":13547225,"url":"https://github.com/owloops/updo","last_synced_at":"2025-10-06T04:39:42.584Z","repository":{"id":214189429,"uuid":"735917479","full_name":"Owloops/updo","owner":"Owloops","description":"Uptime monitoring CLI tool with alerting and advanced settings","archived":false,"fork":false,"pushed_at":"2025-09-22T20:14:54.000Z","size":14006,"stargazers_count":668,"open_issues_count":4,"forks_count":28,"subscribers_count":12,"default_branch":"main","last_synced_at":"2025-09-22T22:11:01.677Z","etag":null,"topics":["cli","monitoring","termui"],"latest_commit_sha":null,"homepage":"https://www.owloops.com/landings/open-source","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Owloops.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-12-26T13:01:30.000Z","updated_at":"2025-09-22T20:14:57.000Z","dependencies_parsed_at":"2024-01-12T02:44:44.320Z","dependency_job_id":"6cac7c4a-1a26-44e2-ba22-e0a5bca2332f","html_url":"https://github.com/Owloops/updo","commit_stats":{"total_commits":22,"total_committers":1,"mean_commits":22.0,"dds":0.0,"last_synced_commit":"8cae28e8b6a3a61476abc13476a5e17815cb19e8"},"previous_names":["owloops/updo","pgagnidze/updo"],"tags_count":39,"template":false,"template_full_name":null,"purl":"pkg:github/Owloops/updo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Owloops%2Fupdo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Owloops%2Fupdo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Owloops%2Fupdo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Owloops%2Fupdo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Owloops","download_url":"https://codeload.github.com/Owloops/updo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Owloops%2Fupdo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278560548,"owners_count":26006950,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-06T02:00:05.630Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","monitoring","termui"],"created_at":"2024-08-01T12:00:52.679Z","updated_at":"2025-10-06T04:39:42.578Z","avatar_url":"https://github.com/Owloops.png","language":"Go","readme":"\u003cdiv align=\"center\"\u003e\n\n# 🐤 Updo - Website Monitoring Tool\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"images/demo.gif\" alt=\"Updo demo\" width=\"600\"/\u003e\n\u003c/p\u003e\n\nUpdo is a command-line tool for monitoring website uptime and performance. It provides real-time metrics on website status, response time, SSL certificate expiry, and more, with alert notifications.\n\n![License:MIT](https://img.shields.io/static/v1?label=license\u0026message=MIT\u0026color=blue)\n[![Latest Release](https://img.shields.io/github/v/release/Owloops/updo)](https://github.com/Owloops/updo/releases/latest)\n[![Go Report Card](https://goreportcard.com/badge/github.com/Owloops/updo)](https://goreportcard.com/report/github.com/Owloops/updo)\n\u003c/div\u003e\n\n## Features\n\n- **Real-time monitoring** with uptime percentage, response times, and SSL certificate tracking\n- **Multi-target monitoring** - Monitor multiple URLs concurrently from the command line or config files\n- **Multi-region AWS Lambda** - Deploy across 13 global regions for worldwide monitoring coverage\n- **Prometheus \u0026 Grafana integration** - Export metrics for visualization and long-term storage\n- **Alert notifications** - Desktop notifications and webhook integration (Slack, Discord, custom endpoints)\n- **Flexible HTTP support** - Custom headers, POST/PUT requests, SSL verification options, response assertions\n- **Multiple output modes** - Interactive TUI, simple text output, or structured JSON logging\n\n## Demo\n\u003ctable\u003e\n   \u003ctr\u003e\n      \u003ctd width=\"50%\" align=\"center\"\u003e\n         \u003ch4\u003eBasic Monitoring\u003c/h4\u003e\n         \u003cvideo src=\"https://github.com/user-attachments/assets/c238df8e-f196-4be5-a9e0-116e76e20847\" controls style=\"width:100%; \n            max-width:400px; height:250px;\"\u003e\n      \u003c/td\u003e\n      \u003ctd width=\"50%\" align=\"center\"\u003e\n         \u003ch4\u003eMulti-Region Monitoring\u003c/h4\u003e\n         \u003cvideo src=\"https://github.com/user-attachments/assets/67c8e51d-fe6f-436a-a34d-cdc2bbf23f46\" controls style=\"width:100%; max-width:400px; height:250px;\"\u003e\n      \u003c/td\u003e\n   \u003c/tr\u003e\n\u003c/table\u003e\n\n## Installation\n\n\u003cdetails\u003e\n\u003csummary\u003emacOS - Homebrew (Recommended)\u003c/summary\u003e\n\n```bash\nbrew tap owloops/tap\nbrew install updo\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eLinux - Package Managers (Recommended)\u003c/summary\u003e\n\n**Debian/Ubuntu:**\n\n```bash\n# Replace VERSION with actual version (e.g., 0.3.7)\ncurl -L -O https://github.com/Owloops/updo/releases/latest/download/updo_VERSION_linux_amd64.deb\nsudo dpkg -i updo_VERSION_linux_amd64.deb\n```\n\n**Red Hat/Fedora/CentOS:**\n\n```bash\n# Replace VERSION with actual version (e.g., 0.3.7)\ncurl -L -O https://github.com/Owloops/updo/releases/latest/download/updo_VERSION_linux_amd64.rpm\nsudo rpm -i updo_VERSION_linux_amd64.rpm\n```\n\n**Alpine Linux:**\n\n```bash\n# Replace VERSION with actual version (e.g., 0.3.7)\ncurl -L -O https://github.com/Owloops/updo/releases/latest/download/updo_VERSION_linux_amd64.apk\nsudo apk add --allow-untrusted updo_VERSION_linux_amd64.apk\n```\n\n**Arch Linux:**\n\n```bash\n# Replace VERSION with actual version (e.g., 0.3.7)\ncurl -L -O https://github.com/Owloops/updo/releases/latest/download/updo_VERSION_linux_amd64.pkg.tar.zst\nsudo pacman -U updo_VERSION_linux_amd64.pkg.tar.zst\n```\n\n**openSUSE:**\n\n```bash\n# Replace VERSION with actual version (e.g., 0.3.7)\ncurl -L -O https://github.com/Owloops/updo/releases/latest/download/updo_VERSION_linux_amd64.rpm\nsudo zypper install --allow-unsigned-rpm updo_VERSION_linux_amd64.rpm\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eWindows - Direct Download\u003c/summary\u003e\n\n**PowerShell:**\n\n```powershell\n# Download and install updo\nInvoke-WebRequest -Uri \"https://github.com/Owloops/updo/releases/latest/download/updo_Windows_amd64.exe\" -OutFile \"updo.exe\"\n# Move to a directory in your PATH (or create a custom directory)\nMove-Item updo.exe C:\\Windows\\System32\\updo.exe\n```\n\n**Manual Download:**\nDownload the Windows executable from the [latest release](https://github.com/Owloops/updo/releases/latest) and add it to your PATH.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eQuick install script (Linux, macOS, Windows/MSYS)\u003c/summary\u003e\n\n```bash\ncurl -sSL https://raw.githubusercontent.com/Owloops/updo/main/install.sh | bash\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eBuild from source\u003c/summary\u003e\n\nRequires Go [installed](https://go.dev/doc/install).\n\n```bash\ngit clone https://github.com/Owloops/updo.git\ncd updo\ngo build\n```\n\nOr install directly:\n\n```bash\ngo install github.com/Owloops/updo@latest\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eDocker\u003c/summary\u003e\n\n```bash\n# Build and run\ndocker build -t updo https://github.com/Owloops/updo.git\ndocker run updo monitor \u003cwebsite-url\u003e [options]\n```\n\n\u003c/details\u003e\n\n## Usage\n\n```bash\n# Monitor URLs\n./updo monitor \u003cwebsite-url\u003e [options]\n./updo monitor \u003curl1\u003e \u003curl2\u003e \u003curl3\u003e\n\n# Using configuration file\n./updo monitor --config \u003cconfig-file\u003e\n\n# Generate shell completions\n./updo completion bash \u003e updo_completion.bash\n```\n\n### Options\n\n**Basic:**\n\n- `--url, --config`: Target URL or TOML config file\n- `--refresh`: Check interval in seconds (default: 5)\n- `--timeout`: Request timeout in seconds (default: 10)  \n- `--count`: Number of checks (0 = infinite)\n- `--simple`: Text output instead of TUI\n\n**HTTP:**\n\n- `--header`: Custom HTTP headers (repeatable)\n- `--request`: HTTP method (default: GET)\n- `--data`: Request body data\n- `--skip-ssl, --follow-redirects, --accept-redirects`: SSL and redirect options\n- `--assert-text`: Expected response text\n\n**Multi-region:**\n\n- `--regions`: AWS regions (comma-separated or 'all')\n- `--profile`: AWS profile for remote executors\n\n**Output \u0026 Alerts:**\n\n- `--log`: JSON structured logging\n- `--webhook-url, --webhook-header`: Webhook notifications\n- `--only, --skip`: Target filtering\n\n\u003e **Note:** When using CLI flags, all settings (headers, webhook URL, timeouts, etc.) apply globally to all monitored targets. For per-target configuration, use a TOML configuration file.\n\n### Examples\n\n```bash\n# Basic monitoring\n./updo monitor https://example.com\n\n# Set custom refresh and timeout\n./updo monitor --refresh 10 --timeout 5 https://example.com\n\n# Simple mode and logging\n./updo monitor --simple --count 10 https://example.com\n./updo monitor --log --count 10 https://example.com \u003e output.json\n\n# Custom requests\n./updo monitor --header \"Authorization: Bearer token\" --assert-text \"Welcome\" https://example.com\n./updo monitor --request POST --header \"Content-Type: application/json\" --data '{\"test\":\"data\"}' https://api.example.com\n\n# Multi-target monitoring\n./updo monitor https://google.com https://github.com https://cloudflare.com\n./updo monitor --config example-config.toml --only Google,GitHub\n\n# Multi-region monitoring\n./updo monitor --regions us-east-1,eu-west-1 https://example.com\n./updo monitor --regions all --profile production https://example.com\n\n# Webhook notifications\n./updo monitor --webhook-url \"https://hooks.slack.com/services/YOUR/WEBHOOK\" https://example.com\n```\n\n## Configuration File\n\nUse TOML configuration for complex monitoring setups with multiple targets.\n\n### Example Configuration\n\n```toml\n[global]\nrefresh_interval = 5\ntimeout = 10\nwebhook_url = \"https://hooks.slack.com/services/YOUR/WEBHOOK\"\nonly = [\"Google\", \"API\"]  # Monitor only these targets\n\n[[targets]]\nurl = \"https://www.google.com\"\nname = \"Google\"\nrefresh_interval = 3\nassert_text = \"Google\"\n\n[[targets]]\nurl = \"https://api.example.com/health\"\nname = \"API\"\nmethod = \"POST\"\nheaders = [\"Authorization: Bearer token\"]\n```\n\n### Configuration Options\n\n**Global settings** (apply to all targets unless overridden):\n\n- `refresh_interval`, `timeout`, `follow_redirects`, `accept_redirects`, `receive_alert`, `count`\n- `webhook_url`, `webhook_headers`: Default webhook settings\n- `only`, `skip`: Target filtering arrays\n- `regions`: AWS regions for remote executors\n\n**Target settings** (can override global):\n\n- `url` (required), `name`: Target identification  \n- `method`, `headers`, `body`: HTTP request options\n- `assert_text`, `should_fail`: Response validation\n- `skip_ssl`, `follow_redirects`, `accept_redirects`: Connection options\n- `webhook_url`, `webhook_headers`: Per-target notifications\n- `regions`: Target-specific AWS regions\n\n## Multi-Region Monitoring\n\nDeploy remote executors as AWS Lambda functions across 13 global regions for distributed monitoring from multiple geographic locations.\n\n```bash\n# Deploy remote executors to AWS regions\nupdo aws deploy --regions us-east-1,eu-west-1\n\n# Monitor using remote executors\nupdo monitor --regions us-east-1,eu-west-1 https://example.com\n\n# Cleanup when done\nupdo aws destroy --regions all\n```\n\n### Prerequisites\n\n**AWS CLI configured** with appropriate credentials and the following permissions:\n\n| Service | Required Permissions |\n|---------|---------------------|\n| Lambda | CreateFunction, UpdateFunctionCode, DeleteFunction, GetFunction, InvokeFunction |\n| IAM | CreateRole, AttachRolePolicy, DetachRolePolicy, DeleteRole, GetRole |\n| STS | GetCallerIdentity |\n\n**Supported regions:** us-east-1, us-west-1, us-west-2, eu-west-1, eu-central-1, eu-west-2, ap-southeast-1, ap-southeast-2, ap-northeast-1, ap-northeast-2, ap-south-1, sa-east-1, ca-central-1\n\n**Troubleshooting:** If you get credential errors, run `aws sso login --profile your-profile` to refresh expired sessions.\n\n## Webhook Notifications\n\nUpdo can send webhook notifications when targets go up or down. This enables integration with various services like Slack, Discord, PagerDuty, or custom alerting systems.\n\n### Webhook Payload\n\nWhen a target status changes, Updo sends a JSON payload:\n\n```json\n{\n  \"event\": \"target_down\",  // or \"target_up\"\n  \"target\": \"Critical API\",\n  \"url\": \"https://api.example.com\",\n  \"timestamp\": \"2024-01-01T12:00:00Z\",\n  \"response_time_ms\": 1500,\n  \"status_code\": 500,\n  \"error\": \"Internal Server Error\"  // only for down events\n}\n```\n\n### Integration Examples\n\n**Slack Webhook:**\n\n```toml\n[[targets]]\nurl = \"https://api.example.com\"\nname = \"Production API\"\nwebhook_url = \"https://hooks.slack.com/services/YOUR/WEBHOOK/URL\"\n```\n\n**Custom Webhook with Headers:**\n\n```toml\n[[targets]]\nurl = \"https://critical-service.example.com\"\nname = \"Critical Service\"\nwebhook_url = \"https://alerts.internal.com/webhook\"\nwebhook_headers = [\n  \"Authorization: Bearer YOUR_TOKEN\",\n  \"X-Service: updo-monitor\"\n]\n```\n\n## Prometheus \u0026 Grafana Integration\n\nExport updo metrics to Prometheus for long-term storage, visualization, and alerting:\n\n```bash\n# Basic Prometheus integration\n./updo monitor --prometheus-url http://localhost:9090/api/v1/write https://example.com\n\n# Via environment variables (CLI flag optional if URL provided via env)\nexport UPDO_PROMETHEUS_RW_SERVER_URL=\"https://prometheus.example.com/api/v1/write\"\nexport UPDO_PROMETHEUS_USERNAME=\"admin\"\nexport UPDO_PROMETHEUS_PASSWORD=\"secret\"\n./updo monitor https://example.com\n```\n\n**Available metrics:**\n\n- Target uptime and response times\n- HTTP status codes and timing breakdown (DNS, TCP, TTFB, download)\n- SSL certificate expiry and assertion results\n\n**Quick start with Docker:**\n\n```bash\n# Clone and start the monitoring stack\ngit clone https://github.com/Owloops/updo.git\ncd updo/examples/prometheus-grafana\ndocker compose up -d\n```\n\nAccess Grafana at [http://localhost:3000](http://localhost:3000) for pre-built dashboards.\n\n\u003e **📖 Full Documentation:** See [examples/prometheus-grafana/README.md](examples/prometheus-grafana/README.md) for complete setup, authentication options, metrics reference, and PromQL examples.\n\n## Structured Logging\n\nThe `--log` flag outputs JSON-formatted logs for programmatic consumption:\n\n- **Check logs** (stdout): HTTP requests, responses, and timing information\n- **Metrics logs** (stdout): Uptime, response time stats, success rate\n- **Error logs** (stderr): Failures, warnings, and assertion results\n\nUsage examples:\n\n```bash\n# All logs to one file\n./updo monitor --log https://example.com \u003e all.json 2\u003e\u00261\n\n# Metrics to one file, errors to another\n./updo monitor --log https://example.com \u003e metrics.json 2\u003e errors.json\n\n# Processing with jq\n./updo monitor --log https://example.com | jq 'select(.type==\"check\") | .response_time_ms'\n```\n\n## Keyboard Shortcuts\n\nWhen monitoring multiple targets:\n\n- `↑/↓`: Navigate targets\n- `Tab`: Collapse/expand all target groups\n- `Enter`: Collapse/expand individual target group\n- `/`: Search mode, `ESC` to exit\n- `l`: Toggle logs per target\n- `q` or `Ctrl+C`: Quit\n\n## Mentions\n\n- [awesome-readme](https://github.com/matiassingers/awesome-readme)\n- [termui](https://github.com/gizak/termui)\n- [Terminal Trove](https://terminaltrove.com/updo)\n- [cobra](https://github.com/spf13/cobra)\n\n## Contributing\n\nContributions to Updo are welcome! Feel free to create issues or submit pull requests.\n\n## License\n\nThis project is licensed under the [MIT License](LICENSE).\n","funding_links":[],"categories":["Examples"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fowloops%2Fupdo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fowloops%2Fupdo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fowloops%2Fupdo/lists"}