{"id":29633707,"url":"https://github.com/tibordp/elayday","last_synced_at":"2026-05-20T07:35:03.010Z","repository":{"id":146070887,"uuid":"351950092","full_name":"tibordp/elayday","owner":"tibordp","description":"A UDP delay-line key-value store","archived":false,"fork":false,"pushed_at":"2023-11-18T21:59:44.000Z","size":58,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-03-29T16:55:00.162Z","etag":null,"topics":["delay-line","grpc"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tibordp.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2021-03-27T00:59:54.000Z","updated_at":"2023-11-18T21:50:05.000Z","dependencies_parsed_at":"2023-05-11T04:45:24.537Z","dependency_job_id":null,"html_url":"https://github.com/tibordp/elayday","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/tibordp/elayday","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tibordp%2Felayday","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tibordp%2Felayday/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tibordp%2Felayday/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tibordp%2Felayday/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tibordp","download_url":"https://codeload.github.com/tibordp/elayday/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tibordp%2Felayday/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33250371,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-20T04:48:54.280Z","status":"ssl_error","status_checked_at":"2026-05-20T04:48:10.851Z","response_time":356,"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":["delay-line","grpc"],"created_at":"2025-07-21T14:06:11.212Z","updated_at":"2026-05-20T07:35:02.993Z","avatar_url":"https://github.com/tibordp.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# elayday\n\nelayday is a distributed key-value store inspired by [delay-line memory](https://en.wikipedia.org/wiki/Delay_line_memory). It uses UDP to continuously forward data between two or more nodes, effectively storing data in the network between them.\n\n## Setup\n\nThe easiest way to try out elayday is via Docker:\n\n```\ndocker run -it ghcr.io/tibordp/elayday:latest server \\\n    --bind [::1]:24601 \\\n    --destination [::1]:24602\n```\n\n(If you get `Error: IO(Os { code: 99, kind: AddrNotAvailable, message: \"Address not available\" })`, you should look [into enabling IPv6 for Docker](https://docs.docker.com/config/daemon/ipv6/). If you do not care about IPv6, you really should, but anyway, you can also bind on `127.0.0.1:\u003cport\u003e`)\n\nElayday is now running, but is sending packets into the void, so in order for the delay line to be closed, something needs to be sending the packets back.\n\nYou may be tempted to try\n\n```\ndocker run -it ghcr.io/tibordp/elayday:latest server \\\n    --bind [::1]:24602 \\\n    --destination [::1]:24601\n```\n\nThis would indeed work, but since you are still on localhost, there is not enough delay, so the UDP packets will be looping back so quickly to drain all the CPU. Ideally, you would run the other node somewhere on the other side of the internet. In fact, the destination server does not even have to run elayday, any UDP refelector would work just fine.\n\nIf you want to cheat or just test it out, you may run a reflector which will add artificial delay locally:\n\n```\ndocker run -it ghcr.io/tibordp/elayday:latest reflector \\\n    --bind [::1]:24602 \\\n    --delay \u003cnumber of seconds\u003e\n```\n\nSetup like this is of course not a real delay-line, as most of the time the messages are stored in memory on the reflector.\n\n### Multi-node setup\n\nAn elayday cluster can run on as many nodes as you want, as long as they are arranged in ring topology (destination of each node is set to the address of the next one in the ring and the ring is closed).\n\n## Interacting with the API\n\nelayday has a gRPC interface, which allows you to store and retreive data from the delay line. In order to enable gRPC, add `--bind-grpc \u003caddress\u003e:\u003cport\u003e` command line option, for example:\n\n```\ndocker run -it -p 24603:24603 \\\n    ghcr.io/tibordp/elayday:latest server \\\n    --bind [::1]:24601 \\\n    --destination [::1]:24602 \\\n    --bind-grpc [::1]:24603\n```\n\nFor example, using [gRPCurl](https://github.com/fullstorydev/grpcurl).\n\n\n### Store a key\n```\ngrpcurl -plaintext \\\n  -d '{\"key\":\"foo\",\"value\":\"SGVsbG8gd29ybGQgCg==\"}' \\\n  [::1]:24603 elayday.Elayday/PutValue\n```\n\n### Retreive the key\n```\ngrpcurl -plaintext \\\n    -d '{\"key\":\"foo\"}' \\\n    [::1]:24603 elayday.Elayday/GetValue\n{\n  \"value\": \"SGVsbG8gd29ybGQgCg==\"\n}\n```\n\n## Limitations\n\nThere are no limitations on the size of the values stored (well, it has to fit into memory of the client and server) as elayday will automatically split the large message into UDP packets not exceeding common MTU over the public internet.\n\nCapacity of the delay-line is directly proportional to the product of network bandwidth and the duration of the round-trip. For example, a 10 Gbps of bandwidth and a 200 ms delay will give a capacity of around 250 megabytes.\n\nFor best results wraps 1000 turns of optical fibre around the Earth's equator or put a mirror on Pluto.\n\n## Development\n\nBuild from source with Cargo:\n\n```\ncargo build\n```\n\nA full-featured [Tilt](https://tilt.dev/) environment is available running elayday in your local Kubernetes cluster.\n\n```\ntilt up\n```\n\nThe gRPC API will be available on `localhost:8080`\n\n## Roadmap\n\n- Ability to delete keys\n- Ability to detect non-existent keys on GET operation. Currently it will block until the key appears.\n- Forward error correction to deal with lost packets\n\n## Is this actually useful?\n\nNo.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftibordp%2Felayday","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftibordp%2Felayday","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftibordp%2Felayday/lists"}