{"id":51600942,"url":"https://github.com/gioxx/YOURLS-ChangeNotifier","last_synced_at":"2026-07-31T00:00:42.686Z","repository":{"id":316588025,"uuid":"1063395092","full_name":"gioxx/YOURLS-ChangeNotifier","owner":"gioxx","description":"Stay informed about every change to your YOURLS short URLs with instant email notifications.","archived":false,"fork":false,"pushed_at":"2026-07-04T17:12:33.000Z","size":56,"stargazers_count":0,"open_issues_count":1,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-07-29T20:33:47.702Z","etag":null,"topics":["php","yourls","yourls-plugin"],"latest_commit_sha":null,"homepage":"https://yourls.gioxx.org/plugins/change-notifier","language":"PHP","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/gioxx.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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,"disclosure":null},"funding":{"github":"gioxx","ko_fi":"gioxx","buy_me_a_coffee":"gioxx"}},"created_at":"2025-09-24T15:08:48.000Z","updated_at":"2026-07-04T17:12:36.000Z","dependencies_parsed_at":"2025-10-01T05:19:48.395Z","dependency_job_id":null,"html_url":"https://github.com/gioxx/YOURLS-ChangeNotifier","commit_stats":null,"previous_names":["gioxx/yourls-changenotifier"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/gioxx/YOURLS-ChangeNotifier","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gioxx%2FYOURLS-ChangeNotifier","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gioxx%2FYOURLS-ChangeNotifier/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gioxx%2FYOURLS-ChangeNotifier/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gioxx%2FYOURLS-ChangeNotifier/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gioxx","download_url":"https://codeload.github.com/gioxx/YOURLS-ChangeNotifier/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gioxx%2FYOURLS-ChangeNotifier/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":36096156,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-30T02:00:05.956Z","response_time":106,"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":["php","yourls","yourls-plugin"],"created_at":"2026-07-11T22:00:32.914Z","updated_at":"2026-07-31T00:00:42.651Z","avatar_url":"https://github.com/gioxx.png","language":"PHP","funding_links":["https://github.com/sponsors/gioxx","https://ko-fi.com/gioxx","https://buymeacoffee.com/gioxx"],"categories":["Plugins"],"sub_categories":["C"],"readme":"# 🔔 YOURLS Change Notifier\n\n**Stay informed about every change to your YOURLS short URLs with instant email notifications.**  \nNever miss a creation, edit, or deletion again — whether it happens through admin panel or API.\n\n[![Latest Release](https://img.shields.io/github/v/release/gioxx/YOURLS-ChangeNotifier)](https://github.com/gioxx/YOURLS-ChangeNotifier/releases)\n[![License](https://img.shields.io/github/license/gioxx/YOURLS-ChangeNotifier)](LICENSE)\n[![Listed in Awesome YOURLS!](https://img.shields.io/badge/Awesome-YOURLS-C5A3BE)](https://github.com/YOURLS/awesome)\n\n---\n\n## 🚀 Features\n\n- **Real-time email notifications** for URL creation, editing, and deletion\n- **Triple email delivery**: PHP mail(), full SMTP, or [Resend](https://resend.com) API\n- **SMTP support** with SSL/TLS encryption and authentication\n- **Resend API support** — modern transactional email without SMTP configuration\n- **Automatic update check** with badge and in-page banner when a new version is available\n- **Password-protected admin panel** for secure configuration\n- **Progressive password protection** (enabled only after successful test send + delivery confirmation click)\n- **Smart data capture** with before/after snapshots for edits\n- **Advanced debug logging** with automatic rotation (5MB limit)\n- **User identification** with IP tracking and authentication details\n- **Customizable email templates** with detailed event information\n- **Reset options** for settings and admin password\n- **Externalized admin assets** (dedicated CSS/JS files for easier maintenance)\n- **Fully internationalized** (i18n-ready)\n\n---\n\n## 🛠️ Installation\n\n1. Download the plugin from [the latest release](https://github.com/gioxx/YOURLS-ChangeNotifier/releases).\n2. Unzip the contents into the `user/plugins/yourls-change-notifier/` directory.\n3. Activate the plugin in the YOURLS admin panel.\n4. Go to the plugin settings page and complete the initial password setup.\n5. Configure your notification preferences and email settings.\n\n\u003e **Requires YOURLS 1.9+ and PHP 7.4+**\n\n---\n\n## ⚙️ Usage\n\n### 🔐 First-Time Setup\nPassword protection is enabled only after:\n- at least one valid recipient email is configured\n- at least one test email has been sent successfully\n- the delivery confirmation link in that test email has been clicked\n\nThis avoids lockouts during initial setup and enables secure password recovery via emailed reset link.\n\n### 📧 Basic Configuration\n- **Recipients**: Add comma-separated email addresses to receive notifications\n- **Events**: Choose which actions trigger notifications (Create/Edit/Delete)\n- **Subject prefix**: Customize email subject lines with your own prefix\n\n### 📨 Email Methods\n\n#### PHP mail() Function\nUse your server's built-in mail functionality — simple and works out of the box.\n\n#### SMTP Configuration\nConfigure external SMTP servers with advanced options:\n- **Host \u0026 Port**: Connect to any SMTP server\n- **Security**: Support for SSL/TLS encryption\n- **Authentication**: Username and password with app password support\n- **Custom sender**: Set your own \"From\" name and email address\n\n#### Resend\nUse the [Resend](https://resend.com) API for reliable transactional email delivery — no SMTP credentials required:\n- **API Key**: Generate one at [resend.com/api-keys](https://resend.com/api-keys)\n- **Verified sender**: From address must be a verified domain or address in your Resend account\n- **Custom sender**: Set your own \"From\" name and email address\n- **Automatic fallback** to PHP mail() if the API call fails\n\n### 🐛 Debug \u0026 Troubleshooting\n- **Debug logging**: Track email delivery and plugin events\n- **Automatic log rotation**: Keeps log files manageable (rotates at 5MB)\n- **Test email function**: Verify mail transport and confirm real inbox delivery via one-time link\n- **Reset options**: Start fresh when needed\n\n---\n\n## 📧 Email Content\n\nEach notification includes comprehensive details:\n- **Event type** (CREATE/EDIT/DELETE)  \n- **Timestamp** with precise timing\n- **User information** (who made the change + IP address)\n- **URL details** (short URL, target URL, title)\n- **Before/after snapshots** for edit operations\n- **YOURLS instance** identification\n\nExample notification:\n```\nEvent:    CREATE\nWhen:     2025-09-25T12:30:45+00:00\nBy:       user: admin\nIP:       192.168.1.100\nInstance: https://yourdomain.com/\nShort:    https://yourdomain.com/abc123\nKeyword:  abc123\nTitle:    My Important Link\nTarget:   https://example.com/very-long-url-here\n```\n\n---\n\n## 🔧 Advanced Features\n\n### Password Protection\n- **Secure admin panel** with hashed password storage\n- **Session management** for convenient access\n- **Shared-hosting resilience** with signed auth-cookie fallback when PHP sessions are unreliable\n- **Email-based password recovery** with one-time expiring reset links\n- **Delivery confirmation flow** with one-time expiring test confirmation links\n- **Password reset option** to return to initial setup\n\n### Smart Data Capture\n- **Pre-edit snapshots** capture original values before changes\n- **Delete data preservation** using multiple fallback methods\n- **API compatibility** works with both admin panel and API operations\n\n### SMTP Support\n- **Native implementation** — no external libraries required\n- **Full protocol support** including EHLO, STARTTLS, AUTH LOGIN\n- **Automatic fallback** to PHP mail() if SMTP fails\n- **Detailed logging** for troubleshooting connection issues\n\n### Resend API Support\n- **Zero-config delivery** — just an API key and a verified sender address\n- **JSON over HTTPS** — no socket handling, no STARTTLS negotiation\n- **Automatic fallback** to PHP mail() if the API call fails\n- **Logged responses** for troubleshooting\n\n---\n\n## 🌐 Translation\n\nThis plugin is fully localized and ready for internationalization.  \nAvailable languages:\n- 🇬🇧 English (default)\n\nYou can contribute new translations via `.po`/`.mo` files inside the `languages/` folder.\n\n---\n\n## 🛡️ Security Features\n\n- **Password hashing** using PHP's `password_hash()`\n- **CSRF protection** with WordPress-style nonces\n- **Session-based authentication** with automatic logout\n- **Signed cookie fallback** to prevent authentication loops on some shared-hosting setups\n- **Encoded SMTP passwords and Resend API keys** for secure storage\n- **Input validation** and sanitization throughout\n\n---\n\n## 💡 Use Cases\n\n- **Team collaboration**: Keep team members informed of URL changes\n- **Content management**: Track when marketing URLs are modified  \n- **Security monitoring**: Get notified of unauthorized URL modifications\n- **API monitoring**: Track programmatic URL operations\n- **Audit trails**: Maintain records of all URL lifecycle events\n\n---\n\n## 📄 License\n\nThis plugin is licensed under the [MIT License](LICENSE).\n\n---\n\n## 💬 About\n\nLovingly developed by the usually-on-vacation brain cell of [Gioxx](https://github.com/gioxx).\n\n---\n\n## 🤝 Contributing\n\nPull requests and feature suggestions are welcome!  \nIf you find bugs or have feature requests, [open an issue](https://github.com/gioxx/YOURLS-ChangeNotifier/issues).  \nIf you find it useful, leave a ⭐ on GitHub! ❤️\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgioxx%2FYOURLS-ChangeNotifier","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgioxx%2FYOURLS-ChangeNotifier","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgioxx%2FYOURLS-ChangeNotifier/lists"}