{"id":35202038,"url":"https://github.com/monobilisim/fizzy-webhook-proxy","last_synced_at":"2026-01-18T07:13:05.258Z","repository":{"id":330690314,"uuid":"1118451867","full_name":"monobilisim/fizzy-webhook-proxy","owner":"monobilisim","description":"Fizzy Webhook Proxy is a middleware service that receives webhook requests from Fizzy and forwards them to platforms like Zulip, Google Chat, and Gotify in a proper format.","archived":false,"fork":false,"pushed_at":"2026-01-17T20:01:25.000Z","size":93,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-18T06:49:13.689Z","etag":null,"topics":["fizzy","golang","google-chat","gotify","proxy","webhook","zulip"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/monobilisim.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-12-17T19:23:32.000Z","updated_at":"2026-01-17T20:01:28.000Z","dependencies_parsed_at":"2026-01-17T22:03:28.365Z","dependency_job_id":null,"html_url":"https://github.com/monobilisim/fizzy-webhook-proxy","commit_stats":null,"previous_names":["monobilisim/fizzy-webhook-proxy"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/monobilisim/fizzy-webhook-proxy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monobilisim%2Ffizzy-webhook-proxy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monobilisim%2Ffizzy-webhook-proxy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monobilisim%2Ffizzy-webhook-proxy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monobilisim%2Ffizzy-webhook-proxy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/monobilisim","download_url":"https://codeload.github.com/monobilisim/fizzy-webhook-proxy/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/monobilisim%2Ffizzy-webhook-proxy/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28532766,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T00:39:45.795Z","status":"online","status_checked_at":"2026-01-18T02:00:07.578Z","response_time":98,"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":["fizzy","golang","google-chat","gotify","proxy","webhook","zulip"],"created_at":"2025-12-29T11:57:56.647Z","updated_at":"2026-01-18T07:13:05.253Z","avatar_url":"https://github.com/monobilisim.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Contributors](https://img.shields.io/github/contributors/monobilisim/fizzy-webhook-proxy.svg?style=for-the-badge)](https://github.com/monobilisim/fizzy-webhook-proxy/graphs/contributors)\n[![Forks](https://img.shields.io/github/forks/monobilisim/fizzy-webhook-proxy.svg?style=for-the-badge)](https://github.com/monobilisim/fizzy-webhook-proxy/network/members)\n[![Stargazers](https://img.shields.io/github/stars/monobilisim/fizzy-webhook-proxy.svg?style=for-the-badge)](https://github.com/monobilisim/fizzy-webhook-proxy/stargazers)\n[![Issues](https://img.shields.io/github/issues/monobilisim/fizzy-webhook-proxy.svg?style=for-the-badge)](https://github.com/monobilisim/fizzy-webhook-proxy/issues)\n[![GPL License](https://img.shields.io/github/license/monobilisim/fizzy-webhook-proxy.svg?style=for-the-badge)](https://github.com/monobilisim/fizzy-webhook-proxy/blob/main/LICENSE)\n\n[![Readme in English](https://img.shields.io/badge/Readme-English-blue)](https://github.com/monobilisim/fizzy-webhook-proxy/blob/main/README.md)\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://mono.tr/\"\u003e\n    \u003cimg src=\"https://monobilisim.com.tr/images/mono-bilisim.svg\" width=\"340\" style=\"max-width: 100%;\"\u003e\n  \u003c/a\u003e\n\n## Fizzy Webhook Proxy\n\n\u003c/div\u003e\n\n**Fizzy Webhook Proxy** is a middleware service that receives webhook requests from Fizzy and forwards them to platforms like Zulip, Google Chat, Gotify, and Telegram in a proper format.\n\nStandard Fizzy notifications can be complex or incomplete. This service intercepts messages, cleans them up, organizes headers, and fixes broken comment links.\n\n---\n\n## Features\n\n- **Rich Notifications:** Card views for Google Chat, clean Markdown format for Zulip, Gotify, and Telegram.\n- **Smart Links:** Fixes comment links, redirects to the relevant card and comment ID.\n- **Deduplication:** Prevents the same event from being reported multiple times (2-second window).\n- **Type Auto-Detection:** Automatically detects webhook type from URL pattern.\n- **Token Authentication:** Required URL prefix for security.\n- **Multiple Targets:** Configure different webhooks for different Fizzy boards.\n\n---\n\n## Installation\n\n### Binary Download\n\n```bash\nsudo wget https://github.com/monobilisim/fizzy-webhook-proxy/releases/latest/download/fizzy-webhook-proxy -O /usr/local/bin/fizzy-webhook-proxy\nsudo chmod +x /usr/local/bin/fizzy-webhook-proxy\n```\n\n### Build from Source\n\n```bash\ngit clone https://github.com/monobilisim/fizzy-webhook-proxy.git\ncd fizzy-webhook-proxy\nsudo make install\n```\n\n---\n\n## Configuration\n\nConfiguration can be provided via:\n\n1. **System-wide:** `/etc/default/fizzy-webhook-proxy`\n2. **Local:** `.env` file in the working directory\n\n### Quick Setup\n\n```bash\nsudo wget https://raw.githubusercontent.com/monobilisim/fizzy-webhook-proxy/main/deployment/fizzy-webhook-proxy \\\n  -O /etc/default/fizzy-webhook-proxy\nsudo nano /etc/default/fizzy-webhook-proxy\n```\n\n---\n\n## Environment Variables\n\n### Required Settings\n\n| Variable | Description | Example |\n|----------|-------------|---------|\n| `TOKEN` | **Required.** Security token for URL prefix. All webhook URLs will be `/{TOKEN}/{identifier}` | `my_secret_token` |\n| `PORT` | HTTP server port (default: `3499`) | `3499` |\n\n### Webhook Targets\n\nDefine targets using the pattern `{IDENTIFIER}_URL`. The identifier automatically becomes the URL path.\n\n| Variable Pattern | URL Path | Notes |\n|------------------|----------|-------|\n| `ZULIP_URL` | `/{TOKEN}/zulip` | Single-word identifier |\n| `IDENTIFIER1_URL` | `/{TOKEN}/identifier1` | Generic naming |\n| `MY_TARGET_URL` | `/{TOKEN}/my-target` | Underscores → hyphens in URL |\n| `GOOGLE_CHAT_URL` | `/{TOKEN}/google-chat` | Type auto-detected from URL |\n\n\u003e **Naming Rule:** Environment variable `{IDENTIFIER}_URL` creates endpoint `/{TOKEN}/{identifier}`. Underscores in the identifier become hyphens in the URL path.\n\n**Supported Platforms (Auto-detected):**\n\n| URL Pattern | Platform | Notes |\n|-------------|----------|-------|\n| Contains `slack_incoming` | Zulip | Zulip's Slack-compatible webhook |\n| Contains `chat.googleapis.com` | Google Chat | Google Chat webhook |\n| Contains `/message?token` | Gotify | Gotify push notification |\n| Contains `api.telegram.org` | Telegram | Telegram Bot API (requires `{IDENTIFIER}_CHAT_ID`) |\n\nIf auto-detection fails, set `{IDENTIFIER}_TYPE` explicitly (e.g., `ZULIP_TYPE=zulip`).\n\n### Telegram Configuration\n\nTelegram uses `token` and `chat_id` as query parameters:\n\n| Variable Pattern | Example |\n|------------------|---------|\n| `{IDENTIFIER}_URL` | `https://api.telegram.org/sendMessage?token=\u003cBOT_TOKEN\u003e\u0026chat_id=-1001234567890` |\n\nThe proxy automatically constructs the proper Telegram Bot API URL from these parameters.\n\nTo get your chat ID:\n1. Add your bot to the target chat/channel\n2. Send a message to the chat\n3. Visit `https://api.telegram.org/bot\u003cBOT_TOKEN\u003e/getUpdates`\n4. Find the `chat.id` field in the response\n\n### Fizzy Link Configuration\n\nThese settings are **highly recommended** for proper link generation in notifications:\n\n| Variable | Description | Example |\n|----------|-------------|---------|\n| `FIZZY_ROOT_URL` | Your Fizzy instance URL. Required for correct card/comment links. | `https://fizzy.example.com` |\n| `FIZZY_ACCOUNT_SLUG` | Your Fizzy account slug. Extracted from `FIZZY_ROOT_URL` if not set. | `my-company` |\n\n\u003e **Important:** Without `FIZZY_ROOT_URL`, notification links may point to incorrect domains or use placeholder URLs (`fizzy.example.com`).\n\n### Optional Settings\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `DEBUG` | Enable verbose logging | `false` |\n\n---\n\n## Example Configuration\n\n```bash\n# ==============================================================================\n# REQUIRED SETTINGS\n# ==============================================================================\n\n# HTTP server port (3499 = \"FIZZ\" on phone keypad)\nPORT=3499\n\n# Security token - all webhook URLs will be: /{TOKEN}/{identifier}\nTOKEN=your_secret_token_here\n\n# ==============================================================================\n# FIZZY LINK CONFIGURATION (Recommended)\n# ==============================================================================\n\n# Your Fizzy instance URL - ensures notification links work correctly\nFIZZY_ROOT_URL=https://fizzy.example.com\n\n# Account slug (optional if FIZZY_ROOT_URL contains it)\n# FIZZY_ACCOUNT_SLUG=my-company\n\n# ==============================================================================\n# WEBHOOK TARGETS\n# ==============================================================================\n# Pattern: {IDENTIFIER}_URL=https://...\n# URL path: /{TOKEN}/{identifier} (underscores become hyphens)\n\n# Zulip (auto-detected from \"slack_incoming\" in URL)\nZULIP_URL=https://chat.example.com/api/v1/external/slack_incoming?api_key=KEY\u0026stream=fizzy\u0026topic=notifications\n\n# Google Chat (auto-detected from \"chat.googleapis.com\")\nGOOGLE_CHAT_URL=https://chat.googleapis.com/v1/spaces/SPACE_ID/messages?key=KEY\u0026token=TOKEN\n\n# Gotify (auto-detected from \"/message?token\")\nGOTIFY_URL=https://gotify.example.com/message?token=APP_TOKEN\n\n# Telegram (auto-detected from \"api.telegram.org\")\nTELEGRAM_URL=https://api.telegram.org/sendMessage?token=123456:ABC-DEF\u0026chat_id=-1001234567890\n\n# Multiple targets example\n# IDENTIFIER1_URL=https://chat.example.com/api/v1/external/slack_incoming?...\u0026stream=stream1\n# IDENTIFIER2_URL=https://chat.googleapis.com/v1/spaces/SPACE_ID/messages?...\n# IDENTIFIER3_URL=https://api.telegram.org/sendMessage?token=123456:ABC-DEF\u0026chat_id=-1009999999999\n#\n# Multi-word identifier example (underscores become hyphens in URL path):\n# MY_TARGET_URL=https://...  → endpoint becomes: /{TOKEN}/my-target\n\n# ==============================================================================\n# OPTIONAL SETTINGS\n# ==============================================================================\n\n# Enable debug logging\n# DEBUG=true\n```\n\nThis configuration creates the following webhook endpoints:\n- `https://your-proxy:3499/your_secret_token_here/zulip`\n- `https://your-proxy:3499/your_secret_token_here/google-chat`\n- `https://your-proxy:3499/your_secret_token_here/gotify`\n- `https://your-proxy:3499/your_secret_token_here/telegram`\n- `https://your-proxy:3499/your_secret_token_here/identifier1` (if uncommented)\n- `https://your-proxy:3499/your_secret_token_here/identifier2` (if uncommented)\n- `https://your-proxy:3499/your_secret_token_here/identifier3` (if uncommented, Telegram)\n- `https://your-proxy:3499/your_secret_token_here/my-target` (if uncommented, note: underscore → hyphen)\n\n---\n\n## Systemd Service\n\n### Install Service\n\n```bash\nsudo wget https://raw.githubusercontent.com/monobilisim/fizzy-webhook-proxy/main/deployment/fizzy-webhook-proxy.service \\\n  -O /etc/systemd/system/fizzy-webhook-proxy.service\nsudo systemctl daemon-reload\nsudo systemctl enable --now fizzy-webhook-proxy\n```\n\n### Manage Service\n\n```bash\nsudo systemctl status fizzy-webhook-proxy   # Check status\nsudo systemctl restart fizzy-webhook-proxy  # Restart after config change\nsudo journalctl -u fizzy-webhook-proxy -f   # View logs\n```\n\n---\n\n## Fizzy Webhook Setup\n\n1. Go to your Fizzy project settings\n2. Navigate to **Webhooks** section\n3. Add a new webhook with URL: `https://your-proxy/{TOKEN}/{identifier}`\n4. Select the events you want to receive:\n\n| Event | Description |\n|-------|-------------|\n| `card_created` | New card created |\n| `card_published` | Card published to board |\n| `comment_created` | New comment on a card |\n| `card_moved` | Card moved to different column |\n| `card_board_changed` | Card moved to different board |\n| `card_assigned` | Card assigned to someone |\n| `card_unassigned` | Card unassigned |\n| `card_closed` | Card closed/completed |\n| `card_reopened` | Card reopened |\n| `card_archived` | Card archived |\n| `card_postponed` | Card postponed |\n| `card_sent_back_to_triage` | Card sent back to triage |\n\n---\n\n## Known Limitations\n\n| Limitation | Description | Workaround |\n|------------|-------------|------------|\n| Card title in comments | Fizzy doesn't send card title in `comment_created` events | Proxy extracts card number from URL |\n| Assignee details | `card_assigned` doesn't include assignee name | Shows \"assigned to someone\" |\n| Duplicate events | Fizzy may send the same event twice | 2-second deduplication window |\n| Comment deep links | Direct comment links require search fallback | Links use search with comment anchor |\n\n---\n\n## Troubleshooting\n\n### No notifications received\n\n1. Check service status: `sudo systemctl status fizzy-webhook-proxy`\n2. Verify webhook URL in Fizzy settings matches your configuration\n3. Enable debug mode: `DEBUG=true` and check logs\n\n### Links point to wrong domain\n\nSet `FIZZY_ROOT_URL` to your actual Fizzy instance URL.\n\n### Type detection fails\n\nSet the type explicitly: `{IDENTIFIER}_TYPE=zulip|google-chat|gotify`\n\n---\n\n## License\n\nGPL-3.0 - See [LICENSE](https://github.com/monobilisim/fizzy-webhook-proxy/blob/main/LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmonobilisim%2Ffizzy-webhook-proxy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmonobilisim%2Ffizzy-webhook-proxy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmonobilisim%2Ffizzy-webhook-proxy/lists"}