{"_id":"@edah/express-rate-limiting","_rev":"7-6661604d9d84d17d4da75528e638ef71","name":"@edah/express-rate-limiting","dist-tags":{"latest":"1.0.7"},"versions":{"0.1.0":{"name":"@edah/express-rate-limiting","version":"0.1.0","keywords":["express","rate-limiter","middleware","typescript","rate-limiting"],"license":"MIT","_id":"@edah/express-rate-limiting@0.1.0","maintainers":[{"name":"edah","email":"benfarhatabderrahmen@gmail.com"}],"dist":{"shasum":"eab0e021c3f5a8f9325ea4e37410fc33cc83aa01","tarball":"https://registry.npmjs.org/@edah/express-rate-limiting/-/express-rate-limiting-0.1.0.tgz","fileCount":22,"integrity":"sha512-OH0jgrargs1wrIKC7AOn2W+Zn52DiL6cSosch2a+zt4Vm7dVPzwSKYp31cIOnzlV2dl+Vmrj07QfHkC9eOkCeg==","signatures":[{"sig":"MEYCIQCPAsFYIJ9udWacAOd3kyDlGl9QdipuBMypYAaWuRnHOAIhALO3p/R1WbEGleA93x+hwdCE1ljlk6m6y5XybuMPNzWa","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30388},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"590232e23dda083ad079c64875246b603f6d17e3","private":false,"scripts":{"compile":"tsc -p tsconfig.build.json","prepare":"npm run compile","compile:watch":"tsc --watch -p tsconfig.build.json","prepublishOnly":"npm run compile"},"_npmUser":{"name":"edah","email":"benfarhatabderrahmen@gmail.com"},"_npmVersion":"11.6.4","description":"Production-ready rate limiter middleware for Express.js","directories":{},"_nodeVersion":"22.17.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"express":"^4.18.2","typescript":"^5","@types/express":"^5.0.6"},"peerDependencies":{"express":">=4"},"_npmOperationalInternal":{"tmp":"tmp/express-rate-limiting_0.1.0_1765569240215_0.2459428111715387","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@edah/express-rate-limiting","version":"1.0.1","keywords":["express","rate-limiter","middleware","typescript","rate-limiting"],"license":"MIT","_id":"@edah/express-rate-limiting@1.0.1","maintainers":[{"name":"edah","email":"benfarhatabderrahmen@gmail.com"}],"dist":{"shasum":"de727b5ce426924379577310f2fc5a1361832717","tarball":"https://registry.npmjs.org/@edah/express-rate-limiting/-/express-rate-limiting-1.0.1.tgz","fileCount":12,"integrity":"sha512-+I3vIobCQGxMVt4XwPl929knWl8CdSTrg2ifHVLToB+K7/fYJKcFoC93xaqIHcITjslrHCskaJxbt6wS+d4nGw==","signatures":[{"sig":"MEUCIBQTlK0lKh/VCexfMdGsAiFHwCWvzwvtNKI/0byaJRcdAiEAqpzM2GGE4SfnV/+AbPNEPRDUNIKAQbAp/Wc3l9yrI+U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20930},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"07c1dcf82bcb36fbff3c0fe489a2b87c4936aed7","private":false,"scripts":{"compile":"tsc -p tsconfig.build.json","prepare":"npm run compile","compile:watch":"tsc --watch -p tsconfig.build.json","prepublishOnly":"npm run compile"},"_npmUser":{"name":"edah","email":"benfarhatabderrahmen@gmail.com"},"_npmVersion":"11.6.4","description":"Production-ready rate limiter middleware for Express.js","directories":{},"_nodeVersion":"22.17.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"express":"^4.18.2","typescript":"^5","@types/express":"^5.0.6"},"peerDependencies":{"express":">=4"},"_npmOperationalInternal":{"tmp":"tmp/express-rate-limiting_1.0.1_1765573976556_0.5791860435360225","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@edah/express-rate-limiting","version":"1.0.3","keywords":["express","rate-limiter","middleware","typescript","rate-limiting"],"license":"MIT","_id":"@edah/express-rate-limiting@1.0.3","maintainers":[{"name":"edah","email":"benfarhatabderrahmen@gmail.com"}],"homepage":"https://github.com/abdelrahmen1313/express-rate-limiting#readme","bugs":{"url":"https://github.com/abdelrahmen1313/express-rate-limiting/issues"},"dist":{"shasum":"71813d52441b7321afee24b967ae307c7a9f151a","tarball":"https://registry.npmjs.org/@edah/express-rate-limiting/-/express-rate-limiting-1.0.3.tgz","fileCount":12,"integrity":"sha512-2eAScZtNCFoXLaWRBmeiidLixJOpJkeAHGxky/RexkQ0qaEhoNd2m/quhgGWr4MztAw9BHAh/iPFeLCoyKTW6Q==","signatures":[{"sig":"MEUCIFco0MiLQrEI8z3NEiehJmZGyiXOw+SJHa/yFdG1PXRhAiEAoACqh0ioJBcvthYZwXOoKg42WsLQAIfxeH7ts80vY0g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":20966},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"c16389b882669093ae8f5024c237796eb5a07d62","private":false,"scripts":{"compile":"tsc -p tsconfig.build.json","prepare":"npm run compile","compile:watch":"tsc --watch -p tsconfig.build.json"},"_npmUser":{"name":"edah","email":"benfarhatabderrahmen@gmail.com"},"repository":{"url":"git+https://github.com/abdelrahmen1313/express-rate-limiting.git","type":"git"},"_npmVersion":"11.6.4","description":"Production-ready rate limiter middleware for Express.js","directories":{},"_nodeVersion":"22.17.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"express":"^4.18.2","typescript":"^5","@types/express":"^5.0.6"},"peerDependencies":{"express":">=4"},"_npmOperationalInternal":{"tmp":"tmp/express-rate-limiting_1.0.3_1765576752869_0.9020878675161821","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@edah/express-rate-limiting","version":"1.0.4","keywords":["express","rate-limiter","middleware","typescript","rate-limiting"],"license":"MIT","_id":"@edah/express-rate-limiting@1.0.4","maintainers":[{"name":"edah","email":"benfarhatabderrahmen@gmail.com"}],"homepage":"https://github.com/abdelrahmen1313/express-rate-limiting#readme","bugs":{"url":"https://github.com/abdelrahmen1313/express-rate-limiting/issues"},"dist":{"shasum":"d6ff2a3ddd14efbb578aa8bd8b231d714769413f","tarball":"https://registry.npmjs.org/@edah/express-rate-limiting/-/express-rate-limiting-1.0.4.tgz","fileCount":4,"integrity":"sha512-DU7QeCxZTnicAP5Qkk8aI7kHG29BNqEHvS5j1XJy8HREWtSCHhBXzNmgOlyv0EwyBVR180FwwuC2Y7fHt1nUDQ==","signatures":[{"sig":"MEQCIGu9xyfP68A3fXUpitwcl6f9vULFGkpTuXIy0iobOUJBAiBU6Fv1JHGwjeZCyjeXbzm51fy7IzENeF8Kv9HXbcAwdg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":10331},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"18817d27b2a2305b470f5bcfccf59c438e73717d","private":false,"scripts":{"compile":"tsc -p tsconfig.build.json","prepare":"npm run compile","compile:watch":"tsc --watch -p tsconfig.build.json"},"_npmUser":{"name":"edah","email":"benfarhatabderrahmen@gmail.com"},"repository":{"url":"git+https://github.com/abdelrahmen1313/express-rate-limiting.git","type":"git"},"_npmVersion":"11.6.4","description":"Production-ready rate limiter middleware for Express.js","directories":{},"_nodeVersion":"22.17.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"express":"^4.18.2","typescript":"^5","@types/express":"^5.0.6"},"peerDependencies":{"express":">=4"},"_npmOperationalInternal":{"tmp":"tmp/express-rate-limiting_1.0.4_1765580047214_0.08588371831872732","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@edah/express-rate-limiting","version":"1.0.5","keywords":["express","rate-limiter","middleware","typescript","rate-limiting"],"license":"MIT","_id":"@edah/express-rate-limiting@1.0.5","maintainers":[{"name":"edah","email":"benfarhatabderrahmen@gmail.com"}],"homepage":"https://github.com/abdelrahmen1313/express-rate-limiting#readme","bugs":{"url":"https://github.com/abdelrahmen1313/express-rate-limiting/issues"},"dist":{"shasum":"4f76e343a4f4443b2b3409880b27c3324c058f36","tarball":"https://registry.npmjs.org/@edah/express-rate-limiting/-/express-rate-limiting-1.0.5.tgz","fileCount":12,"integrity":"sha512-Y94qx8iaxF8JGndarFUQ/SfP0Bdy48+a3ejMA7btRBknBIDN+C2sDZ+0LU4XLt3iX9REqVXtfyEID4FK/N9xRQ==","signatures":[{"sig":"MEUCIQCZOPbAJWU1kbPrsQ8kRYi+Cs5/lS7DnDJP54ocV84wGQIgXLhqS1ioHtyG+R5SynLbKA1NEiBvf59+S+VdGnHoxbY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21671},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"da6bf8f0aa33363675a3f3c01ecb3cc1367245cf","private":false,"scripts":{"compile":"tsc -p tsconfig.build.json","prepare":"npm run compile","compile:watch":"tsc --watch -p tsconfig.build.json"},"_npmUser":{"name":"edah","email":"benfarhatabderrahmen@gmail.com"},"repository":{"url":"git+https://github.com/abdelrahmen1313/express-rate-limiting.git","type":"git"},"_npmVersion":"11.6.4","description":"Production-ready rate limiter middleware for Express.js","directories":{},"_nodeVersion":"22.17.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"express":"^4.18.2","typescript":"^5","@types/express":"^5.0.6"},"peerDependencies":{"express":">=4"},"_npmOperationalInternal":{"tmp":"tmp/express-rate-limiting_1.0.5_1765585080077_0.3160056592645262","host":"s3://npm-registry-packages-npm-production"}},"1.0.6":{"name":"@edah/express-rate-limiting","version":"1.0.6","keywords":["express","rate-limiter","middleware","typescript","rate-limiting"],"license":"MIT","_id":"@edah/express-rate-limiting@1.0.6","maintainers":[{"name":"edah","email":"benfarhatabderrahmen@gmail.com"}],"homepage":"https://github.com/abdelrahmen1313/express-rate-limiting#readme","bugs":{"url":"https://github.com/abdelrahmen1313/express-rate-limiting/issues"},"dist":{"shasum":"035044425e964840894acf1edc33e74742d16847","tarball":"https://registry.npmjs.org/@edah/express-rate-limiting/-/express-rate-limiting-1.0.6.tgz","fileCount":12,"integrity":"sha512-KK53MWf3z9MUeMy8rCeAlntwKUmWGhm2VywIrVFFEKiCe96cT1ItHuZIo/UZKfHA5/GVd5RLc6R2GMHtHX3YRw==","signatures":[{"sig":"MEYCIQCI8vL1+kHKM3YK8uUcPa/ihyE+mpSYahGu4a9/7HReJwIhALKMeuh93wS5LiKBvZm7uA5Mf0XJ9PvhUwmka3cgKXRy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":21700},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"c9a73444e5eca2f1b4dd38bb3072179e3fc77749","private":false,"scripts":{"compile":"tsc -p tsconfig.build.json","prepare":"npm run compile","compile:watch":"tsc --watch -p tsconfig.build.json"},"_npmUser":{"name":"edah","email":"benfarhatabderrahmen@gmail.com"},"repository":{"url":"git+https://github.com/abdelrahmen1313/express-rate-limiting.git","type":"git"},"_npmVersion":"11.6.4","description":"Production-ready rate limiter middleware for Express.js","directories":{},"_nodeVersion":"22.17.0","dependencies":{},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"express":"^4.18.2","typescript":"^5","@types/express":"^5.0.6"},"peerDependencies":{"express":">=4"},"_npmOperationalInternal":{"tmp":"tmp/express-rate-limiting_1.0.6_1765740437366_0.31477773825285493","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@edah/express-rate-limiting","version":"1.0.7","description":"Production-ready rate limiter middleware for Express.js","private":false,"main":"dist/index.js","types":"dist/index.d.ts","publishConfig":{"access":"public"},"scripts":{"compile":"tsc -p tsconfig.build.json","compile:watch":"tsc --watch -p tsconfig.build.json","prepare":"npm run compile"},"dependencies":{},"peerDependencies":{"express":">=4"},"repository":{"type":"git","url":"git+https://github.com/abdelrahmen1313/express-rate-limiting.git"},"devDependencies":{"typescript":"^5","@types/express":"^5.0.6","express":"^4.18.2"},"license":"MIT","keywords":["express","rate-limiter","middleware","typescript","rate-limiting"],"gitHead":"4f4b43bc05d7e55f9380f53c406a70593fbb8351","_id":"@edah/express-rate-limiting@1.0.7","bugs":{"url":"https://github.com/abdelrahmen1313/express-rate-limiting/issues"},"homepage":"https://github.com/abdelrahmen1313/express-rate-limiting#readme","_nodeVersion":"22.17.0","_npmVersion":"11.6.4","dist":{"integrity":"sha512-OmwlJ4QIOnyRVFutBNR47kgAnP9wLlv99As+HUneg46IEWa9wZpGCi8/+BwtEqOvTM0Zj/CONHU+KAk+4xgG+g==","shasum":"2716b6eec6d467028d82c54b1fe4de8a1284e678","tarball":"https://registry.npmjs.org/@edah/express-rate-limiting/-/express-rate-limiting-1.0.7.tgz","fileCount":12,"unpackedSize":21956,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAgxy7zNzyRr6B9jg1IFU1/NztfUb2h6oHWMgasVQhIsAiEA1ILa6pMQk0sYEhTACai0S3Uklyj/jM8nkKJIuOJVRf0="}]},"_npmUser":{"name":"edah","email":"benfarhatabderrahmen@gmail.com"},"directories":{},"maintainers":[{"name":"edah","email":"benfarhatabderrahmen@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/express-rate-limiting_1.0.7_1765816353387_0.4589301970416857"},"_hasShrinkwrap":false}},"time":{"created":"2025-12-12T19:54:00.142Z","modified":"2025-12-15T16:32:33.780Z","0.1.0":"2025-12-12T19:54:00.397Z","1.0.1":"2025-12-12T21:12:56.698Z","1.0.3":"2025-12-12T21:59:13.001Z","1.0.4":"2025-12-12T22:54:07.354Z","1.0.5":"2025-12-13T00:18:00.224Z","1.0.6":"2025-12-14T19:27:17.512Z","1.0.7":"2025-12-15T16:32:33.562Z"},"bugs":{"url":"https://github.com/abdelrahmen1313/express-rate-limiting/issues"},"license":"MIT","homepage":"https://github.com/abdelrahmen1313/express-rate-limiting#readme","keywords":["express","rate-limiter","middleware","typescript","rate-limiting"],"repository":{"type":"git","url":"git+https://github.com/abdelrahmen1313/express-rate-limiting.git"},"description":"Production-ready rate limiter middleware for Express.js","maintainers":[{"name":"edah","email":"benfarhatabderrahmen@gmail.com"}],"readme":"# Express Rate Limiter\r\n\r\nA production-ready, type-safe rate limiter middleware for Express.js applications built with TypeScript.\r\n\r\n## Features\r\n\r\n- ✅ **Type - Safe**\r\n\r\n -Full TypeScript support with comprehensive types\r\n\r\n- ✅ **Lightweight**\r\n\r\n  -Minimal dependencies, only requires Express\r\n\r\n- ✅ **Flexible**\r\n\r\n  -Configurable time windows and request limits\r\n\r\n- ✅ **Memory Efficient**\r\n\r\n  -Automatic cleanup of expired entries\r\n\r\n- ✅ **Proxy Support**\r\n\r\n  -Handles `X-Forwarded-For` headers and custom IP extraction\r\n\r\n- ✅ **Standards Compliant**\r\n\r\n  -Returns standard rate limit headers(`X-RateLimit-*`)\r\n\r\n- ✅ **Per - Route Control**\r\n\r\n  -Apply to specific routes or globally\r\n\r\n- ✅ **Observable**\r\n\r\n  -Access rate limit status in downstream handlers\r\n\r\n## Installation\r\n\r\n```bash\r\nnpm install @edah/express-rate-limiting\r\n```\r\n\r\n## Quick Start\r\n\r\n```typescript\r\nimport express from 'express';\r\nimport { createRateLimiterMiddleware } from '@edah/express-rate-limiting';\r\n\r\nconst app = express();\r\n\r\nconst rateLimiter = createRateLimiterMiddleware({\r\n  maxRequests: 100,\r\n  windowInMinutes: 15,\r\n});\r\n\r\n// Apply globally\r\napp.use(rateLimiter);\r\n\r\n// Or apply to specific routes\r\napp.use('/api', rateLimiter);\r\n\r\napp.listen(3000);\r\n```\r\n\r\n## Configuration\r\n\r\n### Basic Options\r\n\r\n```yaml\r\n\r\n  maxRequests: number;             # Max requests per window (required)\r\n  windowInMinutes?: number;        # Time window in minutes (default: 1)\r\n  enableCleanup?: boolean;         # Enable automatic cleanup (default: true)\r\n  cleanupIntervalMinutes?: number  # Cleanup interval in minutes (default: 5)\r\n  showInformativeHeaders?: boolean #  Control if the api should send X-RATE-LIMIT HEADERS (default : true)\r\n  maxClients?: number              # Maximum clients allowed per route  (default : 9999) \r\n\r\n```\r\n\r\n## Examples\r\n\r\n### Basic Usage\r\n\r\n```typescript\r\nconst rateLimiter = createRateLimiterMiddleware({\r\n  maxRequests: 100,\r\n  windowInMinutes: 15,\r\n});\r\n\r\napp.use(rateLimiter);\r\n```\r\n\r\n### Advanced Options\r\n\r\n``` typescript\r\nconst rateLimiter = createRateLimiterMiddleware({\r\n    maxRequests: 50, windowInMinutes: 5, errorMessage: \"API rate limit exceeded. Please wait before making more requests.\",\r\n\r\n    // Custom IP extractor for cloud environments\r\n    getClientIp: (req : Request) => {\r\n        return ((req.headers[\"cf-connecting-ip\"]as string) || // Cloudflare\r\n                (req.headers[\"x-forwarded-for\"]as string)\r\n            ?.split(\",\")[0]\r\n                ?.trim() || req.socket\r\n                    ?.remoteAddress || req.ip)\r\n    },\r\n\r\n    // Skip rate limiting for health checks and internal endpoints\r\n    skip: (req : Request) => {\r\n        return req.path === \"/health\" || req.path === \"/metrics\"\r\n    },\r\n\r\n    // Cleanup expired records every 10 minutes -- default is 5\r\n    cleanupIntervalMinutes: 10\r\n})\r\n```\r\n\r\n### Per-Route Rate Limits\r\n\r\n``` typescript\r\nconst apiLimiter = createRateLimiterMiddleware({maxRequests: 50, windowInMinutes: 5});\r\n\r\nconst authLimiter = createRateLimiterMiddleware({maxRequests: 5, windowInMinutes: 15});\r\n\r\nconst pastaServiceLimiter = createRateLimiterMiddleware({maxRequests: 5, windowInMinutes: 10, maxClients : 100});\r\n\r\napp.use('/api', apiLimiter);\r\napp.post('/auth/login', authLimiter, (req, res) => {\r\n    // Handle login\r\n});\r\n```\r\n\r\n## Response Behavior\r\n\r\n### Allowed Request\r\n\r\nResponse includes rate limit headers:\r\n\r\n```yaml\r\nHTTP / 1.1 200 OK\r\nX - RateLimit - Limit : 100\r\nX - RateLimit - Remaining : 99\r\nX - RateLimit - Reset : 1702123456\r\n```\r\n\r\nRequest object includes rate limit info:\r\n\r\n```typescript\r\n\r\nreq.rateLimit = {\r\n    remaining: 99,\r\n    resetAt: 1702123456000\r\n};\r\n\r\nreq.rateLimitInfos = {\r\n    \r\n    \"clientsCount\": 1\r\n}\r\n\r\n```\r\n\r\n### Rate Limited Request\r\n\r\n``` yaml\r\nHTTP / 1.1 429 Too Many Requests\r\nX - RateLimit - Limit : 100\r\nX - RateLimit - Remaining : 0\r\nX - RateLimit - Reset : 1702123456\r\n\r\n{\r\n\"error\" : \"Too many requests, please try again later\",\r\n\"retryAfter\" : 300\r\n}\r\n```\r\n\r\n## How It Works\r\n\r\n1. **Request arrives** - Middleware extracts client IP\r\n2. **Check storage** - Looks up client's current snapshot\r\n3. **Validate window** - If window expired, creates new snapshot; otherwise increments hits\r\n4. **Check limit** - Compares hits against maxRequests\r\n5. **Response** - Returns 429 if limited, otherwise adds headers and continues\r\n\r\n## Memory Management\r\n\r\nThe middleware automatically cleans up expired entries:\r\n\r\n- Cleanup runs every 5 minutes by default (configurable)\r\n- Only expired snapshots are removed\r\n- Can be disabled with ` enableCleanup : false ` if managing memory differently\r\n\r\n## Monitoring\r\n\r\nGet active clients number :\r\n\r\n``` typescript\r\napp\r\n.get(\"/\", (req, res) => {\r\n\r\nres.json({message: \"Hello!\", rateLimit: req.rateLimit, infos: req.rateLimitInfos})\r\n})\r\n```\r\n\r\n## Performance Considerations\r\n\r\n- **O(1) lookups** - Client snapshots use Map for constant-time access\r\n- **Minimal overhead** - Lightweight class instances, no external I/O\r\n- **Automatic cleanup** - Prevents unbounded memory growth\r\n- **No external dependencies** - Only requires Express\r\n- **Overrideable Methods** - You can use the skip() decorator to skip rate limiting internal routes\r\n- **Monitor** active clients for spikes or anomalies\r\n\r\n## Contributing\r\n\r\nContributions are welcome!\r\nIf you'd like to improve this utility, fix bugs (if found), or suggest a new feature :\r\n\r\n1. Fork the repository\r\n2. Create a feature branch (`git checkout -b feature/my-feature-name`)\r\n3. Commit your changes (`git commit -m \"feat: add my feature\"`)\r\n4. Push to your branch (`git push origin feature/my-feature-name`)\r\n5. Open a pull request\r\n\r\nPlease follow [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/)\r\n\r\nFeedback and suggestions help shape the roadmap.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md"}