{"id":29016831,"url":"https://github.com/daveminer/basket","last_synced_at":"2025-06-25T22:41:52.122Z","repository":{"id":212033516,"uuid":"710808852","full_name":"daveminer/basket","owner":"daveminer","description":"Phoenix LiveView server to watch real-time stock ticker data from Alpaca","archived":false,"fork":false,"pushed_at":"2025-05-26T02:22:57.000Z","size":1223,"stargazers_count":7,"open_issues_count":0,"forks_count":0,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-05-26T03:27:48.729Z","etag":null,"topics":["alpaca-markets","api","elixir","phoenix-liveview","phoenix-presence","stock-market","websocket"],"latest_commit_sha":null,"homepage":"","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/daveminer.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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}},"created_at":"2023-10-27T13:37:54.000Z","updated_at":"2025-05-26T02:23:00.000Z","dependencies_parsed_at":null,"dependency_job_id":"85c9ea93-7029-4632-a1cd-10444fbe162f","html_url":"https://github.com/daveminer/basket","commit_stats":null,"previous_names":["daveminer/basket"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/daveminer/basket","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daveminer%2Fbasket","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daveminer%2Fbasket/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daveminer%2Fbasket/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daveminer%2Fbasket/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/daveminer","download_url":"https://codeload.github.com/daveminer/basket/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/daveminer%2Fbasket/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261966520,"owners_count":23237623,"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":["alpaca-markets","api","elixir","phoenix-liveview","phoenix-presence","stock-market","websocket"],"created_at":"2025-06-25T22:41:33.683Z","updated_at":"2025-06-25T22:41:52.095Z","avatar_url":"https://github.com/daveminer.png","language":"Elixir","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Tests](https://github.com/daveminer/basket/actions/workflows/ci.yml/badge.svg)\n\n# Basket\n\nWatch your \"basket\" of stocks in real-time with data from [Alpaca](https://alpaca.markets/).\n\n![](basket_demo.gif)\n\nBasket is intended as a template; it provides a working example of a Phoenix Framework web server utilizing\nthe following tools and patterns:\n\n- Continuous Integration\n- [Phoenix Channels](https://hexdocs.pm/phoenix/channels.html)\n- [Phoenix LiveView](https://hexdocs.pm/phoenix_live_view/Phoenix.LiveView.html)\n- [Phoenix Presence](https://hexdocs.pm/phoenix/presence.html)\n- [Pow](https://github.com/pow-auth/pow)\n- Search Autocomplete (in LiveView)\n- [WebSockex](https://github.com/Azolo/websockex)\n\nBasket also serves as a reference for testing patterns:\n\n- [ExMachina](https://hexdocs.pm/ex_machina/ExMachina.html)\n- [Mox](https://github.com/dashbitco/mox)\n- [Test Server](https://github.com/danschultzer/test_server)\n\nMany thanks to the authors of these excellent libraries!\n\n## Setup\n\n### Install\n\n- Ensure Postgres is running. If using Docker, `docker start postgres` usually works well.\n- Run `mix setup` to install and set up dependencies\n- Start the development server with `make dev`\n- Now you can visit [`localhost:4000`](http://localhost:4000) from your browser.\n\n### Create a Dev User\n\n- Unauthenticated users will be redirected to the registration page as per [Pow](https://github.com/pow-auth/pow) standards.\n  Sign up and verify your email (for a quick fix, populate the `email_verified_at` column in the `User` table)\n- Log in and watch your basket!\n\n## OAuth2 with Google\n\"Login with Google\" is available via [Pow Assent](https://github.com/pow-auth/pow_assent) when the `GOOGLE_CLIENT_ID` and `GOOGLE_CLIENT_SECRET` environment variables are set.\nOther Strategies can be implmented by following the pattern for Google OAuth2:\n\n- Add a [Provider](https://github.com/daveminer/basket/commit/c1c914ae9a8b1d75b5a7720608acb6bde3a8f52a#diff-e43c5cbf91db7a8062b6cb860cbf118296c1b4c7ee32fdcf702e54234ba38092R39-R49)\n- Add a [Login Button](https://github.com/daveminer/basket/commit/a12088574ae9a7533aaa8278225cfb9f65fe6e36#diff-63250f1964336b5c6175d1724abf70cc9be60ca58deb74b05893d5093f18eb85R87)\n\n## Architecture\n\nBasket uses HTTP and WebSocket connections to ingress stock data. The real-time updates are\nreceived over WebSocket and distributed through Phoenix Channels, one per stock ticker. Phoenix\nPresence is utilized to track ticker subscription lifecycles for all users in aggregate against\nthe WebSocket client, sharing one client connection efficiently.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdaveminer%2Fbasket","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdaveminer%2Fbasket","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdaveminer%2Fbasket/lists"}