{"id":13551185,"url":"https://github.com/matrix-org/go-neb","last_synced_at":"2026-01-14T23:12:48.647Z","repository":{"id":10096966,"uuid":"64469341","full_name":"matrix-org/go-neb","owner":"matrix-org","description":"Extensible matrix bot written in Go","archived":true,"fork":false,"pushed_at":"2023-06-28T22:10:20.000Z","size":11439,"stargazers_count":284,"open_issues_count":160,"forks_count":92,"subscribers_count":33,"default_branch":"master","last_synced_at":"2025-04-03T01:34:04.219Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/matrix-org.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,"governance":null,"roadmap":null,"authors":null}},"created_at":"2016-07-29T09:39:03.000Z","updated_at":"2025-01-02T16:25:25.000Z","dependencies_parsed_at":"2024-01-16T18:57:50.752Z","dependency_job_id":"ccca6de9-30a6-400c-a596-fb99e37bfffc","html_url":"https://github.com/matrix-org/go-neb","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/matrix-org/go-neb","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matrix-org%2Fgo-neb","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matrix-org%2Fgo-neb/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matrix-org%2Fgo-neb/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matrix-org%2Fgo-neb/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/matrix-org","download_url":"https://codeload.github.com/matrix-org/go-neb/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matrix-org%2Fgo-neb/sbom","scorecard":{"id":625151,"data":{"date":"2025-08-11","repo":{"name":"github.com/matrix-org/go-neb","commit":"3ba3d4600f42d913824ae36cf98d113d6a0d1099"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.9,"checks":[{"name":"Maintained","score":0,"reason":"project is archived","details":["Warn: Repository is archived."],"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":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yaml: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":"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":"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":"Code-Review","score":8,"reason":"Found 10/12 approved changesets -- score normalized to 8","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":"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: Apache License 2.0: 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":"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/ci.yaml:26: update your workflow using https://app.stepsecurity.io/secureworkflow/matrix-org/go-neb/ci.yaml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yaml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/matrix-org/go-neb/ci.yaml/master?enable=pin","Warn: containerImage not pinned by hash: Dockerfile:2","Warn: containerImage not pinned by hash: Dockerfile:20: pin your Docker image by updating alpine:3.13 to alpine:3.13@sha256:469b6e04ee185740477efa44ed5bdd64a07bbdd6c7e5f5d169e540889597b911","Warn: goCommand not pinned by hash: Dockerfile:12-14","Warn: goCommand not pinned by hash: Dockerfile:12-14","Warn: goCommand not pinned by hash: .github/workflows/ci.yaml:35","Warn: goCommand not pinned by hash: .github/workflows/ci.yaml:36","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 containerImage dependencies pinned","Info:   0 out of   4 goCommand 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":"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":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: github.com/matrix-org/.github/SECURITY.md:1","Info: Found linked content: github.com/matrix-org/.github/SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: github.com/matrix-org/.github/SECURITY.md:1","Info: Found text in security policy: github.com/matrix-org/.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":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 28 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":0,"reason":"16 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2022-0322 / GHSA-cg3q-j54f-5p7p","Warn: Project is vulnerable to: GO-2022-0236 / GHSA-h86h-8ppg-mxmh","Warn: Project is vulnerable to: GO-2021-0238 / GHSA-83g2-8m93-v3w7","Warn: Project is vulnerable to: GO-2022-0288","Warn: Project is vulnerable to: GO-2022-0969 / GHSA-69cg-p879-7622","Warn: Project is vulnerable to: GO-2022-1144 / GHSA-xrjj-mj9h-534m","Warn: Project is vulnerable to: GO-2023-1571 / GHSA-vvpx-j8f3-3w6h","Warn: Project is vulnerable to: GO-2023-1988 / GHSA-2wrh-6pvc-2jm9","Warn: Project is vulnerable to: GO-2023-2102 / GHSA-4374-p667-p6c8","Warn: Project is vulnerable to: GHSA-qppj-fm5r-hxr3","Warn: Project is vulnerable to: GO-2024-2687 / GHSA-4v7x-pqxf-cx7m","Warn: Project is vulnerable to: GO-2024-3333","Warn: Project is vulnerable to: GO-2025-3503 / GHSA-qxp5-gwg8-xv66","Warn: Project is vulnerable to: GO-2025-3595 / GHSA-vvgc-356p-c3xw","Warn: Project is vulnerable to: GO-2025-3488 / GHSA-6v2p-p543-phr9","Warn: Project is vulnerable to: GO-2022-0493 / GHSA-p782-xgp4-8hr8"],"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-21T06:10:54.908Z","repository_id":10096966,"created_at":"2025-08-21T06:10:54.908Z","updated_at":"2025-08-21T06:10:54.908Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28437940,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T22:37:52.437Z","status":"ssl_error","status_checked_at":"2026-01-14T22:37:31.496Z","response_time":107,"last_error":"SSL_read: 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":[],"created_at":"2024-08-01T12:01:43.821Z","updated_at":"2026-01-14T23:12:48.618Z","avatar_url":"https://github.com/matrix-org.png","language":"Go","funding_links":[],"categories":["Go","others"],"sub_categories":[],"readme":"# ⚠️ Discontinued\n\nGo-NEB has been discontinued and won't recieve any updates or support. [matrix-hookshot](https://github.com/matrix-org/matrix-hookshot) is the spiritual successor \nto Go-NEB and supports migrating RSS and GitHub integrations. Other options are also available from [matrix.org](https://matrix.org/ecosystem/integrations/).\n\n# Go-NEB\n[![Build Status](https://github.com/matrix-org/go-neb/actions/workflows/ci.yaml/badge.svg?branch=master)](https://github.com/matrix-org/go-neb/actions/workflows/ci.yaml)\n\nGo-NEB is a [Matrix](https://matrix.org) bot written in Go. It is the successor to [Matrix-NEB](https://github.com/matrix-org/Matrix-NEB), the original Matrix bot written in Python.\n\n# Table of Contents\n * [Quick Start](#quick-start)\n    * [Features](#features)\n * [Installing](#installing)\n * [Running](#running)\n    * [Configuration file](#configuration-file)\n * [API](#api)\n    * [Configuring clients](#configuring-clients)\n    * [Configuring services](#configuring-services)\n    * [Configuring realms](#configuring-realms)\n    * [SAS verification](#sas-verification)\n * [Developing](#developing)\n    * [Architecture](#architecture)\n    * [API Docs](#viewing-the-api-docs)\n\n# Quick Start\n\nClone and run (Requires Go 1.16+):\n\n```bash\ngo build github.com/matrix-org/go-neb\nBIND_ADDRESS=:4050 DATABASE_TYPE=sqlite3 DATABASE_URL=go-neb.db?_busy_timeout=5000 BASE_URL=http://localhost:4050 ./go-neb\n```\n\nGet a Matrix user ID and access token. You can do this, for example, with the following curl command by replacing the user ID, password and Synapse URL with your own.\n\n```bash\ncurl -X POST --header 'Content-Type: application/json' -d '{\n    \"identifier\": { \"type\": \"m.id.user\", \"user\": \"nebUsername\" },\n    \"password\": \"nebPassword\",\n    \"type\": \"m.login.password\"\n}' 'http://localhost:8008/_matrix/client/r0/login'\n```\n\nThis is preferable to, for example, logging in via Riot and copying the access token and device ID from there, as then Riot will have uploaded its own device keys which Go-NEB won't have access to causing it to be unable to create encryption sessions.\n\nThe response of this command will be a JSON object with an access token and device ID.\n\nThen, give the values to Go-NEB:\n\n```bash\ncurl -X POST localhost:4050/admin/configureClient --data-binary '{\n    \"UserID\": \"@goneb:localhost\",\n    \"HomeserverURL\": \"http://localhost:8008\",\n    \"AccessToken\": \"\u003caccess_token\u003e\",\n    \"DeviceID\": \"\u003cDEVICEID\u003e\",\n    \"Sync\": true,\n    \"AutoJoinRooms\": true,\n    \"DisplayName\": \"My Bot\"\n}'\n```\n\nTell it what service to run:\n\n```bash\ncurl -X POST localhost:4050/admin/configureService --data-binary '{\n    \"Type\": \"echo\",\n    \"Id\": \"myserviceid\",\n    \"UserID\": \"@goneb:localhost\",\n    \"Config\": {}\n}'\n```\n\nInvite the bot user into a Matrix room and type `!echo hello world`. It will reply with `hello world`.\n\n\n## Features\n\n### Github\n - Login with OAuth2.\n - Ability to create Github issues on any project.\n - Ability to track updates (add webhooks) to projects. This includes new issues, pull requests as well as commits.\n - Ability to expand issues when mentioned as `foo/bar#1234`.\n - Ability to assign a \"default repository\" for a Matrix room to allow `#1234` to automatically expand, as well as shorter issue creation command syntax.\n\n### JIRA\n - Login with OAuth1.\n - Ability to create JIRA issues on a project.\n - Ability to expand JIRA issues when mentioned as `FOO-1234`.\n\n### Giphy\n - Ability to query Giphy's \"text-to-gif\" engine.\n \n### Guggy\n - Ability to query Guggy's gif engine.\n \n### RSS Bot\n - Ability to read Atom/RSS feeds.\n \n### Travis CI\n - Ability to receive incoming build notifications.\n - Ability to adjust the message which is sent into the room.\n \n### Alertmanager\n - Ability to receive alerts and render them with go templates\n\n\n# Installing\n\nGo-NEB is built using Go 1.16+. Once you have installed Go, run the following commands:\n\n```bash\n# Clone the go-neb repository\ngit clone https://github.com/matrix-org/go-neb\ncd go-neb\n\n# Build go-neb\ngo build github.com/matrix-org/go-neb\n```\n\n# Running\nGo-NEB uses environment variables to configure its SQLite database and bind address. To run Go-NEB, run the following command:\n```bash\nBIND_ADDRESS=:4050 DATABASE_TYPE=sqlite3 DATABASE_URL=go-neb.db?_busy_timeout=5000 BASE_URL=https://public.facing.endpoint ./go-neb\n```\n - `BIND_ADDRESS` is the port to listen on.\n - `DATABASE_TYPE` MUST be \"sqlite3\". No other type is supported.\n - `DATABASE_URL` is where to find the database file. One will be created if it does not exist. It is a URL so parameters can be passed to it. We recommend setting `_busy_timeout=5000` to prevent sqlite3 \"database is locked\" errors.\n - `BASE_URL` should be the public-facing endpoint that sites like Github can send webhooks to.\n - `CONFIG_FILE` is the path to the configuration file to read from. This isn't included in the example above, so Go-NEB will operate in HTTP mode.\n - `LOG_DIR` is a directory that log files will be written to, with log rotation enabled. If set, logging to stderr will be disabled.\nGo-NEB needs to be \"configured\" with clients and services before it will do anything useful. It can be configured via a configuration file OR by an HTTP API.\n\n## Configuration file\nIf you run Go-NEB with a `CONFIG_FILE` environment variable, it will load that file and use it for services, clients, etc. There is a [sample configuration file](config.sample.yaml) which explains all the options. In most cases, these are *direct mappings* to the corresponding HTTP API.\n\n# API\nThe API is documented in sections using godoc. The sections consists of:\n - An HTTP API (the path and method to use)\n - A \"JSON request body\" (the JSON that is inside the HTTP request body)\n - \"Configuration\" information (any additional information that is specific to what you're creating)\n \nTo form the complete API, you need to combine the HTTP API with the JSON request body, and the \"Configuration\" information (which is always under a JSON key called `Config`). In addition, most APIs have a `Type` which determines which piece of code to load. To find out what the right type is for the thing you're creating, check the constants defined in godoc.\n\n## Configuring Clients\nGo-NEB needs to connect as a matrix user to receive messages. Go-NEB can listen for messages as multiple matrix users. The users are configured using an HTTP API and the config is stored in the database.\n\n - [HTTP API Docs](https://matrix-org.github.io/go-neb/pkg/github.com/matrix-org/go-neb/api/handlers/index.html#ConfigureClient.OnIncomingRequest)\n - [JSON Request Body Docs](https://matrix-org.github.io/go-neb/pkg/github.com/matrix-org/go-neb/api/index.html#ClientConfig)\n\n## Configuring Services\nServices contain all the useful functionality in Go-NEB. They require a client to operate. Services are configured using an HTTP API and the config is stored in the database. Services use one of the matrix users configured on Go-NEB to send/receive matrix messages.\n\nEvery service has an \"ID\", \"type\" and \"user ID\". Services may specify additional \"config\" keys: see the specific\nservice you're interested in for the additional keys, if any.\n\n - [HTTP API Docs](https://matrix-org.github.io/go-neb/pkg/github.com/matrix-org/go-neb/api/handlers/index.html#ConfigureService.OnIncomingRequest)\n - [JSON Request Body Docs](https://matrix-org.github.io/go-neb/pkg/github.com/matrix-org/go-neb/api/index.html#ConfigureServiceRequest)\n\nList of Services:\n - [Echo](https://matrix-org.github.io/go-neb/pkg/github.com/matrix-org/go-neb/services/echo/) - An example service\n - [Giphy](https://matrix-org.github.io/go-neb/pkg/github.com/matrix-org/go-neb/services/giphy/) - A GIF bot\n - [Github](https://matrix-org.github.io/go-neb/pkg/github.com/matrix-org/go-neb/services/github/) - A Github bot\n - [Github Webhook](https://matrix-org.github.io/go-neb/pkg/github.com/matrix-org/go-neb/services/github/index.html#WebhookService) - A Github notification bot\n - [Guggy](https://matrix-org.github.io/go-neb/pkg/github.com/matrix-org/go-neb/services/guggy/) - A GIF bot\n - [JIRA](https://matrix-org.github.io/go-neb/pkg/github.com/matrix-org/go-neb/services/jira/) - Integration with JIRA\n - [RSS Bot](https://matrix-org.github.io/go-neb/pkg/github.com/matrix-org/go-neb/services/rssbot/) - An Atom/RSS feed reader\n - [Travis CI](https://matrix-org.github.io/go-neb/pkg/github.com/matrix-org/go-neb/services/travisci/) - Receive build notifications from Travis CI\n\n\n## Configuring Realms\nRealms are how Go-NEB authenticates users on third-party websites.\n\n - [HTTP API Docs](https://matrix-org.github.io/go-neb/pkg/github.com/matrix-org/go-neb/api/handlers/index.html#ConfigureAuthRealm.OnIncomingRequest)\n - [JSON Request Body Docs](https://matrix-org.github.io/go-neb/pkg/github.com/matrix-org/go-neb/api/index.html#ConfigureAuthRealmRequest)\n\nList of Realms:\n - [Github](https://matrix-org.github.io/go-neb/pkg/github.com/matrix-org/go-neb/realms/github/index.html#Realm)\n - [JIRA](https://matrix-org.github.io/go-neb/pkg/github.com/matrix-org/go-neb/realms/jira/index.html#Realm)\n \nAuthentication via HTTP:\n - [Github](https://matrix-org.github.io/go-neb/pkg/github.com/matrix-org/go-neb/realms/github/index.html#Realm.RequestAuthSession)\n - [JIRA](https://matrix-org.github.io/go-neb/pkg/github.com/matrix-org/go-neb/realms/jira/index.html#Realm.RequestAuthSession)\n\nAuthentication via the config file:\n - [Github](https://matrix-org.github.io/go-neb/pkg/github.com/matrix-org/go-neb/realms/github/index.html#Session)\n - [JIRA](https://matrix-org.github.io/go-neb/pkg/github.com/matrix-org/go-neb/realms/jira/index.html#Session)\n\n## SAS verification\nGo-NEB supports SAS verification using the decimal method. Another user can start a verification transaction with Go-NEB using their client, and it will be accepted. In order to confirm the devices, the 3 SAS integers must then be sent to Go-NEB, to the endpoint '/verifySAS' so that it can mark the device as trusted.\n\nFor example, if your user ID is `@user:localhost` and your device ID is `ABCD`, you start a SAS verification with Go-NEB and get the SAS \"1111 2222 3333\". You can perform the following curl request to let Go-NEB know the SAS integers so that it can match them with its own:\n\n```bash\ncurl -X POST --header 'Content-Type: application/json' -d '{\n    \"UserID\": \"@neb:localhost\",\n    \"OtherUserID\": \"@user:localhost\",\n    \"OtherDeviceID\": \"ABCD\",\n    \"SAS\": [1111,2222,3333]\n}' 'http://localhost:4050/verifySAS'\n```\n\nIf the SAS match and you also confirm that via the other device's client, the verification should finish successfully.\n\n# Contributing\n\nBefore submitting pull requests, please read the [Matrix.org contribution guidelines](https://github.com/matrix-org/synapse/blob/develop/CONTRIBUTING.md#sign-off) regarding sign-off of your work.\n\n# Developing\n\nThis project depends on `libolm` for the end-to-end encryption. Therefore,\nyou need to install `libolm3` and `libolm-dev` on Ubuntu / `libolm-devel` on\nCentOS to be able to build and run it.\n\nThere's a bunch more tools this project uses when developing in order to do\nthings like linting. Some of them are bundled with go (fmt and vet) but some\nare not. You should install the ones which are not:\n\n```bash\ngo install honnef.co/go/tools/cmd/staticcheck@latest\ngo install github.com/fzipp/gocyclo/cmd/gocyclo@latest\n```\n\nYou can then install the pre-commit hook:\n\n```bash\n./hooks/install.sh\n```\n\n    \n## Architecture\n\n```\n\n   HOMESERVER\n       |\n+=============================================================+\n|      |                 Go-NEB                               |\n| +---------+                                                 |\n| | Clients |                                                 |\n| +---------+                                                 |\n|      |                                                      |\n| +---------+       +------------+      +--------------+      |\n| | Service |-------| Auth Realm |------| Auth Session |-+    |\n| +---------+       +------------+      +--------------+ |    |\n|     ^                   ^              +---------------+    |\n|     |                   |                                   |\n+=============================================================+\n      |                   |                   \n    WEBHOOK            REDIRECT\n    REQUEST            REQUEST\n    \n    \nClients      = A thing which can talk to homeservers and listen for events. /configureClient makes these.\nService      = An individual bot, configured by a user. /configureService makes these.\nAuth Realm   = A place where a user can authenticate with. /configureAuthRealm makes these.\nAuth Session = An individual authentication session /requestAuthSession makes these.\n\n```\n\n\n## Viewing the API docs\n\nThe full docs can be found on [Github Pages](https://matrix-org.github.io/go-neb/pkg/github.com/matrix-org/go-neb). Alternatively, you can locally host the API docs:\n\n```\n# Start a documentation server listening on :6060\nGOPATH=$GOPATH:$(pwd) godoc -v -http=localhost:6060 \u0026\n\n# Open up the documentation for go-neb in a browser.\nsensible-browser http://localhost:6060/pkg/github.com/matrix-org/go-neb\n```\n\n## Docker image\n\nTo get started quickly, use the image from docker.io:\n```\ndocker run -v /path/to/data:/data -e \"BASE_URL=http://your.public.url:4050\" matrixdotorg/go-neb\n```\n\nIf you'd prefer to build the file yourself, clone this repository and build the `Dockerfile`.\n\nThe image sets the following environment variables:\n```\nBIND_ADDRESS=:4050\nDATABASE_TYPE=sqlite3\nDATABASE_URL=/data/go-neb.db?_busy_timeout=5000\n```\n\nThe image exposes port `4050` and a volume at `/data`. The `BASE_URL` environment variable needs to be set, a volume should be mounted at `/data` and port `4050` should be appropriately mapped as desired.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmatrix-org%2Fgo-neb","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmatrix-org%2Fgo-neb","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmatrix-org%2Fgo-neb/lists"}