{"id":48714895,"url":"https://github.com/yoavgeva/ferricstore","last_synced_at":"2026-04-26T21:01:06.035Z","repository":{"id":344693517,"uuid":"1182735065","full_name":"yoavgeva/ferricstore","owner":"yoavgeva","description":"Distributed crash-safe key-value store with Redis wire protocol. Durable by default — every write is Raft-committed and fsync'd. Embeddable Elixir library or standalone server. Built with Elixir + Rust NIFs.","archived":false,"fork":false,"pushed_at":"2026-04-26T08:26:30.000Z","size":46137,"stargazers_count":8,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-26T08:34:38.708Z","etag":null,"topics":["acid","bitcask","cache","distributed-systems","elixir","key-value-store","raft","redis","resp3","rust"],"latest_commit_sha":null,"homepage":null,"language":"Elixir","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yoavgeva.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-15T22:37:10.000Z","updated_at":"2026-04-26T08:26:33.000Z","dependencies_parsed_at":"2026-03-16T10:04:05.481Z","dependency_job_id":null,"html_url":"https://github.com/yoavgeva/ferricstore","commit_stats":null,"previous_names":["yoavgeva/ferricstore"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/yoavgeva/ferricstore","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yoavgeva%2Fferricstore","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yoavgeva%2Fferricstore/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yoavgeva%2Fferricstore/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yoavgeva%2Fferricstore/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yoavgeva","download_url":"https://codeload.github.com/yoavgeva/ferricstore/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yoavgeva%2Fferricstore/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32312505,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T19:15:34.056Z","status":"ssl_error","status_checked_at":"2026-04-26T19:15:15.467Z","response_time":129,"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":["acid","bitcask","cache","distributed-systems","elixir","key-value-store","raft","redis","resp3","rust"],"created_at":"2026-04-11T16:16:10.380Z","updated_at":"2026-04-26T21:01:06.021Z","avatar_url":"https://github.com/yoavgeva.png","language":"Elixir","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FerricStore\n\n[![Hex.pm](https://img.shields.io/hexpm/v/ferricstore.svg)](https://hex.pm/packages/ferricstore)\n[![Hex Docs](https://img.shields.io/badge/hex-docs-blue.svg)](https://hexdocs.pm/ferricstore)\n[![CI](https://github.com/yoavgeva/ferricstore/actions/workflows/test.yml/badge.svg)](https://github.com/yoavgeva/ferricstore/actions/workflows/test.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n**The Redis-compatible store where every write is durable by default.**\n\nFerricStore is a distributed, crash-safe key-value store with Redis wire protocol (RESP3). Every write goes through Raft consensus and is fsync'd to disk before the client gets OK. No \"enable persistence\" checkbox. No \"hope the AOF rewrite finishes before the crash.\" Your data survives kill -9, node failures, and power loss — automatically.\n\n## Why FerricStore?\n\nRedis, Dragonfly, and Memcached treat persistence as optional. By default, your data lives only in RAM. Enable AOF? You still lose the last second. Enable RDB snapshots? You lose minutes. Even with replication, failover is manual or requires Sentinel — a separate system to babysit your cache.\n\nYou shouldn't have to choose between speed and safety.\n\nEvery write in FerricStore is:\n\n| Property | How |\n|---|---|\n| **Atomic** | Each command is a single Raft log entry — applied or not, never partial |\n| **Consistent** | Raft linearizability — every read sees the latest committed write |\n| **Isolated** | Single-threaded state machine per shard — commands never interleave |\n| **Durable** | WAL + fdatasync + Raft quorum — majority of nodes must persist before ack |\n\nNot every key needs the same guarantee. FerricStore lets you choose per namespace:\n\n```elixir\n# Session tokens: never lose them (quorum — majority must persist before ack)\nFERRICSTORE.CONFIG SET \"session:\" durability quorum\n\n# Cache entries: speed over safety (async — write to local WAL, replicate in background)\nFERRICSTORE.CONFIG SET \"cache:\" durability async\n```\n\nOne cluster. Mixed workloads. The right tradeoff for each key prefix.\n\n## Beyond Cachex and Nebulex\n\nIf you're using Cachex or Nebulex today, FerricStore gives you:\n\n- **Crash survival** — your cache survives restarts, deploys, and kill -9. ETS doesn't.\n- **Disk-backed eviction** — when RAM fills up, evicted keys are read from disk instead of hitting your database again. Less load on your database, fewer cache stampedes.\n- **No cold start** — restart your app, all data is already on disk. No thundering herd while the cache warms up.\n- **Redis protocol** — non-Elixir services can share the same store. Use any Redis client library.\n- **Data structures beyond key-value** — Hash, List, Set, SortedSet, Stream, Geo, JSON, Bitmap, HyperLogLog, Bloom, Cuckoo, Count-Min Sketch, TopK, TDigest.\n- **Automatic failover** — Raft consensus with leader election. No Sentinel, no manual intervention.\n- **Mixed durability** — quorum (crash-safe) or async (fast) per key prefix in the same cluster.\n\n## Quick Start\n\n### Embedded (inside your Elixir app)\n\n```elixir\n# mix.exs\n{:ferricstore, \"~\u003e 0.3.0\"}\n```\n\n```elixir\n# Durable by default — this write survives kill -9\n:ok = FerricStore.set(\"user:42:name\", \"alice\", ttl: :timer.hours(1))\n{:ok, \"alice\"} = FerricStore.get(\"user:42:name\")\n\n# Atomic compare-and-swap\n{:ok, true} = FerricStore.cas(\"counter\", \"1\", \"2\")\n\n# Distributed lock\n{:ok, true} = FerricStore.lock(\"resource:42\", \"owner-id\", ttl: 30_000)\n```\n\nNo sidecar. No Docker. No ops. Your Phoenix app starts, FerricStore starts with it.\n\n### Standalone (Redis-compatible server)\n\n```bash\ndocker run -p 6379:6379 -e FERRICSTORE_PROTECTED_MODE=false -v ferricstore_data:/data yoavgeva/ferricstore\n\n# Connect with any Redis client\nredis-cli -p 6379\n127.0.0.1:6379\u003e SET user:42:name alice\nOK\n```\n\nDrop-in Redis replacement. 250+ commands. Use your existing Redis client libraries.\n\n## Guides\n\n- [Getting Started](guides/getting-started.md) — installation, configuration, first commands\n- [Best Practices](guides/best-practices.md) — hash tags, durability, pipelining, key design\n- [Architecture](guides/architecture.md) — write path, read path, three-tier storage, Raft consensus\n- [Commands Reference](guides/commands.md) — all 250+ commands with syntax and compatibility notes\n- [Embedded Mode](guides/embedded-mode.md) — using FerricStore inside your Elixir app\n- [Standalone Mode](guides/standalone-mode.md) — Redis-compatible server, dashboard, Prometheus\n- [Configuration](guides/configuration.md) — all config options\n- [Deployment](guides/deployment.md) — Docker, Kubernetes, bare metal, clustering\n- [Security](guides/security.md) — ACL, TLS, protected mode\n- [Extensions](guides/extensions.md) — Plug sessions, Ecto L2 cache\n- [Comparison](guides/comparison.md) — vs Redis, Valkey, Dragonfly, Garnet, Kvrocks, Cachex, Nebulex\n\n## Requirements\n\n- Elixir \u003e= 1.19\n- Erlang/OTP 28+\n- Rust toolchain (for NIF compilation, or use precompiled binaries)\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyoavgeva%2Fferricstore","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyoavgeva%2Fferricstore","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyoavgeva%2Fferricstore/lists"}