4 Commits

Author SHA1 Message Date
cc519e4cee DOCS: Updated README & ROADMAP
All checks were successful
Close Stale Issues / stale (push) Successful in 3s
2026-02-17 21:27:56 +00:00
3c8903ac66 DOCS: Updated the Issue templates to YAMLs for form like issue entry 2026-02-17 21:09:34 +00:00
4ec2e822f2 FIX: echo "$ISSUES" | while ... passes a single empty line to the loop
All checks were successful
Close Stale Issues / stale (push) Successful in 3s
2026-02-16 11:30:42 +00:00
6e1a887539 FIX: INTERNAL_ERROR in checkout and Auto-assign bugs 2026-02-16 11:25:58 +00:00
13 changed files with 788 additions and 429 deletions

View File

@@ -1,46 +0,0 @@
---
name: 🐛 Bug Report
about: Report a bug or unexpected behavior
title: '[BUG] '
labels: bug, status:investigating
assignees: ''
---
## Bug Description
<!-- A clear description of what the bug is -->
## Steps to Reproduce
1.
2.
3.
## Expected Behavior
<!-- What you expected to happen -->
## Actual Behavior
<!-- What actually happened -->
## Environment
- **Subscription Tier**: Sandbox / Indie / Studio / Enterprise
- **Endpoint Used**: (e.g., POST /api/v1/webhooks/stripe/...)
- **Timestamp**: (e.g., 2026-02-13T10:30:00Z)
- **Event ID** (if applicable): evt_...
- **Browser** (if dashboard issue): Chrome / Firefox / Safari / Edge
## Screenshots / Logs
<!-- If applicable, add screenshots or error logs -->
```
Paste logs here
```
## Additional Context
<!-- Any other context about the problem -->
## Workaround
<!-- If you found a temporary workaround, share it here -->
---
**⚠️ SECURITY WARNING**
Do NOT include API keys, secrets, or sensitive customer data.
For security issues, email security@evercatch.dev instead.

View File

@@ -0,0 +1,112 @@
name: 🐛 Bug Report
about: Report a bug or unexpected behavior
title: '[BUG] '
labels: ['bug', 'status:investigating']
body:
- type: markdown
attributes:
value: |
> **⚠️ SECURITY WARNING:** Do NOT include API keys, secrets, or sensitive customer data.
> For security issues, email **security@evercatch.dev** instead.
- type: textarea
id: description
attributes:
label: Bug Description
description: A clear description of what the bug is.
placeholder: Describe the bug...
validations:
required: true
- type: textarea
id: steps
attributes:
label: Steps to Reproduce
description: Step-by-step instructions to reproduce the behavior.
placeholder: |
1.
2.
3.
validations:
required: true
- type: textarea
id: expected
attributes:
label: Expected Behavior
description: What you expected to happen.
placeholder: I expected...
validations:
required: true
- type: textarea
id: actual
attributes:
label: Actual Behavior
description: What actually happened.
placeholder: Instead, what happened was...
validations:
required: true
- type: dropdown
id: tier
attributes:
label: Subscription Tier
options:
- Sandbox (Free)
- Indie
- Studio
- Enterprise
validations:
required: true
- type: input
id: endpoint
attributes:
label: Endpoint Used
description: The API endpoint related to this bug.
placeholder: 'e.g. POST /api/v1/webhooks/stripe/...'
- type: input
id: timestamp
attributes:
label: Timestamp
description: When did this occur?
placeholder: 'e.g. 2026-02-13T10:30:00Z'
- type: input
id: event-id
attributes:
label: Event ID (if applicable)
placeholder: 'e.g. evt_...'
- type: dropdown
id: browser
attributes:
label: Browser (if dashboard issue)
options:
- N/A
- Chrome
- Firefox
- Safari
- Edge
- Other
- type: textarea
id: logs
attributes:
label: Screenshots / Logs
description: If applicable, paste error logs or describe screenshots.
render: shell
- type: textarea
id: workaround
attributes:
label: Workaround
description: If you found a temporary workaround, share it here.
- type: textarea
id: context
attributes:
label: Additional Context
description: Any other context about the problem.

View File

@@ -1,45 +0,0 @@
---
name: 📚 Documentation Issue
about: Report missing, incorrect, or unclear documentation
title: '[DOCS] '
labels: documentation
assignees: ''
---
## Documentation Page
<!-- Link to the docs page with the issue -->
https://docs.evercatch.dev/...
## Issue Type
- [ ] Missing documentation
- [ ] Incorrect information
- [ ] Unclear/confusing explanation
- [ ] Broken link
- [ ] Code example doesn't work
- [ ] Typo/grammar
- [ ] Outdated information
## Description
<!-- What's wrong with the docs? -->
## Current Content
<!-- Quote the current problematic content -->
```
Current text/code here
```
## Suggested Fix
<!-- How would you improve it? -->
```
Suggested text/code here
```
## Additional Context
<!-- Screenshots, correct information, working examples, etc. -->
## Impact
<!-- How does this affect users? -->
- [ ] Critical - Causes errors if followed
- [ ] High - Likely to confuse users
- [ ] Medium - Could be clearer
- [ ] Low - Minor improvement

View File

