{"id":17012219,"url":"https://github.com/ngscheurich/elixirconf-2023","last_synced_at":"2025-04-12T08:40:59.564Z","repository":{"id":198643004,"uuid":"701210273","full_name":"ngscheurich/elixirconf-2023","owner":"ngscheurich","description":"Demo code for my ElixirConf 2023 talk, “Conversational Web APIs”","archived":false,"fork":false,"pushed_at":"2023-10-06T14:53:09.000Z","size":1444,"stargazers_count":6,"open_issues_count":1,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-10T06:05:12.281Z","etag":null,"topics":["elixir","elixirconf"],"latest_commit_sha":null,"homepage":"https://www.youtube.com/watch?v=ZBG9VXTycpI","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/ngscheurich.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}},"created_at":"2023-10-06T06:55:00.000Z","updated_at":"2023-12-07T01:06:41.000Z","dependencies_parsed_at":null,"dependency_job_id":"bb748a73-d4b9-48a2-84c5-344ac79e2086","html_url":"https://github.com/ngscheurich/elixirconf-2023","commit_stats":null,"previous_names":["ngscheurich/elixirconf-2023"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ngscheurich%2Felixirconf-2023","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ngscheurich%2Felixirconf-2023/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ngscheurich%2Felixirconf-2023/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ngscheurich%2Felixirconf-2023/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ngscheurich","download_url":"https://codeload.github.com/ngscheurich/elixirconf-2023/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248543075,"owners_count":21121828,"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":["elixir","elixirconf"],"created_at":"2024-10-14T06:09:53.469Z","updated_at":"2025-04-12T08:40:59.542Z","avatar_url":"https://github.com/ngscheurich.png","language":"Elixir","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Conversational Web APIs Demos\n\nContained herein is the source code that I demoed at my [ElixirConf 2023] talk, “Conversational Web APIs”.\n\nYou can [view the talk on YouTube][video] and it is described thusly:\n\n\u003e Phoenix Channels are great! They’re a go-to solution for adding real-time capabilities to our apps. But with a bit of creative thinking, Channels can also provide a full-duplex alternative to web API models like REST and GraphQL. Come and learn how building a stateful, Channels-based web interface can reduce network traffic, eliminate data overhead, and provide a unified mechanism for establishing application connectivity to browsers, mobile apps, and hardware devices.\n\u003e\n\u003eAfter a brief introduction to (or perhaps a refresher on) Phoenix Channels, we’ll discover the interesting possibilities they represent and the problems they solve when backing a web API. You’ll learn how GridPoint leveraged Channels to build and deploy a “conversational” web API to support a critical business case, get the inside scoop on the tradeoffs involved, and learn why this model might fit your project well.\n\u003e\n\u003e Stick around until the end for an introduction to a new Elixir library that can help jump-start your explorations with a Channel-based web API.\n\n## Projects\n\nYou might notice, upon cursory inspection, that it seems as though I’ve (perhaps _unceremoniously_), jammed the code for four separate projects into a single Git repository. Well, you’re right. I did that. But there _was_ a small ceremony. Let’s just call it a monorepo.\n\n### Counter\n\nThe [`counter`](counter) project is a Phoenix app that powered the audience participation bit of the talk. I know some of you in the audience were just jamming on that button—you know who you are!\n\nTo run it, `mix setup` and then `mix phx.server`. You’ll need [Elixir].\n\n### Counter Client\n\nThe [`counter-client`](counter-client) project is a Electron app that I used to display the audience count average on screen.\n\nTo run it, `npm i` and then `npm start`. You’ll need [Node.js].\n\n### Lyrical\n\nThe [`lyrical`](lyrical) project is a simple implementation of the songs app I used as an example.\n\nTo run it, `mix setup` and then `mix phx.server`. You’ll need [Elixir] and [PostgreSQL]. Check out the [seeds file] to set up your some songs.\n\n\n### Lyrical App\n\nThe [`lyrical-app`](lyrical-app) project is a React Native app that talks to `lyrical`. I demoed this app in the iPhone simulator at the end of the talk.\n\nTo run it, `npm i` and then `npm start`. You’ll need [Node.js] and an iOS or Android dev setup.\n\n## Resources\n\n- [“Routing patterns for manageable Phoenix Channels”][post] by Lucas San Román is the blog post I mentioned\n- [ChannelHandler] is the great Channels routing library I mentioned\n- The [`LyricalWeb.Channels.Dispatcher`][dispatcher] module defines some example routing macros\n\n## License\n\nThis code is licensed under the MIT license.\n\n---\n\n[elixirconf 2023]: https://2023.elixirconf.com/\n[video]: https://www.youtube.com/watch?v=ZBG9VXTycpI\n[elixir]: https://elixir-lang.org/\n[node.js]: https://nodejs.org/en\n[postgresql]: https://www.postgresql.org/\n[seeds file]: lyrical/priv/repo/seeds.exs\n[post]: https://felt.com/blog/pheonix-channel-routing-patterns\n[channelhandler]: https://github.com/doorgan/channel_handler\n[dispatcher]: lyrical/lib/lyrical_web/channels/dispatcher.ex\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fngscheurich%2Felixirconf-2023","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fngscheurich%2Felixirconf-2023","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fngscheurich%2Felixirconf-2023/lists"}