{"id":37185716,"url":"https://github.com/lnxjedi/gopherbot","last_synced_at":"2026-01-14T21:31:12.565Z","repository":{"id":30343643,"uuid":"55290221","full_name":"lnxjedi/gopherbot","owner":"lnxjedi","description":"ChatOps Engine for Slack, written in Go, inspired by Hubot and Jenkins","archived":false,"fork":false,"pushed_at":"2025-01-17T16:20:49.000Z","size":19442,"stargazers_count":62,"open_issues_count":17,"forks_count":10,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-08-24T22:28:15.240Z","etag":null,"topics":["bash-scripting","bot","chatbot","chatops","devops","hubot","linux","python-library","robot","ruby-library","slack"],"latest_commit_sha":null,"homepage":"https://lnxjedi.github.io/gopherbot","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"uva-its/gopherbot","license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lnxjedi.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"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":"AUTHORS.txt","dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2016-04-02T11:01:04.000Z","updated_at":"2025-05-11T07:48:32.000Z","dependencies_parsed_at":"2023-12-11T17:47:02.183Z","dependency_job_id":"0e361e8c-6da1-44ec-a85a-c8bb6953b9bf","html_url":"https://github.com/lnxjedi/gopherbot","commit_stats":{"total_commits":1982,"total_committers":10,"mean_commits":198.2,"dds":"0.25277497477295663","last_synced_commit":"a7e43b8a6df46fafb31f5b826f8bcfae7ebd1e45"},"previous_names":["parsley42/gopherbot","uva-its/gopherbot"],"tags_count":95,"template":false,"template_full_name":null,"purl":"pkg:github/lnxjedi/gopherbot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lnxjedi%2Fgopherbot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lnxjedi%2Fgopherbot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lnxjedi%2Fgopherbot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lnxjedi%2Fgopherbot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lnxjedi","download_url":"https://codeload.github.com/lnxjedi/gopherbot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lnxjedi%2Fgopherbot/sbom","scorecard":{"id":596409,"data":{"date":"2025-08-11","repo":{"name":"github.com/lnxjedi/gopherbot","commit":"51265d18f6dcd348bb523383247fd1a3202912d2"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.4,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/30 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":"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":"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":"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'contents' permission set to 'read': .github/workflows/build-container-base.yml:21","Info: jobLevel 'contents' permission set to 'read': .github/workflows/build-daily-dev.yml:22","Info: jobLevel 'contents' permission set to 'read': .github/workflows/build-weekly-latest.yml:21","Warn: no topLevel permission defined: .github/workflows/build-container-base.yml:1","Warn: no topLevel permission defined: .github/workflows/build-daily-dev.yml:1","Warn: no topLevel permission defined: .github/workflows/build-weekly-latest.yml:1","Warn: no topLevel permission defined: .github/workflows/build.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":"SAST","score":0,"reason":"no SAST tool detected","details":["Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"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":"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":"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 v2.16.0 not signed: https://api.github.com/repos/lnxjedi/gopherbot/releases/188770375","Warn: release artifact v2.15.8 not signed: https://api.github.com/repos/lnxjedi/gopherbot/releases/188557892","Warn: release artifact v2.15.7 not signed: https://api.github.com/repos/lnxjedi/gopherbot/releases/188350341","Warn: release artifact v2.15.6 not signed: https://api.github.com/repos/lnxjedi/gopherbot/releases/188252084","Warn: release artifact v2.15.5 not signed: https://api.github.com/repos/lnxjedi/gopherbot/releases/188108115","Warn: release artifact v2.16.0 does not have provenance: https://api.github.com/repos/lnxjedi/gopherbot/releases/188770375","Warn: release artifact v2.15.8 does not have provenance: https://api.github.com/repos/lnxjedi/gopherbot/releases/188557892","Warn: release artifact v2.15.7 does not have provenance: https://api.github.com/repos/lnxjedi/gopherbot/releases/188350341","Warn: release artifact v2.15.6 does not have provenance: https://api.github.com/repos/lnxjedi/gopherbot/releases/188252084","Warn: release artifact v2.15.5 does not have provenance: https://api.github.com/repos/lnxjedi/gopherbot/releases/188108115"],"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":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"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":"Packaging","score":10,"reason":"packaging workflow detected","details":["Info: Project packages its releases by way of GitHub Actions.: .github/workflows/build-container-base.yml:17"],"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":"Pinned-Dependencies","score":5,"reason":"dependency not pinned by hash detected -- score normalized to 5","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-container-base.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/lnxjedi/gopherbot/build-container-base.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-daily-dev.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/lnxjedi/gopherbot/build-daily-dev.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-daily-dev.yml:34: update your workflow using https://app.stepsecurity.io/secureworkflow/lnxjedi/gopherbot/build-daily-dev.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-daily-dev.yml:40: update your workflow using https://app.stepsecurity.io/secureworkflow/lnxjedi/gopherbot/build-daily-dev.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build-weekly-latest.yml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/lnxjedi/gopherbot/build-weekly-latest.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/lnxjedi/gopherbot/build.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/build.yml:16: update your workflow using https://app.stepsecurity.io/secureworkflow/lnxjedi/gopherbot/build.yml/main?enable=pin","Warn: containerImage not pinned by hash: .gitpod/Dockerfile:1: pin your Docker image by updating golang:1.13.8 to golang:1.13.8@sha256:d7e0b99badf7f34b5096089484a733897c9b89aa12ffb9f67f81da054f8a403e","Warn: containerImage not pinned by hash: resources/heroku/Dockerfile:1: pin your Docker image by updating quay.io/lnxjedi/gopherbot:latest to quay.io/lnxjedi/gopherbot:latest@sha256:1a36ecba6860053bae5c229fdb2aa3b1df7250cc0c2773272817166aeb6071ff","Warn: goCommand not pinned by hash: .gitpod/gotools.sh:2","Warn: goCommand not pinned by hash: .gitpod/gotools.sh:30","Warn: pipCommand not pinned by hash: jobs/install-libs.sh:7","Info:   0 out of   7 GitHub-owned GitHubAction dependencies pinned","Info:  10 out of  10 third-party GitHubAction dependencies pinned","Info:   0 out of   2 containerImage dependencies pinned","Info:   0 out of   2 goCommand dependencies pinned","Info:   0 out of   1 pipCommand 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":"Vulnerabilities","score":2,"reason":"8 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2022-0635","Warn: Project is vulnerable to: GO-2022-0646","Warn: Project is vulnerable to: GO-2025-3754 / GHSA-2x5j-vhc8-9cwm","Warn: Project is vulnerable to: GO-2025-3367 / GHSA-r9px-m959-cxf4","Warn: Project is vulnerable to: GO-2025-3368 / GHSA-v725-9546-7q7m","Warn: Project is vulnerable to: GO-2025-3487 / GHSA-hcg3-q754-cr77","Warn: Project is vulnerable to: GO-2025-3503 / GHSA-qxp5-gwg8-xv66","Warn: Project is vulnerable to: GO-2025-3595 / GHSA-vvgc-356p-c3xw"],"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-20T23:14:50.330Z","repository_id":30343643,"created_at":"2025-08-20T23:14:50.330Z","updated_at":"2025-08-20T23:14:50.330Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28435081,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T18:57:19.464Z","status":"ssl_error","status_checked_at":"2026-01-14T18:52:48.501Z","response_time":107,"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":["bash-scripting","bot","chatbot","chatops","devops","hubot","linux","python-library","robot","ruby-library","slack"],"created_at":"2026-01-14T21:31:11.755Z","updated_at":"2026-01-14T21:31:12.550Z","avatar_url":"https://github.com/lnxjedi.png","language":"Go","readme":"# Gopherbot ChatOps Engine\n\nGopherbot is designed for flexible automation and orchestration of infrastructure and development tasks for Slack[^connectors] teams. It supports scripting and libraries in Bash[^bash], Python, Ruby, and Go[^go], with a dynamic pipeline-based architecture supporting complex multi-language workflows. The core engine bootstraps and updates individual team robots from a git repository containing configuration (mostly YAML), scripts and libraries used for automation, with a simple robot API for each language that drastically simplifies chat-based interactions, state tracking, and concurrency.\n\n[^connectors]: Gopherbot has a modular interface for writing other protocol connectors in Go; currently only Slack and the Terminal connector are supported\n[^bash]: The current bash library doesn't support long-term memories, though limited support is planned for v3\n[^go]: Since version 2.15, Gopherbot supports dynamicly loaded Go extensions via [Yaegi](https://github.com/traefik/yaegi), but only stdlib and the Gopherbot API are supported\n\nSlogans under consideration:\n* **The Co-worker that Never Sleeps**\n* **The DevOps Swiss-Army Chainsaw**\n\n## What does Gopherbot *do*?\n**Gopherbot** runs as a Linux process on a server/VM or container in your infrastructure. On start-up it examines a few environment variables needed to retrieve your robot's git repository and encrypted credentials, then connects to your team chat. From there it can respond to CLI-like commands matching regular expressions whose capture groups are passed as command-line arguments to scripts written in Bash, Ruby, Python, or Go[^go_call]. These plugins can perform any number of functions to provision resources, run reports, deploy software or interact with CI/CD - just about any functionality a DevOps engineer might want to provide in team chat. Most robots also perform any number of automation \"jobs\", either scheduled with the built-in cron facility or triggered by specific external messages posted from other external automated tasks, such as a \"build complete\" notification from CI/CD or commit message from GitHub. You can find a lot more information in the [introduction](https://lnxjedi.github.io/gopherbot/Introduction.html) of the online manual.\n\n[^go_call]: Go is the exception to this pattern; instead, Go extensions define Handler functions that are passed a \"robot\" object and string arguments.\n\n## Major Features\n* Self-deploying and updating with **GitOps**-style management\n* Threaded conversation support and thread-awareness\n* Support for hidden Slack \"slash\" commands to reduce channel noise and prevent sensitive information from leaking into team chat\n* Powerful pipeline-oriented engine for creating and combining reusable components in multiple scripting languages\n* Flexible support for encrypted secrets\n* Wide variety of security features including built-in Google Authenticator TOTP\n* Full-featured **IDE** and terminal connector for developing extensions\n* Highly configurable with Go-templated YAML\n\n## Documentation\nThe latest documentation can always be found at the GitHub-hosted [online manual](https://lnxjedi.github.io/gopherbot); the documentation source is in a [separate repository](https://github.com/lnxjedi/gopherbot-doc). Documentation automatically generated from the Go sources can be found at [pkg.go.dev](https://pkg.go.dev/github.com/lnxjedi/gopherbot/v2).\n\nThe manual is still very incomplete; however, sometimes the best documentation is example code. To that end, the most powerful and complete robot I have is [Mr. Data](https://github.com/parsley42/data-gopherbot) (now retired) - the robot that ran my home Kubernetes cluster when I still had time for such things. [Clu](https://github.com/parsley42/clu-gopherbot) is the development robot used for development and writing documentation. Though **Clu** doesn't do any useful work, he has examples of most facets of **Gopherbot** functionality. [Floyd](https://github.com/parsley42/floyd-gopherbot) (a utility robot I shared with my wife) is the oldest and longest-running robot instance, though he retired after AWS started charging for his IP address.\n\n## Release Status\nVersion 2 has been stable for me for over a year, and has finally been released. I've accepted that a fully up-to-date manual will lag significantly, but that is currently where the most work is being done. Version 3 is expected Q1 2025, with the primary features being dynamic Go extension support (already available in v2.15.0) and having all core features migrated to dynamic Go extensions to reduce bootstrapping dependencies.\n\n## Previewing\nIf you have [Docker](https://www.docker.com/) available, you can kick the tires on the default robot running the **terminal** connector:\n```\n$ docker run -it --rm ghcr.io/lnxjedi/gopherbot\n...\nTerminal connector running; Type '|c?' to list channels, '|u?' to list users\n...\ngeneral: *******\ngeneral: Welcome to the *Gopherbot* terminal connector. Since no configuration was\ndetected, you're connected to 'floyd', the default robot.\ngeneral: If you've started the robot by mistake, just hit ctrl-D to exit and try\n'gopherbot --help'; otherwise feel free to play around with the default robot - you\ncan start by typing 'help'. If you'd like to start configuring a new robot, type:\n';setup slack'.\nc:general/u:alice -\u003e help\n...\n```\n\nFor a more thorough preview of Gopherbot in the **IDE**, see the [preview](https://lnxjedi.github.io/gopherbot/botdev/IDE.html#previewing-gopherbot) section in the online manual.\n\n## Downloading\nYou can download the latest release build from the [release page](https://github.com/lnxjedi/gopherbot/releases/latest). Up-to-date container builds can be found in the [GitHub Container Registry](hhttps://github.com/orgs/lnxjedi/packages?repo_name=gopherbot).\n\n### Gopherbot Container Variants\n**Gopherbot** CI/CD pipelines create two container variants:\n* [gopherbot](https://github.com/lnxjedi/gopherbot/pkgs/container/gopherbot) - `ghcr.io/lnxjedi/gopherbot`\n  * `gopherbot` is a fairly minimal gopherbot container for running a production containerized robot\n* [gopherbot-dev](https://github.com/lnxjedi/gopherbot/pkgs/container/gopherbot-dev) - `ghcr.io/lnxjedi/gopherbot-dev`\n  * `gopherbot-dev` uses [OpenVSCode Server](https://github.com/gitpod-io/openvscode-server) for the entrypoint, and is intended for use in setting up and developing extensions for your robots[^devcontainer]\n\n[^devcontainer]: Note that the development container always contains the most recent code in `/opt/gopherbot` - you may want to e.g. `cd /opt/gopherbot; git checkout v2.6.2.1; make`\n\n## Building from Source\nBuilding from source is as straight-forward as `make dist` with the `Makefile`, as long as the build system has all the requirements.\n\n**Requirements:**\n* A recent (1.18+) version of Go\n* Standard build utilities; make, tar, gzip\n\n**Steps:**\n1. Clone this repository\n1. Optionally check out a release version - `git checkout v2.6.2.1`\n1. `make dist` in the repository root to create an installable archive, or just `make` to build the binaries\n1. Follow the [manual installation instructions](https://lnxjedi.github.io/gopherbot/install/ManualInstall.html#installing-the-archive) for installing an archive on your system\n\n---\n\nThis example transcript is a little outdated, and doesn't showcase the new job functionality introduced in version 2 - but **Gopherbot** still knows how to tell jokes.\n\n![](https://raw.githubusercontent.com/wiki/lnxjedi/gopherbot/botdemo.gif)\n\n## Deprecated and Unsupported Platforms\nThe Windows and Darwin (MacOS) ports have both been removed. The best solution for these platforms is to take advantage of the excellent Linux container support to run your robot in a container, perhaps with [Docker Desktop](https://www.docker.com/products/docker-desktop). [WSL](https://docs.microsoft.com/en-us/windows/wsl/install) is also a good solution for Windows.\n\n## Sample Command Plugin with the Ruby API\n```ruby\n#!/usr/bin/ruby\nrequire 'net/http'\nrequire 'json'\n\nrequire 'gopherbot_v1'\nbot = Robot.new()\n\ndefaultConfig = \u003c\u003c'DEFCONFIG'\nHelp:\n- Keywords: [ \"weather\" ]\n  Helptext: [ \"(bot), weather in \u003ccity(,country) or zip code\u003e - fetch the weather from OpenWeatherMap\" ]\nCommandMatchers:\n- Command: weather\n  Regex: '(?i:weather (?:in|for) (.+))'\nDEFCONFIG\n\n# NOTE: the required environment variables need to be supplied as\n# `Parameters` for the `weather` plugin in custom/conf/robot.yaml.\n# The API key should be encrypted.\n\ncommand = ARGV.shift()\n\ncase command\nwhen \"configure\"\n    puts defaultConfig\n    exit\nwhen \"weather\"\n    location = ARGV.shift()\n    location += \",#{ENV[\"DEFAULT_COUNTRY\"]}\" unless location.include?(',')\n    uri = URI(\"http://api.openweathermap.org/data/2.5/weather?q=#{location}\u0026units=#{ENV[\"TEMP_UNITS\"]}\u0026APPID=#{ENV[\"OWM_APIKEY\"]}\")\n    d = JSON::parse(Net::HTTP.get(uri))\n    if d[\"message\"]\n        bot.Say(\"Sorry: \\\"#{d[\"message\"]}\\\", maybe try the zip code?\")\n    else\n        w = d[\"weather\"][0]\n        t = d[\"main\"]\n        bot.Say(\"The weather in #{d[\"name\"]} is currently \\\"#{w[\"description\"]}\\\" and #{t[\"temp\"]} degrees, with a forecast low of #{t[\"temp_min\"]} and high of #{t[\"temp_max\"]}\")\n    end\nend\n```\n\n### Contributing\nPR's welcome. For development, testing, and collaboration, feel free to shoot me an email for an invite to [the LinuxJedi Slack team](https://linuxjedi.slack.com).\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flnxjedi%2Fgopherbot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flnxjedi%2Fgopherbot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flnxjedi%2Fgopherbot/lists"}