stefan_z
Chord - A Flexible Library for Real-Time Context Management 🎵
Hello everyone!
I’m excited to share Chord, an Elixir library I’ve been working on that simplifies real-time context management and state synchronization for distributed and real-time applications. It’s designed to be both flexible and efficient, with an API that’s easy to use and integrate.
Why Chord?
Chord was born out of the need to streamline state synchronization and lifecycle management for real-time systems, where contexts change frequently. Whether you’re building a collaborative application, a real-time dashboard, or a messaging system, Chord provides the tools to manage state seamlessly.
Key Features
- Context Management: Create, update, synchronize, and delete contexts effortlessly.
- Delta Tracking: Minimize data transfer by only sending changes.
- Flexible Backends: Use ETS (in-memory) or Redis (distributed) for storage.
- Partial Updates: Update specific fields within a context without replacing the entire structure.
- Customizable Cleanup: Automatically or manually clean up expired data.
- Context Export & Restore: Export contexts to external storage or restore them when needed.
- Pluggable Architecture: Use custom modules for time providers, delta formatting, and external state restoration.
Open to Feedback
This is the first release of Chord, and I’d love to hear your thoughts! Is there something you’d like to see added or improved? Are there edge cases I haven’t considered? Your feedback would mean a lot and help make Chord even better.
You can find the project on Hex.pm and GitHub:
- Hex: chord | Hex
- GitHub:
Thank you for checking it out, and I’m looking forward to hearing your feedback! ![]()
Most Liked
dimitarvp
Thanks for posting this. Quick feedback: a few more examples, and more real-world-like, would be very appreciated.
l3nz
Agreed - not sure what/where it is supposed to be. What is a “context”?
l3nz
If I were you I’d use that as theproject description on GitHub ![]()
stefan_z
Hi @l3nz,
I see what you mean about it resembling an Elixir Agent, but there are a few key differences and advantages that Chord brings, especially with deltas and their management:
- Flexibility in architecture: While Agents are a stateful abstraction, Chord works in both stateful (via GenServer) and stateless modes (direct calls to backends like Redis or ETS). This flexibility makes it easier to adapt Chord to a variety of use cases.
- Efficient state updates with deltas: Instead of syncing the entire state on every update, Chord tracks the changes (deltas). This minimizes bandwidth usage and makes real-time synchronization more efficient, especially for larger datasets or high-frequency updates.
- Delta retention and expiry: Chord allows you to configure how long deltas are retained and when expired deltas should be cleaned up. This gives you fine-grained control over memory and storage, which is something Agents don’t provide by default.
- Decoupled backend support: Chord allows you to plug in different backends, such as ETS for in-memory storage or Redis for distributed setups. This makes it highly scalable, which can be challenging to achieve with simple Agents.
Let me know if there are specific points you’d like to see covered more in-depth in the docs! ![]()
stefan_z
Hi @dimitarvp, thank you so much for your thoughtful feedback, I truly appreciate it! ![]()
Initially, I chose not to include old_value for the :removed action by default, instead offering the option to implement a custom delta formatter to adapt deltas to specific needs. However, after reflecting on your suggestion, I completely agree with you. Adding old_value to the :removed action provides greater flexibility and aligns better with the behavior of other actions like :modified. I’ll be incorporating this change in the next update.
Regarding your question, a “backend” in Chord simply refers to the underlying data storage mechanism, such as ETS or Redis.
As for “context” versus “state,” I understand your perspective, and you raise a great point. The term “context” was chosen to highlight the library’s flexibility and adaptability, aligning with its design goals. While “state” might feel more universally intuitive, “context” reflects the broader intent behind Chord’s functionality. I really appreciate your input, it’s always valuable to revisit and reflect on these choices.
Thanks again for your insights! Let me know if there’s anything else you’d like to discuss or suggest, I’d be happy to hear it!







