{"id":16370874,"url":"https://github.com/liquidz/jubot","last_synced_at":"2026-04-01T21:50:52.469Z","repository":{"id":26366600,"uuid":"29815793","full_name":"liquidz/jubot","owner":"liquidz","description":"Chatbot framework in Clojure","archived":false,"fork":false,"pushed_at":"2015-05-10T07:33:11.000Z","size":798,"stargazers_count":67,"open_issues_count":1,"forks_count":4,"subscribers_count":6,"default_branch":"master","last_synced_at":"2026-03-27T23:42:02.163Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","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/liquidz.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":"2015-01-25T14:00:08.000Z","updated_at":"2026-02-25T14:00:29.000Z","dependencies_parsed_at":"2022-08-28T12:51:29.591Z","dependency_job_id":null,"html_url":"https://github.com/liquidz/jubot","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/liquidz/jubot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liquidz%2Fjubot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liquidz%2Fjubot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liquidz%2Fjubot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liquidz%2Fjubot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/liquidz","download_url":"https://codeload.github.com/liquidz/jubot/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liquidz%2Fjubot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31292576,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T21:15:39.731Z","status":"ssl_error","status_checked_at":"2026-04-01T21:15:34.046Z","response_time":53,"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-10-11T03:06:21.058Z","updated_at":"2026-04-01T21:50:52.444Z","avatar_url":"https://github.com/liquidz.png","language":"Clojure","funding_links":[],"categories":["Frameworks and libraries"],"sub_categories":["Slack"],"readme":"# jubot\n[![Circle CI](https://circleci.com/gh/liquidz/jubot.svg?style=svg)](https://circleci.com/gh/liquidz/jubot) [![Dependency Status](https://www.versioneye.com/user/projects/54ca4610de7924f81a0000dc/badge.svg?style=flat)](https://www.versioneye.com/user/projects/54ca4610de7924f81a0000dc)\n\n**[API Docs](http://liquidz.github.io/jubot/api/)**\n\n![jubot](resources/jubot.png)\n**Chatbot framework in Clojure.**\n\nCurrently, jubot supports following adapters and brains:\n\n * Adapter\n  * [Slack](https://slack.com/)\n * Brain\n  * [Redis](http://redis.io/)\n\n## Why jubot?\n\n * Simplicity\n  * Handlers are simple functions, and these are **TESTABLE**.\n * Efficiency\n  * Supports REPL friendly development that you love.\n * Extensibility\n  * Easy to exntend system because jubot uses [stuartsierra/component](https://github.com/stuartsierra/component) as a component system.\n\n\n## Getting Started\n\n```sh\n$ lein new jubot YOUR_JUBOT_PROJECT\n$ cd YOUR_JUBOT_PROJECT\n$ lein repl\nuser=\u003e (in \"jubot help\")\n```\n\n\n## Handlers\n\nHandler is a function to process user input.\n\n### Ping pong example:\n\n**NOTE:** This example will response for any addresses because example code does not check `:message-for-me?`.\n\n```clj\n(defn ping-handler\n  \"jubot ping - reply with 'pong'\"\n  [{:keys [text]}]\n  (if (= \"ping\" text) \"pong\"))\n```\n * Arguments\n  * `:user`: User name\n  * `:text`: Input string.\n  * `:to`: Address username.\n  * `:message-for-me?`: Is inputted message addredded to bot or not.\n * Document string\n  * Document string will be shown in chatbot help.\n```clj\nuser=\u003e (in \"jubot help\")\n```\n\nOr you can use [`handler/regexp`](http://liquidz.github.io/jubot/api/jubot.handler.html#var-regexp):\n\n```\n(ns foo.bar\n  (:require\n    [jubot.handler :as jh]))\n\n(defn ping-handler\n  [arg]\n  (jh/regexp arg\n    #\"^ping$\" (constantly \"pong\")))\n```\n\n### Which handlers are collected automatically?\n\nDevelopers do not need to specify which handlers are used, because jubot collects handler functions automatically.\n\n * Public functions that matches `/^.*-handler$/` in `ns-prefix` will be collected automatically.\n  * `ns-prefix` is a namespace regular expression. It is defined in `YOUR_JUBOT_PROJECT.core`.\n  * However, namespaces that matches `/^.*-test$/` is excluded.\n\n\n## Schedules\nSchedule is a function that is called periodically as a cron.\n\n### Good morning/night example:\n```clj\n(ns foo.bar\n  (:require\n    [jubot.scheduler :as js]))\n\n(def good-morning-schedule\n  (js/schedules\n    \"0 0 7 * * * *\"  (fn [] \"good morning\")\n    \"0 0 21 * * * *\" (fn [] \"good night\")))\n```\n * Use [`scheduler/schedule`](http://liquidz.github.io/jubot/api/jubot.scheduler.html#var-schedule) or [`scheduler/schedules`](http://liquidz.github.io/jubot/api/jubot.scheduler.html#var-schedules) to define one or more schedules.\n  * If the function returns string, jubot sends the string to adapter as a message. In other words, jubot does nothing when the function returns other than string.\n * Scheduling format\n  * Jubot uses [cronj](https://github.com/zcaudate/cronj) for scheduling tasks, and scheduling format's details is here: [cronj format](http://docs.caudate.me/cronj/#crontab)\n\n### Which schedules are collected automatically?\nAs same as handler section, jubot collects schedule functions automatically.\n\n * Public schedule funtion that matches `/^.*-schedule$/` in `ns-prefix` will be collected automatically.\n * Test namespaces that matches `/^.*-test$/` are excluded.\n\n## Development in REPL\nJubot provides some useful funcition to develop chatbot in REPL efficiently.\nThese functions are defined in `dev/user.clj`.\n\n```clj\nuser=\u003e (start)   ; start jubot system\nuser=\u003e (stop)    ; stop jubot system\nuser=\u003e (restart) ; reload sources and restart jubot system\nuser=\u003e (in \"jubot ping\")\n```\n\n## Command line arguments\n\n### Adapter name: `-a`, `--adapter`\n * Default value is \"slack\"\n * Possible adapter names are as follows:\n  * slack\n  * repl (for development)\n\n### Brain name: `-b`, `--brain`\n * Default value is \"memory\"\n * Possible brain names are as follow:\n  * redis\n  * memory (for development)\n\n### Chatbot name: `-n`, `--name`\n * Default value is \"jubot\"\n\n## Deploy to Heroku\n 1. Edit `Procfile` as you want\n 1. Create and deploy (the following sample uses Redis as a brain)\n```sh\nheroku apps:create\nheroku addons:add rediscloud\ngit push heroku master\n```\n\nOr use following deployment button based on [jubot-sample](https://github.com/liquidz/jubot-sample).\n\n[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy?template=https://github.com/liquidz/jubot-sample)\n\n### Slack setting\n * Required integration\n  * Outgoing WebHooks\n  * Incoming WebHooks\n * Required environmental variables\n```sh\nheroku config:add SLACK_OUTGOING_TOKEN=\"aaa\"\nheroku config:add SLACK_INCOMING_URL=\"bbb\"\n```\n\n### Advanced setting for heroku\n * Avoid sleeping app\n```sh\nheroku config:add AWAKE_URL=\"Application url on heroku\"\n```\n\n## License\n\nCopyright (C) 2015 [uochan](http://twitter.com/uochan)\n\nDistributed under the Eclipse Public License either version 1.0 or (at\nyour option) any later version.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliquidz%2Fjubot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fliquidz%2Fjubot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliquidz%2Fjubot/lists"}