@@ -0,0 +1,68 @@
name: 📚 Documentation Issue
about: Report missing, incorrect, or unclear documentation
title: '[DOCS] '
labels: ['documentation']
body:
- type: input
id: page-url
attributes:
label: Documentation Page
description: Link to the docs page with the issue.
placeholder: 'https://docs.evercatch.dev/...'
validations:
required: true
- type: checkboxes
id: issue-type
attributes:
label: Issue Type
options:
- label: Missing documentation
- label: Incorrect information
- label: Unclear/confusing explanation
- label: Broken link
- label: Code example doesn't work
- label: Typo/grammar
- label: Outdated information
- type: textarea
id: description
attributes:
label: Description
description: What's wrong with the docs?
placeholder: The problem is...
validations:
required: true
- type: textarea
id: current
attributes:
label: Current Content
description: Quote the current problematic content.
render: markdown
- type: textarea
id: suggested
attributes:
label: Suggested Fix
description: How would you improve it?
render: markdown
- type: textarea
id: context
attributes:
label: Additional Context
description: Screenshots, correct information, working examples, etc.
- type: dropdown
id: impact
attributes:
label: Impact
description: How does this affect users?
options:
- Critical - Causes errors if followed
- High - Likely to confuse users
- Medium - Could be clearer
- Low - Minor improvement
validations:
required: true

View File

@@ -1,54 +0,0 @@
---
name: ✨ Feature Request
about: Suggest a new feature or enhancement
title: '[FEATURE] '
labels: feature
assignees: ''
---
## Problem Statement
<!-- What problem does this feature solve? -->
## Proposed Solution
<!-- Describe your ideal solution -->
## Use Case
<!-- How would you use this feature? Be specific. -->
**Example scenario:**
```
When I... [describe situation]
I want to... [describe action]
So that... [describe benefit]
```
## Current Workaround
<!-- How are you currently handling this? -->
## Tier Relevance
<!-- Which subscription tier would benefit most? -->
- [ ] Sandbox (Free)
- [ ] Indie
- [ ] Studio
- [ ] Enterprise
- [ ] All tiers
## Similar Features
<!-- Have you seen this feature in other products? -->
## Additional Context
<!-- Screenshots, mockups, examples from competitors, etc. -->
## Impact
<!-- How important is this feature to you? -->
- [ ] Critical - Blocking my business
- [ ] High - Very useful
- [ ] Medium - Nice to have
- [ ] Low - Just an idea
## Willingness to Pay
<!-- Would you upgrade your tier for this feature? -->
- [ ] Yes, I would upgrade immediately
- [ ] Yes, I would consider upgrading
- [ ] No, but it would improve my experience
- [ ] N/A - Already on Enterprise

View File

@@ -0,0 +1,90 @@
name: ✨ Feature Request
about: Suggest a new feature or enhancement
title: '[FEATURE] '
labels: ['feature']
body:
- type: textarea
id: problem
attributes:
label: Problem Statement
description: What problem does this feature solve?
placeholder: I'm frustrated when...
validations:
required: true
- type: textarea
id: solution
attributes:
label: Proposed Solution
description: Describe your ideal solution.
placeholder: I would like...
validations:
required: true
- type: textarea
id: use-case
attributes:
label: Use Case
description: How would you use this feature? Be specific.
placeholder: |
When I... [describe situation]
I want to... [describe action]
So that... [describe benefit]
validations:
required: true
- type: textarea
id: workaround
attributes:
label: Current Workaround
description: How are you currently handling this?
- type: checkboxes
id: tier
attributes:
label: Tier Relevance
description: Which subscription tier(s) would benefit most?
options:
- label: Sandbox (Free)
- label: Indie
- label: Studio
- label: Enterprise
- label: All tiers
- type: textarea
id: similar
attributes:
label: Similar Features
description: Have you seen this feature in other products?
- type: textarea
id: context
attributes:
label: Additional Context
description: Screenshots, mockups, examples from competitors, etc.
- type: dropdown
id: impact
attributes:
label: Impact
description: How important is this feature to you?
options:
- Critical - Blocking my business
- High - Very useful
- Medium - Nice to have
- Low - Just an idea
validations:
required: true
- type: dropdown
id: willingness
attributes:
label: Willingness to Pay
description: Would you upgrade your tier for this feature?
options:
- 'Yes, I would upgrade immediately'
- 'Yes, I would consider upgrading'
- No, but it would improve my experience
- N/A - Already on Enterprise
validations:
required: true

View File

@@ -1,44 +0,0 @@
---
name: 🔐 Security Vulnerability
about: Report a security issue (PRIVATE - use email instead)
title: 'DO NOT USE - Email security@evercatch.dev'
labels: security
assignees: ''
---
# ⚠️ STOP - DO NOT USE THIS TEMPLATE
**Security vulnerabilities should NOT be reported publicly.**
Please email us instead: **security@evercatch.dev**
## Why?
Public disclosure of security issues can:
- Put user data at risk
- Allow attackers to exploit the vulnerability
- Violate responsible disclosure practices
## What to Include in Your Email
- **Description** - What is the vulnerability?
- **Steps to Reproduce** - How can we reproduce it?
- **Impact** - What could an attacker do?
- **Proof of Concept** - Code or screenshots (optional)
- **Suggested Fix** - If you have one
- **Your Contact Info** - For follow-up
## Our Commitment
- ✅ Response within 24 hours
- ✅ Updates every 48 hours
- ✅ Credit in security advisories (if desired)
- ✅ Potential bug bounty (for critical issues)
## Security Policy
Read our full security policy: [SECURITY.md](../../SECURITY.md)
---
**Thank you for keeping Evercatch secure!** 🔒

