{"id":34250441,"url":"https://github.com/shortishly/mcd","last_synced_at":"2026-05-29T22:31:07.222Z","repository":{"id":146801319,"uuid":"563745774","full_name":"shortishly/mcd","owner":"shortishly","description":"memcached API compatible server (meta, text and binary) and client","archived":false,"fork":false,"pushed_at":"2023-12-19T21:44:00.000Z","size":303,"stargazers_count":2,"open_issues_count":3,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-19T19:17:10.645Z","etag":null,"topics":["erlang-otp","memcached","server"],"latest_commit_sha":null,"homepage":"https://shortishly.com/blog/mcd-emulating-memcached-with-statem-and-socket/","language":"Erlang","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/shortishly.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}},"created_at":"2022-11-09T08:45:54.000Z","updated_at":"2023-07-13T11:24:10.000Z","dependencies_parsed_at":"2023-11-24T17:41:56.701Z","dependency_job_id":null,"html_url":"https://github.com/shortishly/mcd","commit_stats":null,"previous_names":[],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/shortishly/mcd","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shortishly%2Fmcd","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shortishly%2Fmcd/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shortishly%2Fmcd/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shortishly%2Fmcd/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shortishly","download_url":"https://codeload.github.com/shortishly/mcd/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shortishly%2Fmcd/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33673627,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-29T02:00:06.066Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["erlang-otp","memcached","server"],"created_at":"2025-12-16T09:21:30.748Z","updated_at":"2026-05-29T22:31:07.217Z","avatar_url":"https://github.com/shortishly.png","language":"Erlang","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://shortishly.github.io/mcd/cover/\"\u003e\n      \u003cimg alt=\"Test Coverage\" src=\"https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fshortishly.github.io%2Fmcd%2Fcover%2Fcoverage.json\u0026query=%24.total\u0026suffix=%25\u0026style=flat-square\u0026label=Test%20Coverage\u0026color=green\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://shortishly.github.io/mcd/ct/\"\u003e\n      \u003cimg alt=\"Test Results\" src=\"https://img.shields.io/badge/Tests-Common%20Test-green?style=flat-square\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://shortishly.github.io/mcd/edoc/\"\u003e\n      \u003cimg alt=\"edoc\" src=\"https://img.shields.io/badge/Documentation-edoc-green?style=flat-square\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://erlang.org/\"\u003e\n      \u003cimg alt=\"Erlang/OTP 25+\" src=\"https://img.shields.io/badge/Erlang%2FOTP-25%2B-green?style=flat-square\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://www.apache.org/licenses/LICENSE-2.0\"\u003e\n      \u003cimg alt=\"Apache-2.0\" src=\"https://img.shields.io/github/license/shortishly/mcd?style=flat-square\"\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n## What is MCD?\n\n[mcd][mcd-github] is a [memcached][memcached-org] compatible API\nserver written in [Erlang/OTP 25][erlang-org] using\n[ETS][ets-erlang-org] to maintain the cache of data.\n\nIt has a TCP [memcached][memcached-org] compatible API on port 11211\noffering:\n\n- the original text based [standard\n  protocol][memcached-protocol-text];\n- the [binary protocol][memcached-protocol-binary];\n- the text based [meta protocol][memcached-protocol-meta] (which\n  also deprecates the binary protocol).\n  \n![main](https://github.com/shortishly/mcd/actions/workflows/main.yml/badge.svg)\n  \n## Build\n\n[mcd][mcd-github] uses [erlang.mk][erlang-mk] with [Erlang/OTP\n25][erlang-org] to build:\n\n```shell\nmake\n```\n\n## Run\n\nTo run [mcd][mcd-github] with an [Erlang Shell][erlang-shell]\nlistening on port 11211:\n\n```shell\nmake shell\n```\n\n## Docker\n\nTo run [mcd][mcd-github] as a docker container:\n\n```shell\ndocker run \\\n    --pull always \\\n    --detach \\\n    --publish 11211:11211 \\\n    --rm \\\n    ghcr.io/shortishly/mcd:latest\n```\n\n## API Example\n\nThe text based API is the easiest to try out from the command line\nwith a simple set and get:\n\n```shell\ntelnet localhost 11211\nTrying 127.0.0.1...\nConnected to localhost.\nEscape character is '^]'.\n\nset foo 0 0 6 \nfooval\nSTORED\nget foo\nVALUE foo 0 6\nfooval\nEND\n```\n\nThe implementation uses some recently introduced features of\n[Erlang/OTP][erlang-org]:\n\n- [socket][erlang-org-socket] for all communication\n- [send_request][erlang-org-send-request-4] for asynchronous request\n  and response.\n- the [timeout][erlang-org-statem-timeout] feature of\n  [statem][erlang-org-statem] to expire items from the cache.\n\n[erlang-mk]: https://erlang.mk\n[erlang-org-send-request-4]: https://www.erlang.org/doc/man/gen_statem.html#send_request-4\n[erlang-org-socket]: https://www.erlang.org/doc/man/socket.html\n[erlang-org-statem-timeout]: https://www.erlang.org/doc/man/gen_statem.html#type-timeout_event_type\n[erlang-org-statem]: https://www.erlang.org/doc/man/gen_statem.html\n[erlang-org]: https://www.erlang.org\n[erlang-shell]: https://www.erlang.org/doc/man/shell.html\n[ets-erlang-org]: https://www.erlang.org/doc/man/ets.html\n[mcd-github]: https://github.com/shortishly/mcd\n[memcached-org]: https://memcached.org/\n[memcached-protocol-binary]: https://github.com/memcached/memcached/wiki/BinaryProtocolRevamped\n[memcached-protocol-meta]: https://github.com/memcached/memcached/wiki/MetaCommands\n[memcached-protocol-text]: https://github.com/memcached/memcached/wiki/Commands\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshortishly%2Fmcd","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshortishly%2Fmcd","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshortishly%2Fmcd/lists"}