{"id":15446193,"url":"https://github.com/moul/zapfilter","last_synced_at":"2025-09-06T07:32:14.623Z","repository":{"id":37935197,"uuid":"292261376","full_name":"moul/zapfilter","owner":"moul","description":"⚡💊 advanced filtering for uber's zap logger","archived":false,"fork":false,"pushed_at":"2025-08-27T19:54:49.000Z","size":112,"stargazers_count":18,"open_issues_count":15,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-08-28T04:35:39.560Z","etag":null,"topics":["debug","logger","logging","zap"],"latest_commit_sha":null,"homepage":"https://manfred.life/golang","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/moul.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":".github/CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE-APACHE","code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":".github/SECURITY.md","support":".github/SUPPORT.md","governance":null,"roadmap":null,"authors":"AUTHORS","dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":["moul"],"patreon":"moul","open_collective":"moul","custom":["https://manfred.life/donate"]}},"created_at":"2020-09-02T11:15:25.000Z","updated_at":"2025-02-24T10:03:58.000Z","dependencies_parsed_at":"2023-12-27T07:32:13.042Z","dependency_job_id":"4e3f610f-af24-4ffd-aa04-f1223eca78f1","html_url":"https://github.com/moul/zapfilter","commit_stats":{"total_commits":41,"total_committers":4,"mean_commits":10.25,"dds":0.5121951219512195,"last_synced_commit":"984e87f53aca56edfa850399e306083d0ae5ea42"},"previous_names":[],"tags_count":9,"template":false,"template_full_name":"moul/golang-repo-template","purl":"pkg:github/moul/zapfilter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moul%2Fzapfilter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moul%2Fzapfilter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moul%2Fzapfilter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moul%2Fzapfilter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/moul","download_url":"https://codeload.github.com/moul/zapfilter/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/moul%2Fzapfilter/sbom","scorecard":{"id":418012,"data":{"date":"2025-08-11","repo":{"name":"github.com/moul/zapfilter","commit":"984e87f53aca56edfa850399e306083d0ae5ea42"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":4,"checks":[{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Security-Policy","score":9,"reason":"security policy file detected","details":["Info: security policy file detected: .github/SECURITY.md:1","Info: Found linked content: .github/SECURITY.md:1","Warn: One or no descriptive hints of disclosure, vulnerability, and/or timelines in security policy","Info: Found text in security policy: .github/SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Code-Review","score":0,"reason":"Found 0/2 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/go.yml:1","Warn: no topLevel permission defined: .github/workflows/pr.yml:1","Warn: no topLevel permission defined: .github/workflows/release.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/moul/zapfilter/go.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/go.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/moul/zapfilter/go.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:49: update your workflow using https://app.stepsecurity.io/secureworkflow/moul/zapfilter/go.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:51: update your workflow using https://app.stepsecurity.io/secureworkflow/moul/zapfilter/go.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:68: update your workflow using https://app.stepsecurity.io/secureworkflow/moul/zapfilter/go.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:70: update your workflow using https://app.stepsecurity.io/secureworkflow/moul/zapfilter/go.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:73: update your workflow using https://app.stepsecurity.io/secureworkflow/moul/zapfilter/go.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/go.yml:87: update your workflow using https://app.stepsecurity.io/secureworkflow/moul/zapfilter/go.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:109: update your workflow using https://app.stepsecurity.io/secureworkflow/moul/zapfilter/go.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:111: update your workflow using https://app.stepsecurity.io/secureworkflow/moul/zapfilter/go.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:114: update your workflow using https://app.stepsecurity.io/secureworkflow/moul/zapfilter/go.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/go.yml:128: update your workflow using https://app.stepsecurity.io/secureworkflow/moul/zapfilter/go.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/pr.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/moul/zapfilter/pr.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/pr.yml:17: update your workflow using https://app.stepsecurity.io/secureworkflow/moul/zapfilter/pr.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/release.yml:14: update your workflow using https://app.stepsecurity.io/secureworkflow/moul/zapfilter/release.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/release.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/moul/zapfilter/release.yml/master?enable=pin","Info:   0 out of  11 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   5 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE-APACHE:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-19T00:25:38.389Z","repository_id":37935197,"created_at":"2025-08-19T00:25:38.390Z","updated_at":"2025-08-19T00:25:38.390Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273873370,"owners_count":25183363,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-06T02:00:13.247Z","response_time":2576,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["debug","logger","logging","zap"],"created_at":"2024-10-01T19:59:42.990Z","updated_at":"2025-09-06T07:32:14.284Z","avatar_url":"https://github.com/moul.png","language":"Go","funding_links":["https://github.com/sponsors/moul","https://patreon.com/moul","https://opencollective.com/moul","https://manfred.life/donate"],"categories":[],"sub_categories":[],"readme":"# zapfilter\n\n ⚡💊 advanced filtering for uber's zap logger\n\n[![go.dev reference](https://img.shields.io/badge/go.dev-reference-007d9c?logo=go\u0026logoColor=white)](https://pkg.go.dev/moul.io/zapfilter)\n[![License](https://img.shields.io/badge/license-Apache--2.0%20%2F%20MIT-%2397ca00.svg)](https://github.com/moul/zapfilter/blob/master/COPYRIGHT)\n[![GitHub release](https://img.shields.io/github/release/moul/zapfilter.svg)](https://github.com/moul/zapfilter/releases)\n[![Made by Manfred Touron](https://img.shields.io/badge/made%20by-Manfred%20Touron-blue.svg?style=flat)](https://manfred.life/)\n\n[![Go](https://github.com/moul/zapfilter/workflows/Go/badge.svg)](https://github.com/moul/zapfilter/actions?query=workflow%3AGo)\n[![Release](https://github.com/moul/zapfilter/workflows/Release/badge.svg)](https://github.com/moul/zapfilter/actions?query=workflow%3ARelease)\n[![PR](https://github.com/moul/zapfilter/workflows/PR/badge.svg)](https://github.com/moul/zapfilter/actions?query=workflow%3APR)\n[![GolangCI](https://golangci.com/badges/github.com/moul/zapfilter.svg)](https://golangci.com/r/github.com/moul/zapfilter)\n[![codecov](https://codecov.io/gh/moul/zapfilter/branch/master/graph/badge.svg)](https://codecov.io/gh/moul/zapfilter)\n[![Go Report Card](https://goreportcard.com/badge/moul.io/zapfilter)](https://goreportcard.com/report/moul.io/zapfilter)\n[![CodeFactor](https://www.codefactor.io/repository/github/moul/zapfilter/badge)](https://www.codefactor.io/repository/github/moul/zapfilter)\n\n\n## Usage\n\n```go\nimport \"moul.io/zapfilter\"\n\nfunc ExampleParseRules() {\n\tcore := zap.NewExample().Core()\n\t// *=myns             =\u003e any level, myns namespace\n    // info,warn:myns.*   =\u003e info or warn level, any namespace matching myns.*\n\t// error=*            =\u003e everything with error level\n\tlogger := zap.New(zapfilter.NewFilteringCore(core, zapfilter.MustParseRules(\"*:myns info,warn:myns.* error:*\")))\n\tdefer logger.Sync()\n\n\tlogger.Debug(\"top debug\")                                 // no match\n\tlogger.Named(\"myns\").Debug(\"myns debug\")                  // matches *:myns\n\tlogger.Named(\"bar\").Debug(\"bar debug\")                    // no match\n\tlogger.Named(\"myns\").Named(\"foo\").Debug(\"myns.foo debug\") // no match\n\n\tlogger.Info(\"top info\")                                 // no match\n\tlogger.Named(\"myns\").Info(\"myns info\")                  // matches *:myns\n\tlogger.Named(\"bar\").Info(\"bar info\")                    // no match\n\tlogger.Named(\"myns\").Named(\"foo\").Info(\"myns.foo info\") // matches info,warn:myns.*\n\n\tlogger.Warn(\"top warn\")                                 // no match\n\tlogger.Named(\"myns\").Warn(\"myns warn\")                  // matches *:myns\n\tlogger.Named(\"bar\").Warn(\"bar warn\")                    // no match\n\tlogger.Named(\"myns\").Named(\"foo\").Warn(\"myns.foo warn\") // matches info,warn:myns.*\n\n\tlogger.Error(\"top error\")                                 // matches error:*\n\tlogger.Named(\"myns\").Error(\"myns error\")                  // matches *:myns and error:*\n\tlogger.Named(\"bar\").Error(\"bar error\")                    // matches error:*\n\tlogger.Named(\"myns\").Named(\"foo\").Error(\"myns.foo error\") // matches error:*\n\n\t// Output:\n\t// {\"level\":\"debug\",\"logger\":\"myns\",\"msg\":\"myns debug\"}\n\t// {\"level\":\"info\",\"logger\":\"myns\",\"msg\":\"myns info\"}\n\t// {\"level\":\"info\",\"logger\":\"myns.foo\",\"msg\":\"myns.foo info\"}\n\t// {\"level\":\"warn\",\"logger\":\"myns\",\"msg\":\"myns warn\"}\n\t// {\"level\":\"warn\",\"logger\":\"myns.foo\",\"msg\":\"myns.foo warn\"}\n\t// {\"level\":\"error\",\"msg\":\"top error\"}\n\t// {\"level\":\"error\",\"logger\":\"myns\",\"msg\":\"myns error\"}\n\t// {\"level\":\"error\",\"logger\":\"bar\",\"msg\":\"bar error\"}\n\t// {\"level\":\"error\",\"logger\":\"myns.foo\",\"msg\":\"myns.foo error\"}\n}\n```\n\n[embedmd]:# (.tmp/godoc.txt txt /FUNCTIONS/ $)\n```txt\nFUNCTIONS\n\nfunc CheckAnyLevel(logger *zap.Logger) bool\n    CheckAnyLevel determines whether at least one log level isn't filtered-out\n    by the logger.\n\nfunc CheckLevel(logger *zap.Logger, level zapcore.Level) bool\n    CheckLevel determines whether a specific log level would produce log or not.\n\nfunc NewFilteringCore(next zapcore.Core, filter FilterFunc) zapcore.Core\n    NewFilteringCore returns a core middleware that uses the given filter\n    function to determine whether to actually call Write on the next core in the\n    chain.\n\n\nTYPES\n\ntype FilterFunc func(zapcore.Entry, []zapcore.Field) bool\n    FilterFunc is used to check whether to filter the given entry and filters\n    out.\n\nfunc All(filters ...FilterFunc) FilterFunc\n    All checks if all filters return true.\n\nfunc Any(filters ...FilterFunc) FilterFunc\n    Any checks if any filter returns true.\n\nfunc ByLevels(pattern string) (FilterFunc, error)\n    ByLevels creates a FilterFunc based on a pattern.\n\n    Level Patterns\n\n        | Pattern | Debug | Info | Warn | Error | DPanic | Panic | Fatal |\n        | ------- | ----- | ---- | ---- | ----- | ------ | ----- | ----- |\n        | \u003cempty\u003e | X     | X    | X    | X     | X      | X     | X     |\n        | *       | X     | X    | X    | X     | x      | X     | X     |\n        | debug   | X     |      |      |       |        |       |       |\n        | info    |       | X    |      |       |        |       |       |\n        | warn    |       |      | X    |       |        |       |       |\n        | error   |       |      |      | X     |        |       |       |\n        | dpanic  |       |      |      |       | X      |       |       |\n        | panic   |       |      |      |       |        | X     |       |\n        | fatal   |       |      |      |       |        |       | X     |\n        | debug+  | X     | X    | x    | X     | X      | X     | X     |\n        | info+   |       | X    | X    | X     | X      | X     | X     |\n        | warn+   |       |      | X    | X     | X      | X     | X     |\n        | error+  |       |      |      | X     | X      | X     | X     |\n        | dpanic+ |       |      |      |       | X      | X     | X     |\n        | panic+  |       |      |      |       |        | X     | X     |\n        | fatal+  |       |      |      |       |        |       | X     |\n\nfunc ByNamespaces(input string) FilterFunc\n    ByNamespaces takes a list of patterns to filter out logs based on their\n    namespaces. Patterns are checked using path.Match.\n\nfunc ExactLevel(level zapcore.Level) FilterFunc\n    ExactLevel filters out entries with an invalid level.\n\nfunc MinimumLevel(level zapcore.Level) FilterFunc\n    MinimumLevel filters out entries with a too low level.\n\nfunc MustParseRules(pattern string) FilterFunc\n    MustParseRules calls ParseRules and panics if initialization failed.\n\nfunc ParseRules(pattern string) (FilterFunc, error)\n    ParseRules takes a CLI-friendly set of rules to construct a filter.\n\n    Syntax\n\n        pattern: RULE [RULE...]\n        RULE: one of:\n         - LEVELS:NAMESPACES\n         - NAMESPACES\n        LEVELS: LEVEL,[,LEVEL]\n        LEVEL: see `Level Patterns`\n        NAMESPACES: NAMESPACE[,NAMESPACE]\n        NAMESPACE: one of:\n         - namespace     // should be exactly this namespace\n         - *mat*ch*      // should match\n         - -NAMESPACE    // should not match\n\n    Examples\n\n        *                            everything\n        *:*                          everything\n        info:*                       level info;  any namespace\n        info+:*                      levels info, warn, error, dpanic, panic, and fatal; any namespace\n        info,warn:*                  levels info, warn; any namespace\n        ns1                          any level; namespace 'ns1'\n        *:ns1                        any level; namespace 'ns1'\n        ns1*                         any level; namespaces matching 'ns1*'\n        *:ns1*                       any level; namespaces matching 'ns1*'\n        *:ns1,ns2                    any level; namespaces 'ns1' and 'ns2'\n        *:ns*,-ns3*                  any level; namespaces matching 'ns*' but not matching 'ns3*'\n        info:ns1                     level info; namespace 'ns1'\n        info,warn:ns1,ns2            levels info and warn; namespaces 'ns1' and 'ns2'\n        info:ns1 warn:n2             level info + namespace 'ns1' OR level warn and namespace 'ns2'\n        info,warn:myns* error+:*     levels info or warn and namespaces matching 'myns*' OR levels error, dpanic, panic or fatal for any namespace\n\nfunc Reverse(filter FilterFunc) FilterFunc\n    Reverse checks is the passed filter returns false.\n\n```\n\nMore examples on https://pkg.go.dev/moul.io/zapfilter\n\n## Install\n\n### Using go\n\n```console\n$ go get -u moul.io/zapfilter\n```\n\n### Releases\n\nSee https://github.com/moul/zapfilter/releases\n\n## Contribute\n\n![Contribute \u003c3](https://raw.githubusercontent.com/moul/moul/master/contribute.gif)\n\nI really welcome contributions. Your input is the most precious material. I'm well aware of that and I thank you in advance. Everyone is encouraged to look at what they can do on their own scale; no effort is too small.\n\nEverything on contribution is sum up here: [CONTRIBUTING.md](./CONTRIBUTING.md)\n\n### Contributors ✨\n\n\u003c!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section --\u003e\n[![All Contributors](https://img.shields.io/badge/all_contributors-2-orange.svg)](#contributors)\n\u003c!-- ALL-CONTRIBUTORS-BADGE:END --\u003e\n\nThanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):\n\n\u003c!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --\u003e\n\u003c!-- prettier-ignore-start --\u003e\n\u003c!-- markdownlint-disable --\u003e\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"http://manfred.life\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/94029?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003eManfred Touron\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#maintenance-moul\" title=\"Maintenance\"\u003e🚧\u003c/a\u003e \u003ca href=\"https://github.com/moul/zapfilter/commits?author=moul\" title=\"Documentation\"\u003e📖\u003c/a\u003e \u003ca href=\"https://github.com/moul/zapfilter/commits?author=moul\" title=\"Tests\"\u003e⚠️\u003c/a\u003e \u003ca href=\"https://github.com/moul/zapfilter/commits?author=moul\" title=\"Code\"\u003e💻\u003c/a\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003ca href=\"https://manfred.life/moul-bot\"\u003e\u003cimg src=\"https://avatars1.githubusercontent.com/u/41326314?v=4\" width=\"100px;\" alt=\"\"/\u003e\u003cbr /\u003e\u003csub\u003e\u003cb\u003emoul-bot\u003c/b\u003e\u003c/sub\u003e\u003c/a\u003e\u003cbr /\u003e\u003ca href=\"#maintenance-moul-bot\" title=\"Maintenance\"\u003e🚧\u003c/a\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n\u003c!-- markdownlint-enable --\u003e\n\u003c!-- prettier-ignore-end --\u003e\n\u003c!-- ALL-CONTRIBUTORS-LIST:END --\u003e\n\nThis project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification. Contributions of any kind welcome!\n\n### Stargazers over time\n\n[![Stargazers over time](https://starchart.cc/moul/zapfilter.svg)](https://starchart.cc/moul/zapfilter)\n\n## License\n\n© 2020 [Manfred Touron](https://manfred.life)\n\nLicensed under the [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0) ([`LICENSE-APACHE`](LICENSE-APACHE)) or the [MIT license](https://opensource.org/licenses/MIT) ([`LICENSE-MIT`](LICENSE-MIT)), at your option. See the [`COPYRIGHT`](COPYRIGHT) file for more details.\n\n`SPDX-License-Identifier: (Apache-2.0 OR MIT)`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmoul%2Fzapfilter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmoul%2Fzapfilter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmoul%2Fzapfilter/lists"}