View File

@@ -0,0 +1,56 @@
name: 🔐 Security Vulnerability
about: Report a security issue (PRIVATE - use email instead)
title: 'DO NOT USE - Email security@evercatch.dev'
labels: ['security']
body:
- type: markdown
attributes:
value: |
# ⚠️ STOP — DO NOT USE THIS TEMPLATE
**Security vulnerabilities should NOT be reported publicly.**
Please email us instead: **security@evercatch.dev**
---
### Why?
Public disclosure of security issues can:
- Put user data at risk
- Allow attackers to exploit the vulnerability before a fix is ready
- Violate responsible disclosure practices
---
### What to Include in Your Email
- **Description** — What is the vulnerability?
- **Steps to Reproduce** — How can we reproduce it?
- **Impact** — What could an attacker do?
- **Proof of Concept** — Code or screenshots (optional)
- **Suggested Fix** — If you have one
- **Your Contact Info** — For follow-up
---
### Our Commitment
- ✅ Response within 24 hours
- ✅ Updates every 48 hours
- ✅ Credit in security advisories (if desired)
- ✅ Potential bug bounty for critical issues
Read our full security policy: [SECURITY.md](../../SECURITY.md)
---
**Thank you for keeping Evercatch secure! 🔒**
- type: checkboxes
id: acknowledge
attributes:
label: Acknowledgement
options:
- label: I understand I should email security@evercatch.dev instead of using this form.
required: true

View File

