{"id":13480635,"url":"https://github.com/yetibot/yetibot","last_synced_at":"2025-05-14T22:08:12.788Z","repository":{"id":2040444,"uuid":"2977472","full_name":"yetibot/yetibot","owner":"yetibot","description":"🤖 Extreme chatops bot for Slack, Discord, Mattermost, IRC 🔧 New contributors welcome 🏗","archived":false,"fork":false,"pushed_at":"2025-03-11T16:03:05.000Z","size":2259,"stargazers_count":351,"open_issues_count":306,"forks_count":62,"subscribers_count":17,"default_branch":"master","last_synced_at":"2025-04-13T18:44:38.813Z","etag":null,"topics":["chatbot","chatops","clojure","docker","irc","slack","unix-pipes","yetibot"],"latest_commit_sha":null,"homepage":"https://yetibot.com","language":"Clojure","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"epl-1.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yetibot.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2011-12-14T03:44:00.000Z","updated_at":"2025-03-04T07:34:07.000Z","dependencies_parsed_at":"2024-01-03T06:57:01.312Z","dependency_job_id":"4e5e77f0-ff45-461a-9f53-3848740fc32f","html_url":"https://github.com/yetibot/yetibot","commit_stats":{"total_commits":2058,"total_committers":29,"mean_commits":70.96551724137932,"dds":"0.13070942662779395","last_synced_commit":"09438bdb9aa411eb9fcc537ba9ed6e7a7a69e4d2"},"previous_names":[],"tags_count":258,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yetibot%2Fyetibot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yetibot%2Fyetibot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yetibot%2Fyetibot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yetibot%2Fyetibot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yetibot","download_url":"https://codeload.github.com/yetibot/yetibot/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254235698,"owners_count":22036963,"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":["chatbot","chatops","clojure","docker","irc","slack","unix-pipes","yetibot"],"created_at":"2024-07-31T17:00:42.914Z","updated_at":"2025-05-14T22:08:07.768Z","avatar_url":"https://github.com/yetibot.png","language":"Clojure","funding_links":[],"categories":["Frameworks and libraries","Clojure"],"sub_categories":["IRC"],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg width=\"560\"\n    src=\"https://github.com/yetibot/yetibot/raw/master/img/yetibot_final.png?raw=true\" /\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n  \u003ci\u003eA chat bot written in Clojure, at your service.\u003c/i\u003e\n\u003c/p\u003e\n\n# Yetibot\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"http://slack.yetibot.com\"\u003e\u003cimg src=\"https://img.shields.io/badge/Yetibot%20Slack-%E2%9C%8C%EF%B8%8F-55C4D4.svg?style=for-the-badge\" alt=\"Slack\" data-canonical-src=\"https://img.shields.io/badge/Yetibot%20Slack-%E2%9C%8C%EF%B8%8F-55C4D4.svg?style=for-the-badge\" style=\"max-width:100%;\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/yetibot/yetibot/actions/workflows/test.yml\"\u003e\u003cimg alt=\"GitHub Workflow Status\" src=\"https://img.shields.io/github/actions/workflow/status/yetibot/yetibot/test.yml?style=for-the-badge\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://clojars.org/yetibot\"\u003e\u003cimg src=\"https://img.shields.io/clojars/v/yetibot.svg?style=for-the-badge\" alt=\"Yetibot\" data-canonical-src=\"https://img.shields.io/clojars/v/yetibot.svg?style=for-the-badge\" style=\"max-width:100%;\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://versions.deps.co/yetibot/yetibot\"\u003e\u003cimg src=\"https://img.shields.io/badge/dynamic/json.svg?label=deps\u0026url=https%3A%2F%2Fversions.deps.co%2Fyetibot%2Fyetibot%2Fstatus.json\u0026query=%24.stats..[%22out-of-date%22]\u0026suffix=%20out%20of%20date\u0026style=for-the-badge\u0026colorB=lightgrey\" alt=\"Outdated dependencies\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://hub.docker.com/r/yetibot/yetibot/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Docker-%F0%9F%90%B3-FDDE68.svg?style=for-the-badge\" alt=\"Yetibot on Docker Hub\" data-canonical-src=\"https://img.shields.io/badge/Docker-%F0%9F%90%B3-FDDE68.svg?style=for-the-badge\" style=\"max-width:100%;\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://codecov.io/gh/yetibot/yetibot\"\u003e\u003cimg src=\"https://img.shields.io/codecov/c/github/yetibot/yetibot.svg?style=for-the-badge\" alt=\"Codecov\" data-canonical-src=\"https://img.shields.io/codecov/c/github/yetibot/yetibot.svg?style=for-the-badge\" style=\"max-width:100%;\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\nYou can think of Yetibot as a **communal command line**. It excels at:\n\n- **teaching**: how to run internal automation, language evaluation for JS,\n  Scala, Clojure, and Haskell\n- **productivity**: automating things around Jenkins, JIRA, running SSH\n  commands on various servers, and interacting with internal APIs via private\n  Yetibot plugins\n- **fun**: Google image search, gif lookups, meme generation\n\nFeatures that make Yetibot powerful and great, which is to say *fun*:\n\n- [**Unix-style pipes**](https://yetibot.com/user-guide#pipes) allow tremendous\n  expressiveness in chaining together complex and flexible commands.\n- [**Sub-expressions**](https://yetibot.com/user-guide#subexpressions) let you\n  embed the output of one command into an outer command. They can be nested as\n  many levels deep as you can imagine (open a PR to add to\n  [EXAMPLES](https://yetibot.com/user-guide#examples) if you come up with\n  something crazy!).\n- [**Aliases**](https://yetibot.com/user-guide#aliases) let you parameterize\n  complex expressions and give them a name allowing your team to quickly build\n  up idiomatic team-specific Yetibot usages (not just memes!).\n- [**Per-channel settings**](https://yetibot.com/user-guide#channel_settings)\n  let you store arbitrary config at the channel level, which can be used by\n  commands or aliases to change the behavior of commands depending on which\n  channel you're in (e.g. the default JIRA project(s) for a channel).\n- [**Feature category toggle**](https://yetibot.com/user-guide#categories) lets\n  you disable or enable entire categories of commands per-channel; useful for\n  disabling gifs in the work-only channel 😁.\n\nTake a look at the [usage examples](https://yetibot.com/user-guide#examples) to\nsee some ~~fun~~ useful things it can do.\n\n\u003cp\u003eThis project is supported by:\u003c/p\u003e\n\u003cp\u003e\n  \u003ca href=\"https://www.digitalocean.com/\"\u003e\n    \u003cimg src=\"https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/SVG/DO_Logo_horizontal_blue.svg\" width=\"201px\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n## New contributors\n\nWelcome new contributors!\n\n- Feel free to tackle [any issue](https://github.com/yetibot/yetibot/issues)\n- Issues labeled [`good first issue`](https://github.com/yetibot/yetibot/labels/good%20first%20issue)\n  are good for first time Yetibot contributors\n- Ask `@devth` for help on [Slack](https://slack.yetibot.com/), GitHub or\n  anywhere else you can find him\n\n## Use it right now\n\nGet an invite to the official Yetibot slack at\n[slack.yetibot.com](http://slack.yetibot.com). There's Yetibot running on a\nDroplet generously provided by [DigitalOcean](https://www.digitalocean.com) that\nyou can play with in Slack.\n\n## Getting started\n\nTo quickly try out Yetibot with minimal config:\n\n- See the [Getting Started](doc/GETTING_STARTED.md) docs including a Docker\n  Compose example\n- [Yetibot on Docker](doc/DOCKER.md) docs if you want to run it with Docker\n\n## Yetibot users\n\nAlready using Yetibot? Please add yourself to the [list of Yetibot\nusers](https://github.com/yetibot/yetibot/wiki/Yetibot-users)!\n\n## Contributing\n\nSee [CONTRIBUTING](CONTRIBUTING.md).\n\n## Road map\n\nYetibot has been undergoing continuous improvement since its inception. These\nare the immediate priorities, in addition to any bug fixes. Feedback and\ncontributions are very welcome!\n\n- [x] Write docs on how to develop Yetibot - See the [Dev\n  Guide](https://yetibot.com/dev-guide)\n- [x] Dockerize Yetibot. Done! Check out [the instructions](doc/DOCKER.md).\n- [x] Integrate with [StackStorm](https://stackstorm.com/) for automation on\n      steriods. Done! Check out\n      [yetibot-stackstorm](https://github.com/yetibot/yetibot-stackstorm).\n- [ ] Create a Heroku deploy button to make it easy to get started\n- [ ] Make adapters plugable\n- [ ] Create more examples of plugins (e.g. Travis)\n- [x] Run a demo Yetibot instance — you can now talk to a Yetibot on Freenode in\n  the `#yetibot` channel or join [Yetibot Slack](https://slack.yetibot.com)!\n- [x] Design \u0026 build [yetibot.com](https://yetibot.com) — \u003cem\u003eDone!\u003c/em\u003e\n- [x] Flatten the config and obtain it via\n  [environ](https://github.com/weavejester/environ) to follow [12 Factor\n  App](http://12factor.net/config) practices\n  [#570](https://github.com/yetibot/yetibot/issues/570)\n\n## Installation\n\nThere are a few ways to run Yetibot:\n\n1. **Follow the [Docker instructions](doc/DOCKER.md)**: the fastest way if you're\n   already using Docker.\n1. [**yetibot-helm**](https://github.com/yetibot/yetibot-helm): the official\n   Helm Chart for quickly running Yetibot on Kubernetes.\n1. **Clone this repo**: this gives you a standard Yetibot installation and\n   provides a git-ignored place to store configuration. Run from the root dir\n   with `lein run`.\n1. **Make your own repo and depend on Yetibot**: this gives you ultimate\n   customizability, allowing you to depend on custom Yetibot plugins or define\n   your own commands in-project, and gives you control over where you store\n   your config (manual management, commit to private git repo, etc...)\n\n   [![Yetibot](https://img.shields.io/clojars/v/yetibot.svg)](https://clojars.org/yetibot)\n\n## Configuration\n\nSee [Configuration docs](https://yetibot.com/ops-guide#configuration).\n\n## Usage\n\nFor more docs see the [User Guide](https://yetibot.com/user-guide).\n\nAll commands are prefixed by `!`.\n\n### Pipes\n\nOutput from one command can be piped to another, like Unix pipes.\n\n```\n!complete does IE support | xargs echo %s? No, it is sucky.\n\ndoes ie support html5? No, it is sucky.\ndoes ie support css3? No, it is sucky.\ndoes ie support svg? No, it is sucky.\ndoes ie support media queries? No, it is sucky.\ndoes ie support ftps? No, it is sucky.\ndoes ie support png? No, it is sucky.\ndoes ie support canvas? No, it is sucky.\ndoes ie support @font-face? No, it is sucky.\ndoes ie support webgl? No, it is sucky.\ndoes ie support ttf? No, it is sucky.\n```\n\n### Backticks\n\nBackticks provide a lightweight syntax for sub-expressions, but they can't be\nnested.\n\n```\n!meme grumpy cat: `catfact` / False\n```\n\n\u003cimg src=\"http://cdn.memegenerator.net/instances/500x/33734863.jpg\" /\u003e\n\n### Nested sub-expressions\n\nFor arbitrarily-nested sub-expressions, use `$(expr)` syntax, which\ndisambiguates the open and closing of an expressions.\n\n```\n!meme philos: $(complete how does one $(users | random | letters | random) | random)\n```\n\n\u003cimg src=\"http://i.imgflip.com/z4d45.jpg\" /\u003e\n\n### Combo\n\n```\n!echo `repeat 4 echo i don't always repeat myself but | unwords`…StackOverflowError | meme interesting:\n```\n\n\u003cimg src=\"http://i.imgflip.com/z4d6f.jpg\" /\u003e\n\n### Aliases\n\nYou can build your own aliases at runtime. These are stored in the configured\ndatabase, so upon restart they are restored.\n\n```\n!alias nogrid = repeat 3 echo `repeat 3 meme grumpy: no | join`\n```\n\nPipes can be used, but the right-hand side must be quoted in order to treat it\nas a literal instead of being evaluated according to normal pipe behavior.\n\n```\n!alias i5 = \"random | echo http://icons.wunderground.com/webcamramdisk/w/a/wadot/324/current.jpg?t=%s\u0026.jpg\"\n```\n\nYou can specify placeholder arguments on the right-hand side using `$s` to\nindicate all arguments, or `$n` (where n is a 1-based index of which arg).\n\n```\n!alias temp = \"weather $s | head 2 | tail\"\n!temp 98104\n=\u003e 33.6 F (0.9 C), Overcast\n```\n\n### Adapter config\n\n**IRC**: Yetibot can listen on any number of channels. You configure\nchannels in\n[config.edn](https://github.com/yetibot/yetibot/blob/53cb4f01f6b6ad0be3f8061d9297a036453f3b9c/config/config-sample.edn#L33-L34).\nYou can also invite Yetibot to a channel at runtime using the IRC `/invite`\ncommand:\n\n```\n/invite yetibot #whoa\n```\n\nWhen you invite Yetibot to a new channel, `config.edn` is overwritten, so next\ntime you restart Yetibot, it will re-join the same channels.\n\nYou can also use the `!room` command to tell yetibot to join or leave a channel.\n\n```\n!help room\nroom join \u003croom\u003e # join \u003croom\u003e\nroom leave \u003croom\u003e # leave \u003croom\u003e\nroom list # list rooms that yetibot is in\nroom set \u003ckey\u003e \u003cvalue\u003e # configure a setting for the current room\nroom settings # show all chat settings for this room\nroom settings \u003ckey\u003e # show the value for a single setting\n```\n\n**Slack**: bots can't join a channel on their own, they must be invited, so\nroom configuration doesn't apply. Instead, `/invite @yetibot` to any channel\nthat you're in, and `/kick @yetibot` if you want it to leave. NB: you might need\nspecial privileges in order to kick.\n\n**Campfire is no longer supported.** If you use Campfire, open an\nissue and we can add it back in!\n\n**Other chat platforms**: If your chat platform of choice is not supported, open\nan issue. Adding adapters is quite easy.\n\n#### Broadcast\n\nIf a room has `broadcast` set to `true`, Tweets will be posted to that room.\nBy default all rooms have it set to false. To enable:\n\n```\n!room set broadcast true\n```\n\n### Help\n\nYetibot self-documents itself using the docstrings of its various commands. Ask it\nfor `!help` to get a list of help topics. `!help all` shows fully expanded command\nlist for each topic.\n\n```\n!help | join ,\n```\n\n```\nUse help \u003ctopic\u003e for more details, !, \u003cgen\u003ethat, alias, ascii, asciichart,\nattack, buffer, catfact, chat, chuck, classnamer, clj, cls, complete, config,\ncount, curl, ebay, echo, eval, features, gh, giftv, grep, haiku, head, help,\nhistory, horse, hs, http, image, info, jargon, jen, join, js, keys, list, log,\nmail, meme, memethat, mustachefact, number, order, poke, poms, random, raw,\nreact, reload, repeat, rest, reverse, rhyme, scala, scalex, sed, set, sort, source,\nsplit, ssh, status, tail, take, tee, twitter, update, uptime, urban, users,\nvals, weather, wiki, wolfram, wordnik, words, xargs, xkcd, zen\n```\n\n## Plugins\n\nYetibot has a plugin-based architecture. Its core which all plugins depend on\nis [yetibot.core](https://github.com/yetibot/yetibot.core).\n\n[![yetibot.core](https://img.shields.io/clojars/v/yetibot.core.svg)](https://clojars.org/yetibot.core)\n\nYetibot will load all commands and observers with namespaces on the classpath\nmatching [these\nregexes](https://github.com/yetibot/yetibot.core/blob/master/src/yetibot/core/loader.clj#L12-16).\n\nThis lets you build any number of independent plugin projects and combine them\nvia standard Leiningen dependencies.\n\n## How it works\n\nCurious how the internals of Yetibot works? At a high level:\n\n1. commands are run through a\n   [parser](https://github.com/yetibot/yetibot.core/blob/master/src/yetibot/core/parser.clj)\n   built on [InstaParse](https://github.com/Engelberg/instaparse):\n1. an [InstaParse\n   transformer](https://github.com/yetibot/yetibot.core/blob/master/src/yetibot/core/interpreter.clj)\n   is configured to evaluate expressions through the interpreter, which handles\n   things like nested sub-expressions and piped commands\n1. [command\n   namespaces](https://github.com/yetibot/yetibot/tree/master/src/yetibot/commands)\n   are\n   [`hook`ed](https://github.com/yetibot/yetibot.core/blob/master/src/yetibot/core/hooks.clj)\n   into the interpreter's `handle-cmd` function using a `cmd-hook` macro and\n   triggered via regex prefix matching\n\n## Getting help\n\nIf the docs or implementation code don't serve you well, please open a pull\nrequest and explain why so we can improve the docs. Also feel free to open an\nissue for feature requests!\n\n## Yetibot in the wild\n\n- [ChatOps - Managing Operations in Group\n  Chat](http://www.oreilly.com/webops-perf/free/chatops.csp) by Jason Hand\n\n## License\n\nCopyright \u0026copy; 2012-2019 Trevor Hartman. Distributed under the [Eclipse Public\nLicense 1.0](http://opensource.org/licenses/eclipse-1.0.php), the same as\nClojure.\n\nLogo designed by [Freeform Design Co](http://freeformdesign.co/).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyetibot%2Fyetibot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyetibot%2Fyetibot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyetibot%2Fyetibot/lists"}