{"id":30027778,"url":"https://github.com/suleman-elahi/whook","last_synced_at":"2026-05-15T20:04:40.326Z","repository":{"id":306098571,"uuid":"1025008140","full_name":"Suleman-Elahi/whook","owner":"Suleman-Elahi","description":"A simple webhook manager. Can be self hosted. Supports destination URLs and JSON transformation.","archived":false,"fork":false,"pushed_at":"2026-01-30T22:31:18.000Z","size":189,"stargazers_count":1,"open_issues_count":1,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-01-31T14:19:38.321Z","etag":null,"topics":["fastapi","flask-sqlalchemy","python","shoelace","shoelacecss","webhook-receiver","webhook-server","webhooks","webhooks-catcher"],"latest_commit_sha":null,"homepage":"","language":"HTML","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/Suleman-Elahi.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":"2025-07-23T15:20:05.000Z","updated_at":"2026-01-31T07:41:11.000Z","dependencies_parsed_at":"2025-07-23T17:37:38.101Z","dependency_job_id":"e6f938d3-95ec-42c9-898c-8983467ac40f","html_url":"https://github.com/Suleman-Elahi/whook","commit_stats":null,"previous_names":["suleman-elahi/whook"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Suleman-Elahi/whook","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Suleman-Elahi%2Fwhook","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Suleman-Elahi%2Fwhook/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Suleman-Elahi%2Fwhook/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Suleman-Elahi%2Fwhook/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Suleman-Elahi","download_url":"https://codeload.github.com/Suleman-Elahi/whook/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Suleman-Elahi%2Fwhook/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33078004,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-15T11:35:32.926Z","status":"ssl_error","status_checked_at":"2026-05-15T11:35:31.362Z","response_time":103,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["fastapi","flask-sqlalchemy","python","shoelace","shoelacecss","webhook-receiver","webhook-server","webhooks","webhooks-catcher"],"created_at":"2025-08-06T13:56:58.371Z","updated_at":"2026-05-15T20:04:40.321Z","avatar_url":"https://github.com/Suleman-Elahi.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 📖 Whook: Self-Hosted Webhook Manager\r\n\r\n![Whook Dashboard](https://res.cloudinary.com/suleman/image/upload/v1769874888/whook_dashboard_mglref.png)\r\n\r\n![Whook Request Details](https://res.cloudinary.com/suleman/image/upload/v1769874888/whook_request_details_ni4csf.png)\r\n\r\nWhook is a high-performance, self-hosted webhook management system built with **FastAPI**. Supports SQLite, PostgreSQL, and MySQL/MariaDB. Features real-time monitoring, background processing, Google SSO authentication, and multi-user support.\r\n\r\n## ✨ Features\r\n\r\n- **Google SSO Authentication:** Secure login with Google accounts\r\n- **Multi-User Support:** Each user has their own isolated webhooks\r\n- **Multi-Database Support:** SQLite, PostgreSQL, MySQL/MariaDB\r\n- **Real-time Updates:** WebSocket support for live webhook monitoring\r\n- **Background Processing:** Redis + RQ for async webhook handling\r\n- **Modern UI:** Clean, professional interface with Shoelace components\r\n- **Payload Forwarding:** Route received webhooks to multiple destination URLs\r\n- **JSON Transformation:** Customize webhook payloads before forwarding\r\n- **Self-Hosted:** Full control over your data and environment\r\n\r\n## 🚀 Quick Start\r\n\r\n### Using Docker Compose (Recommended)\r\n\r\n```bash\r\n# Clone the repository\r\ngit clone \u003cyour-repo-url\u003e\r\ncd whook\r\n\r\n# Copy environment file and configure\r\ncp .env.example .env\r\n# Edit .env with your Google OAuth credentials\r\n\r\n# Start PostgreSQL and Redis\r\ndocker-compose up -d\r\n\r\n# Install dependencies and run\r\npip install -r requirements.txt\r\n# OR with uv\r\nuv sync\r\n\r\n# Start the application\r\n./run.sh\r\n```\r\n\r\n### Using SQLite (Simplest)\r\n\r\n```bash\r\n# Set DATABASE_URL in .env\r\nDATABASE_URL=sqlite:///webhooks.db\r\n\r\n# Start Redis (required)\r\ndocker-compose up -d redis\r\n\r\n# Run the application\r\n./run.sh\r\n```\r\n\r\n## 📋 Requirements\r\n\r\n- Python 3.11+\r\n- Redis 6+\r\n- Database: SQLite, PostgreSQL 12+, or MySQL/MariaDB 10+\r\n\r\n## 🔧 Configuration\r\n\r\nCopy `.env.example` to `.env` and configure:\r\n\r\n```env\r\n# Database - Choose one:\r\nDATABASE_URL=sqlite:///webhooks.db\r\n# DATABASE_URL=postgresql://webhook_user:webhook_pass@localhost:5432/webhooks_db\r\n# DATABASE_URL=mysql+pymysql://user:password@localhost:3306/webhooks_db\r\n\r\n# Redis\r\nREDIS_URL=redis://localhost:6379/0\r\n\r\n# Application\r\nAPP_HOST=0.0.0.0\r\nAPP_PORT=5000\r\nDEBUG=False\r\n\r\n# Security - Generate with: python -c \"import secrets; print(secrets.token_urlsafe(32))\"\r\nSECRET_KEY=change-this-secret-key-in-production\r\n\r\n# Google OAuth (Required)\r\nGOOGLE_CLIENT_ID=your-client-id.apps.googleusercontent.com\r\nGOOGLE_CLIENT_SECRET=your-client-secret\r\nREDIRECT_URI=http://localhost:5000/auth/callback\r\n\r\n# Data Retention\r\nWEBHOOK_RETENTION_DAYS=30\r\n```\r\n\r\n### Google OAuth Setup\r\n\r\nSee [GOOGLE_OAUTH_SETUP.md](GOOGLE_OAUTH_SETUP.md) for step-by-step instructions.\r\n\r\n## 🛠️ Usage\r\n\r\n### Creating a Webhook Endpoint\r\n\r\n1. Click \"Create New Webhook\"\r\n2. Enter a descriptive name\r\n3. Copy the generated unique URL\r\n4. Use the URL to receive webhooks from external services\r\n\r\n### Viewing Webhook Requests\r\n\r\n1. Click on a webhook from the dashboard\r\n2. View incoming requests in real-time\r\n3. Click any request to see headers and body\r\n4. Use \"Copy cURL\" to replay the request\r\n\r\n### Configuring Payload Forwarding\r\n\r\n1. Click Settings (⚙️) on a webhook\r\n2. Add destination URLs (comma-separated)\r\n3. Optionally add a transformation script\r\n4. Save settings\r\n\r\n### JSON Transformation\r\n\r\n```python\r\ndef transform(data):\r\n    return {\r\n        'event_type': data.get('type'),\r\n        'user_id': data.get('user', {}).get('id'),\r\n        'processed': True\r\n    }\r\n```\r\n\r\n## 🏗️ Architecture\r\n\r\n```\r\n┌─────────────┐\r\n│   Browser   │\r\n└──────┬──────┘\r\n       │ WebSocket + HTTP\r\n       ▼\r\n┌─────────────┐     ┌─────────────┐\r\n│   FastAPI   │────▶│  Database   │\r\n│   Server    │     │ SQLite/PG/  │\r\n│  (Port 5000)│     │   MySQL     │\r\n└──────┬──────┘     └─────────────┘\r\n       │ Enqueue\r\n       ▼\r\n┌─────────────┐     ┌─────────────┐\r\n│    Redis    │────▶│  RQ Worker  │\r\n│   Queue     │     │ (Background)│\r\n└─────────────┘     └─────────────┘\r\n```\r\n\r\n## 📝 Docker Services\r\n\r\n```bash\r\n# Start all services\r\ndocker-compose up -d\r\n\r\n# Start only Redis (for SQLite setup)\r\ndocker-compose up -d redis\r\n```\r\n\r\nServices:\r\n- **PostgreSQL:** localhost:5432\r\n- **Redis:** localhost:6379\r\n- **pgAdmin:** http://localhost:5050 (admin@webhooks.local / admin)\r\n\r\n## 🔒 Production Recommendations\r\n\r\n- Use PostgreSQL or MySQL for production workloads\r\n- Generate a strong SECRET_KEY\r\n- Enable HTTPS with valid certificates\r\n- Set up firewall rules\r\n- Use environment variables for secrets\r\n\r\n## 📄 License\r\n\r\nMIT License - see `LICENSE` file for details.\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsuleman-elahi%2Fwhook","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsuleman-elahi%2Fwhook","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsuleman-elahi%2Fwhook/lists"}