{"id":37105208,"url":"https://github.com/lidel/meowkov","last_synced_at":"2026-01-14T12:41:49.011Z","repository":{"id":34592209,"uuid":"38539510","full_name":"lidel/meowkov","owner":"lidel","description":"Markov chain IRC bot (PoC exercise in golang and Redis)","archived":true,"fork":false,"pushed_at":"2019-10-14T14:33:35.000Z","size":71,"stargazers_count":7,"open_issues_count":18,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-06-19T18:12:18.476Z","etag":null,"topics":["chat-bot","golang","irc-bot","markov-chain","redis","text-generation"],"latest_commit_sha":null,"homepage":"https://shitmeowkovsays.tumblr.com","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"cc0-1.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lidel.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-07-04T16:05:29.000Z","updated_at":"2023-01-28T08:39:54.000Z","dependencies_parsed_at":"2022-09-04T10:31:52.447Z","dependency_job_id":null,"html_url":"https://github.com/lidel/meowkov","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/lidel/meowkov","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lidel%2Fmeowkov","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lidel%2Fmeowkov/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lidel%2Fmeowkov/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lidel%2Fmeowkov/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lidel","download_url":"https://codeload.github.com/lidel/meowkov/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lidel%2Fmeowkov/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28420814,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T10:47:48.104Z","status":"ssl_error","status_checked_at":"2026-01-14T10:46:19.031Z","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":["chat-bot","golang","irc-bot","markov-chain","redis","text-generation"],"created_at":"2026-01-14T12:41:48.175Z","updated_at":"2026-01-14T12:41:48.999Z","avatar_url":"https://github.com/lidel.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# meowkov\n\n![meowkov is happy to interact with humans](https://i.imgur.com/Hja2KRJm.jpg)\n\n[![Build Status](https://travis-ci.org/lidel/meowkov.svg)](https://travis-ci.org/lidel/meowkov)\n[![Coverage Status](https://coveralls.io/repos/lidel/meowkov/badge.svg?branch=master\u0026service=github)](https://coveralls.io/github/lidel/meowkov?branch=master)\n[![Go Report Card](http://goreportcard.com/badge/lidel/meowkov)](http://goreportcard.com/report/lidel/meowkov)\n\n\u003e [Markov chain](https://en.wikipedia.org/wiki/Markov_chain) IRC bot and PoC exercise in [golang](http://golang.org/) and [Redis](http://redis.io/)\n\n## Table of Contents\n\n- [Background](#background)\n  - [Markov Chains](#markov-chains)\n- [Usage](#usage)\n  - [Standalone](#running-standalone-binary)\n  - [Docker](#running-with-docker)\n  - [Populating Corpus](#populating-corpus)\n- [License](#license)\n\n## Background\n\nMeowkov is a simple [Markov chain](https://en.wikipedia.org/wiki/Markov_chain) IRC bot.\nCreated as a learning exercise in [golang](http://golang.org/) and [Redis](http://redis.io/).\n\n### Markov Chains\n\n- [Markov Chains at Wikipedia](https://en.wikipedia.org/wiki/Markov_chain)\n- [Markov Chain Explained Visually](http://setosa.io/ev/markov-chains/)\n\n\n## Usage\n\n### Running Standalone Binary\n\nTo start your own instance:\n\n1. Clone the repo: `git clone https://github.com/lidel/meowkov.git`\n2. Copy `meowkov.conf.template` to `meowkov.conf` and change at least `BotName`, `Channels` and `RedisServer`\n3. Run `make build` to build `meowkov` binary\n4. Run `./meowkov`\n5. That is all: meowkov bot will join specified room after a few seconds\n\n#### Commands\n\n- `make build` builds the app\n- `make dev-updatedeps` updates dependencies to latest versions\n- `./meowkov` runs the app against `meowkov.conf` in current directory\n- `./meowkov -c /some/path/meowkov.conf` runs the app with specified config file\n- `echo \"some text\" | ./meowkov -import=true -purge=false`  adds piped strings to the corpus\n- `echo \"some text\" | ./meowkov -import=true -purge=true` replaces corpus with piped data\n  (destructive, remember to backup Redis database before executing this)\n\n### Running with Docker\n\nTo start dockerized instance with latest Redis:\n\n1. Clone the repo: `git clone https://github.com/lidel/meowkov.git`\n2. Copy `meowkov.conf.template` to `meowkov.conf` and change at least `BotName` and `Channels` (`RedisServer` will be set automatically by Docker)\n3. Run `make docker-rebuild` to build (in foreground) and run (in background) via Docker container\n4. That is all: meowkov bot will join specified room after a few seconds\n\n#### Docker Commands\n\n`Makefile` provides commands that simplify build and deployment.    \nCommands assume `meowkov.conf` to be present in the same directory as `Makefile`.    \nRedis data with corpus is persisted to `data/dump.rpd`.\n\n- `make docker-rebuild` builds the app and runs it in a container\n- `make docker-update` same as `docker-rebuild` but also checks for updates of `golang` and `redis` images\n- `make docker-stop` stops already existing container\n- `make docker-start` starts already existing container\n- `make docker-logs` tails the output (runs in debug by default)\n- `make docker-clean` removes meowkov containers and a custom image\n- `echo \"some text\" | make docker-corpus-add` adds piped strings to the corpus\n- `echo \"some text\" | make docker-corpus-replace` replaces corpus with piped data\n  (destructive, remember to backup `data/dump.rpd` before executing this)\n\n### Populating Corpus\n\nThe bot is as good as its corpus.    \nRunning it with empty one will not produce any meaningful results for a long time.    \nIt is a good idea to bootstrap the corpus using old IRC logs, news articles, etc.\n\nText can be loaded into the corpus (which is backed by Redis) like this:\n```\necho \"line one\\nline two with more text\" | make docker-corpus-add\n```\nor if run in standalone mode:\n```\necho \"line one\\nline two with more text\" | ./meowkov -import=true -purge=false\n```\n\nOne may also want to generate input on a different machine, for example from weechat logs:\n\n```\nfind ~/.weechat/logs -name \"*#foo*\" -type f -exec sh -c \"grep -vP '^.+\\t(\u003c/-|--\u003e|--|.*\\*)\\t' {} | cut -f3 -d$'\\t'\" \\; \u003e corpus.txt\n```\nThen transfer the file to the box with meowkov and perform import there:\n```\ncat corpus.txt | make docker-corpus-add\n```\n\nChanges are instantaneous: corpus import can be performed while bot is running, no restart is required.    \nThe same text can be imported multiple times: Markov chains are kept in Redis Sets which provide automatic deduplication.\n\n## License\n\n[CC0 Public Domain Dedication](https://creativecommons.org/publicdomain/zero/1.0/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flidel%2Fmeowkov","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flidel%2Fmeowkov","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flidel%2Fmeowkov/lists"}