Compare commits
2 Commits
main
...
EC-00-Acti
| Author | SHA1 | Date | |
|---|---|---|---|
|
4aca6997ff
|
|||
| 08bb82b7ae |
46
.gitea/issue_template/bug_report.md
Normal file
46
.gitea/issue_template/bug_report.md
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
---
|
||||||
|
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.
|
||||||
@@ -1,112 +0,0 @@
|
|||||||
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.
|
|
||||||
45
.gitea/issue_template/documentation.md
Normal file
45
.gitea/issue_template/documentation.md
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
---
|
||||||
|
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
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
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
|
|
||||||
54
.gitea/issue_template/feature_request.md
Normal file
54
.gitea/issue_template/feature_request.md
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
---
|
||||||
|
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
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
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
|
|
||||||
44
.gitea/issue_template/security_vulnerability.md
Normal file
44
.gitea/issue_template/security_vulnerability.md
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
---
|
||||||
|
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!** 🔒
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
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
|
|
||||||
52
.gitea/issue_template/support_request.md
Normal file
52
.gitea/issue_template/support_request.md
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
---
|
||||||
|
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)
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
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.
|
|
||||||
@@ -20,38 +20,45 @@ jobs:
|
|||||||
THIRTY_DAYS_AGO_SEC=$(date -d '30 days ago' '+%s')
|
THIRTY_DAYS_AGO_SEC=$(date -d '30 days ago' '+%s')
|
||||||
|
|
||||||
# Get all open issues sorted by oldest update first
|
# 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 '.[]')
|
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
|
# Check if we have issues to process
|
||||||
if [ -z "$ISSUES" ]; then
|
if [ -z "$ISSUES" ]; then
|
||||||
echo "No open issues found."
|
echo "No open issues found."
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "$ISSUES" | while IFS= read -r issue; do
|
echo "$ISSUES" | while IFS= read -r issue; do
|
||||||
# Safety Check 2: Skip empty lines
|
# Prevent processing empty lines
|
||||||
if [ -z "$issue" ]; then continue; fi
|
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')
|
||||||
|
|
||||||
|
# Convert issue update time to seconds
|
||||||
UPDATED_AT_SEC=$(date -d "$UPDATED_AT" '+%s')
|
UPDATED_AT_SEC=$(date -d "$UPDATED_AT" '+%s')
|
||||||
|
|
||||||
# Stop processing if we reach issues newer than 30 days
|
# LOGIC CHECK: If the issue is newer than 30 days, stop (since list is sorted asc)
|
||||||
if [ "$UPDATED_AT_SEC" -gt "$THIRTY_DAYS_AGO_SEC" ]; then
|
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
|
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"
|
||||||
@@ -59,30 +66,25 @@ 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"
|
||||||
@@ -91,29 +93,21 @@ 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 // empty')
|
LATEST_COMMENT_AUTHOR=$(echo "$COMMENTS" | jq -r '.[-1].user.login')
|
||||||
|
|
||||||
# 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')
|
||||||
|
|
||||||
|
|||||||
408
README.md
408
README.md
@@ -1,69 +1,65 @@
|
|||||||
<div align="center">
|
<p align="center">
|
||||||
|
<img src="assets/banner.png" alt="Evercatch Banner" width="800">
|
||||||
|
</p>
|
||||||
|
|
||||||
<img src="assets/banner.png" alt="Evercatch" width="800">
|
<p align="center">
|
||||||
|
<strong>The webhook infrastructure platform for developers who want simplicity without sacrificing power.</strong>
|
||||||
|
</p>
|
||||||
|
|
||||||
<br/>
|
<p align="center">
|
||||||
<br/>
|
<a href="https://evercatch.dev">Website</a> •
|
||||||
|
<a href="https://docs.evercatch.dev">Docs</a> •
|
||||||
<img src="https://img.shields.io/badge/STATUS-ALPHA-red?style=flat-square&labelColor=000" alt="ALPHA">
|
<a href="https://app.evercatch.dev">Dashboard</a> •
|
||||||
|
<a href="https://status.evercatch.dev">Status</a>
|
||||||
<img src="https://img.shields.io/badge/BETA-JUNE%202026-orange?style=flat-square&labelColor=000" alt="Beta June 2026">
|
</p>
|
||||||
|
|
||||||
<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 Problem
|
> **The webhook infrastructure platform for developers who want simplicity without sacrificing power.**
|
||||||
|
|
||||||
You're wiring up Stripe, SendGrid, GitHub, Shopify — all at once. Each one speaks a different language:
|
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.
|
||||||
|
|
||||||
- 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
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Quick Start
|
## 📋 What is Evercatch?
|
||||||
|
|
||||||
### 1. Create an account
|
Evercatch sits between your webhook providers (Stripe, SendGrid, GitHub, etc.) and your application, giving you:
|
||||||
|
|
||||||
|
- **📦 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" \
|
||||||
@@ -74,248 +70,178 @@ curl -X POST https://api.evercatch.dev/api/v1/auth/signup \
|
|||||||
}'
|
}'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Response:**
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"user": { "id": "550e8400-e29b-...", "email": "you@example.com" },
|
"user": { "id": "550e8400-...", "email": "you@example.com" },
|
||||||
"api_key": { "api_key": "ec_live_abc123...", "prefix": "ec_live_abc1" },
|
"api_key": {
|
||||||
"subscription": { "tier": "sandbox", "status": "active" }
|
"api_key": "ec_live_abc123...",
|
||||||
|
"prefix": "ec_live_abc1"
|
||||||
|
},
|
||||||
|
"subscription": { "tier": "sandbox", "status": "trialing" }
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
### 2. Point your webhook provider at Evercatch
|
### 2. Point Your Webhooks at Evercatch
|
||||||
|
|
||||||
```
|
```
|
||||||
https://api.evercatch.dev/api/v1/webhooks/{provider}/{your-user-id}
|
https://api.evercatch.dev/api/v1/webhooks/stripe/550e8400-...
|
||||||
```
|
```
|
||||||
|
|
||||||
Configure Stripe in 30 seconds:
|
**Example: Configure Stripe**
|
||||||
1. Open [Stripe Dashboard → Webhooks](https://dashboard.stripe.com/webhooks)
|
1. Go to [Stripe Dashboard → Webhooks](https://dashboard.stripe.com/webhooks)
|
||||||
2. Add endpoint → paste your Evercatch URL
|
2. Click "Add Endpoint"
|
||||||
3. Add header: `X-API-Key: ec_live_abc123...`
|
3. Enter: `https://api.evercatch.dev/api/v1/webhooks/stripe/550e8400-...`
|
||||||
4. Select events → done
|
4. Select events
|
||||||
|
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": "My API",
|
"name": "Production API",
|
||||||
"url": "https://yourapp.com/webhooks",
|
"url": "https://yourapp.com/webhooks",
|
||||||
"providers": ["stripe"],
|
"providers": ["stripe"],
|
||||||
"event_types": ["payment.*"]
|
"event_types": ["payment.*"]
|
||||||
}'
|
}'
|
||||||
```
|
```
|
||||||
|
|
||||||
Evercatch now receives, normalizes, stores, and forwards every matching event — automatically retrying on failure.
|
### 4. That's It! 🎉
|
||||||
|
Evercatch now:
|
||||||
### Or use a native SDK
|
- ✅ Receives webhooks from Stripe
|
||||||
|
- ✅ Normalizes them to a unified schema
|
||||||
```python
|
- ✅ Stores them for 24 hours (Sandbox tier)
|
||||||
# Python
|
- ✅ Forwards them to `yourapp.com/webhooks`
|
||||||
from evercatch import Evercatch
|
- ✅ Retries on failure
|
||||||
|
|
||||||
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.*"],
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Integrations
|
## 📊 Pricing
|
||||||
|
|
||||||
We are launching with major integrations from day one, with more coming after beta.
|
| 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 |
|
||||||
|
|
||||||
| Provider | Incoming Webhooks | Signature Verification | Normalized Schema |
|
**All plans include:**
|
||||||
|----------|:-----------------:|:---------------------:|:-----------------:|
|
- ✅ Unlimited API keys
|
||||||
| **Stripe** | ✅ | ✅ | ✅ |
|
- ✅ Real-time event forwarding
|
||||||
| **More at launch** | ✅ | ✅ | ✅ |
|
- ✅ Automatic retries
|
||||||
|
- ✅ 99.9% uptime SLA
|
||||||
|
- ✅ Support via email
|
||||||
|
|
||||||
> 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).
|
**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)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## SDKs
|
## 🐛 Found a Bug?
|
||||||
|
|
||||||
Native, idiomatic clients for your language — all built on the same REST API.
|
We want to fix it! **[→ Report a Bug](../../issues/new?template=bug_report.md)**
|
||||||
|
|
||||||
| Language | Package | Status |
|
Please include:
|
||||||
|----------|---------|--------|
|
- Clear steps to reproduce
|
||||||
| **Python** | `pip install evercatch` | Launching with beta |
|
- Expected vs actual behavior
|
||||||
| **Node.js / TypeScript** | `npm install @evercatch/sdk` | Launching with beta |
|
- Your subscription tier
|
||||||
| **Go** | `go get github.com/evercatch/evercatch-go` | Launching with beta |
|
- Event IDs (if applicable)
|
||||||
| **Ruby** | `gem install evercatch` | Launching with beta |
|
|
||||||
|
|
||||||
All SDKs support the full API surface: destinations, event history, replays, and API key management.
|
**Do NOT include API keys or sensitive data.**
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## CLI
|
## ✨ Have a Feature Idea?
|
||||||
|
|
||||||
A first-class CLI tool ships at launch for local development workflows.
|
We'd love to hear it! **[→ Request a Feature](../../issues/new?template=feature_request.md)**
|
||||||
|
|
||||||
```bash
|
Tell us:
|
||||||
# Install
|
- What problem it solves
|
||||||
npm install -g @evercatch/cli
|
- How you'd use it
|
||||||
|
- Which tier would benefit
|
||||||
# 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
|
## 🔐 Security Vulnerability?
|
||||||
|
|
||||||
| Plan | Price | Events / mo | Retention | Destinations | Overage |
|
**DO NOT open a public issue.**
|
||||||
|------|-------|-------------|-----------|--------------|---------|
|
|
||||||
| **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 |
|
|
||||||
|
|
||||||
<details>
|
**Email:** [security@evercatch.dev](mailto:security@evercatch.dev)
|
||||||
<summary>What's included in each plan</summary>
|
|
||||||
|
|
||||||
<br/>
|
We'll respond within 24 hours. See our [Security Policy](SECURITY.md) for details.
|
||||||
|
|
||||||
**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) · [View Full Pricing →](https://evercatch.dev/pricing)
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Join the Beta
|
## ❓ Need Help?
|
||||||
|
|
||||||
> We are preparing for **beta launch in June 2026** *(tentative)*. See [ROADMAP.md](ROADMAP.md) for details.
|
- 📚 **Documentation**: [docs.evercatch.dev](https://docs.evercatch.dev)
|
||||||
|
- 📧 **Email Support**: [support@evercatch.dev](mailto:support@evercatch.dev)
|
||||||
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.
|
- 💳 **Billing**: [billing@evercatch.dev](mailto:billing@evercatch.dev)
|
||||||
|
- **[→ Open a Support Ticket](../../issues/new?template=support_request.md)**
|
||||||
**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
|
## 📚 Resources
|
||||||
|
|
||||||
<details>
|
- **Documentation:** [docs.evercatch.dev](https://docs.evercatch.dev)
|
||||||
<summary>Found a bug?</summary>
|
- **API Reference:** [docs.evercatch.dev/api](https://docs.evercatch.dev/api)
|
||||||
|
- **Status Page:** [status.evercatch.dev](https://status.evercatch.dev)
|
||||||
<br/>
|
- **Blog:** [blog.evercatch.dev](https://blog.evercatch.dev)
|
||||||
|
- **Roadmap:** [roadmap.evercatch.dev](https://roadmap.evercatch.dev)
|
||||||
**[→ Open a Bug Report](https://git.psmattas.com/Evercatch/.profile/issues/new?template=.gitea%2fissue_template%2fbug_report.yml)**
|
- **Changelog:** [changelog.evercatch.dev](https://changelog.evercatch.dev)
|
||||||
|
|
||||||
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">
|
## 🤝 Contributing
|
||||||
|
|
||||||
<br/>
|
We welcome community contributions! See [CONTRIBUTING.md](CONTRIBUTING.md) for:
|
||||||
|
- Bug reports
|
||||||
|
- Feature requests
|
||||||
|
- Documentation improvements
|
||||||
|
- Beta testing
|
||||||
|
- Integration examples
|
||||||
|
|
||||||
**No webhook left behind.**
|
---
|
||||||
|
|
||||||
<br/>
|
## 📜 Code of Conduct
|
||||||
|
|
||||||
[evercatch.dev](https://evercatch.dev) · [status.evercatch.dev](https://status.evercatch.dev) · [contact@evercatch.dev](mailto:contact@evercatch.dev)
|
All community members must follow our [Code of Conduct](CODE_OF_CONDUCT.md).
|
||||||
|
|
||||||
</div>
|
**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>
|
||||||
|
|||||||
99
ROADMAP.md
99
ROADMAP.md
@@ -1,99 +0,0 @@
|
|||||||
<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