{"__v":0,"_id":"55e06af5186ca30d00f9b448","initVersion":{"_id":"55da5710a955100d00def8eb","version":"1.0.0"},"project":"54348ec95b10711400c6c445","tags":[],"user":{"_id":"54348e770ef9c008001651d4","username":"","name":"Chris McCord"},"createdAt":"2015-08-28T14:06:45.033Z","changelog":[],"body":"[block:image]\n{\n  \"images\": [\n    {\n      \"image\": [\n        \"https://files.readme.io/0RoKaRTw2kvMiGrOWw4g_diff2.png\",\n        \"diff2.png\",\n        \"1200\",\n        \"216\",\n        \"#27aa50\",\n        \"\"\n      ]\n    }\n  ]\n}\n[/block]\nAfter a year and a half of work, 2500 commits, and 30 releases, Phoenix 1.0 is here! With 1.0 in place, Phoenix is set to take on the world whether you're building APIs, HTML5 applications, or network services for native devices. Written in Elixir, you get beautiful syntax, productive tooling and a fast runtime. Along the way, we've had many [success stories of companies using phoenix in production](https://www.youtube.com/watch?v=xT8vDHIvurs&feature=youtu.be), and two ElixirConf's where we showed off Phoenix's progress. \n[block:api-header]\n{\n  \"type\": \"basic\",\n  \"title\": \"Many Thanks\"\n}\n[/block]\nBefore we jump into some of the great things Phoenix has to offer, we owe thanks to the people that helped make this possible.\n\n# José Valim\nThough he'll try to downplay his efforts, José paved the way for Phoenix with a level of contribution that is simply amazing. He not only wrote Elixir, but bootstrapped Phoenix with the [Plug](https://github.com/elixir-lang/plug) library, opened database access with [Ecto](https://github.com/elixir-lang/ecto), and contributed thousands of lines of code to Phoenix itself. Along the way, he crafted Elixir releases and helped build a community that has been such a pleasure to be a part of. Thank you!\n\n# phoenix-core\n\nThe core team devoted many of their nights and weekends to get where we are today. Whether it's [Lance Halvorsen](https://twitter.com/lance_halvorsen) writing the lovely Phoenix guides, [Jason Stiebs](https://twitter.com/peregrine) helping flesh out the initial channels layer, [Eric Meadows-Jönsson](https://twitter.com/emjii) working on hex.pm and making sure we have graceful fallback for older browsers, or [Sonny Scroggin](https://twitter.com/scrogson) contributing in many areas while training newcomers, these people helped make Phoenix what it is today.\n[block:api-header]\n{\n  \"type\": \"basic\",\n  \"title\": \"The real-time web\"\n}\n[/block]\nFrom the beginning, Phoenix has been focused on taking on the real-time web. The goal was to make real-time communication just as trivial as writing a REST endpoint. We've realized that goal with channels. This 90 second clip of a collaborative editor should give you a sense of what's possible:\n[block:embed]\n{\n  \"html\": \"<iframe class=\\\"embedly-embed\\\" src=\\\"//cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FGLa9gtvP13Y%3Ffeature%3Doembed&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DGLa9gtvP13Y&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FGLa9gtvP13Y%2Fhqdefault.jpg&key=02466f963b9b4bb8845a05b53d3235d7&type=text%2Fhtml&schema=youtube\\\" width=\\\"640\\\" height=\\\"480\\\" scrolling=\\\"no\\\" frameborder=\\\"0\\\" allowfullscreen></iframe>\",\n  \"url\": \"https://www.youtube.com/watch?v=GLa9gtvP13Y\",\n  \"title\": \"Phoenix Training Sneak-peek\",\n  \"favicon\": \"https://s.ytimg.com/yts/img/favicon-vflz7uhzw.ico\",\n  \"image\": \"https://i.ytimg.com/vi/GLa9gtvP13Y/hqdefault.jpg\"\n}\n[/block]\nChannels give you a multiplexed connection to the server for bidirectional communication. Phoenix also abstracts the transport layer, so you no longer have to be concerned with how the user has connected. Whether WebSocket, Long-polling, or a custom transport, your channel code remains the same. You write code against an abstracted \"socket\", and Phoenix takes care of the rest. Even on a cluster of machines, your messages are broadcasted across the nodes automatically. Phoenix's javascript client also provides an API that makes client/server communication beautifully simple. This is what it looks like:\n[block:image]\n{\n  \"images\": [\n    {\n      \"image\": [\n        \"https://files.readme.io/BQqrXpR1GlfmvqQowX5Q_channels.png\",\n        \"channels.png\",\n        \"2108\",\n        \"610\",\n        \"#baa365\",\n        \"\"\n      ]\n    }\n  ]\n}\n[/block]\n\n[block:api-header]\n{\n  \"type\": \"basic\",\n  \"title\": \"Beyond the browser\"\n}\n[/block]\nAs a \"web framework\", Phoenix targets traditional browser applications, but the so-called \"web\" is evolving. And we need a framework to evolve with it. Phoenix transcends the browser by connecting not only browsers, but iPhones, Android handsets, and smart devices alike. [Justin Schneck](https://twitter.com/mobileoverlord), [Eoin Shanaghy](https://twitter.com/eoins), and [David Stump](https://twitter.com/davidstump) helped Phoenix realize this goal by writing channel clients for objC, Swift, C#, and Java. To appreciate what this enables, Justin demo'd a Phoenix chat application running on an Apple Watch, iPhone, and web browser all powered by native phoenix channel clients:\n[block:embed]\n{\n  \"html\": \"<iframe class=\\\"embedly-embed\\\" src=\\\"//cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fplayer.vimeo.com%2Fvideo%2F136679715&url=https%3A%2F%2Fvimeo.com%2F136679715&image=http%3A%2F%2Fi.vimeocdn.com%2Fvideo%2F531279922_960.jpg&key=02466f963b9b4bb8845a05b53d3235d7&type=text%2Fhtml&schema=vimeo\\\" width=\\\"1152\\\" height=\\\"720\\\" scrolling=\\\"no\\\" frameborder=\\\"0\\\" allowfullscreen></iframe>\",\n  \"url\": \"https://vimeo.com/136679715\",\n  \"title\": \"Phoenix Channels on Apple Devices\",\n  \"favicon\": \"https://f.vimeocdn.com/images_v6/favicon_32.ico\",\n  \"image\": \"http://i.vimeocdn.com/video/531279922_960.jpg\"\n}\n[/block]\n\n[block:api-header]\n{\n  \"type\": \"basic\",\n  \"title\": \"Productivity in the short term and the long term\"\n}\n[/block]\nIn addition to high connectivity, Phoenix gives you a comfortable feature set to get up and running quickly and be productive with your team. But, Software isn't just about the short-term. Elixir leverages tried and true patterns for long-term project success and maintainability. The Erlang runtime was designed for systems to run for many years, with minimal downtime. Using these patterns and the runtime innovations, you can deploy systems that self-heal, support hot-code uploading, and have capabilities known to support *millions* of connected users. Out of the box, Phoenix provides:\n\n# Short-term productivity\n- Project generation with `mix phoenix.new my_app`\n- Live-reload in development. Make a change to any template, view, or asset and see the results immediately in the browser\n- Postgres, MySQL, MSSQL, and MongoDB resources through [Ecto](https://github.com/elixir-lang/ecto) integration\n- Resource generators, such as `mix phoenix.gen.html User users name:string age:integer` to bootstrap a project and learn the ins and outs of phoenix best practices\n- A precompiled view layer with EEx templates for lightning fast response times, often measuring in *microseconds*\n- Channels for realtime communication\n- and more\n\n# Long-term productivity\n- The ability to run multiple phoenix applications side-by-side in the same OS process or break a bigger application into smaller chunks with umbrella apps: http://blog.plataformatec.com.br/2015/06/elixir-in-times-of-microservices/\n- Erlang OTP tooling to get a live look into your running application and diagnose issues:\n\n[block:image]\n{\n  \"images\": [\n    {\n      \"image\": [\n        \"https://files.readme.io/wKCayIOUQrSLRWkQ3jzt_Screen%20Shot%202015-08-28%20at%209.39.43%20AM.png\",\n        \"Screen Shot 2015-08-28 at 9.39.43 AM.png\",\n        \"1586\",\n        \"1028\",\n        \"#9c5f4e\",\n        \"\"\n      ]\n    }\n  ]\n}\n[/block]\n\n[block:api-header]\n{\n  \"type\": \"basic\",\n  \"title\": \"What's Next?\"\n}\n[/block]\nWe're just getting started with 1.0. With a strong and stable core in place, we'll be building Channel Presence features, internationalization, and more. Be sure to [register for ElixirConf]() in October to find out yet unannounced plans beyond Phoenix 1.1 and other neat things happening in the Elixir ecosystem. José Valim is also hosting a Phoenix webinar on Sept 4 to talk about Phoenix and answer viewer questions.\n\n- [Phoenix webinar & Q/A with José Valim](http://pages.plataformatec.com.br/webinar-phoenix-framework-with-jose-valim), Sept 4\n- [ElixirConf](http://elixirconf.com), October 1-3 Austin, TX\n\n[block:api-header]\n{\n  \"type\": \"basic\",\n  \"title\": \"Getting Started\"\n}\n[/block]\nSo how can you join in on all this fun? The [Phoenix guides](http://www.phoenixframework.org) will take you through the basics and get you up and running quickly. If you're new to Elixir, here's a few resources to get up to speed before jumping into Phoenix:\n\n- [elixir-lang.org getting started guides](http://elixir-lang.org/getting-started/introduction.html)\n- [How I Start:  Elixir](https://howistart.org/posts/elixir/1)\n- [Elixir Workshop](http://www.chrismccord.com/blog/2014/05/27/all-aboard-the-elixir-express/)\n\n\nIt has been an amazing ride, and we're just getting started. Let's show the world what Elixir and Phoenix can do.\n\n–Chris","slug":"phoenix-10-the-framework-for-the-modern-web-just-landed","title":"Phoenix 1.0 – the framework for the modern web just landed"}

