{"id":13630611,"url":"https://github.com/osrg/namazu","last_synced_at":"2025-04-17T17:31:35.187Z","repository":{"id":57588879,"uuid":"26900441","full_name":"osrg/namazu","owner":"osrg","description":":fish: 鯰: Programmable fuzzy scheduler for testing distributed systems","archived":true,"fork":false,"pushed_at":"2018-08-24T17:26:41.000Z","size":29978,"stargazers_count":493,"open_issues_count":15,"forks_count":42,"subscribers_count":31,"default_branch":"master","last_synced_at":"2024-11-08T22:36:44.298Z","etag":null,"topics":["flaky-tests","testing-tools"],"latest_commit_sha":null,"homepage":"http://osrg.github.io/namazu","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/osrg.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-11-20T07:09:50.000Z","updated_at":"2024-10-17T12:47:37.000Z","dependencies_parsed_at":"2022-09-12T15:12:17.804Z","dependency_job_id":null,"html_url":"https://github.com/osrg/namazu","commit_stats":null,"previous_names":["osrg/earthquake"],"tags_count":8,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/osrg%2Fnamazu","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/osrg%2Fnamazu/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/osrg%2Fnamazu/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/osrg%2Fnamazu/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/osrg","download_url":"https://codeload.github.com/osrg/namazu/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249359991,"owners_count":21257145,"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","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":["flaky-tests","testing-tools"],"created_at":"2024-08-01T22:01:49.596Z","updated_at":"2025-04-17T17:31:32.285Z","avatar_url":"https://github.com/osrg.png","language":"Go","funding_links":[],"categories":["Notable Tools","Go","3. Fault Injection"],"sub_categories":["Generic Tools"],"readme":"# Namazu: Programmable Fuzzy Scheduler for Testing Distributed Systems\n\n[![Release](http://github-release-version.herokuapp.com/github/osrg/namazu/release.svg?style=flat)](https://github.com/osrg/namazu/releases/latest)\n[![Join the chat at https://gitter.im/osrg/namazu](https://img.shields.io/badge/GITTER-join%20chat-green.svg)](https://gitter.im/osrg/namazu?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge\u0026utm_content=badge)\n[![GoDoc](https://godoc.org/github.com/osrg/namazu/nmz?status.svg)](https://godoc.org/github.com/osrg/namazu/nmz)\n[![Build Status](https://travis-ci.org/osrg/namazu.svg?branch=master)](https://travis-ci.org/osrg/namazu)\n[![Coverage Status](https://coveralls.io/repos/github/osrg/namazu/badge.svg?branch=master)](https://coveralls.io/github/osrg/namazu?branch=master)\n[![Go Report Card](https://goreportcard.com/badge/github.com/osrg/namazu)](https://goreportcard.com/report/github.com/osrg/namazu)\n\nNamazu (formerly named Earthquake) is a programmable fuzzy scheduler for testing real implementations of distributed system such as ZooKeeper.\n\n![doc/img/namazu.png](doc/img/namazu.png)\n\nNamazu permutes Java function calls, Ethernet packets, Filesystem events, and injected faults in various orders so as to find implementation-level bugs of the distributed system.\nNamazu can also control non-determinism of the thread interleaving (by calling `sched_setattr(2)` with randomized parameters).\nSo Namazu can be also used for testing standalone multi-threaded software.\n\nBasically, Namazu permutes events in a random order, but you can write your [own state exploration policy](doc/arch.md) (in Golang) for finding deep bugs efficiently.\n\n[Namazu (鯰) means a catfish :fish: in Japanese](https://en.wiktionary.org/wiki/%E9%AF%B0).\n\nBlog: [http://osrg.github.io/namazu/](http://osrg.github.io/namazu/)\n\nTwitter: [@NamazuFuzzTest](https://twitter.com/NamazuFuzzTest)\n\n## Looking for Namazu Swarm (Distributed Parallel CI)?\n\n[Namazu Swarm](https://github.com/osrg/namazu-swarm) executes multiple CI jobs in parallel across a Docker cluster.\n[Namazu Swarm](https://github.com/osrg/namazu-swarm) is developed as a part of Namazu, but it does not depends on Namazu (although you can combine them together).\n\n\u003cimg src=\"https://raw.githubusercontent.com/osrg/namazu-swarm/507f1ea51790ebc6d64740e8eb14e009d0353970/docs/img/nmzswarm.png\" width=\"300\" /\u003e\n\nNamazu Swarm is hosted at [osrg/namazu-swarm](https://github.com/osrg/namazu-swarm).\n\n## Found and Reproduced Bugs\n\n:new:=Found, :repeat:=Reproduced\n\n### Flaky integration tests\n\nIssue|Reproducibility\u003cbr\u003e(traditional)|Reproducibility\u003cbr\u003e(Namazu)|Note\n---|---|---|---\n:new: [ZOOKEEPER-2212](https://issues.apache.org/jira/browse/ZOOKEEPER-2212)\u003cbr\u003e(race)|0%|21.8%|In traditional testing, we could not reproduce the issue in 5,000 runs (60 hours). We newly found the issue and improved its reproducibility using Namazu Ethernet inspector. Note that the reproducibility improvement depends on its configuration(see also [#137](https://github.com/osrg/namazu/pull/137)).\u003cbr\u003e[Blog article](http://osrg.github.io/namazu/post/zookeeper-2212/) and repro code ([Ryu SDN version](example/zk-found-2212.ryu) and [Netfilter version](example/zk-found-2212.nfqhook)) are available.\n\n### Flaky xUnit tests (picked out, please see also [#125](https://github.com/osrg/namazu/issues/125))\n\nIssue|Reproducibility\u003cbr\u003e(traditional)|Reproducibility\u003cbr\u003e(Namazu)|Note\n---|---|---|---\n:repeat: [YARN-4548](https://issues.apache.org/jira/browse/YARN-4548)|11%|82%|Used Namazu process inspector.\n:repeat: [ZOOKEEPER-2080](https://issues.apache.org/jira/browse/ZOOKEEPER-2080)|14%|62%|Used Namazu Ethernet inspector. [Blog article](http://osrg.github.io/namazu/post/zookeeper-2080/) and [repro code](example/zk-repro-2080.nfqhook) are available.\n:repeat: [YARN-4556](https://issues.apache.org/jira/browse/YARN-4548)|2%|44%|Used Namazu process inspector.\n:repeat: [YARN-5043](https://issues.apache.org/jira/browse/YARN-5043)|12%|30%|Used Namazu process inspector.\n:repeat: [ZOOKEEPER-2137](https://issues.apache.org/jira/browse/ZOOKEEPER-2137)|2%|16%|Used Namazu process inspector.\n:repeat: [YARN-4168](https://issues.apache.org/jira/browse/YARN-4168)|1%|8%|Used Namazu process inspector.\n:repeat: [YARN-1978](https://issues.apache.org/jira/browse/YARN-1978)|0%|4%|Used Namazu process inspector.\n:repeat: etcd [#5022](https://github.com/coreos/etcd/issues/5022)|0%|3%|Used Namazu process inspector.\n\nWe also improved reproducibility of some flaky etcd tests (to be documented).\n\n### Others\n\nIssue|Note\n---|---\n:new: [YARN-4301](https://issues.apache.org/jira/browse/YARN-4301)\u003cbr\u003e(fault tolerance)|Used Namazu filesystem inspector and Namazu API. [Repro code](example/yarn/4301-reproduce) is available.\n:new: etcd command line client (etcdctl) [#3517](https://github.com/coreos/etcd/issues/3517)\u003cbr\u003e(timing specification)|Used Namazu Ethernet inspector. [Repro code](example/etcd/3517-reproduce) is available.\u003cbr\u003eThe issue has been fixed in [#3530](https://github.com/coreos/etcd/pull/3530) and it also resulted a hint of [#3611](https://github.com/coreos/etcd/pull/3611).\n\n## Talks\n\n * [ApacheCon Core North America](http://sched.co/6OJU) (May 11-13, 2016, Vancouver) [[slide](http://www.slideshare.net/AkihiroSuda/flaky-tests-and-bugs-in-apache-software-eg-hadoop)]\n * [CoreOS Fest](http://sched.co/6Szb) (May 9-10, 2016, Berlin) [[slide](http://www.slideshare.net/mitakeh/namazu-a-debugger-for-distributed-systems-specific-bugs/1)]\n * [FOSDEM](https://fosdem.org/2016/schedule/event/nondeterminism_in_hadoop/) (January 30-31, 2016, Brussels) [[slide](http://www.slideshare.net/AkihiroSuda/tackling-nondeterminism-in-hadoop-testing-and-debugging-distributed-systems-with-earthquake-57866497)]\n * The poster session of [ACM Symposium on Cloud Computing (SoCC)](http://acmsocc.github.io/2015/) (August 27-29, 2015, Hawaii) [[poster](http://acmsocc.github.io/2015/posters/socc15posters-final18.pdf)]\n\n### Talks about [Namazu Swarm](https://github.com/osrg/namazu-swarm)\n\n * [Open Source Summit Japan](http://sched.co/AOmo) (May 31-June 2, 2017, Tokyo) [[slide](http://events.linuxfoundation.jp/sites/events/files/slides/Parallelizing%20CI%20Using%20Docker%20Swarm-mode.pdf)]\n\n## Getting Started\n### Installation\nThe installation process is very simple:\n\n    $ sudo apt-get install libzmq3-dev libnetfilter-queue-dev\n    $ go get github.com/osrg/namazu/nmz\n\nCurrently, Namazu is tested with [Go 1.6](https://golang.org/dl/).\n\nYou can also download the latest binary from [here](https://github.com/osrg/namazu/releases).\n\n### Container Mode\nThe following instruction shows how you can start *Namazu Container*, the simplified, Docker-like CLI for Namazu.\n\n    $ sudo nmz container run -it --rm -v /foo:/foo ubuntu bash\n\n\nIn *Namazu Container*, you can run arbitrary command that might be *flaky*.\nJUnit tests are interesting to try.\n\n    nmzc$ git clone something\n    nmzc$ cd something\n    nmzc$ for f in $(seq 1 1000);do mvn test; done\n\n\nYou can also specify a config file (`--nmz-autopilot` option for `nmz container`.)\nA typical configuration file (`config.toml`) is as follows:\n\n```toml\n# Policy for observing events and yielding actions\n# You can also implement your own policy.\n# Default: \"random\"\nexplorePolicy = \"random\"\n\n[explorePolicyParam]\n  # for Ethernet/Filesystem/Java inspectors, event are non-deterministically delayed.\n  # minInterval and maxInterval are bounds for the non-deterministic delays\n  # Default: 0 and 0\n  minInterval = \"80ms\"\n  maxInterval = \"3000ms\"\n\n  # for Ethernet/Filesystem inspectors, you can specify fault-injection probability (0.0-1.0).\n  # Default: 0.0\n  faultActionProbability = 0.0\n\n  # for Process inspector, you can specify how to schedule processes\n  # \"mild\": execute processes with randomly prioritized SCHED_NORMAL/SCHED_BATCH scheduler.\n  # \"extreme\": pick up some processes and execute them with SCHED_RR scheduler. others are executed with SCHED_BATCH scheduler.\n  # \"dirichlet\": execute processes with SCHED_DEADLINE scheduler. Dirichlet-distribution is used for deciding runtime values.\n  # Default: \"mild\"\n  procPolicy = \"extreme\"\n\n[container]\n  # Default: false\n  enableEthernetInspector = true\n  ethernetNFQNumber = 42\n  # Default: true\n  enableProcInspector = true\n  procWatchInterval = \"1s\"\n  # Default: true (for volumes (`-v /foo:/bar`))\n  enableFSInspector = true\n```\nFor other parameters, please refer to [`config.go`](nmz/util/config/config.go) and [`randompolicy.go`](nmz/explorepolicy/random/randompolicy.go).\n\n\n### Non-container Mode\n\n#### Process inspector\n\n    $ sudo nmz inspectors proc -pid $TARGET_PID -watch-interval 1s\n\nBy default, all the processes and the threads under `$TARGET_PID` are randomly scheduled.\n\nYou can also specify a config file by running with `-autopilot config.toml`.\n\nYou can also set `-orchestrator-url` (e.g. `http://127.0.0.1:10080/api/v3`) and `-entity-id` for distributed execution.\n\nNote that the process inspector may be not effective for reproducing short-running flaky tests, but it's still effective for long-running tests: [issue #125](https://github.com/osrg/namazu/issues/125).\n\n\nThe guide for reproducing flaky Hadoop tests (please use `nmz` instead of `microearthquake`): [FOSDEM slide 42](http://www.slideshare.net/AkihiroSuda/tackling-nondeterminism-in-hadoop-testing-and-debugging-distributed-systems-with-earthquake-57866497/42).\n\n\n#### Filesystem inspector (FUSE)\n\n    $ mkdir /tmp/{nmzfs-orig,nmzfs}\n    $ sudo nmz inspectors fs -original-dir /tmp/nmzfs-orig -mount-point /tmp/nmzfs -autopilot config.toml\n\t$ $TARGET_PROGRAM_WHICH_ACCESSES_TMP_NMZFS\n\t$ sudo fusermount -u /tmp/nmzfs\n\nBy default, all the `read`, `mkdir`, and `rmdir` accesses to the files under `/tmp/nmzfs` are randomly scheduled.\n`/tmp/nmzfs-orig` is just used as the backing storage.\n(Note that you have to set `explorePolicyParam.minInterval` and `explorePolicyParam.maxInterval` in the config file.)\n\nYou can also inject faullts (currently just injects `-EIO`) by setting `explorePolicyParam.faultActionProbability` in the config file.\n\n#### Ethernet inspector (Linux netfilter_queue)\n\n    $ iptables -A OUTPUT -p tcp -m owner --uid-owner $(id -u johndoe) -j NFQUEUE --queue-num 42\n    $ sudo nmz inspectors ethernet -nfq-number 42\n\t$ sudo -u johndoe $TARGET_PROGRAM\n\t$ iptables -D OUTPUT -p tcp -m owner --uid-owner $(id -u johndoe) -j NFQUEUE --queue-num 42\n\nBy default, all the packets for `johndoe` are randomly scheduled (with some optimization for TCP retransmission).\n\nYou can also inject faults (currently just drop packets) by setting `explorePolicyParam.faultActionProbability` in the config file.\n\n#### Ethernet inspector (Openflow 1.3)\n\nYou have to install [ryu](https://github.com/osrg/ryu) and [hookswitch](https://github.com/osrg/hookswitch) for this feature.\n\n    $ sudo pip install ryu hookswitch\n    $ sudo hookswitch-of13 ipc:///tmp/hookswitch-socket --tcp-ports=4242,4243,4244\n\t$ sudo nmz inspectors ethernet -hookswitch ipc:///tmp/hookswitch-socket\n\nPlease also refer to [doc/how-to-setup-env-full.md](doc/how-to-setup-env-full.md) for this feature.\n\n#### Java inspector (AspectJ, byteman)\n\nTo be documented\n\n## How to Contribute\nWe welcome your contribution to Namazu.\nPlease feel free to send your pull requests on github!\n\n    $ cd $GOPATH/src/github.com/osrg\n    $ git clone https://github.com/YOUR_GITHUB_ACCOUNT/namazu.git\n    $ cd namazu\n    $ git checkout -b your-branch\n    $ ./build\n    $ your-editor foo.go\n    $ ./clean \u0026\u0026 ./build \u0026\u0026 go test -race ./nmz/...\n    $ git commit -a -s\n\n## Copyright\nCopyright (C) 2015 [Nippon Telegraph and Telephone Corporation](http://www.ntt.co.jp/index_e.html).\n\nReleased under [Apache License 2.0](LICENSE).\n\n---------------------------------------\n## Advanced Guide\n### Distributed execution\n\nBasically please follow these examples: [example/zk-found-2212.ryu](example/zk-found-2212.ryu), [example/zk-found-2212.nfqhook](example/zk-found-2212.nfqhook)\n\n#### Step 1\nPrepare `config.toml` for distributed execution.\nExample:\n```toml\n# executed in `nmz init`\ninit = \"init.sh\"\n\n# executed in `nmz run`\nrun = \"run.sh\"\n\n# executed in `nmz run` as the test oracle\nvalidate = \"validate.sh\"\n\n# executed in `nmz run` as the clean-up script\nclean = \"clean.sh\"\n\n# REST port for the communication.\n# You can also set pbPort for ProtocolBuffers (Java inspector)\nrestPort = 10080\n\n# of course you can also set explorePolicy here as well\n```\n\n#### Step 2\nCreate `materials` directory, and put `*.sh` into it.\n\n#### Step 3\nRun `nmz init --force config.toml materials /tmp/x`.\n\nThis command executes `init.sh` for initializing the workspace `/tmp/x`.\n`init.sh` can access the `materials` directory as `${NMZ_MATERIALS_DIR}`.\n\n#### Step 4\nRun `for f in $(seq 1 100);do nmz run /tmp/x; done`.\n\nThis command starts the orchestrator, and executes `run.sh`, `validate.sh`, and `clean.sh` for testing the system (100 times).\n\n`run.sh` should invoke multiple Namazu inspectors: `nmz inspectors \u003cproc|fs|ethernet\u003e -entity-id _some_unique_string -orchestrator-url http://127.0.0.1:10080/api/v3`\n\n`*.sh` can access the `/tmp/x/{00000000, 00000001, 00000002, ..., 00000063}` directory as `${NMZ_WORKING_DIR}`, which is intended for putting test results and some relevant information. (Note: 0x63==99)\n\n`validate.sh` should exit with zero for successful executions, and with non-zero status for failed executions.\n\n`clean.sh` is an optional clean-up script for each of the execution.\n\n#### Step 5\nRun `nmz summary /tmp/x` for summarizing the result.\n\nIf you have [JaCoCo](http://eclemma.org/jacoco/) coverage data, you can run `java -jar bin/nmz-analyzer.jar --classes-path /somewhere/classes /tmp/x` for counting execution patterns as in [FOSDEM slide 18](http://www.slideshare.net/AkihiroSuda/tackling-nondeterminism-in-hadoop-testing-and-debugging-distributed-systems-with-earthquake-57866497/18).\n\n![doc/img/exec-pattern.png](doc/img/exec-pattern.png)\n\n### API for your own exploration policy\n\n```go\n// implements nmz/explorepolicy/ExplorePolicy interface\ntype MyPolicy struct {\n\tactionCh chan Action\n}\n\nfunc (p *MyPolicy) ActionChan() chan Action {\n\treturn p.actionCh\n}\n\nfunc (p *MyPolicy) QueueEvent(event Event) {\n\t// Possible events:\n\t//  - JavaFunctionEvent (byteman)\n\t//  - PacketEvent (Netfilter, Openflow)\n\t//  - FilesystemEvent (FUSE)\n\t//  - ProcSetEvent (Linux procfs)\n\t//  - LogEvent (syslog)\n\tfmt.Printf(\"Event: %s\\n\", event)\n\t// You can also inject fault actions\n\t//  - PacketFaultAction\n\t//  - FilesystemFaultAction\n\t//  - ProcSetSchedAction\n\t//  - ShellAction\n\taction, err := event.DefaultAction()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\t// send in a goroutine so as to make the function non-blocking.\n\t// (Note that nmz/util/queue/TimeBoundedQueue provides\n\t// better semantics and determinism, this is just an example.)\n\tgo func() {\n\t\tfmt.Printf(\"Action ready: %s\\n\", action)\n\t\tp.actionCh \u003c- action\n\t\tfmt.Printf(\"Action passed: %s\\n\", action)\n\t}()\n}\n\nfunc NewMyPolicy() ExplorePolicy {\n\treturn \u0026MyPolicy{actionCh: make(chan Action)}\n}\n\nfunc main(){\n\tRegisterPolicy(\"mypolicy\", NewMyPolicy)\n\tos.Exit(CLIMain(os.Args))\n}\n```\nPlease refer to [example/template](example/template) for further information.\n\n### Semi-deterministic replay\nIf an event structure has `replay_hint` hash string (that does not contain time-dependent/random things),\nyou can semi-deterministically replay a scenario using `time.Duration(hash(seed,replay_hint) % maxInterval)`.\nNo record is required for replaying.\n\nWe have a PoC for ZOOKEEPER-2212. Please refer to [#137](https://github.com/osrg/namazu/pull/137).\n\nWe also implemented a similar thing for Go: [go-replay](https://github.com/AkihiroSuda/go-replay).\n\n### Known Limitation\nAfter running Namazu (process inspector with `exploreParam.procPolicyParam=\"dirichlet\"`) many times, `sched_setattr(2)` can fail with `EBUSY`.\nThis seems to be a bug of kernel; We're looking into this.\n\n### FAQs\n\n#### Q. The example test always fails (or always succeeds). What does it mean?\n\nA. Probably it is due to a misconfiguration. Please check the logs.\n\ne.g. [example/zk-found-2212.nfqhook](example/zk-found-2212.nfqhook):\n\n    $ nmz init --force config.toml materials /tmp/zk-2212\n    $ nmz run /tmp/zk-2212\n    Validation failed: ...\n    $ ls -l /tmp/zk-2212/00000000/\n    total 296\n    drwxr-xr-x 2 root      root   4096 Sep  5 05:30 actions/\n    -rw-r--r-- 1 root      root   1098 Sep  5 05:30 check-fle-states.log\n    -rw-r--r-- 1 root      root      2 Sep  5 05:30 check-fle-states.result\n    srwxr-xr-x 1 root      root      0 Sep  5 05:29 ether_inspector=\n    -rw-r--r-- 1 root      root  33369 Sep  5 05:30 history\n    -rw-r--r-- 1 root      root  97856 Sep  5 05:30 inspector.log\n    -rw-r--r-- 1 root      root      6 Sep  5 05:29 inspector.pid\n    -rw-r--r-- 1 root      root 126836 Sep  5 05:30 nfqhook.log\n    -rw-r--r-- 1 root      root      6 Sep  5 05:29 nfqhook.pid\n    -rw-r--r-- 1 root      root   1302 Sep  5 05:30 nmz.log\n    -rw-r--r-- 1 root      root     71 Sep  5 05:30 result.json\n    drwxr-xr-x 3 nfqhooked root   4096 Sep  5 05:30 zk1/\n    drwxr-xr-x 3 nfqhooked root   4096 Sep  5 05:30 zk2/\n    drwxr-xr-x 3 nfqhooked root   4096 Sep  5 05:30 zk3/\n\nIf an error is recorded in `inspector.log` or `nfqhook.log`, probably the ZooKeeper packet inspector (written in python, [misc/pynmz](misc/pynmz)) is not working due to some dependency issue. Please install required packages accordingly.\n\nYou may also need to adjust some parameter in `/tmp/zk-2212/config.toml`, such as `explorePolicyParam.maxInterval` and `explorePolicyParam.minInterval` for higher reproducibility.\n\n\n---------------------------------------\nIf you have any questions, please do not hesitate to contact us via [GitHub issues](https://github.com/osrg/namazu/issues) or via [Gitter](https://gitter.im/osrg/namazu).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fosrg%2Fnamazu","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fosrg%2Fnamazu","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fosrg%2Fnamazu/lists"}