Hi everyone!
I’m working on an open-source project built with Elixir and Phoenix. The product (not public yet) is designed to be a modular system with a versioned core and an extensible plugin architecture. The core includes a set of plugins maintained by the product owners and a UI, but customers running their own product instance can also add custom plugins without modifying the core system. Those plugins could also extend the UI.
Here’s what I’m aiming for:
- Versioned Core System:
• Customers should be able to upgrade the product to a new version while ensuring backward compatibility with their existing plugins.
• I’m thinking of using semantic versioning and providing a clear API/contract for plugins.
- Extensible Plugin Architecture:
• The product will have both built-in (core) plugins and external/custom plugins.
• Customers should be able to write their own plugins and integrate them into the product without recompiling the core system.
• Ideally, plugins would be dynamically loaded at runtime or managed in a way that avoids the need to rebuild the release.
- Challenges:
• Handling upgrades in a way that preserves stability for custom plugins.
• Allowing customers to easily build and integrate their plugins, given that Elixir releases bundle and compile the system.
I’m particularly inspired by systems like Kubernetes’ extensibility and Livebook’s Smart Cells, which allow dynamic additions and version compatibility. I’d love to hear from the community:
• Have you worked on similar systems in Elixir or other languages?
• What approaches have you used for plugin architecture and version management?
• Any tips for handling dynamic loading, plugin API contracts, or upgrade paths in Elixir?
• Are there libraries, patterns, or tools in the Elixir ecosystem that you’d recommend?
I’m looking for guidance, feedback, or even cautionary tales as I continue building the product. Thank you in advance for your insights!