Phoenix 1.0 – the framework for the modern web just landed


[block:image] { "images": [ { "image": [ "https://files.readme.io/0RoKaRTw2kvMiGrOWw4g_diff2.png", "diff2.png", "1200", "216", "#27aa50", "" ] } ] } [/block] After a year and a half of work, 2500 commits, and 30 releases, Phoenix 1.0 is here! With 1.0 in place, Phoenix is set to take on the world whether you're building APIs, HTML5 applications, or network services for native devices. Written in Elixir, you get beautiful syntax, productive tooling and a fast runtime. Along the way, we've had many [success stories of companies using phoenix in production](https://www.youtube.com/watch?v=xT8vDHIvurs&feature=youtu.be), and two ElixirConf's where we showed off Phoenix's progress. [block:api-header] { "type": "basic", "title": "Many Thanks" } [/block] Before we jump into some of the great things Phoenix has to offer, we owe thanks to the people that helped make this possible. # José Valim Though he'll try to downplay his efforts, José paved the way for Phoenix with a level of contribution that is simply amazing. He not only wrote Elixir, but bootstrapped Phoenix with the [Plug](https://github.com/elixir-lang/plug) library, opened database access with [Ecto](https://github.com/elixir-lang/ecto), and contributed thousands of lines of code to Phoenix itself. Along the way, he crafted Elixir releases and helped build a community that has been such a pleasure to be a part of. Thank you! # phoenix-core The core team devoted many of their nights and weekends to get where we are today. Whether it's [Lance Halvorsen](https://twitter.com/lance_halvorsen) writing the lovely Phoenix guides, [Jason Stiebs](https://twitter.com/peregrine) helping flesh out the initial channels layer, [Eric Meadows-Jönsson](https://twitter.com/emjii) working on hex.pm and making sure we have graceful fallback for older browsers, or [Sonny Scroggin](https://twitter.com/scrogson) contributing in many areas while training newcomers, these people helped make Phoenix what it is today. [block:api-header] { "type": "basic", "title": "The real-time web" } [/block] From the beginning, Phoenix has been focused on taking on the real-time web. The goal was to make real-time communication just as trivial as writing a REST endpoint. We've realized that goal with channels. This 90 second clip of a collaborative editor should give you a sense of what's possible: [block:embed] { "html": "<iframe class=\"embedly-embed\" src=\"//cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FGLa9gtvP13Y%3Ffeature%3Doembed&url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DGLa9gtvP13Y&image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FGLa9gtvP13Y%2Fhqdefault.jpg&key=02466f963b9b4bb8845a05b53d3235d7&type=text%2Fhtml&schema=youtube\" width=\"640\" height=\"480\" scrolling=\"no\" frameborder=\"0\" allowfullscreen></iframe>", "url": "https://www.youtube.com/watch?v=GLa9gtvP13Y", "title": "Phoenix Training Sneak-peek", "favicon": "https://s.ytimg.com/yts/img/favicon-vflz7uhzw.ico", "image": "https://i.ytimg.com/vi/GLa9gtvP13Y/hqdefault.jpg" } [/block] Channels give you a multiplexed connection to the server for bidirectional communication. Phoenix also abstracts the transport layer, so you no longer have to be concerned with how the user has connected. Whether WebSocket, Long-polling, or a custom transport, your channel code remains the same. You write code against an abstracted "socket", and Phoenix takes care of the rest. Even on a cluster of machines, your messages are broadcasted across the nodes automatically. Phoenix's javascript client also provides an API that makes client/server communication beautifully simple. This is what it looks like: [block:image] { "images": [ { "image": [ "https://files.readme.io/BQqrXpR1GlfmvqQowX5Q_channels.png", "channels.png", "2108", "610", "#baa365", "" ] } ] } [/block] [block:api-header] { "type": "basic", "title": "Beyond the browser" } [/block] As a "web framework", Phoenix targets traditional browser applications, but the so-called "web" is evolving. And we need a framework to evolve with it. Phoenix transcends the browser by connecting not only browsers, but iPhones, Android handsets, and smart devices alike. [Justin Schneck](https://twitter.com/mobileoverlord), [Eoin Shanaghy](https://twitter.com/eoins), and [David Stump](https://twitter.com/davidstump) helped Phoenix realize this goal by writing channel clients for objC, Swift, C#, and Java. To appreciate what this enables, Justin demo'd a Phoenix chat application running on an Apple Watch, iPhone, and web browser all powered by native phoenix channel clients: [block:embed] { "html": "<iframe class=\"embedly-embed\" src=\"//cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fplayer.vimeo.com%2Fvideo%2F136679715&url=https%3A%2F%2Fvimeo.com%2F136679715&image=http%3A%2F%2Fi.vimeocdn.com%2Fvideo%2F531279922_960.jpg&key=02466f963b9b4bb8845a05b53d3235d7&type=text%2Fhtml&schema=vimeo\" width=\"1152\" height=\"720\" scrolling=\"no\" frameborder=\"0\" allowfullscreen></iframe>", "url": "https://vimeo.com/136679715", "title": "Phoenix Channels on Apple Devices", "favicon": "https://f.vimeocdn.com/images_v6/favicon_32.ico", "image": "http://i.vimeocdn.com/video/531279922_960.jpg" } [/block] [block:api-header] { "type": "basic", "title": "Productivity in the short term and the long term" } [/block] In addition to high connectivity, Phoenix gives you a comfortable feature set to get up and running quickly and be productive with your team. But, Software isn't just about the short-term. Elixir leverages tried and true patterns for long-term project success and maintainability. The Erlang runtime was designed for systems to run for many years, with minimal downtime. Using these patterns and the runtime innovations, you can deploy systems that self-heal, support hot-code uploading, and have capabilities known to support *millions* of connected users. Out of the box, Phoenix provides: # Short-term productivity - Project generation with `mix phoenix.new my_app` - Live-reload in development. Make a change to any template, view, or asset and see the results immediately in the browser - Postgres, MySQL, MSSQL, and MongoDB resources through [Ecto](https://github.com/elixir-lang/ecto) integration - Resource generators, such as `mix phoenix.gen.html User users name:string age:integer` to bootstrap a project and learn the ins and outs of phoenix best practices - A precompiled view layer with EEx templates for lightning fast response times, often measuring in *microseconds* - Channels for realtime communication - and more # Long-term productivity - The ability to run multiple phoenix applications side-by-side in the same OS process or break a bigger application into smaller chunks with umbrella apps: http://blog.plataformatec.com.br/2015/06/elixir-in-times-of-microservices/ - Erlang OTP tooling to get a live look into your running application and diagnose issues: [block:image] { "images": [ { "image": [ "https://files.readme.io/wKCayIOUQrSLRWkQ3jzt_Screen%20Shot%202015-08-28%20at%209.39.43%20AM.png", "Screen Shot 2015-08-28 at 9.39.43 AM.png", "1586", "1028", "#9c5f4e", "" ] } ] } [/block] [block:api-header] { "type": "basic", "title": "What's Next?" } [/block] We're just getting started with 1.0. With a strong and stable core in place, we'll be building Channel Presence features, internationalization, and more. Be sure to [register for ElixirConf]() in October to find out yet unannounced plans beyond Phoenix 1.1 and other neat things happening in the Elixir ecosystem. José Valim is also hosting a Phoenix webinar on Sept 4 to talk about Phoenix and answer viewer questions. - [Phoenix webinar & Q/A with José Valim](http://pages.plataformatec.com.br/webinar-phoenix-framework-with-jose-valim), Sept 4 - [ElixirConf](http://elixirconf.com), October 1-3 Austin, TX [block:api-header] { "type": "basic", "title": "Getting Started" } [/block] So how can you join in on all this fun? The [Phoenix guides](http://www.phoenixframework.org) will take you through the basics and get you up and running quickly. If you're new to Elixir, here's a few resources to get up to speed before jumping into Phoenix: - [elixir-lang.org getting started guides](http://elixir-lang.org/getting-started/introduction.html) - [How I Start: Elixir](https://howistart.org/posts/elixir/1) - [Elixir Workshop](http://www.chrismccord.com/blog/2014/05/27/all-aboard-the-elixir-express/) It has been an amazing ride, and we're just getting started. Let's show the world what Elixir and Phoenix can do. –Chris