@@ -1,52 +0,0 @@
---
name: ❓ Support Request
about: Get help with using Evercatch
title: '[SUPPORT] '
labels: question
assignees: ''
---
## Issue Summary
<!-- Brief description of what you need help with -->
## What I'm Trying to Do
<!-- Describe your goal -->
## What I've Tried
<!-- List what you've already attempted -->
1.
2.
3.
## Account Information
- **Email**: (your account email)
- **User ID** (if known):
- **Subscription Tier**: Sandbox / Indie / Studio / Enterprise
## Relevant Documentation
<!-- Links to docs you've read -->
- [ ] I've searched [docs.evercatch.dev](https://docs.evercatch.dev)
- [ ] I've checked [existing issues](../../issues)
- [ ] I've reviewed the [API docs](https://docs.evercatch.dev/api)
## Error Messages
<!-- If applicable, paste any error messages -->
```
Paste error here
```
## Questions
1.
2.
## Screenshots
<!-- If applicable, add screenshots -->
---
**💡 TIP:** Before opening a support ticket, check:
- [Documentation](https://docs.evercatch.dev)
- [API Reference](https://docs.evercatch.dev/api)
- [Existing Issues](../../issues)
- [Status Page](https://status.evercatch.dev)

View File

@@ -0,0 +1,95 @@
name: ❓ Support Request
about: Get help with using Evercatch
title: '[SUPPORT] '
labels: ['question']
body:
- type: markdown
attributes:
value: |
**💡 Before opening a ticket, please check:**
[Documentation](https://docs.evercatch.dev) · [API Reference](https://docs.evercatch.dev/api) · [Existing Issues](../../issues) · [Status Page](https://status.evercatch.dev)
- type: textarea
id: summary
attributes:
label: Issue Summary
description: Brief description of what you need help with.
placeholder: I need help with...
validations:
required: true
- type: textarea
id: goal
attributes:
label: What I'm Trying to Do
description: Describe your goal.
placeholder: My goal is to...
validations:
required: true
- type: textarea
id: tried
attributes:
label: What I've Tried
description: List what you've already attempted.
placeholder: |
1.
2.
3.
validations:
required: true
- type: input
id: email
attributes:
label: Account Email
placeholder: you@example.com
- type: input
id: user-id
attributes:
label: User ID (if known)
placeholder: usr_...
- type: dropdown
id: tier
attributes:
label: Subscription Tier
options:
- Sandbox (Free)
- Indie
- Studio
- Enterprise
validations:
required: true
- type: checkboxes
id: docs-checked
attributes:
label: Relevant Documentation
description: Please confirm you've checked these resources.
options:
- label: I've searched [docs.evercatch.dev](https://docs.evercatch.dev)
- label: I've checked [existing issues](../../issues)
- label: I've reviewed the [API docs](https://docs.evercatch.dev/api)
- type: textarea
id: errors
attributes:
label: Error Messages
description: If applicable, paste any error messages.
render: shell
- type: textarea
id: questions
attributes:
label: Questions
placeholder: |
1.
2.
- type: textarea
id: screenshots
attributes:
label: Screenshots
description: If applicable, describe or attach screenshots.

View File

@@ -20,45 +20,38 @@ jobs:
THIRTY_DAYS_AGO_SEC=$(date -d '30 days ago' '+%s')
# Get all open issues sorted by oldest update first
# REMOVED 'since' because it filters for NEWER issues
ISSUES=$(curl -s -H "Authorization: token $API_TOKEN" "$API_BASE_URL/repos/$REPO/issues?state=open&sort=updated&order=asc" | jq -c '.[]')
# Check if we have issues to process
# Safety Check 1: Exit if no issues found
if [ -z "$ISSUES" ]; then
echo "No open issues found."
exit 0
fi
echo "$ISSUES" | while IFS= read -r issue; do
# Prevent processing empty lines
# Safety Check 2: Skip empty lines
if [ -z "$issue" ]; then continue; fi
ISSUE_NUMBER=$(echo "$issue" | jq -r '.number')
UPDATED_AT=$(echo "$issue" | jq -r '.updated_at')
# Convert issue update time to seconds
UPDATED_AT_SEC=$(date -d "$UPDATED_AT" '+%s')
# LOGIC CHECK: If the issue is newer than 30 days, stop (since list is sorted asc)
# Stop processing if we reach issues newer than 30 days
if [ "$UPDATED_AT_SEC" -gt "$THIRTY_DAYS_AGO_SEC" ]; then
# Found an issue updated recently, so we are done with the old ones
continue
continue
fi
HAS_STALE_LABEL=$(echo "$issue" | jq -r '.labels[] | select(.name == "status: stale") | .name')
# Skip if already has stale label
if [ -n "$HAS_STALE_LABEL" ]; then
continue
fi
echo "Marking issue #$ISSUE_NUMBER as stale (last updated: $UPDATED_AT)"
# Add stale label
LABELS='{"labels": ["status: stale"]}'
curl -s -f -X POST -H "Authorization: token $API_TOKEN" -H "Content-Type: application/json" -d "$LABELS" "$API_BASE_URL/repos/$REPO/issues/$ISSUE_NUMBER/labels"
# Add stale comment
STALE_MSG="This issue has been automatically marked as stale because it has not had recent activity.\n\nIt will be closed in **14 days** if no further activity occurs.\n\nIf this issue is still relevant, please:\n- Add a comment with updates\n- Remove the \`status: stale\` label\n\nThank you for your contributions! 🙏"
COMMENT_JSON=$(jq -n --arg body "$STALE_MSG" '{"body": $body}')
curl -s -f -X POST -H "Authorization: token $API_TOKEN" -H "Content-Type: application/json" -d "$COMMENT_JSON" "$API_BASE_URL/repos/$REPO/issues/$ISSUE_NUMBER/comments"
@@ -66,25 +59,30 @@ jobs:
- name: Close stale issues
run: |
# Issues marked stale for 14+ days
FOURTEEN_DAYS_AGO=$(date -u -d '14 days ago' '+%Y-%m-%dT%H:%M:%SZ')
# Get stale issues
ISSUES=$(curl -s -H "Authorization: token $API_TOKEN" "$API_BASE_URL/repos/$REPO/issues?state=open&labels=status:stale" | jq -c '.[]')
# FIX: Check if list is empty
if [ -z "$ISSUES" ]; then
echo "No stale issues found to close."
exit 0
fi
echo "$ISSUES" | while IFS= read -r issue; do
# FIX: Check for empty line
if [ -z "$issue" ]; then continue; fi
ISSUE_NUMBER=$(echo "$issue" | jq -r '.number')
UPDATED_AT=$(echo "$issue" | jq -r '.updated_at')
# Check if updated_at is older than 14 days
if [[ "$UPDATED_AT" < "$FOURTEEN_DAYS_AGO" ]]; then
echo "Closing stale issue #$ISSUE_NUMBER (last updated: $UPDATED_AT)"
# Close the issue
CLOSE_JSON='{"state": "closed"}'
curl -s -f -X PATCH -H "Authorization: token $API_TOKEN" -H "Content-Type: application/json" -d "$CLOSE_JSON" "$API_BASE_URL/repos/$REPO/issues/$ISSUE_NUMBER"
# Add closing comment
CLOSE_MSG="This issue was automatically closed due to inactivity.\n\nIf you believe this was closed in error, please:\n1. Reopen the issue\n2. Provide updated information\n3. Remove the \`status: stale\` label\n\nThank you! 🙏"
COMMENT_JSON=$(jq -n --arg body "$CLOSE_MSG" '{"body": $body}')
curl -s -f -X POST -H "Authorization: token $API_TOKEN" -H "Content-Type: application/json" -d "$COMMENT_JSON" "$API_BASE_URL/repos/$REPO/issues/$ISSUE_NUMBER/comments"
@@ -93,21 +91,29 @@ jobs:
- name: Remove stale label on activity
run: |
# Get stale issues that were recently updated
ISSUES=$(curl -s -H "Authorization: token $API_TOKEN" "$API_BASE_URL/repos/$REPO/issues?state=open&labels=status:stale" | jq -c '.[]')
# FIX: Check if list is empty
if [ -z "$ISSUES" ]; then
echo "No stale issues found to check for activity."
exit 0
fi
echo "$ISSUES" | while IFS= read -r issue; do
# FIX: Check for empty line
if [ -z "$issue" ]; then continue; fi
ISSUE_NUMBER=$(echo "$issue" | jq -r '.number')
# Get comments
COMMENTS=$(curl -s -H "Authorization: token $API_TOKEN" "$API_BASE_URL/repos/$REPO/issues/$ISSUE_NUMBER/comments")
LATEST_COMMENT_AUTHOR=$(echo "$COMMENTS" | jq -r '.[-1].user.login')
LATEST_COMMENT_AUTHOR=$(echo "$COMMENTS" | jq -r '.[-1].user.login // empty')
# Skip if no comments exist or fetch failed
if [ -z "$LATEST_COMMENT_AUTHOR" ]; then continue; fi
# If latest comment is not from bot, remove stale label
if [ "$LATEST_COMMENT_AUTHOR" != "EC-bot" ] && [ "$LATEST_COMMENT_AUTHOR" != "gitea-actions" ]; then
echo "Removing stale label from issue #$ISSUE_NUMBER (recent activity detected)"
# Get label ID
LABELS=$(curl -s -H "Authorization: token $API_TOKEN" "$API_BASE_URL/repos/$REPO/issues/$ISSUE_NUMBER/labels")
STALE_LABEL_ID=$(echo "$LABELS" | jq -r '.[] | select(.name == "status: stale") | .id')

408
README.md
View File

@@ -1,65 +1,69 @@
<p align="center">
<img src="assets/banner.png" alt="Evercatch Banner" width="800">
</p>
<div align="center">
<p align="center">
<strong>The webhook infrastructure platform for developers who want simplicity without sacrificing power.</strong>
</p>
<img src="assets/banner.png" alt="Evercatch" width="800">
<p align="center">
<a href="https://evercatch.dev">Website</a> •
<a href="https://docs.evercatch.dev">Docs</a> •
<a href="https://app.evercatch.dev">Dashboard</a> •
<a href="https://status.evercatch.dev">Status</a>
</p>
<br/>
<br/>
<img src="https://img.shields.io/badge/STATUS-ALPHA-red?style=flat-square&labelColor=000" alt="ALPHA">
&nbsp;
<img src="https://img.shields.io/badge/BETA-JUNE%202026-orange?style=flat-square&labelColor=000" alt="Beta June 2026">
&nbsp;
<img src="https://img.shields.io/badge/CLOSED%20SOURCE-111?style=flat-square&labelColor=000" alt="Closed Source">
<br/>
<br/>
### Webhook infrastructure that just works.
**One endpoint. Any provider. Reliable delivery.**
Point every webhook at Evercatch. We capture, normalize, and forward them to your app — with retries, history, and zero glue code.
<br/>
[Join the Beta](#-join-the-beta) &nbsp;·&nbsp; [Roadmap](ROADMAP.md) &nbsp;·&nbsp; [Docs](https://docs.evercatch.dev) &nbsp;·&nbsp; [Status](https://status.evercatch.dev) &nbsp;·&nbsp; [Pricing](#-pricing)
</div>
<br/>
> [!WARNING]
> **Evercatch is in active ALPHA development and is not production-ready.** Most external links (docs, dashboard, API, blog) will not be live until the beta launch. Interested in early access? Reach out at [contact@evercatch.dev](mailto:contact@evercatch.dev).
---
> **The webhook infrastructure platform for developers who want simplicity without sacrificing power.**
## The Problem
Evercatch is a modern webhook ingestion and forwarding platform that captures, normalizes, and reliably delivers webhooks from any source to any destination. Built for developers, by developers.
You're wiring up Stripe, SendGrid, GitHub, Shopify — all at once. Each one speaks a different language:
- Different payload schemas
- Different signature verification methods
- Different retry semantics
- No single place to debug, search, or replay events
**You're writing glue code instead of shipping features.**
## The Fix
```
Your Providers → Evercatch → Your App
```
Point every webhook at a single Evercatch endpoint. We handle the rest:
- **Normalize** every payload to a unified schema
- **Validate** signatures so you don't have to
- **Store** events with configurable retention (24h → 90 days)
- **Forward** to your destination with automatic retries and exponential backoff
- **Replay** any event from your dashboard in seconds
---
## 📋 What is Evercatch?
## Quick Start
Evercatch sits between your webhook providers (Stripe, SendGrid, GitHub, etc.) and your application, giving you:
### 1. Create an account
- **📦 Unified Schema** - One normalized format for all webhook providers
- **🔄 Reliable Delivery** - Automatic retries with exponential backoff
- **📊 Event History** - Search, filter, and replay webhooks up to 90 days
- **⚡ Lightning Fast** - Sub-100ms webhook ingestion
- **🔐 Secure by Design** - API key authentication, filtered sensitive data
- **💰 Usage-Based Pricing** - Pay only for what you use, with generous free tier
---
## 💡 Why Evercatch?
### The Problem
You're integrating with multiple services (Stripe for payments, SendGrid for emails, Shopify for orders). Each has:
- Different webhook formats
- Different retry behaviors
- Different ways to verify authenticity
- No central dashboard to debug issues
**You spend more time managing webhooks than building your product.**
### The Evercatch Solution
Point all your webhooks at Evercatch. We:
1. ✅ Receive and validate webhooks from any provider
2. ✅ Normalize them to a unified schema
3. ✅ Store them with intelligent retention (7-90 days)
4. ✅ Forward them to your app with automatic retries
5. ✅ Give you a beautiful dashboard to search, filter, and replay events
**You focus on your product. We handle the webhooks.**
---
## 🚀 Quick Start
### 1. Sign Up
```bash
curl -X POST https://api.evercatch.dev/api/v1/auth/signup \
-H "Content-Type: application/json" \
@@ -70,178 +74,248 @@ curl -X POST https://api.evercatch.dev/api/v1/auth/signup \
}'
```
**Response:**
```json
{
"user": { "id": "550e8400-...", "email": "you@example.com" },
"api_key": {
"api_key": "ec_live_abc123...",
"prefix": "ec_live_abc1"
},
"subscription": { "tier": "sandbox", "status": "trialing" }
"user": { "id": "550e8400-e29b-...", "email": "you@example.com" },
"api_key": { "api_key": "ec_live_abc123...", "prefix": "ec_live_abc1" },
"subscription": { "tier": "sandbox", "status": "active" }
}
```
### 2. Point Your Webhooks at Evercatch
### 2. Point your webhook provider at Evercatch
```
https://api.evercatch.dev/api/v1/webhooks/stripe/550e8400-...
https://api.evercatch.dev/api/v1/webhooks/{provider}/{your-user-id}
```
**Example: Configure Stripe**
1. Go to [Stripe Dashboard → Webhooks](https://dashboard.stripe.com/webhooks)
2. Click "Add Endpoint"
3. Enter: `https://api.evercatch.dev/api/v1/webhooks/stripe/550e8400-...`
4. Select events
5. Add header: `X-API-Key: ec_live_abc123...`
Configure Stripe in 30 seconds:
1. Open [Stripe Dashboard → Webhooks](https://dashboard.stripe.com/webhooks)
2. Add endpoint → paste your Evercatch URL
3. Add header: `X-API-Key: ec_live_abc123...`
4. Select events → done
### 3. Register a destination
### 3. Configure Your Destination
```bash
curl -X POST https://api.evercatch.dev/api/v1/destinations \
-H "X-API-Key: ec_live_abc123..." \
-H "Content-Type: application/json" \
-d '{
"name": "Production API",
"name": "My API",
"url": "https://yourapp.com/webhooks",
"providers": ["stripe"],
"event_types": ["payment.*"]
}'
```
### 4. That's It! 🎉
Evercatch now:
- ✅ Receives webhooks from Stripe
- ✅ Normalizes them to a unified schema
- ✅ Stores them for 24 hours (Sandbox tier)
- ✅ Forwards them to `yourapp.com/webhooks`
- ✅ Retries on failure
Evercatch now receives, normalizes, stores, and forwards every matching event — automatically retrying on failure.
### Or use a native SDK
```python
# Python
from evercatch import Evercatch
ec = Evercatch("ec_live_abc123...")
ec.destinations.create(
name="My API",
url="https://yourapp.com/webhooks",
providers=["stripe"],
event_types=["payment.*"],
)
```
```typescript
// Node.js / TypeScript
import { Evercatch } from "@evercatch/sdk";
const ec = new Evercatch("ec_live_abc123...");
await ec.destinations.create({
name: "My API",
url: "https://yourapp.com/webhooks",
providers: ["stripe"],
eventTypes: ["payment.*"],
});
```
---
## 📊 Pricing
## Integrations
| Plan | Price | Events/mo | Retention | Destinations | Overage |
|------|-------|-----------|-----------|--------------|---------|
| **Sandbox** | €0 | 100k | 24 hours | 2 | — |
| **Indie** | €29 | 1M | 7 days | 10 | €0.50/100k |
| **Studio** | €99 | 10M | 30 days | Unlimited | €0.30/100k |
| **Enterprise** | €299 | 50M | 90 days | Unlimited | €0.20/100k |
We are launching with major integrations from day one, with more coming after beta.
**All plans include:**
- ✅ Unlimited API keys
- ✅ Real-time event forwarding
- ✅ Automatic retries
- ✅ 99.9% uptime SLA
- ✅ Support via email
| Provider | Incoming Webhooks | Signature Verification | Normalized Schema |
|----------|:-----------------:|:---------------------:|:-----------------:|
| **Stripe** | ✅ | ✅ | ✅ |
| **More at launch** | ✅ | ✅ | ✅ |
**Studio+ includes:**
- ✨ Full-text search
- ✨ Advanced filtering
- ✨ Event replay
- ✨ Custom retention
**Enterprise includes:**
- 🚀 Priority support
- 🚀 Custom SLAs
- 🚀 Dedicated Slack channel
- 🚀 SSO/SAML
- 🚀 Custom contracts
[**→ Start Free**](https://evercatch.dev/signup) · [**→ View Full Pricing**](https://evercatch.dev/pricing)
> New integrations are tracked in [ROADMAP.md](ROADMAP.md). Want to see a specific provider? [Request it here](https://git.psmattas.com/Evercatch/.profile/issues/new?template=.gitea%2fissue_template%2ffeature_request.yml).
---
## 🐛 Found a Bug?
## SDKs
We want to fix it! **[→ Report a Bug](../../issues/new?template=bug_report.md)**
Native, idiomatic clients for your language — all built on the same REST API.
Please include:
- Clear steps to reproduce
- Expected vs actual behavior
- Your subscription tier
- Event IDs (if applicable)
| Language | Package | Status |
|----------|---------|--------|
| **Python** | `pip install evercatch` | Launching with beta |
| **Node.js / TypeScript** | `npm install @evercatch/sdk` | Launching with beta |
| **Go** | `go get github.com/evercatch/evercatch-go` | Launching with beta |
| **Ruby** | `gem install evercatch` | Launching with beta |
**Do NOT include API keys or sensitive data.**
All SDKs support the full API surface: destinations, event history, replays, and API key management.
---
## ✨ Have a Feature Idea?
## CLI
We'd love to hear it! **[→ Request a Feature](../../issues/new?template=feature_request.md)**
A first-class CLI tool ships at launch for local development workflows.
Tell us:
- What problem it solves
- How you'd use it
- Which tier would benefit
```bash
# Install
npm install -g @evercatch/cli
# Authenticate
ec auth login
# Forward live events to your local server during development
ec listen --forward http://localhost:3000/webhooks
# Replay a past event
ec events replay evt_01j9x...
# Inspect recent events
ec events list --provider stripe --limit 20
```
The CLI is designed to replace `ngrok` style tunnelling for webhook development — no tunnels needed, just replay and inspect from your terminal.
---
## 🔐 Security Vulnerability?
## Pricing
**DO NOT open a public issue.**
| Plan | Price | Events / mo | Retention | Destinations | Overage |
|------|-------|-------------|-----------|--------------|---------|
| **Sandbox** | Free | 100k | 24 hours | 2 | — |
| **Indie** | €29 / mo | 1M | 7 days | 10 | €0.50 / 100k |
| **Studio** | €99 / mo | 10M | 30 days | Unlimited | €0.30 / 100k |
| **Enterprise** | €299 / mo | 50M | 90 days | Unlimited | €0.20 / 100k |
**Email:** [security@evercatch.dev](mailto:security@evercatch.dev)
<details>
<summary>What's included in each plan</summary>
We'll respond within 24 hours. See our [Security Policy](SECURITY.md) for details.
<br/>
**All plans**
- Unlimited API keys
- Real-time event forwarding
- Automatic retries with exponential backoff
- 99.9% uptime SLA
- Email support
**Studio and above**
- Full-text event search
- Advanced filtering
- Event replay
- Custom retention windows
**Enterprise**
- Priority support + dedicated Slack channel
- Custom SLAs and contracts
- SSO / SAML
- Custom retention and event volume
</details>
[Start Free →](https://evercatch.dev/signup) &nbsp;·&nbsp; [View Full Pricing →](https://evercatch.dev/pricing)
---
## ❓ Need Help?
## Join the Beta
- 📚 **Documentation**: [docs.evercatch.dev](https://docs.evercatch.dev)
- 📧 **Email Support**: [support@evercatch.dev](mailto:support@evercatch.dev)
- 💳 **Billing**: [billing@evercatch.dev](mailto:billing@evercatch.dev)
- **[→ Open a Support Ticket](../../issues/new?template=support_request.md)**
> We are preparing for **beta launch in June 2026** *(tentative)*. See [ROADMAP.md](ROADMAP.md) for details.
We're looking for early developers to test the platform before public launch. Sign up, try it out, and share honest feedback — we'll set you up with a **free Indie or higher subscription** account for the duration of testing.
**To join the beta developer list:**
Send an email to [contact@evercatch.dev](mailto:contact@evercatch.dev) with the subject line **`Beta Dev List`** and a short description of your use case.
We'll follow up with access details as we get closer to launch.
---
## 📚 Resources
## Reference
- **Documentation:** [docs.evercatch.dev](https://docs.evercatch.dev)
- **API Reference:** [docs.evercatch.dev/api](https://docs.evercatch.dev/api)
- **Status Page:** [status.evercatch.dev](https://status.evercatch.dev)
- **Blog:** [blog.evercatch.dev](https://blog.evercatch.dev)
- **Roadmap:** [roadmap.evercatch.dev](https://roadmap.evercatch.dev)
- **Changelog:** [changelog.evercatch.dev](https://changelog.evercatch.dev)
<details>
<summary>Found a bug?</summary>
<br/>
**[→ Open a Bug Report](https://git.psmattas.com/Evercatch/.profile/issues/new?template=.gitea%2fissue_template%2fbug_report.yml)**
Include: steps to reproduce · expected vs actual behaviour · your subscription tier · event IDs if applicable.
Do **not** include API keys or sensitive data in public issues.
</details>
<details>
<summary>Have a feature request?</summary>
<br/>
**[→ Open a Feature Request](https://git.psmattas.com/Evercatch/.profile/issues/new?template=.gitea%2fissue_template%2ffeature_request.yml)**
Tell us what problem it solves, how you'd use it, and which tier it matters most for.
</details>
<details>
<summary>Security vulnerability?</summary>
<br/>
**Do not open a public issue.**
Email [security@evercatch.dev](mailto:security@evercatch.dev) — we respond within 24 hours. See [SECURITY.md](SECURITY.md) for our full disclosure policy and bug bounty details.
</details>
<details>
<summary>Need help?</summary>
<br/>
- [docs.evercatch.dev](https://docs.evercatch.dev) — full documentation
- [support@evercatch.dev](mailto:support@evercatch.dev) — email support
- [billing@evercatch.dev](mailto:billing@evercatch.dev) — billing questions
- [Open a support ticket →](https://git.psmattas.com/Evercatch/.profile/issues/new?template=.gitea%2fissue_template%2fsupport_request.yml)
</details>
<details>
<summary>Legal</summary>
<br/>
[Terms of Service](https://evercatch.dev/terms) &nbsp;·&nbsp; [Privacy Policy](https://evercatch.dev/privacy) &nbsp;·&nbsp; [SLA](https://evercatch.dev/sla) &nbsp;·&nbsp; [Acceptable Use](https://evercatch.dev/acceptable-use)
Community: [Code of Conduct](CODE_OF_CONDUCT.md) — report violations to [conduct@evercatch.dev](mailto:conduct@evercatch.dev)
</details>
---
## 🤝 Contributing
<div align="center">
We welcome community contributions! See [CONTRIBUTING.md](CONTRIBUTING.md) for:
- Bug reports
- Feature requests
- Documentation improvements
- Beta testing
- Integration examples
<br/>
---
**No webhook left behind.**
## 📜 Code of Conduct
<br/>
All community members must follow our [Code of Conduct](CODE_OF_CONDUCT.md).
[evercatch.dev](https://evercatch.dev) &nbsp;·&nbsp; [status.evercatch.dev](https://status.evercatch.dev) &nbsp;·&nbsp; [contact@evercatch.dev](mailto:contact@evercatch.dev)
**TL;DR:** Be respectful, professional, and kind. No harassment, discrimination, or spam.
**Report violations:** [conduct@evercatch.dev](mailto:conduct@evercatch.dev)
---
## ⚖️ Legal
- **Terms of Service:** [evercatch.dev/terms](https://evercatch.dev/terms)
- **Privacy Policy:** [evercatch.dev/privacy](https://evercatch.dev/privacy)
- **SLA:** [evercatch.dev/sla](https://evercatch.dev/sla)
- **Acceptable Use:** [evercatch.dev/acceptable-use](https://evercatch.dev/acceptable-use)
---
<p align="center">
<img src="assets/banner.png" alt="Evercatch Banner" width="800">
<br/>
<strong>No webhook left behind</strong>
<br/><br/>
<a href="https://evercatch.dev">Website</a> •
<a href="https://docs.evercatch.dev">Docs</a> •
<a href="https://app.evercatch.dev">Dashboard</a> •
<a href="https://status.evercatch.dev">Status</a>
</p>
</div>

99
ROADMAP.md Normal file
View File

@@ -0,0 +1,99 @@
<div align="center">
# Evercatch Roadmap
**Beta launch tentatively planned for June 2026.**
This is a high-level overview. Evercatch is a closed-source project — a detailed public roadmap is not available at this time. This document will be updated as we get closer to launch.
</div>
---
> [!CAUTION]
> All timelines are **tentative** and subject to change. Nothing here should be treated as a commitment.
---
## Beta Launch — June 2026 *(tentative)*
The initial beta release is focused on delivering a solid, well-tested core. Here is what we are targeting for day one:
### Integrations
We are launching with major webhook provider integrations from day one. Each integration includes:
- Incoming webhook ingestion
- Cryptographic signature verification
- Payload normalisation to the Evercatch unified schema
Additional integrations will be added in the weeks following beta launch based on community demand.
> Want to see a specific integration? [Request it →](https://git.psmattas.com/Evercatch/.profile/issues/new?template=.gitea%2fissue_template%2ffeature_request.yml)
### Native SDKs
First-party SDK support is shipping with beta:
| SDK | Install | Notes |
|-----|---------|-------|
| **Python** | `pip install evercatch` | Full API coverage |
| **Node.js / TypeScript** | `npm install @evercatch/sdk` | Full API coverage, typed |
| **Go** | `go get github.com/evercatch/evercatch-go` | Full API coverage |
| **Ruby** | `gem install evercatch` | Full API coverage |
All SDKs target the same REST API surface and will be kept in sync with API changes.
### CLI Tool
A dedicated CLI for local development ships at beta launch:
```
@evercatch/cli
```
**Key capabilities:**
- `ec auth login` — authenticate your local environment
- `ec listen` — receive and forward live events to a local server without tunnelling
- `ec events list` — browse recent events with filtering
- `ec events replay <id>` — replay any stored event to any destination
- `ec destinations list / create / delete` — manage destinations from the terminal
The CLI is a first-class tool, not an afterthought. The goal is to make local webhook development fast and debuggable.
### Dashboard & API
- Full web dashboard for event browsing, search, filtering, and replay
- REST API with comprehensive coverage
- API key management with per-key scoping
---
## Join the Beta
We are looking for developers to test Evercatch before public launch. Beta testers who provide **valuable feedback** will receive a **free Indie or higher subscription** account for the duration of testing.
**To get on the list:**
Email [contact@evercatch.dev](mailto:contact@evercatch.dev) with subject line **`Beta Dev List`** and a short description of your use case. We will follow up with access details closer to launch.
For general questions or feedback: [support@evercatch.dev](mailto:support@evercatch.dev)
---
## Post-Beta
We will share more details about the post-beta roadmap after the initial launch. Areas we are actively thinking about include:
- Additional webhook provider integrations
- Extended SDK language support
- Advanced event filtering and routing rules
- Team and organisation features
- Custom webhook transformation pipelines
---
*Last updated: February 2026*
[← Back to README](README.md)