{"id":13507380,"url":"https://github.com/fremantle-industries/workbench","last_synced_at":"2025-04-07T05:13:30.415Z","repository":{"id":37952640,"uuid":"230536864","full_name":"fremantle-industries/workbench","owner":"fremantle-industries","description":"From Idea to Execution - Manage your trading operation across a distributed cluster","archived":false,"fork":false,"pushed_at":"2023-03-06T20:10:21.000Z","size":12841,"stargazers_count":120,"open_issues_count":27,"forks_count":21,"subscribers_count":9,"default_branch":"main","last_synced_at":"2025-03-30T22:11:20.122Z","etag":null,"topics":["algo-trading","cloud","cluster","crypto-trading","cryptocurrency","distributed-systems","elixir","elixir-lang","finance","fintech","trading"],"latest_commit_sha":null,"homepage":"","language":"Elixir","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/fremantle-industries.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2019-12-28T00:24:29.000Z","updated_at":"2025-03-02T03:50:42.000Z","dependencies_parsed_at":"2024-05-01T15:27:37.477Z","dependency_job_id":"c2468ca3-2de2-41fd-ba19-4f1853fceaf8","html_url":"https://github.com/fremantle-industries/workbench","commit_stats":{"total_commits":866,"total_committers":6,"mean_commits":"144.33333333333334","dds":"0.30254041570438794","last_synced_commit":"e5aeda7abd72ccffabe5b21f26d48b5c573f9670"},"previous_names":[],"tags_count":18,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fremantle-industries%2Fworkbench","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fremantle-industries%2Fworkbench/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fremantle-industries%2Fworkbench/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fremantle-industries%2Fworkbench/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fremantle-industries","download_url":"https://codeload.github.com/fremantle-industries/workbench/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247595335,"owners_count":20963943,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["algo-trading","cloud","cluster","crypto-trading","cryptocurrency","distributed-systems","elixir","elixir-lang","finance","fintech","trading"],"created_at":"2024-08-01T02:00:32.590Z","updated_at":"2025-04-07T05:13:30.396Z","avatar_url":"https://github.com/fremantle-industries.png","language":"Elixir","funding_links":[],"categories":["Applications","Elixir/Erlang"],"sub_categories":["Data Visualization"],"readme":"# Workbench - From Idea to Execution\n[![Build Status](https://github.com/fremantle-industries/workbench/workflows/test/badge.svg?branch=main)](https://github.com/fremantle-industries/workbench/actions?query=workflow%3Atest)\n[![hex.pm version](https://img.shields.io/hexpm/v/workbench.svg?style=flat)](https://hex.pm/packages/workbench)\n\nManage your trading operation across a distributed cluster\n\n[Install](#install) | [Usage](#usage) | [Features](./docs/FEATURES.md) | [Requirements](./docs/REQUIREMENTS.md) | [Configuration](./docs/CONFIGURATION.md) | [Observability](./docs/OBSERVABILITY.md)\n\n## Project Goals\n\n`workbench` strives to provide a first class development environment that brings the same \nproductivity and performance benefits from the [Phoenix](https://www.phoenixframework.org/) \n\u0026 [Elixir](https://elixir-lang.org/) community to real time algorithmic and quant workflows.\n\n## Install\n\nAdd `workbench` to your list of dependencies in `mix.exs`\n\n```elixir\ndef deps do\n  [\n    {:workbench, \"~\u003e 0.0.18\"}\n  ]\nend\n```\n\nGenerate migrations\n\n```bash\n$ mix workbench.gen.migration\n```\n\nRun migrations\n\n```bash\n$ mix ecto.migrate\n```\n\n## Features\n\n### Stream Real Time Orders\n\n![stream-real-time-orders](./docs/stream-realtime-orders.png)\n\n### Remotely Control Trade Instances in a Cluster\n\n![remote-control-trade](./docs/remote-control-trade.png)\n\n### Live Portfolio Tracking \u0026 Historical Snapshots\n\n[![live-balance-snapshots](./docs/live-balance-snapshots.png)](https://youtu.be/cklMhS0KD88)\n\n### Track Cold Storage\n\n![wallets](./docs/wallets.png)\n\n### Explore Products within the Trading Universe\n\n![products-index](./docs/products-index.png)\n![products-show](./docs/products-show.png)\n\n### Receive Notifications\n\n[![notifications](./docs/notifications.png)](https://youtu.be/NJS0YTsKoiQ)\n\n### Monitor Operations Across Your Cluster\n\n![dashboard-beam-vm-health](./docs/grafana-dashboard-beam-vm-health.png)\n\n![dashboard-tai-health](./docs/grafana-dashboard-tai-health.png)\n\n![dashboard-balances](./docs/grafana-dashboard-balances.png)\n\n## Usage\n\n### Running workbench as a standalone endpoint\n\nAdd the workbench phoenix endpoint to your config\n\n```elixir\nconfig :workbench, WorkbenchWeb.Endpoint,\n  http: [port: 4000],\n  url: [host: \"workbench.localhost\", port: \"4000\"],\n```\n\n### Embedding workbench in your own Elixir project\n\nThere are two options for running `workbench` along side your existing Elixir projects\n\n1. Plug \u0026 Phoenix provide the ability to host multiple endpoints\nas servers on different ports\n\n```elixir\n# config/config.exs\n# Phoenix endpoints\nconfig :my_app, MyAppWeb.Endpoint,\n  pubsub_server: MyApp.PubSub,\n  http: [port: 4000],\n  url: [host: \"my-app.localhost\", port: \"4000\"],\n  live_view: [signing_salt: \"aolmUusQ6//zaa5GZHu7DG2V3YAgOoP/\"],\n  secret_key_base: \"vKt36v4Gi2Orw8b8iBRg6ZFdzXKLvcRYkk1AaMLYX0+ry7k5XaJXd/LY/itmoxPP\",\n  server: true\n\nconfig :workbench, WorkbenchWeb.Endpoint,\n  pubsub_server: Tai.PubSub,\n  http: [port: 4001],\n  url: [host: \"workbench.localhost\", port: \"4001\"],\n  live_view: [signing_salt: \"aolmUusQ6//zaa5GZHu7DG2V3YAgOoP/\"],\n  secret_key_base: \"xKt36v4Gi2Orw8b8iBRg6ZFdzXKLvcRYkk1AaMLYX0+ry7k5XaJXd/LY/itmoxPP\",\n  server: true\n```\n\n2. Use a proxy to host multiple endpoints on the same port [https://github.com/jesseshieh/master_proxy](https://github.com/jesseshieh/master_proxy)\n\n```elixir\n# mix.exs\ndef deps do\n  [{:master_proxy, \"~\u003e 0.1\"}]\nend\n```\n\n```elixir\n# config/config.exs\n# Phoenix endpoints\nconfig :niex, MyAppWeb.Endpoint,\n  pubsub_server: Tai.PubSub,\n  live_view: [signing_salt: \"aolmUusQ6//zaa5GZHu7DG2V3YAgOoP/\"],\n  secret_key_base: \"vKt36v4Gi2Orw8b8iBRg6ZFdzXKLvcRYkk1AaMLYX0+ry7k5XaJXd/LY/itmoxPP\",\n  server: false,\n  debug_errors: true,\n  check_origin: false\n\nconfig :workbench, WorkbenchWeb.Endpoint,\n  pubsub_server: Tai.PubSub,\n  live_view: [signing_salt: \"polmUusQ6//zaa5GZHu7DG2V3YAgOoP/\"],\n  secret_key_base: \"xKt36v4Gi2Orw8b8iBRg6ZFdzXKLvcRYkk1AaMLYX0+ry7k5XaJXd/LY/itmoxPP\",\n  server: false,\n  debug_errors: true,\n  check_origin: false\n\n\n# Master Proxy\nconfig :master_proxy,\n  # any Cowboy options are allowed\n  http: [:inet6, port: 4000],\n  # https: [:inet6, port: 4443],\n  backends: [\n    %{\n      host: ~r/my-app.localhost/,\n      phoenix_endpoint: MyAppWeb.Endpoint\n    },\n    %{\n      host: ~r/workbench.localhost/,\n      phoenix_endpoint: WorkbenchWeb.Endpoint\n    }\n  ]\n```\n\n## Development\n\nYou can run the app natively on the host\n\n```bash\n$ docker-compose up db\n$ mix setup\n$ mix phx.server\n```\n\nOr within `docker-compose`\n\n```\n$ docker-compose up\n```\n\nWait a few seconds for the app to boot and you should be able to view the app at `http://workbench.localhost:4000`\n\n## Test\n\n```bash\n$ docker-compose up db\n$ mix test\n```\n\nSave this and re-open workbench in a private tab\n\n## Help Wanted :)\n\nIf you think this `workbench` thing might be worthwhile and you don't see a feature \nwe would love your contributions to add them! Feel free to drop us an email or open \na Github issue.\n\n## Authors\n\n* [Alex Kwiatkowski](https://github.com/rupurt) - alex+git@fremantle.io\n\n## License\n\n`workbench` is released under the [MIT license](./LICENSE.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffremantle-industries%2Fworkbench","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffremantle-industries%2Fworkbench","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffremantle-industries%2Fworkbench/lists"}