{"id":13407496,"url":"https://github.com/aichaos/rivescript-go","last_synced_at":"2026-01-19T18:36:09.042Z","repository":{"id":35791095,"uuid":"40072164","full_name":"aichaos/rivescript-go","owner":"aichaos","description":" A RiveScript interpreter for Go. RiveScript is a scripting language for chatterbots.","archived":false,"fork":false,"pushed_at":"2023-08-20T23:10:56.000Z","size":264,"stargazers_count":61,"open_issues_count":9,"forks_count":16,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-08-14T07:45:25.575Z","etag":null,"topics":["ai","artificial-intelligence","bots","chatbot","chatbots","rivescript"],"latest_commit_sha":null,"homepage":"https://www.rivescript.com/","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aichaos.png","metadata":{"files":{"readme":"README.md","changelog":"Changes.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null}},"created_at":"2015-08-02T07:27:23.000Z","updated_at":"2025-05-13T23:33:47.000Z","dependencies_parsed_at":"2024-01-16T10:08:38.586Z","dependency_job_id":null,"html_url":"https://github.com/aichaos/rivescript-go","commit_stats":null,"previous_names":[],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/aichaos/rivescript-go","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aichaos%2Frivescript-go","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aichaos%2Frivescript-go/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aichaos%2Frivescript-go/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aichaos%2Frivescript-go/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aichaos","download_url":"https://codeload.github.com/aichaos/rivescript-go/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aichaos%2Frivescript-go/sbom","scorecard":{"id":172668,"data":{"date":"2025-08-11","repo":{"name":"github.com/aichaos/rivescript-go","commit":"3d8d905184f3f598d782e18e53bc1d307a055d09"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.8,"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":"Code-Review","score":1,"reason":"Found 3/18 approved changesets -- score normalized to 1","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":"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":"Dangerous-Workflow","score":-1,"reason":"no workflows found","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":-1,"reason":"No tokens found","details":null,"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":"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":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"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":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"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":0,"reason":"Project has not signed or included provenance with any releases.","details":["Warn: release artifact v0.4.0 not signed: https://api.github.com/repos/aichaos/rivescript-go/releases/117392642","Warn: release artifact v0.3.1 not signed: https://api.github.com/repos/aichaos/rivescript-go/releases/48211649","Warn: release artifact v0.3.0 not signed: https://api.github.com/repos/aichaos/rivescript-go/releases/6237846","Warn: release artifact v0.2.0 not signed: https://api.github.com/repos/aichaos/rivescript-go/releases/5391247","Warn: release artifact v0.1.0 not signed: https://api.github.com/repos/aichaos/rivescript-go/releases/4889731","Warn: release artifact v0.4.0 does not have provenance: https://api.github.com/repos/aichaos/rivescript-go/releases/117392642","Warn: release artifact v0.3.1 does not have provenance: https://api.github.com/repos/aichaos/rivescript-go/releases/48211649","Warn: release artifact v0.3.0 does not have provenance: https://api.github.com/repos/aichaos/rivescript-go/releases/6237846","Warn: release artifact v0.2.0 does not have provenance: https://api.github.com/repos/aichaos/rivescript-go/releases/5391247","Warn: release artifact v0.1.0 does not have provenance: https://api.github.com/repos/aichaos/rivescript-go/releases/4889731"],"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":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 19 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-16T16:58:09.913Z","repository_id":35791095,"created_at":"2025-08-16T16:58:09.913Z","updated_at":"2025-08-16T16:58:09.913Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28580363,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-19T18:29:59.827Z","status":"ssl_error","status_checked_at":"2026-01-19T18:29:40.878Z","response_time":67,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["ai","artificial-intelligence","bots","chatbot","chatbots","rivescript"],"created_at":"2024-07-30T20:00:41.175Z","updated_at":"2026-01-19T18:36:09.022Z","avatar_url":"https://github.com/aichaos.png","language":"Go","readme":"# RiveScript-Go\n\n[![GoDoc](https://godoc.org/github.com/aichaos/rivescript-go?status.svg)](https://godoc.org/github.com/aichaos/rivescript-go)\n[![Gitter](https://badges.gitter.im/aichaos/rivescript-go.svg)](https://gitter.im/aichaos/rivescript-go?utm_source=badge\u0026utm_medium=badge\u0026utm_campaign=pr-badge)\n[![Build Status](https://travis-ci.org/aichaos/rivescript-go.svg?branch=master)](https://travis-ci.org/aichaos/rivescript-go)\n\n## Introduction\n\nThis is a RiveScript interpreter library written for the Go programming\nlanguage. RiveScript is a scripting language for chatterbots, making it easy\nto write trigger/response pairs for building up a bot's intelligence.\n\n**This project is currently in Beta status.** The API should be mostly stable\nbut things might move around on you.\n\n## About RiveScript\n\nRiveScript is a scripting language for authoring chatbots. It has a very\nsimple syntax and is designed to be easy to read and fast to write.\n\nA simple example of what RiveScript looks like:\n\n```\n+ hello bot\n- Hello human.\n```\n\nThis matches a user's message of \"hello bot\" and would reply \"Hello human.\"\nOr for a slightly more complicated example:\n\n```\n+ my name is *\n* \u003cformal\u003e == \u003cbot name\u003e =\u003e \u003cset name=\u003cformal\u003e\u003eWow, we have the same name!\n* \u003cget name\u003e != undefined =\u003e \u003cset name=\u003cformal\u003e\u003eDid you change your name?\n- \u003cset name=\u003cformal\u003e\u003eNice to meet you, \u003cget name\u003e!\n```\n\nThe official website for RiveScript is https://www.rivescript.com/\n\nTo test drive RiveScript in your web browser, try the\n[RiveScript Playground](https://play.rivescript.com/).\n\n## Documentation\n\n* RiveScript Library: \u003chttps://godoc.org/github.com/aichaos/rivescript-go\u003e\n* RiveScript Stand-alone Interpreter: \u003chttps://godoc.org/github.com/aichaos/rivescript-go/cmd/rivescript\u003e\n* JavaScript Object Macros: \u003chttps://godoc.org/github.com/aichaos/rivescript-go/lang/javascript\u003e\n* RiveScript Parser: \u003chttps://godoc.org/github.com/aichaos/rivescript-go/parser\u003e\n\nAlso check out the [**RiveScript Community Wiki**](https://github.com/aichaos/rivescript/wiki)\nfor common design patterns and tips \u0026 tricks for RiveScript.\n\n## Installation\n\nFor the development library:\n\n`go get github.com/aichaos/rivescript-go`\n\nFor the stand-alone `rivescript` binary for testing a bot:\n\n`go get github.com/aichaos/rivescript-go/cmd/rivescript`\n\n## Usage\n\nThe distribution of RiveScript includes an interactive shell for testing your\nRiveScript bot. Run it with the path to a folder on disk that contains your\nRiveScript documents. Example:\n\n```bash\n# (Linux)\n$ rivescript eg/brain\n\n# (Windows)\n\u003e rivescript.exe eg/brain\n```\n\nSee `rivescript -help` for options it accepts, including debug mode and UTF-8\nmode.\n\nWhen used as a library for writing your own chatbot, the synopsis is as follows:\n\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"github.com/aichaos/rivescript-go\"\n)\n\nfunc main() {\n    // Create a new bot with the default settings.\n    bot := rivescript.New(nil)\n\n    // To enable UTF-8 mode, you'd have initialized the bot like:\n    bot = rivescript.New(rivescript.WithUTF8())\n\n    // Load a directory full of RiveScript documents (.rive files)\n    err := bot.LoadDirectory(\"eg/brain\")\n    if err != nil {\n      fmt.Printf(\"Error loading from directory: %s\", err)\n    }\n\n    // Load an individual file.\n    err = bot.LoadFile(\"./testsuite.rive\")\n    if err != nil {\n      fmt.Printf(\"Error loading from file: %s\", err)\n    }\n\n    // Sort the replies after loading them!\n    bot.SortReplies()\n\n    // Get a reply.\n    reply, err := bot.Reply(\"local-user\", \"Hello, bot!\")\n    if err != nil {\n      fmt.Printf(\"Error: %s\\n\", err)\n    } else {\n      fmt.Printf(\"The bot says: %s\", reply)\n    }\n}\n```\n\n## Configuration\n\nThe constructor takes an optional `Config` struct. Here is a full example with\nall the supported options. You only need to provide keys that are different to\nthe defaults.\n\n```go\nbot := rivescript.New(\u0026rivescript.Config{\n    Debug: false,                 // Debug mode, off by default\n    Strict: false,                // No strict syntax checking\n    UTF8: false,                  // No UTF-8 support enabled by default\n    Depth: 50,                    // Becomes default 50 if Depth is \u003c= 0\n    Seed: time.Now().UnixNano(),  // Random number seed (default is == 0)\n    SessionManager: memory.New(), // Default in-memory session manager\n})\n```\n\nFor convenience, you can use a shortcut:\n\n```go\n// A nil config uses all the defaults.\nbot = rivescript.New(nil)\n\n// WithUTF8 enables UTF-8 mode (other settings left as default).\nbot = rivescript.New(rivescript.WithUTF8())\n```\n\n## Object Macros\n\nA common feature in many RiveScript implementations is the object macro, which\nenables you to write dynamic program code (in your favorite programming\nlanguage) to add extra capabilities to your bot. For example, your bot could\nanswer a question of \"what is the weather like in *$location*\" by running some\ncode to look up their answer via a web API.\n\nThe Go version of RiveScript has support for object macros written in Go\n(at compile time of your application). It also has optional support for\nJavaScript object macros using the [goja](https://github.com/dop251/goja) library.\n\nHere is how to define a Go object macro:\n\n```go\nbot.SetSubroutine(func(rs *rivescript.RiveScript, args []string) string {\n    return \"Hello world!\"\n})\n```\n\n### JavaScript Object Macros\n\nHere is an example how to make JavaScript object macros available via\nthe [goja](https://github.com/dop251/goja) module:\n\n```go\npackage main\n\nimport (\n    \"fmt\"\n    \"github.com/aichaos/rivescript-go\"\n    \"github.com/aichaos/rivescript-go/lang/javascript\"\n)\n\nfunc main() {\n    // Initialize RiveScript first.\n    bot := rivescript.New(rivescript.WithUTF8())\n\n    // Add the JavaScript object macro handler.\n    js := javascript.New(bot)\n    bot.SetHandler(\"javascript\", js)\n\n    // You can access the goja VM and set your own global\n    // variable or function bindings to be called from your\n    // object macros.\n    js.VM.Set(\"helloFunc\", func(name string) string {\n        return fmt.Sprintf(\"Hello, %s!\", name)\n    })\n\n    // Load some RiveScript code. This example just tests the\n    // JavaScript object macro support.\n    err := bot.Stream(`\n        \u003e object add javascript\n          let a = args[0];\n          let b = args[1];\n          return parseInt(a) + parseInt(b);\n        \u003c object\n\n        \u003e object fn javascript\n          let result = helloFunc(args[0])\n          return result\n        \u003c object\n\n        + add # and #\n        - \u003cstar1\u003e + \u003cstar2\u003e = \u003ccall\u003eadd \u003cstar1\u003e \u003cstar2\u003e\u003c/call\u003e\n\n        + say hello *\n        - \u003ccall\u003efn \u003cstar\u003e\u003c/call\u003e\n    `)\n    if err != nil {\n      fmt.Printf(\"Error loading RiveScript document: %s\", err)\n    }\n\n    // Sort the replies after loading them!\n    bot.SortReplies()\n\n    // Get some replies!\n    inputs := []string{\"add 5 and 12\", \"say hello goja\"}\n    for _, message := range inputs {\n      fmt.Printf(\"You said: %s\\n\", message)\n        reply, err := bot.Reply(\"local-user\", message)\n        if err != nil {\n          fmt.Printf(\"Error: %s\\n\", err)\n        } else {\n          fmt.Printf(\"The bot says: %s\\n\", reply)\n        }\n    }\n}\n```\n\n## UTF-8 Support\n\nUTF-8 support in RiveScript is considered an experimental feature. It is\ndisabled by default.\n\nBy default (without UTF-8 mode on), triggers may only contain basic ASCII\ncharacters (no foreign characters), and the user's message is stripped of all\ncharacters except letters, numbers and spaces. This means that, for example,\nyou can't capture a user's e-mail address in a RiveScript reply, because of\nthe @ and . characters.\n\nWhen UTF-8 mode is enabled, these restrictions are lifted. Triggers are only\nlimited to not contain certain metacharacters like the backslash, and the\nuser's message is only stripped of backslashes and HTML angled brackets\n(to protect from obvious XSS if you use RiveScript in a web application).\nAdditionally, common punctuation characters are stripped out, with the default\nset being `/[.,!?;:]/g`. This can be overridden by providing a new regexp\nstring literal to the `RiveScript.SetUnicodePunctuation` function. Example:\n\n```go\n// Make a new bot with UTF-8 mode enabled.\nbot := rivescript.New(rivescript.WithUTF8())\n\n// Override the punctuation characters that get stripped\n// from the user's message.\nbot.SetUnicodePunctuation(`[.,!?;:]`);\n```\n\nThe `\u003cstar\u003e` tags in RiveScript will capture the user's \"raw\" input, so you can\nwrite replies to get the user's e-mail address or store foreign characters in\ntheir name.\n\n## Building\n\nI use a GNU Makefile to make building and running this module easier. The\nrelevant commands are:\n\n* `make setup` - run this after freshly cloning this repo. It runs the\n  `git submodule` commands to pull down vendored dependencies.\n* `make build` - this will build the front-end command from `cmd/rivescript`\n  and place its binary into the `bin/` directory. It builds a binary relevant\n  to your current system, so on Linux this will create a Linux binary.\n  It's also recommended to run this one at least once, because it will cache\n  dependency packages and speed up subsequent builds and runs.\n* `make run` - runs the front-end command and points it to the `eg/brain` folder\n  as its RiveScript source.\n* `make fmt` - runs `gofmt -w` on all the source files.\n* `make test` - runs the unit tests.\n* `make clean` - cleans up the `.gopath`, `bin` and `dist` directories.\n\n### Testing\n\nThe rivescript-go repo submodules the RiveScript Test Suite (rsts) project.\nIf you didn't do a `git clone --recursive` for rivescript-go you can pull the\nsubmodule via the following commands:\n\n```bash\ngit submodule init\ngit submodule update\n```\n\nThen `make test` (or `go test`) should show results from the tests run\nout of the rsts/ folder.\n\n### Releasing\n\nYou can build a release for an individual platform by running a command like\n`make linux/amd64`. The valid build targets are currently as follows:\n\n* Linux: `linux/386` and `linux/amd64`\n* Windows: `windows/386` and `windows/amd64`\n* MacOS: `darwin/amd64`\n\nRun `make release` to automatically build releases for all supported platforms.\n\nA directory for the release is created in `dist/rivescript-$VERSION-$OS-$ARCH/`\nthat contains the built binary, README.md, Changes.md and examples. You can\ninspect this directory afterwards; its contents are automatically tarred up\n(zip for Windows) and placed in the root of the git repo.\n\nIf you are cross-compiling for a different system, you may need to mess with\npermissions so that Go can download the standard library for the new target.\nExample:\n\n```bash\n% sudo mkdir /usr/lib/golang/pkg/windows_386\n% chown your_user:your_user /usr/lib/golang/pkg/windows_386\n```\n\n## See Also\n\n* [rivescript-go/parser](./parser) - A standalone package for parsing RiveScript\n  code and returning an \"abstract syntax tree.\"\n* [rivescript-go/macro](./macro) - Contains an interface for creating your own\n  object macro handlers for foreign programming languages.\n* [rivescript-go/sessions](./sessions) - Contains the interface for user\n  variable session managers as well as the default in-memory manager and the\n  `NullStore` for testing. Other official session managers (e.g. Redis) are in\n  here as well.\n\n## License\n\n```\nThe MIT License (MIT)\n\nCopyright (c) 2017 Noah Petherbridge\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n```\n\n## See Also\n\nThe official RiveScript website, http://www.rivescript.com/\n","funding_links":[],"categories":["Tools","Go"],"sub_categories":["Libraries"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faichaos%2Frivescript-go","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faichaos%2Frivescript-go","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faichaos%2Frivescript-go/lists"}