Compare commits
4 Commits
EC-00-Acti
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
cc519e4cee
|
|||
|
3c8903ac66
|
|||
|
4ec2e822f2
|
|||
|
6e1a887539
|
@@ -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.
|
|
||||||
112
.gitea/issue_template/bug_report.yml
Normal file
112
.gitea/issue_template/bug_report.yml
Normal 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.
|
||||||
@@ -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
|
|
||||||
68
.gitea/issue_template/documentation.yml
Normal file
68
.gitea/issue_template/documentation.yml
Normal 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
|
||||||
@@ -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
|
|
||||||
90
.gitea/issue_template/feature_request.yml
Normal file
90
.gitea/issue_template/feature_request.yml
Normal 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
|
||||||
@@ -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!** 🔒
|
|
||||||
56
.gitea/issue_template/security_vulnerability.yml
Normal file
56
.gitea/issue_template/security_vulnerability.yml
Normal 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
|
||||||
@@ -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)
|
|
||||||
95
.gitea/issue_template/support_request.yml
Normal file
95
.gitea/issue_template/support_request.yml
Normal 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.
|
||||||
@@ -16,8 +16,9 @@ jobs:
|
|||||||
PR_AUTHOR: ${{ gitea.actor }}
|
PR_AUTHOR: ${{ gitea.actor }}
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
|
# FIX 1: Use standard short syntax to avoid upstream gitea.com connection errors
|
||||||
- name: Check out repository
|
- name: Check out repository
|
||||||
uses: https://gitea.com/actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
@@ -25,8 +26,15 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
API_URL="$API_BASE_URL/repos/$REPO/pulls/$PR_NUMBER/commits"
|
API_URL="$API_BASE_URL/repos/$REPO/pulls/$PR_NUMBER/commits"
|
||||||
MESSAGES=$(curl -s -H "Authorization: token $API_TOKEN" "$API_URL" | jq -r '.[].commit.message')
|
MESSAGES=$(curl -s -H "Authorization: token $API_TOKEN" "$API_URL" | jq -r '.[].commit.message')
|
||||||
UNIQUE_TYPES=$(echo "$MESSAGES" | grep -oP '^EC-\d+: \K(FEAT|FIX|DOCS|STYLE|REFACTOR|PERF|TEST|CHORE)' | sort -u)
|
|
||||||
if [[ -z "$UNIQUE_TYPES" ]]; then exit 0; fi
|
# FIX 2: Added '|| true' to prevent failure if no matches are found (grep returns 1 on no match)
|
||||||
|
UNIQUE_TYPES=$(echo "$MESSAGES" | grep -oP '^EC-\d+: \K(FEAT|FIX|DOCS|STYLE|REFACTOR|PERF|TEST|CHORE)' | sort -u || true)
|
||||||
|
|
||||||
|
if [[ -z "$UNIQUE_TYPES" ]]; then
|
||||||
|
echo "No semantic commit types found."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
LABELS_JSON=$(echo "$UNIQUE_TYPES" | jq -R '("type: " + (. | ascii_downcase))' | jq -s '{"labels": .}')
|
LABELS_JSON=$(echo "$UNIQUE_TYPES" | jq -R '("type: " + (. | ascii_downcase))' | jq -s '{"labels": .}')
|
||||||
ISSUES_API_URL="$API_BASE_URL/repos/$REPO/issues/$PR_NUMBER/labels"
|
ISSUES_API_URL="$API_BASE_URL/repos/$REPO/issues/$PR_NUMBER/labels"
|
||||||
curl -s -f -X POST -H "Authorization: token $API_TOKEN" -H "Content-Type: application/json" -d "$LABELS_JSON" "$ISSUES_API_URL"
|
curl -s -f -X POST -H "Authorization: token $API_TOKEN" -H "Content-Type: application/json" -d "$LABELS_JSON" "$ISSUES_API_URL"
|
||||||
@@ -66,10 +74,15 @@ jobs:
|
|||||||
|
|
||||||
- name: Auto-assign reviewers
|
- name: Auto-assign reviewers
|
||||||
run: |
|
run: |
|
||||||
REVIEWERS_JSON='{ "reviewers": ["psmattas"] }'
|
target_reviewer="psmattas"
|
||||||
|
|
||||||
if [[ -n "$REVIEWERS_JSON" ]]; then
|
# FIX 3: Check if the author is the target reviewer to avoid API error (422)
|
||||||
echo "Requesting review from: $REVIEWERS_JSON"
|
if [[ "$PR_AUTHOR" == "$target_reviewer" ]]; then
|
||||||
|
echo "Author is $target_reviewer. Skipping self-review request."
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
REVIEWERS_JSON="{\"reviewers\": [\"$target_reviewer\"]}"
|
||||||
|
echo "Requesting review from: $target_reviewer"
|
||||||
API_URL="$API_BASE_URL/repos/$REPO/pulls/$PR_NUMBER/requested_reviewers"
|
API_URL="$API_BASE_URL/repos/$REPO/pulls/$PR_NUMBER/requested_reviewers"
|
||||||
curl -s -f -X POST -H "Authorization: token $API_TOKEN" -H "Content-Type: application/json" -d "$REVIEWERS_JSON" "$API_URL"
|
curl -s -f -X POST -H "Authorization: token $API_TOKEN" -H "Content-Type: application/json" -d "$REVIEWERS_JSON" "$API_URL"
|
||||||
fi
|
|
||||||
|
|||||||
@@ -16,29 +16,42 @@ jobs:
|
|||||||
steps:
|
steps:
|
||||||
- name: Mark stale issues
|
- name: Mark stale issues
|
||||||
run: |
|
run: |
|
||||||
# Issues with no activity for 30 days
|
# Calculate timestamp for 30 days ago (seconds since epoch for comparison)
|
||||||
THIRTY_DAYS_AGO=$(date -u -d '30 days ago' '+%Y-%m-%dT%H:%M:%SZ')
|
THIRTY_DAYS_AGO_SEC=$(date -d '30 days ago' '+%s')
|
||||||
|
|
||||||
# Get all open issues updated before 30 days ago
|
# Get all open issues sorted by oldest update first
|
||||||
ISSUES=$(curl -s -H "Authorization: token $API_TOKEN" "$API_BASE_URL/repos/$REPO/issues?state=open&since=$THIRTY_DAYS_AGO&sort=updated&order=asc" | jq -c '.[]')
|
ISSUES=$(curl -s -H "Authorization: token $API_TOKEN" "$API_BASE_URL/repos/$REPO/issues?state=open&sort=updated&order=asc" | jq -c '.[]')
|
||||||
|
|
||||||
|
# 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
|
echo "$ISSUES" | while IFS= read -r issue; do
|
||||||
|
# Safety Check 2: Skip empty lines
|
||||||
|
if [ -z "$issue" ]; then continue; fi
|
||||||
|
|
||||||
ISSUE_NUMBER=$(echo "$issue" | jq -r '.number')
|
ISSUE_NUMBER=$(echo "$issue" | jq -r '.number')
|
||||||
UPDATED_AT=$(echo "$issue" | jq -r '.updated_at')
|
UPDATED_AT=$(echo "$issue" | jq -r '.updated_at')
|
||||||
|
UPDATED_AT_SEC=$(date -d "$UPDATED_AT" '+%s')
|
||||||
|
|
||||||
|
# Stop processing if we reach issues newer than 30 days
|
||||||
|
if [ "$UPDATED_AT_SEC" -gt "$THIRTY_DAYS_AGO_SEC" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
HAS_STALE_LABEL=$(echo "$issue" | jq -r '.labels[] | select(.name == "status: stale") | .name')
|
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
|
if [ -n "$HAS_STALE_LABEL" ]; then
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "Marking issue #$ISSUE_NUMBER as stale (last updated: $UPDATED_AT)"
|
echo "Marking issue #$ISSUE_NUMBER as stale (last updated: $UPDATED_AT)"
|
||||||
|
|
||||||
# Add stale label
|
|
||||||
LABELS='{"labels": ["status: stale"]}'
|
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"
|
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! 🙏"
|
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}')
|
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"
|
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"
|
||||||
@@ -46,25 +59,30 @@ jobs:
|
|||||||
|
|
||||||
- name: Close stale issues
|
- name: Close stale issues
|
||||||
run: |
|
run: |
|
||||||
# Issues marked stale for 14+ days
|
|
||||||
FOURTEEN_DAYS_AGO=$(date -u -d '14 days ago' '+%Y-%m-%dT%H:%M:%SZ')
|
FOURTEEN_DAYS_AGO=$(date -u -d '14 days ago' '+%Y-%m-%dT%H:%M:%SZ')
|
||||||
|
|
||||||
# Get stale issues
|
# Get stale issues
|
||||||
ISSUES=$(curl -s -H "Authorization: token $API_TOKEN" "$API_BASE_URL/repos/$REPO/issues?state=open&labels=status:stale" | jq -c '.[]')
|
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
|
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')
|
ISSUE_NUMBER=$(echo "$issue" | jq -r '.number')
|
||||||
UPDATED_AT=$(echo "$issue" | jq -r '.updated_at')
|
UPDATED_AT=$(echo "$issue" | jq -r '.updated_at')
|
||||||
|
|
||||||
# Check if updated_at is older than 14 days
|
|
||||||
if [[ "$UPDATED_AT" < "$FOURTEEN_DAYS_AGO" ]]; then
|
if [[ "$UPDATED_AT" < "$FOURTEEN_DAYS_AGO" ]]; then
|
||||||
echo "Closing stale issue #$ISSUE_NUMBER (last updated: $UPDATED_AT)"
|
echo "Closing stale issue #$ISSUE_NUMBER (last updated: $UPDATED_AT)"
|
||||||
|
|
||||||
# Close the issue
|
|
||||||
CLOSE_JSON='{"state": "closed"}'
|
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"
|
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! 🙏"
|
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}')
|
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"
|
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"
|
||||||
@@ -73,21 +91,29 @@ jobs:
|
|||||||
|
|
||||||
- name: Remove stale label on activity
|
- name: Remove stale label on activity
|
||||||
run: |
|
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 '.[]')
|
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
|
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')
|
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")
|
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
|
if [ "$LATEST_COMMENT_AUTHOR" != "EC-bot" ] && [ "$LATEST_COMMENT_AUTHOR" != "gitea-actions" ]; then
|
||||||
echo "Removing stale label from issue #$ISSUE_NUMBER (recent activity detected)"
|
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")
|
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')
|
STALE_LABEL_ID=$(echo "$LABELS" | jq -r '.[] | select(.name == "status: stale") | .id')
|
||||||
|
|
||||||
|
|||||||
470
README.md
470
README.md
@@ -1,65 +1,69 @@
|
|||||||
<p align="center">
|
<div align="center">
|
||||||
<img src="assets/banner.png" alt="Evercatch Banner" width="800">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
<img src="assets/banner.png" alt="Evercatch" width="800">
|
||||||
<strong>The webhook infrastructure platform for developers who want simplicity without sacrificing power.</strong>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
<br/>
|
||||||
<a href="https://evercatch.dev">Website</a> •
|
<br/>
|
||||||
<a href="https://docs.evercatch.dev">Docs</a> •
|
|
||||||
<a href="https://app.evercatch.dev">Dashboard</a> •
|
<img src="https://img.shields.io/badge/STATUS-ALPHA-red?style=flat-square&labelColor=000" alt="ALPHA">
|
||||||
<a href="https://status.evercatch.dev">Status</a>
|
|
||||||
</p>
|
<img src="https://img.shields.io/badge/BETA-JUNE%202026-orange?style=flat-square&labelColor=000" alt="Beta June 2026">
|
||||||
|
|
||||||
|
<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) · [Roadmap](ROADMAP.md) · [Docs](https://docs.evercatch.dev) · [Status](https://status.evercatch.dev) · [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
|
```bash
|
||||||
curl -X POST https://api.evercatch.dev/api/v1/auth/signup \
|
curl -X POST https://api.evercatch.dev/api/v1/auth/signup \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
@@ -70,178 +74,248 @@ curl -X POST https://api.evercatch.dev/api/v1/auth/signup \
|
|||||||
}'
|
}'
|
||||||
```
|
```
|
||||||
|
|
||||||
**Response:**
|
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"user": { "id": "550e8400-...", "email": "you@example.com" },
|
"user": { "id": "550e8400-e29b-...", "email": "you@example.com" },
|
||||||
"api_key": {
|
"api_key": { "api_key": "ec_live_abc123...", "prefix": "ec_live_abc1" },
|
||||||
"api_key": "ec_live_abc123...",
|
"subscription": { "tier": "sandbox", "status": "active" }
|
||||||
"prefix": "ec_live_abc1"
|
|
||||||
},
|
|
||||||
"subscription": { "tier": "sandbox", "status": "trialing" }
|
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### 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**
|
Configure Stripe in 30 seconds:
|
||||||
1. Go to [Stripe Dashboard → Webhooks](https://dashboard.stripe.com/webhooks)
|
1. Open [Stripe Dashboard → Webhooks](https://dashboard.stripe.com/webhooks)
|
||||||
2. Click "Add Endpoint"
|
2. Add endpoint → paste your Evercatch URL
|
||||||
3. Enter: `https://api.evercatch.dev/api/v1/webhooks/stripe/550e8400-...`
|
3. Add header: `X-API-Key: ec_live_abc123...`
|
||||||
4. Select events
|
4. Select events → done
|
||||||
5. Add header: `X-API-Key: ec_live_abc123...`
|
|
||||||
|
### 3. Register a destination
|
||||||
|
|
||||||
### 3. Configure Your Destination
|
|
||||||
```bash
|
```bash
|
||||||
curl -X POST https://api.evercatch.dev/api/v1/destinations \
|
curl -X POST https://api.evercatch.dev/api/v1/destinations \
|
||||||
-H "X-API-Key: ec_live_abc123..." \
|
-H "X-API-Key: ec_live_abc123..." \
|
||||||
-H "Content-Type: application/json" \
|
-H "Content-Type: application/json" \
|
||||||
-d '{
|
-d '{
|
||||||
"name": "Production API",
|
"name": "My API",
|
||||||
"url": "https://yourapp.com/webhooks",
|
"url": "https://yourapp.com/webhooks",
|
||||||
"providers": ["stripe"],
|
"providers": ["stripe"],
|
||||||
"event_types": ["payment.*"]
|
"event_types": ["payment.*"]
|
||||||
}'
|
}'
|
||||||
```
|
```
|
||||||
|
|
||||||
### 4. That's It! 🎉
|
Evercatch now receives, normalizes, stores, and forwards every matching event — automatically retrying on failure.
|
||||||
Evercatch now:
|
|
||||||
- ✅ Receives webhooks from Stripe
|
### Or use a native SDK
|
||||||
- ✅ Normalizes them to a unified schema
|
|
||||||
- ✅ Stores them for 24 hours (Sandbox tier)
|
```python
|
||||||
- ✅ Forwards them to `yourapp.com/webhooks`
|
# Python
|
||||||
- ✅ Retries on failure
|
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
|
||||||
|
|
||||||
|
We are launching with major integrations from day one, with more coming after beta.
|
||||||
|
|
||||||
|
| Provider | Incoming Webhooks | Signature Verification | Normalized Schema |
|
||||||
|
|----------|:-----------------:|:---------------------:|:-----------------:|
|
||||||
|
| **Stripe** | ✅ | ✅ | ✅ |
|
||||||
|
| **More at launch** | ✅ | ✅ | ✅ |
|
||||||
|
|
||||||
|
> 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).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## SDKs
|
||||||
|
|
||||||
|
Native, idiomatic clients for your language — all built on the same REST API.
|
||||||
|
|
||||||
|
| 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 |
|
||||||
|
|
||||||
|
All SDKs support the full API surface: destinations, event history, replays, and API key management.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## CLI
|
||||||
|
|
||||||
|
A first-class CLI tool ships at launch for local development workflows.
|
||||||
|
|
||||||
|
```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.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Pricing
|
||||||
|
|
||||||
| Plan | Price | Events / mo | Retention | Destinations | Overage |
|
| Plan | Price | Events / mo | Retention | Destinations | Overage |
|
||||||
|------|-------|-----------|-----------|--------------|---------|
|
|------|-------|-------------|-----------|--------------|---------|
|
||||||
| **Sandbox** | €0 | 100k | 24 hours | 2 | — |
|
| **Sandbox** | Free | 100k | 24 hours | 2 | — |
|
||||||
| **Indie** | €29 | 1M | 7 days | 10 | €0.50/100k |
|
| **Indie** | €29 / mo | 1M | 7 days | 10 | €0.50 / 100k |
|
||||||
| **Studio** | €99 | 10M | 30 days | Unlimited | €0.30/100k |
|
| **Studio** | €99 / mo | 10M | 30 days | Unlimited | €0.30 / 100k |
|
||||||
| **Enterprise** | €299 | 50M | 90 days | Unlimited | €0.20/100k |
|
| **Enterprise** | €299 / mo | 50M | 90 days | Unlimited | €0.20 / 100k |
|
||||||
|
|
||||||
**All plans include:**
|
<details>
|
||||||
- ✅ Unlimited API keys
|
<summary>What's included in each plan</summary>
|
||||||
- ✅ Real-time event forwarding
|
|
||||||
- ✅ Automatic retries
|
|
||||||
- ✅ 99.9% uptime SLA
|
|
||||||
- ✅ Support via email
|
|
||||||
|
|
||||||
**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)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🐛 Found a Bug?
|
|
||||||
|
|
||||||
We want to fix it! **[→ Report a Bug](../../issues/new?template=bug_report.md)**
|
|
||||||
|
|
||||||
Please include:
|
|
||||||
- Clear steps to reproduce
|
|
||||||
- Expected vs actual behavior
|
|
||||||
- Your subscription tier
|
|
||||||
- Event IDs (if applicable)
|
|
||||||
|
|
||||||
**Do NOT include API keys or sensitive data.**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✨ Have a Feature Idea?
|
|
||||||
|
|
||||||
We'd love to hear it! **[→ Request a Feature](../../issues/new?template=feature_request.md)**
|
|
||||||
|
|
||||||
Tell us:
|
|
||||||
- What problem it solves
|
|
||||||
- How you'd use it
|
|
||||||
- Which tier would benefit
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔐 Security Vulnerability?
|
|
||||||
|
|
||||||
**DO NOT open a public issue.**
|
|
||||||
|
|
||||||
**Email:** [security@evercatch.dev](mailto:security@evercatch.dev)
|
|
||||||
|
|
||||||
We'll respond within 24 hours. See our [Security Policy](SECURITY.md) for details.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ❓ Need Help?
|
|
||||||
|
|
||||||
- 📚 **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)**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📚 Resources
|
|
||||||
|
|
||||||
- **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)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🤝 Contributing
|
|
||||||
|
|
||||||
We welcome community contributions! See [CONTRIBUTING.md](CONTRIBUTING.md) for:
|
|
||||||
- Bug reports
|
|
||||||
- Feature requests
|
|
||||||
- Documentation improvements
|
|
||||||
- Beta testing
|
|
||||||
- Integration examples
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📜 Code of Conduct
|
|
||||||
|
|
||||||
All community members must follow our [Code of Conduct](CODE_OF_CONDUCT.md).
|
|
||||||
|
|
||||||
**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/>
|
<br/>
|
||||||
<strong>No webhook left behind</strong>
|
|
||||||
<br/><br/>
|
**All plans**
|
||||||
<a href="https://evercatch.dev">Website</a> •
|
- Unlimited API keys
|
||||||
<a href="https://docs.evercatch.dev">Docs</a> •
|
- Real-time event forwarding
|
||||||
<a href="https://app.evercatch.dev">Dashboard</a> •
|
- Automatic retries with exponential backoff
|
||||||
<a href="https://status.evercatch.dev">Status</a>
|
- 99.9% uptime SLA
|
||||||
</p>
|
- 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) · [View Full Pricing →](https://evercatch.dev/pricing)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Join the Beta
|
||||||
|
|
||||||
|
> 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.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Reference
|
||||||
|
|
||||||
|
<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) · [Privacy Policy](https://evercatch.dev/privacy) · [SLA](https://evercatch.dev/sla) · [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>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
**No webhook left behind.**
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
[evercatch.dev](https://evercatch.dev) · [status.evercatch.dev](https://status.evercatch.dev) · [contact@evercatch.dev](mailto:contact@evercatch.dev)
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|||||||
99
ROADMAP.md
Normal file
99
ROADMAP.md
Normal 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)
|
||||||
Reference in New Issue
Block a user