A real-time personal finance and investment monitoring platform built with Elixir, Erlang, and PostgreSQL.
Market Mate is a proprietary, source-available system for real-time portfolio monitoring and alerting. The project is intentionally structured to demonstrate how Phoenix LiveView, Ash Framework, and OTP can be used together to model a finance domain, persist application state in PostgreSQL, and run a separate real-time engine for price ingestion and alert evaluation.
The repository is shared for local evaluation, technical interviews, and recruiter or reviewer demos. RevenueLink Technologies LLC retains all rights outside that limited evaluation use.
Market Mate is split into two BEAM applications that share a PostgreSQL-backed data model:
- Elixir / Phoenix / LiveView / Ash handles the web application, domain modeling, user-facing workflows, and in-app notifications. Ash resources and actions define the core business entities and operations rather than concentrating application rules in large Phoenix contexts.
- Erlang / OTP runs the real-time engine responsible for polling market data, ingesting external updates, and evaluating alert conditions on tracked symbols.
- PostgreSQL is the shared source of truth for holdings, tracked symbols, alerts, notifications, and other persisted application state.
At a high level, the Erlang side continuously gathers and evaluates market data, writes durable state and alert-relevant events, and the Elixir side presents that state through LiveView-driven UI flows and user workflows. The split exists to keep the real-time engine operationally focused on concurrency, supervision, and fault isolation, while the Elixir application remains focused on domain behavior, UI composition, and application workflows.
Ash is used as the primary domain-modeling layer for the Elixir application.
- It provides a declarative way to define resources, relationships, validations, and actions.
- Business logic is organized around resource actions instead of being spread across ad hoc controller or context modules.
- That structure helps avoid the drift into context-heavy Phoenix codebases where rules become inconsistent across entry points.
- It improves maintainability by giving the application a consistent shape for reads, writes, policies, and changes.
- As the domain grows, the resource-and-action model scales more cleanly than a collection of manually coordinated service layers.
The real-time engine is implemented in Erlang rather than Elixir by design.
-
Access to lower-level BEAM primitives Erlang provides more direct control over process behavior, message passing, and supervision strategies. This allows finer control over how data flows through the system under continuous, high-frequency workloads.
-
Explicit control over concurrency and messaging The engine is responsible for polling, ingesting, and evaluating market data in near real time. Implementing this layer in Erlang makes it easier to reason about mailbox behavior, backpressure scenarios, and process lifecycle without additional abstraction layers.
-
Protocol-oriented design The engine behaves more like a long-running protocol system than a typical web application. Erlang enables modeling communication flows and state transitions closer to the underlying execution model of the BEAM.
-
Separation of responsibilities The system is intentionally split:
- Erlang handles concurrency, ingestion, alert evaluation, and fault isolation
- Elixir handles domain modeling, workflows, and UI
This keeps the real-time path operationally focused and avoids coupling it to web-layer concerns.
-
Demonstration of BEAM depth This architecture highlights proficiency in both high-level Elixir application design (Phoenix + Ash) and lower-level Erlang/OTP system design, reflecting real-world use of the BEAM across different abstraction layers.
- Import holdings from Fidelity and track portfolio state in the application.
- Monitor tracked symbols with continuously refreshed market data.
- Evaluate target-price and price-threshold alerts and generate in-app notifications.
- Reflect relevant state changes in the UI through LiveView-based updates.
- Erlang for the engine: the ingestion and alerting path benefits from lightweight processes, supervision trees, and predictable fault handling under continuous polling workloads.
- Elixir + Ash for application logic: Phoenix LiveView supports a stateful real-time UI, while Ash gives the business domain a declarative structure that is easier to reason about and extend.
- PostgreSQL as the source of truth: a single durable store keeps the web application and engine aligned on holdings, alerts, and user-visible state.
- Infrastructure kept intentionally simple for MVP: more complex messaging or orchestration layers such as RabbitMQ were deferred until they are justified by throughput, deployment, or operational constraints.
Market Mate is actively under development. Core functionality is working today, including Fidelity import, portfolio tracking, target-price and threshold-based monitoring, alert generation, and in-app notifications. The project is not yet production-ready; current work is focused on refinement, operational hardening, and expanding the feature set without compromising the underlying architecture.
mmex/ # Elixir/Phoenix/LiveView/Ash application
mmerl/ # Erlang/OTP market data and alert engine
shared/db/postgres/ # Shared PostgreSQL schema and database assets
infra/ # CI, Docker, and operational scripts
integration_tests/ # Cross-application and end-to-end test support
docs/ # Supplemental project documentation
This repository may be cloned and run locally for personal evaluation, interview, and demonstration purposes only. Commercial use, redistribution, and derivative works require prior written permission from RevenueLink Technologies LLC.
All intellectual property, product concepts, and source materials remain the property of RevenueLink Technologies LLC. See LICENSE.md for the full terms.
For a detailed functional checklist and scope description, see REQUIREMENTS.md.
Market Mate is developed by Kyle Neal (RevenueLink Technologies LLC) and serves as both a practical tool and a demonstration of real-world Elixir/Erlang/PostgreSQL system design.