From 94c05ccbfa55bac50fb8dfb80542c6f030db117e Mon Sep 17 00:00:00 2001 From: nelsonic Date: Tue, 7 Jul 2026 15:19:04 +0100 Subject: [PATCH 01/19] add
element to contents to hide #165 --- README.md | 43 ++++++++++++++++++++++++++----------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index c04323a..ceb4c64 100644 --- a/README.md +++ b/README.md @@ -2,12 +2,15 @@ # Technology Stack -The software and systems we use to build the **`dwyl`** platform. +The software and systems we use to build **`@dwyl`**. -![la-rel-easter-KuCGlBXjH_o-unsplash](https://user-images.githubusercontent.com/194400/184178915-302f5a0e-96ab-46c9-9731-ca82affefc7e.jpg "La-Rel Easter - Child stacking blocks") +![la-rel-easter-KuCGlBXjH_o-unsplash](https://user-images.githubusercontent.com/194400/184178915-302f5a0e-96ab-46c9-9731-ca82affefc7e.jpg "La-Rel Easter - Child stacking blocks") +
+ Contents [click to expand] + - [Technology Stack](#technology-stack) - [Why?](#why) - [What?](#what) @@ -50,10 +53,13 @@ The software and systems we use to build the **`dwyl`** platform. - [Other Tech/Tools?](#other-techtools) - [How to Propose `NEW` Tech/Tools?](#how-to-propose-new-techtools) +
+
+ # Why? -As a ***team of people*** -using technology +As a ***team of people*** +using technology to **_make_ digital products**,
it's _essential_ to **be _unambiguous_** about the **stack/tools** we use,
@@ -66,7 +72,9 @@ to make product(s) that are --> > _If **anything** is **unclear** or you have **any questions** please_ -[***ask***](https://github.com/dwyl/technology-stack/issues). +[***ask***](https://github.com/dwyl/technology-stack/issues).
+We are always happy to answer tech stack related questions.
+But please make sure you read the whole doc including the FAQ first. # What? @@ -795,26 +803,27 @@ and reduce the chances of success. ## Other Tech/Tools? -We have written about -our choice of programming language _extensively_ in: -[learn-elixir/issues/102](https://github.com/dwyl/learn-elixir/issues/102). +We have written _extensively_ about +our choice of programming language in: +[learn-elixir#102](https://github.com/dwyl/learn-elixir/issues/102). + +Our use of **`Elixir`** is for a **_very_ specific reason**: +we are building **fault-tolerant realtime systems**. +For the type of App we are building, +**`Erlang/OTP`** is the **_undisputed_ king** +on the **server side**. -Our use of **`Elixir`** is for a very specific reason: -we are building fault-tolerant realtime systems. -For the type of App we are building, -`Erlang/OTP` is the _undisputed_ king -on the server side. We _could_ use almost any other language/framework, but it would be a _lot_ more work for an inferior result. -If we need to build a **_specific_ feature** -requested by a person _using_ our product, -then we will **100%** consider a technology +If we need to build a **_specific_ feature** +requested by a person _using_ our product/service, +then we will **100%** consider a technology that enables us to deliver it. ## How to Propose `NEW` Tech/Tools? -The way to _propose_ a specific tech/tool +The way to _propose_ a **specific tech/tool** is simple: [open an issue](https://github.com/dwyl/technology-stack/issues) describe how the tech/tool From 6c08082890a13f1c28ab95a1868a72ca55a006d5 Mon Sep 17 00:00:00 2001 From: nelsonic Date: Thu, 9 Jul 2026 11:08:46 +0100 Subject: [PATCH 02/19] update links to SO survey 2025 #165 --- README.md | 48 +++++++++++------ flutter.md | 153 ++++++++++++++++++++++++++++++----------------------- 2 files changed, 119 insertions(+), 82 deletions(-) diff --git a/README.md b/README.md index ceb4c64..734fe4a 100644 --- a/README.md +++ b/README.md @@ -63,8 +63,9 @@ using technology to **_make_ digital products**,
it's _essential_ to **be _unambiguous_** about the **stack/tools** we use,
-**so that _everyone_** is **clear** -what we _all_ need to master.
+**so that _everyone_** is **clear** +what we _all_ need to +[**master**](https://www.google.com/search?q=definition+of+mastery).
+we want to maximize our efforts +to build the `App` that _most_ people want/need. +We are focussing on building the **`Web App`** initially +because the web is universally accessible. +_Many_ companies have focussed their initial efforts on `iOS` +because it's the _easiest_ platform to target, +`iOS` buyers have more disposable income and are more likely to _pay_ for apps. > "_Making an App for `iOS` is Faster and Less Expensive_". -> "_`Android` users tend to be -> less willing to pay for apps than `iOS` users, -> so free apps with in-app ads are more common._" +> "_`Android` users tend to be +> less willing to pay for apps than `iOS` users, +> so **free apps** with **in-app ads** are more common._" https://medium.com/@the_manifest/android-vs-ios-which-platform-to-build-your-app-for-first-22ea8996abe1 -> There are fewer iOS devices to target and test on which dramatically shortens dev timelines. -e.g in 2022 there are only **7 supported screen sizes** for iPhone: -> + 4" - iPhone 5S and SE (old screen size but still used by [tens of millions](https://deviceatlas.com/blog/most-popular-iphones) people) -> + 4.7" - iPhone 6, 7, 8 and SE 2020 & 2022 -> + 5.42" - iPhone 12 & 13 Mini -> + 5.5" iPhone 6 Plus, 7 Plus and 8 Plus -> + 5.85" - iPhone X, XS and 11 Pro -> + 6.06" - iPhone XR, iPhone 11, 12 & 13 Pro -> + 6.46" - iPhone XS Max and iPhone 11, 12, 13 Pro Max -See: https://en.wikipedia.org/wiki/List_of_iOS_devices -The _full_ device feature compatibility matrix -is lets developers see _exactly_ what features are available for all iOS devices (including all iPads): https://developer.apple.com/library/archive/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/Displays/Displays.html - -> In **2015** there were _already_ -> "_more than **24,000 different `Android` devices** -> from 1300 brands_" +> There are fewer iOS devices to target +> and test on which dramatically shortens dev timelines. +e.g in 2026 there are only **8 supported screen sizes** for iPhone: + +> + 4.7": iPhone SE (2nd & 3rd generation) +> + 5.42": iPhone 12 & 13 Mini +> + 5.5": iPhone 6 Plus, 7 Plus and 8 Plus +> + 5.85": iPhone X, XS and 11 Pro +> + 6.06": iPhone 11, 12, 13 Pro, 14 Pro +> + 6.3": iPhone 15 Pro, 16 Pro, 17 +> + 6.46" iPhone 11, 12, 13 & 14 Pro Max +> + 6.7": iPhone 16 Plus +> + 6.9": iPhone 16 Pro Max, iPhone 17 Pro Max +See: +[support.apple.com/en-gb/guide/iphone/iphe3fa5df43/ios](https://support.apple.com/en-gb/guide/iphone/iphe3fa5df43/ios) +and +[wikipedia.org/wiki/List_of_iOS_devices](https://en.wikipedia.org/wiki/List_of_iOS_devices) +The _full_ device feature compatibility matrix +lets developers see _exactly_ what features +are available for all iOS devices (including all iPads): +https://developer.apple.com/library/archive/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/Displays/Displays.html + +## How Many Distinct `Android` Devices + +By **2015** there were _already_ +"_more than **24,000 different `Android` devices** +from **1300 brands**_" https://www.zdnet.com/article/android-fragmentation-there-are-now-24000-devices-from-1300-brands + ![image](https://user-images.githubusercontent.com/194400/83424494-60523680-a424-11ea-829c-d75be55d7f17.png) + That was before the _explosion_ of new devices from Chinese and manufacturers. -In 2022 there is no official stat -for the number of devices or screen sizes -(_because Google is painfully aware -of the fragmentation problem -but doesn't want to surface it!_) -suffice to say that it's _several_ orders of magnitude -more complex to build an Android App +In 2026 there is no official stat +for the number of devices or screen sizes +(_because Google is painfully aware +of the fragmentation problem +but doesn't want to surface it!_) +suffice to say that it's **_several_ orders of magnitude** +**more complex** to **build** an **`Android App`** that looks _consistently_ good across all devices. -Android development is _considerably_ more complex, +Android development is _considerably_ more complex, which is why devs prefer `iOS` for their MVP. @@ -277,9 +292,13 @@ and was the 3rd "most loved" framework: [https://insights.stackoverflow.com/survey/2020#technology-most-loved](https://insights.stackoverflow.com/survey/2020#technology-most-loved-dreaded-and-wanted-other-frameworks-libraries-and-tools-loved3) StackOverflow-survey-2020-flutter-most-loved -In the 2022 survey `Flutter` -has overtaken `React Native` -in popularity: +In the 2022 survey `Flutter` +overtook `React Native` +in popularity: https://survey.stackoverflow.co/2022/#section-most-popular-technologies-other-frameworks-and-libraries +and in all years since it has maintained its' lead: +https://survey.stackoverflow.co/2025 + [![HitCount](https://hits.dwyl.com/dwyl/technology-stack-flutter.svg?style=flat-square)](https://hits.dwyl.com/dwyl/technology-stack) + From b97e5a2a3a55e9b5eac4082140d0850dfb135971 Mon Sep 17 00:00:00 2001 From: nelsonic Date: Thu, 9 Jul 2026 18:49:45 +0100 Subject: [PATCH 03/19] add deep link to https://survey.stackoverflow.co/2025/technology#2-web-frameworks-and-technologies for #165 --- README.md | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 734fe4a..2dec578 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ The software and systems we use to build **`@dwyl`**. - [What?](#what) - [The `PETAL` Stack](#the-petal-stack) - [**`Phoenix`**](#phoenix) - - [`Phoenix` the "Most Loved" Framework in 2022](#phoenix-the-most-loved-framework-in-2022) + - [`Phoenix` the "Most Loved" Framework](#phoenix-the-most-loved-framework) - [**`Elixir`**](#elixir) - [`Elixir` is `#2` in 2022](#elixir-is-2-in-2022) - [**`Tailwind CSS`**](#tailwind-css) @@ -79,7 +79,7 @@ But please make sure you read the whole doc first. # What? -This document + diagrams _describe_ +This document + diagrams _describe_ the full "**`PETAL`**" Technology Stack we use for **`dwyl`** products/projects. @@ -93,12 +93,12 @@ and ***world-class quality***! ![dwyl-technology-stack-diagram-PETAL](https://user-images.githubusercontent.com/194400/184719877-a6112c04-7cd9-441f-a293-e6b133d4b67c.png) -"PETAL" is an acronym1 +"PETAL" is an acronym1 for the following elements: ### **`Phoenix`** -**`Phoenix`** is a Web Application Framework +**`Phoenix`** is a Web Application Framework that does not compromise on speed, reliability or maintainability! **`Phoenix`** is the "_successor_" @@ -112,16 +112,21 @@ The list of ***benefits*** Phoenix has over Please see: [dwyl/**learn-phoenix-framework**#our-**top-10-reasons**-why-phoenix](https://github.com/dwyl/learn-phoenix-framework#our-top-10-reasons-why-phoenix)
-#### `Phoenix` the "Most Loved" Framework in 2022 +#### `Phoenix` the "Most Loved" Framework -`Phoenix` tops the list of "Most Loved" Frameworks -on the 2022 StackOverflow Community Survey ❤️ +`Phoenix` tops the list of "**Most Loved**" Frameworks +on the +[2025 StackOverflow Community Survey](https://survey.stackoverflow.co/2025/technology#2-web-frameworks-and-technologies). ❤️ +This is the **3rd year in a row**. https://survey.stackoverflow.co/2022/#section-most-loved-dreaded-and-wanted-web-frameworks-and-technologies + ![stackoverflow-most-loved-framework-phoenix](https://user-images.githubusercontent.com/194400/184833098-0e9cd055-9e4f-4c93-96ed-4411e1a8154c.png) + + ### **`Elixir`** **`Elixir`** is the _functional_ programming language From 7cf2021457cad984367fab99065b5628f6fd1231 Mon Sep 17 00:00:00 2001 From: nelsonic Date: Tue, 21 Jul 2026 09:23:52 +0100 Subject: [PATCH 04/19] tidy legacy/README.md (no change to content) #165 --- legacy/README.md | 51 ++++++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/legacy/README.md b/legacy/README.md index 851e6d8..2b87515 100644 --- a/legacy/README.md +++ b/legacy/README.md @@ -5,19 +5,22 @@ We have deployed our **`Node.js`** stack for _many_ clients and internal apps and achieved good results!
It works well and we have not had any issues with "_performance_" or "_scaling_" deploying to AWS. -> For an example of app built using our Node.js Stack
-see: https://github.com/TheScienceMuseum/collectionsonline
+ +> For an example of app built using our Node.js Stack, +see: [TheScienceMuseum/collectionsonline](https://github.com/TheScienceMuseum/collectionsonline)
+Still runs smoothly and has been maintained and extended over 10 years! +[collection.sciencemuseumgroup.org.uk](https://collection.sciencemuseumgroup.org.uk) There's no "_reason_" to "_rewrite_" any of our _existing_ projects to _any_ other "_stack_".
-**`Node.js`** works perfectly well -and will continue to be supported -for the lifetime -of the project(s) +**`Node.js`** works perfectly well +and will continue to be supported +for the lifetime +of the project(s). -> See: "***tl;dr***" section below if you are _interested_ -in ***why*** we decided to "_evolve_" -to "***PETAL***" for ***new*** projects... +> See: "**TL;DR**" section below if you are _interested_ +in **_why_** we decided to "_evolve_" +to "**_PETAL_**" for **_new_** projects... ## Overview @@ -25,16 +28,19 @@ The following diagram is an overview of our **`Node.js`** stack: ![dwyl-stack-with-postgres](https://cloud.githubusercontent.com/assets/194400/18927934/e5a9d0a4-85b5-11e6-9c59-4d5052d09053.png) -> Note: To edit/improve this diagram: https://github.com/dwyl/technology-stack/issues/1 +> Note: To edit/improve this diagram: +> [dwyl/technology-stack#1](https://github.com/dwyl/technology-stack/issues/1) -We have produced a ***complete beginners guide*** -for *each* of the components in our stack. (see below) +We have produced a **_complete beginners guide_** +for _each_ of the components in our stack. (see below) ## Open Source Projects We Use -### For Us *By* Us +### For Us _By_ Us -We ***craft code*** to [***scratch our own itch***](https://github.com/dwyl/start-here#our-approach-scratching-your-own-itch) and ***everything*** we do is ***always Open Source*** +We **_craft code_** to +[**_scratch our own itch_**](https://github.com/dwyl/start-here#our-approach-scratching-your-own-itch) +and **_everything_** we do is **_always Open Source_**. | Project | Used For | Build Status | Test Coverage | Dependency Status | Tutorial | | --------|----------|:-----:|:--------:|:------------:|-------| @@ -62,21 +68,21 @@ https://github.com/dwyl/learn-hapi It enables realtime, bi-directional communication between web clients and server. Socket.io lets us send data to/from everyone connected to our app(s) without having to refresh the web page. https://socket.io/ -+ **Riot.js** - is the most ***light-weight*** user-interface (UI) framework ++ **Riot.js** - is the most **_light-weight_** user-interface (UI) framework available which is compatible with IE 8/9 and has good -server-side rendering (*which means pages load faster for slow devices like budget smart phones*). +server-side rendering +(_which means pages load faster for slow devices like budget smart phones_). see: https://github.com/dwyl/learn-riot -+ **Redis** - the most popular *in-memory* data store which is *essential* -for building the ***fastest possible*** apps. ++ **Redis** - the most popular _in-memory_ data store which is _essential_ +for building the **_fastest possible_** apps. read more: https://github.com/dwyl/learn-redis + **ElasticSearch** - the most feature-rich search engine. we use it to find things fast. Learn more: https://github.com/dwyl/learn-elasticsearch - ### Development Dependencies -We *carefully* select and only use *well-maintained* -"*pure*" JavaScript modules +We _carefully_ select and only use _well-maintained_ +"_pure_" JavaScript modules in our development toolchain: + **Tape** for testing: https://github.com/dwyl/learn-tape @@ -90,5 +96,4 @@ https://github.com/dwyl/learn-istanbul#tracking-coverage-as-a-service + **CodeClimate** for tracking code quality: https://github.com/dwyl/learn-codeclimate - - [![HitCount](https://hits.dwyl.com/dwyl/technology-stack-node.svg?style=flat-square)](https://hits.dwyl.com/dwyl/technology-stack) +[![HitCount](https://hits.dwyl.com/dwyl/technology-stack-node.svg?style=flat-square)](https://hits.dwyl.com/dwyl/technology-stack) From 515242665a064dffbee0fde4fcdf84eb35390ef2 Mon Sep 17 00:00:00 2001 From: nelsonic Date: Thu, 23 Jul 2026 14:32:15 +0100 Subject: [PATCH 05/19] add recommended reading link to Ask HN: MVP Stack: https://news.ycombinator.com/item?id=34530052 #165 --- README.md | 100 +++++++++++++++++++++++++++++++++++------------------- 1 file changed, 66 insertions(+), 34 deletions(-) diff --git a/README.md b/README.md index 2dec578..8f7ecc5 100644 --- a/README.md +++ b/README.md @@ -18,10 +18,10 @@ The software and systems we use to build **`@dwyl`**. - [**`Phoenix`**](#phoenix) - [`Phoenix` the "Most Loved" Framework](#phoenix-the-most-loved-framework) - [**`Elixir`**](#elixir) - - [`Elixir` is `#2` in 2022](#elixir-is-2-in-2022) - - [**`Tailwind CSS`**](#tailwind-css) - - [**`Alpine.js`**](#alpinejs) - - [**`LiveView`**](#liveview) + - [`Elixir` Remains Most Loved Language](#elixir-remains-most-loved-language) + - [`Tailwind CSS`](#tailwind-css) + - [`Alpine.js` (Optional)](#alpinejs-optional) + - [`LiveView`](#liveview) - [_Beginner_ Tutorials?](#beginner-tutorials) - [**`Phoenix`/`Elixir`**:](#phoenixelixir) - [Small Projects That Showcase `Phoenix`](#small-projects-that-showcase-phoenix) @@ -52,6 +52,7 @@ The software and systems we use to build **`@dwyl`**. - [Radical Simplicity](#radical-simplicity) - [Other Tech/Tools?](#other-techtools) - [How to Propose `NEW` Tech/Tools?](#how-to-propose-new-techtools) +- [Recommended Reading](#recommended-reading)
@@ -86,8 +87,8 @@ we use for **`dwyl`** products/projects. Each element in our stack was _carefully_ selected based on its individual merits.
When _assembled_ into a seamless "machine", -the stack is _unrivaled_ for **developer productivity** -and ***world-class quality***! +the stack is _unrivaled_ for **developer effectiveness** +and _**world-class quality**_! ## The `PETAL` Stack @@ -107,7 +108,7 @@ Built _from scratch_ by highly experienced engineers who worked on/with Rails. It _solves_ all of the speed/socket/scaling/concurrency, issues people felt when building/using Rails apps. -The list of ***benefits*** Phoenix has over +The list of _**benefits**_ Phoenix has over (_virtually every_) other Web Frameworks is _extensive_.
Please see: [dwyl/**learn-phoenix-framework**#our-**top-10-reasons**-why-phoenix](https://github.com/dwyl/learn-phoenix-framework#our-top-10-reasons-why-phoenix)
@@ -115,9 +116,9 @@ Please see: #### `Phoenix` the "Most Loved" Framework `Phoenix` tops the list of "**Most Loved**" Frameworks -on the +on the [2025 StackOverflow Community Survey](https://survey.stackoverflow.co/2025/technology#2-web-frameworks-and-technologies). ❤️ -This is the **3rd year in a row**. +for the **3rd year in a row**. https://survey.stackoverflow.co/2022/#section-most-loved-dreaded-and-wanted-web-frameworks-and-technologies @@ -125,8 +126,6 @@ https://survey.stackoverflow.co/2022/#section-most-loved-dreaded-and-wanted-web- ![stackoverflow-most-loved-framework-phoenix](https://user-images.githubusercontent.com/194400/184833098-0e9cd055-9e4f-4c93-96ed-4411e1a8154c.png) - - ### **`Elixir`** **`Elixir`** is the _functional_ programming language @@ -144,47 +143,66 @@ Also a language's popularity has more to do with the intellectual inertia people/companies have because they allow existing (_legacy_) codebases to dictate future development; i.e. -[***sunk cost bias***](https://www.investopedia.com/terms/s/sunk-cost-trap.asp). -see: [dwyl/**learn-elixir#key-advantages**](https://github.com/dwyl/learn-elixir#**key-advantages**) +[_**sunk cost bias**_](https://www.investopedia.com/terms/s/sunk-cost-trap.asp). +see: +[dwyl/**learn-elixir#key-advantages**](https://github.com/dwyl/learn-elixir#key-advantages-) -#### `Elixir` is `#2` in 2022 +#### `Elixir` Remains Most Loved Language -`Elixir` is the 2nd +`Elixir` is the 2nd "Most Loved" programming language: https://survey.stackoverflow.co/2022/#section-most-loved-dreaded-and-wanted-programming-scripting-and-markup-languages ![stackoverflow-survey-elixir](https://user-images.githubusercontent.com/194400/184831055-7f22484b-4c2b-472a-bf09-9165ef5fc7f9.png) -This is a good measure of how much people _enjoy_ working -in the language. -And as we all know people who _enjoy_ their work -are _better_ at doing it! -### **`Tailwind CSS`** +This is a good measure +of how much people _enjoy_ working +in the language. +And as we all know people who _enjoy_ their work +are _better_ at doing it! + +### `Tailwind CSS` -**`Tailwind`** is the most _sane_ way +**`Tailwind`** is the most _sane_ way of creating a _beautiful_ web app UI that can _easily_ be extended by a team of people without fear of one person's change "_breaking_" another feature. Unlike "_traditional_" CSS which - _as it's name implies_ - encourages -"_cascading_" of styles, `Tailwind` +"_cascading_" of styles, `Tailwind` makes the style of each component _specific_ and _local_ to that component. -see: +see: [dwyl/**learn-tailwind**](https://github.com/dwyl/learn-tailwind) -### **`Alpine.js`** +We paid for a license for +**Tailwind Plus**: +[tailwindcss.com/plus](https://tailwindcss.com/plus) +It has hundreds of carefully crafted UI templates +that can easily be customized. -**`Alpine.js`** is a lightweight library for enhancing interactions -in a web application. It's declarative, responsive and easy to learn. -`Alphine.js` plays well with `LiveView` for progressive enhancements. -see: +### `Alpine.js` (Optional) + +**`Alpine.js`** is a **lightweight** library +for enhancing interactions in a web application. +It's **declarative**, responsive and easy to learn. +`Alphine.js` plays well with `LiveView` for +[progressive enhancements](https://en.wikipedia.org/wiki/Progressive_enhancement). +see: [dwyl/**learn-alpine.js**](https://github.com/dwyl/learn-alpine.js) -### **`LiveView`** +`alpine.min.js @ 3.13.8` is `41 Kb` _uncompressed_. +When delivered over a network (minified + gzipped), +the size footprint drops down to roughly `14 KB`. + +This means it loads in under + + +### `LiveView` **`LiveView`** is a radically simplified way -of building realtime web apps with significantly less code. +of building **realtime web apps** with significantly less code. +
@@ -855,15 +873,29 @@ that has been requested by a person using our product. _Proactively_ create a **`new` repo** in the dwyl org -to capture your own learning +to capture your own learning of the tech/tool you are proposing. -e.g: +e.g: [dwyl?q=learn](https://github.com/dwyl?q=learn&type=all&language=&sort=) -Once you have invested the time +Once you have invested the time to learn the tech/tool beyond **`"hello world"`** and are confident that it will help us achieve a specific end-goal, -then _please_ make the case for it. +then _please_ make the case for it. [![HitCount](https://hits.dwyl.com/dwyl/technology-stack.svg?style=flat-square)](https://hits.dwyl.com/dwyl/technology-stack) + +# Recommended Reading + +This thread on **Hacker News** +with 723 comments +converges on the "**PETAL**" stack: +"Ask HN: **What** would be your **stack** if you are **building an MVP** today?" +https://news.ycombinator.com/item?id=34530052 +It's from 2023 but is still 100% relevant. +If anything the JS ecosystem is even _more_ fragmented +and the non-Elixir frameworks haven't caught-up to Phoenix +which just keeps getting better with each new release. + +[![HitCount](https://hits.dwyl.com/dwyl/technology-stack.svg?style=flat-square)](https://hits.dwyl.com/dwyl/technology-stack) \ No newline at end of file From f2cb99662d6dd16f4a993888d38ebc92aae6e2c5 Mon Sep 17 00:00:00 2001 From: nelsonic Date: Fri, 24 Jul 2026 11:34:35 +0100 Subject: [PATCH 06/19] Add .DS_Store to .gitignore for #164 see: https://en.wikipedia.org/wiki/.DS_Store --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 2130136..9b400f6 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,6 @@ build/Release node_modules npm-debug.log .eslintrc.js + +# https://en.wikipedia.org/wiki/.DS_Store +.DS_Store \ No newline at end of file From 88c05a23b78cd1e22a220013e804519367fdb6d9 Mon Sep 17 00:00:00 2001 From: nelsonic Date: Fri, 24 Jul 2026 11:37:45 +0100 Subject: [PATCH 07/19] Tidy .gitignore (remove old/unused lines) #165 --- .gitignore | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 9b400f6..2a35ca6 100644 --- a/.gitignore +++ b/.gitignore @@ -13,20 +13,13 @@ lib-cov # Coverage directory used by tools like istanbul coverage -# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# node-waf configuration -.lock-wscript - # Compiled binary addons (https://nodejs.org/api/addons.html) build/Release # Dependency directory -# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git node_modules npm-debug.log .eslintrc.js -# https://en.wikipedia.org/wiki/.DS_Store +# en.wikipedia.org/wiki/.DS_Store .DS_Store \ No newline at end of file From 9190f966189216543078b5c701eb582bdb2160ad Mon Sep 17 00:00:00 2001 From: nelsonic Date: Fri, 24 Jul 2026 11:38:18 +0100 Subject: [PATCH 08/19] remove noise from legacy/package.json #165 --- legacy/package.json | 58 +++------------------------------------------ 1 file changed, 3 insertions(+), 55 deletions(-) diff --git a/legacy/package.json b/legacy/package.json index a4193fc..7187f80 100644 --- a/legacy/package.json +++ b/legacy/package.json @@ -1,6 +1,6 @@ { "name": "technology-stack", - "version": "1.0.2", + "version": "2.0.1", "description": "Clarity for all Technology used in DWYL products & client work.", "repository": { "type": "git", @@ -9,58 +9,6 @@ "author": "dwyl & co", "license": "GPL-2.0", "homepage": "https://github.com/dwyl/technology-stack#readme", - "dependencies": { - "env2": "^2.1.1", - "esta": "^4.2.0", - "goodparts": "^1.0.4", - "hapi-auth-jwt2": "^7.1.3", - "hapi-error": "^1.1.3", - "hapi-login": "^1.2.2", - "hapi-postgres-connection": "^6.1.0", - "hapi-redis-connection": "^5.0.0", - "hapi-register": "^1.1.0", - "hapi-riot": "^1.0.2" - }, - "learn": { - "env2": { - "use": "Loading Environment Variables", - "repo": "learn-environment-variables" - }, - "hapi-auth-jwt2": { - "use": "Authentication & Sessions", - "repo": "learn-json-web-tokens" - }, - "hapi-redis-connection": { - "use": "Simplify Redis Connection", - "repo": "learn-redis" - }, - "esta": { - "use": "ElasticSearch CRUD", - "repo": "learn-elasticsearch" - }, - "hapi-postgres-connection": { - "use": "Postgres Connection Pooling", - "repo": "learn-postgresql" - }, - "hapi-riot": { - "use": "Server-side (Fast) Rendering of Riot Tags", - "repo": "learn-riot" - }, - "hapi-error": { - "use": "Human-Friendly Error Messages", - "repo": "hapi-error#why" - }, - "goodparts": { - "use": "Consistent Code (Linting & Style)", - "repo": "goodparts#why" - }, - "hapi-login": { - "use": "User Login", - "repo": "learn-hapi" - }, - "hapi-register": { - "use": "User Registration", - "repo": "learn-hapi" - } - } + "dependencies": {}, + "learn": {} } \ No newline at end of file From b1b6878089d2378830eb427f27dc3579dd467e5c Mon Sep 17 00:00:00 2001 From: nelsonic Date: Sat, 25 Jul 2026 14:11:58 +0100 Subject: [PATCH 09/19] list the elements of the PETAL acronym in the "What?" section of README.md #165 --- README.md | 81 ++++++++++++++++++++++++++---------------------------- flutter.md | 25 +++++++++++------ 2 files changed, 56 insertions(+), 50 deletions(-) diff --git a/README.md b/README.md index 8f7ecc5..60466ca 100644 --- a/README.md +++ b/README.md @@ -15,31 +15,6 @@ The software and systems we use to build **`@dwyl`**. - [Why?](#why) - [What?](#what) - [The `PETAL` Stack](#the-petal-stack) - - [**`Phoenix`**](#phoenix) - - [`Phoenix` the "Most Loved" Framework](#phoenix-the-most-loved-framework) - - [**`Elixir`**](#elixir) - - [`Elixir` Remains Most Loved Language](#elixir-remains-most-loved-language) - - [`Tailwind CSS`](#tailwind-css) - - [`Alpine.js` (Optional)](#alpinejs-optional) - - [`LiveView`](#liveview) - - [_Beginner_ Tutorials?](#beginner-tutorials) - - [**`Phoenix`/`Elixir`**:](#phoenixelixir) - - [Small Projects That Showcase `Phoenix`](#small-projects-that-showcase-phoenix) - - [`Elixir` Utilities](#elixir-utilities) - - [**`Flutter`**](#flutter) - - [Miscellaneous](#miscellaneous) - - [Our `MVP`](#our-mvp) - - [Database?](#database) - - [We _Prefer_ `PostgreSQL`](#we-prefer-postgresql) - - [List of Organizations Using PostgreSQL](#list-of-organizations-using-postgresql) - - [Operating System?](#operating-system) - - [Continuous Integration](#continuous-integration) - - [Deployment](#deployment) - - [Application Server](#application-server) - - [SSL/TLS Encryption](#ssltls-encryption) -- [tl;dr](#tldr) - - [Why Try a "New Stack"?](#why-try-a-new-stack) - - [Why Try Something New When We're _Already_ Good with the "Old"...?](#why-try-something-new-when-were-already-good-with-the-old) - [Making Difficult Decisions](#making-difficult-decisions) - [_Most_ "_Application Architects_" will pick one of these 3 options:](#most-application-architects-will-pick-one-of-these-3-options) - [Toast Knife Analogy](#toast-knife-analogy) @@ -93,20 +68,44 @@ and _**world-class quality**_! ## The `PETAL` Stack ![dwyl-technology-stack-diagram-PETAL](https://user-images.githubusercontent.com/194400/184719877-a6112c04-7cd9-441f-a293-e6b133d4b67c.png) + @@ -25,7 +27,6 @@ after all there are still plenty of jobs writing [FORTRAN]( This works in the _short-term_ because most _organisations_ take a long time to adopt new tech so people can cling onto their ageing knowledge. - --> # _Why_? 🤷‍♀️ @@ -34,17 +35,16 @@ so people can cling onto their ageing knowledge. If I was **starting** my journey **from _scratch_** now **what tech** would I learn/use?
-If we could keep all +If we could keep all the knowledge/wisdom and experience gained -over 20+ years of programming -but avoid any preconceptions and biases +over 20+ years of programming +but avoid any preconceptions and biases i.e. ["sunk cost bias"](https://en.wikipedia.org/wiki/Sunk_cost#Fallacy_effect). Would we still choose the tech/tools we are _currently_ using? Or would we pick something else completely different? - -The people/teams/organisations that can _objectively_ +The people/teams/organizations that can _objectively_ question why they use particular tech/tools can take advantage of all the advancements being made @@ -56,7 +56,14 @@ The question we need to ask/answer _before_ diving into any discussion of which technology/language/framework we should or shouldn't use is: -**What are _problem_ are we _trying_ to _solve_?** + +## What _Problem_ Are _Solving_?** + +We are trying to deploy a **`Native` Mobile App** +that **launches fast** and **performs well** (with a low memory footprint) +on both `Android` and `IOs`. + +`Flutter` solves this for us and allows maximum cross-platform code-reuse. When we (_initially_) looked at `Flutter` in early 2018, it did _not_ meet all our needs for a UI framework. @@ -69,6 +76,8 @@ development both from the _army_ of **Google** Developers and the thriving community and it has matured considerably. It _excels_ at _all_ of our requirements. +# Who? + Google is using `Flutter` for several of their cross-platform Native Mobile Apps including **Google Adds** (_their main money maker_) From 6c1b061a53d262eef3878a357e67cc3d1e9d8263 Mon Sep 17 00:00:00 2001 From: nelsonic Date: Sat, 25 Jul 2026 14:42:48 +0100 Subject: [PATCH 10/19] tidy scaling section of README #165 --- README.md | 139 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 94 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 60466ca..bb1b309 100644 --- a/README.md +++ b/README.md @@ -15,13 +15,39 @@ The software and systems we use to build **`@dwyl`**. - [Why?](#why) - [What?](#what) - [The `PETAL` Stack](#the-petal-stack) + - [**`Phoenix`**](#phoenix) + - [`Phoenix` the "Most Loved" Framework](#phoenix-the-most-loved-framework) + - [**`Elixir`**](#elixir) + - [`Elixir` Remains Most Loved Language](#elixir-remains-most-loved-language) + - [`Tailwind CSS`](#tailwind-css) + - [`Alpine.js` (Optional)](#alpinejs-optional) + - [`LiveView`](#liveview) + - [_Beginner_ Tutorials?](#beginner-tutorials) + - [**`Phoenix`/`Elixir`**:](#phoenixelixir) + - [Small Projects That Showcase `Phoenix`](#small-projects-that-showcase-phoenix) + - [`Elixir` Utilities](#elixir-utilities) + - [**`Flutter`**](#flutter) + - [Miscellaneous](#miscellaneous) + - [Our `MVP`](#our-mvp) + - [Database?](#database) + - [We _Prefer_ `PostgreSQL`](#we-prefer-postgresql) + - [List of Organizations Using PostgreSQL](#list-of-organizations-using-postgresql) + - [Operating System?](#operating-system) + - [Continuous Integration](#continuous-integration) + - [Deployment](#deployment) + - [Application Server](#application-server) + - [SSL/TLS Encryption](#ssltls-encryption) +- [tl;dr](#tldr) + - [Why Try a "New Stack"?](#why-try-a-new-stack) + - [Why Try Something New When We're _Already_ Good with the "Old"...?](#why-try-something-new-when-were-already-good-with-the-old) - [Making Difficult Decisions](#making-difficult-decisions) - [_Most_ "_Application Architects_" will pick one of these 3 options:](#most-application-architects-will-pick-one-of-these-3-options) - [Toast Knife Analogy](#toast-knife-analogy) - [Focussing on Long-term Benefits](#focussing-on-long-term-benefits) - [Further Reading on Long-term Thinking](#further-reading-on-long-term-thinking) - [*Contextualising* Technology Adoption (_Mini History Lesson_)](#contextualising-technology-adoption-mini-history-lesson) - - [Does it _Scale_?!?](#does-it-scale) + - [Does it _Scale_?](#does-it-scale) + - [TL;DR](#tldr-1) - [What About _Full Stack `JavaScript`_?](#what-about-full-stack-javascript) - [Alternative Databases?](#alternative-databases) - [Radical Simplicity](#radical-simplicity) @@ -69,8 +95,9 @@ and _**world-class quality**_! ![dwyl-technology-stack-diagram-PETAL](https://user-images.githubusercontent.com/194400/184719877-a6112c04-7cd9-441f-a293-e6b133d4b67c.png) "PETAL" is an acronym1 for the following elements: @@ -207,26 +234,26 @@ of building **realtime web apps** with significantly less code. ## _Beginner_ Tutorials? -We have _crafted_ a "***Complete Beginner's Guide***" +We have _crafted_ a "**_Complete Beginner's_ Guide**" for each element in the stack, so that we: + ***Document our collective learning*** `while` we are building projects.
-(_because as humans -we **forget fast** +(_because as humans +we **forget fast** unless we **capture** it **immediately**_!) -+ ***Share*** our knowledge with other people so we can ++ **_Share_** our knowledge with other people so we can + Help to train (_potential_) new team members as quickly/effectively as possible. - + ***Collectively iterate*** on our knowledge + + **_Collectively iterate_** on our knowledge and "_level-up_" as a _team_! + "Onboard" the client team (_who may want/need_) to - support/maintain the codebase/project + support/maintain the codebase/project if/when we _seamlessly_ "hand over". - + Inform the wider community + + Inform the wider community of both technical _and_ non-technical people ("stake holders") who are _generally_ interested in _understanding_ the project. - + Enlighten other teams/organisations/agencies/etc. we aren't in + + Enlighten other teams/organizations/agencies/etc. we aren't in _direct_ contact with that there is a "_more fun_" way of building software! + Make _everyone's_ life easier/better by having a "launch pad" for @@ -302,7 +329,6 @@ where you can learn `Flutter` 7. `Bloc`: [dwyl/flutter-**bloc**-tutorial](https://github.com/dwyl/flutter-bloc-tutorial) - ### Miscellaneous In this section, @@ -310,7 +336,6 @@ we will list a few repos that explain concepts and tools that we are actively using while developing our [`app`](https://github.com/dwyl/app). - 1. Payment processing: [dwyl/learn-**payment-processing**](https://github.com/dwyl/learn-payment-processing) 1. API design: @@ -690,41 +715,65 @@ moving one framework to another is a _much_ more difficult decision. But one thing is for _sure_ we are going to use the "_smart phone_" even if other people insist on using the "brick". +### Does it _Scale_? -### Does it _Scale_?!? - -If you are new to web development, -_please focus on **`UX`** -and forget about "**scale**"_!
- -> _Unless you work somewhere that - **already** has "**millions of users**" and
-your team **cannot consider** anything that -does not support a million concurrent connections...!_
- -> _But let's face it, **most** people have -[**imaginary scaling issues**](https://twitter.com/ThePracticalDev/status/800752571497545729) -not **real** ones.
-discussing "scalability" **`before`** -you have **10,000 paying customers** -is a waste of time!!_
- -Stop worrying about "scalability" -and instead **focus** on building something **useful**
-**focus** on **User Experience** not ("backend") **scalability**! - -The _good_ news is that -**`Phoenix`** "***scales***" _really well_!
-see: +The _good_ news is that +**`Phoenix`** "**_scales_**" **_really well_**!
+see: [phoenixframework.org/blog/the-road-to-2-million-websocket-connections](https://www.phoenixframework.org/blog/the-road-to-2-million-websocket-connections) -Forget about "_scaling_" until you have _made_ -[***something people want***](http://paulgraham.com/good.html) -and are _paying_ for!
-Then _use_ the pile of cash you got from your product -to hire "_engineers_" to make it _available_ to more people!! +#### TL;DR + +Yes, scalability and especially **fault tolerance** is **important**. +And **`Phoenix`** has your back with all of the above. +It lets you **focus** on **User Experience** +and rest assured that **scalability** is **baked-in**. + +If you are new to building web apps, +_please focus on **`UX`** +and **forget** about "**scale**"_!
+ +Focus **all** of your energy on crafting +beautifully functional UI/UX +that gives the person _using_ your App +their desired outcome +in as few steps as possible. + +The sad reality is that +[most startups fail](https://briskfab.com/why-most-startups-fail-before-product-market-fit-and-how-to-avoid-it) +before they achieve +[product-market fit](https://en.wikipedia.org/wiki/Product-market_fit). +Of those that "make it", +most will end up re-building their App(s) +as they refine the UX over time. + +So **focus on moving _fast_** and **building well-tested features**. + +> Unless you work somewhere that + **already** has **millions of users** + (e.g. [Big Tech](https://en.wikipedia.org/wiki/Big_Tech)) + and your team **cannot _consider_** anything that + does not support a million concurrent connections ...
+> **_Most_** people have + [**_imaginary_ scaling issues**](https://x.com/ThePracticalDev/status/800752571497545729) + not **real** ones.
+discussing "scalability" **`before`** +you have **100K paying customers** +is a waste of time!!
+ +Stop wasting your time worrying about "scalability" +and instead **focus** on building the **useful** features +that people are requesting.
+ +Forget about "_scaling_" until you have +[**_made_ something people want**](https://paulgraham.com/good.html) +and are _paying_ for to solve their immediate pain!
+Once you have a few thousand paying "users", +_use_ the pile of cash you got from your product +to hire _experienced engineers_ +to make it _available_ to more people! -

+
From 4e9007735456f64760ff520cfeb8f5c0e87ee3b2 Mon Sep 17 00:00:00 2001 From: nelsonic Date: Sun, 26 Jul 2026 08:43:48 +0100 Subject: [PATCH 11/19] expand Elixir utilities section #165 --- README.md | 157 +++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 113 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index bb1b309..e8dce2c 100644 --- a/README.md +++ b/README.md @@ -23,9 +23,9 @@ The software and systems we use to build **`@dwyl`**. - [`Alpine.js` (Optional)](#alpinejs-optional) - [`LiveView`](#liveview) - [_Beginner_ Tutorials?](#beginner-tutorials) - - [**`Phoenix`/`Elixir`**:](#phoenixelixir) - - [Small Projects That Showcase `Phoenix`](#small-projects-that-showcase-phoenix) - - [`Elixir` Utilities](#elixir-utilities) + - [`Phoenix` / `Elixir`](#phoenix--elixir) + - [Small Projects That Showcase `Phoenix`](#small-projects-that-showcase-phoenix) + - [`Elixir` Utilities](#elixir-utilities) - [**`Flutter`**](#flutter) - [Miscellaneous](#miscellaneous) - [Our `MVP`](#our-mvp) @@ -113,13 +113,13 @@ that update in real-time whenever a change is made by anyone else. Let's go through each of these in a bit more detail. - ### **`Phoenix`** **`Phoenix`** is the Web Application Framework that **does not compromise** -on **speed** (both to build apps/features and serve requests), -**reliability** or **maintainability**! +on **speed**
+(both when building apps/features and serving requests), +**reliability** or **maintainability**!
**`Phoenix`** is the _successor_ to the incredibly popular [Ruby-on-Rails](https://rubyonrails.org/) @@ -134,7 +134,7 @@ who worked on/with `Rails`. It _solves_ all of the speed/socket/scaling/concurrency issues people felt when building/using Rails apps. -The list of _**benefits**_ Phoenix has over +The list of _**benefits**_ `Phoenix` has over (_virtually every_) other Web Frameworks is _extensive_.
Please see: [dwyl/**learn-phoenix-framework**#our-**top-10-reasons**-why-phoenix](https://github.com/dwyl/learn-phoenix-framework#our-top-10-reasons-why-phoenix)
@@ -144,12 +144,16 @@ Please see: **`Phoenix`** tops the list of "**Most Loved**" Frameworks on the for the **3rd year in a row** on the [2025 StackOverflow Developer Survey](https://survey.stackoverflow.co/2025/technology#2-web-frameworks-and-technologies). ❤️ -. -https://survey.stackoverflow.co/2022/#section-most-loved-dreaded-and-wanted-web-frameworks-and-technologies +![stackoverflow-most-loved-framework-phoenix](https://user-images.githubusercontent.com/194400/184833098-0e9cd055-9e4f-4c93-96ed-4411e1a8154c.png) +https://survey.stackoverflow.co/2022/#section-most-loved-dreaded-and-wanted-web-frameworks-and-technologies -![stackoverflow-most-loved-framework-phoenix](https://user-images.githubusercontent.com/194400/184833098-0e9cd055-9e4f-4c93-96ed-4411e1a8154c.png) +This is not a +[popularity contest](https://en.wikipedia.org/wiki/Popularity_contest), +the votes are private/confidential. +When software engineering community collectively +votes that a framework is their "most loved", ### **`Elixir`** @@ -236,34 +240,34 @@ of building **realtime web apps** with significantly less code. We have _crafted_ a "**_Complete Beginner's_ Guide**" for each element in the stack, so that we: -+ ***Document our collective learning*** +- **Document our collective learning** `while` we are building projects.
(_because as humans we **forget fast** unless we **capture** it **immediately**_!) -+ **_Share_** our knowledge with other people so we can - + Help to train (_potential_) new team members +- **_Share_** our knowledge with other people so we can + - Help to train (_potential_) new team members as quickly/effectively as possible. - + **_Collectively iterate_** on our knowledge + - **_Collectively iterate_** on our knowledge and "_level-up_" as a _team_! - + "Onboard" the client team (_who may want/need_) to + - "Onboard" the client team (_who may want/need_) to support/maintain the codebase/project if/when we _seamlessly_ "hand over". - + Inform the wider community + - Inform the wider community of both technical _and_ non-technical people ("stake holders") who are _generally_ interested in _understanding_ the project. - + Enlighten other teams/organizations/agencies/etc. we aren't in + - Enlighten other teams/organizations/agencies/etc. we aren't in _direct_ contact with that there is a "_more fun_" way of building software! -+ Make _everyone's_ life easier/better +- Make _everyone's_ life easier/better by having a "launch pad" for [_rapid_ learning](https://youtu.be/hOZnP4dZYK0 "Matrix Easter Egg ;-)")! -We have written several **_beginner_ tutorials** +We have written several **_beginner_ tutorials** that span our technology stack and tools we actively use in development. -### **`Phoenix`/`Elixir`**: +### `Phoenix` / `Elixir` Here are a few of our learning repositories pertaining to `Phoenix` and `Phoenix Liveview`. @@ -272,41 +276,61 @@ pertaining to `Phoenix` and `Phoenix Liveview`. [dwyl/learn-elixir](https://github.com/dwyl/learn-elixir) 2. Learn `Phoenix`: [dwyl/learn-**phoenix**-framework](https://github.com/dwyl/learn-phoenix-framework) -3. Counter (Liveview): +3. Counter (`LiveView`): [dwyl/phoenix-liveview-**counter**-tutorial](https://github.com/dwyl/phoenix-liveview-counter-tutorial) -4. Todo List (Liveview): +4. Todo List (`LiveView`): [dwyl/phoenix-liveview-**todo-list**-tutorial](https://github.com/dwyl/phoenix-liveview-todo-list-tutorial) -5. Stopwatch (Liveview): +5. Stopwatch (`LiveView`): [dwyl/phoenix-liveview-**stopwatch**](https://github.com/dwyl/phoenix-liveview-stopwatch) 6. Chat: [dwyl/phoenix-**chat**-example](https://github.com/dwyl/phoenix-chat-example) -7. Chat (Liveview): +7. Chat (`LiveView`): [dwyl/phoenix-**liveview-chat**-example](https://github.com/dwyl/phoenix-liveview-chat-example) -8. Realtime cursor tracking (Liveview): -[dwyl/phoenix-liveview-realtime-**cursor**-tracking-tutorial](dwyl/phoenix-liveview-realtime-cursor-tracking-tutorial) +8. Realtime cursor tracking (`LiveView`): +[dwyl/phoenix-liveview-realtime-**cursor**-tracking-tutorial](https://github.com/dwyl/phoenix-liveview-realtime-cursor-tracking-tutorial) 9. `Papertrail` and `Phoenix`: [dwyl/phoenix-**papertrail**-demo](https://github.com/dwyl/phoenix-papertrail-demo) 10. `Flutter` and `Phoenix`: [dwyl/**flutter-phoenix**-channels-demo](https://github.com/dwyl/flutter-phoenix-channels-demo) - -#### Small Projects That Showcase `Phoenix` +### Small Projects That Showcase `Phoenix` We have a couple of "internal" (but Open Source) projects -that use `Phoenix` +that use `Phoenix` and serve as a good showcase for the stack: -1. Labels: +1. Labels: [dwyl/**labels**](https://github.com/dwyl/labels) -2. Hits: +2. Hits: [dwyl/**hits**](https://github.com/dwyl/hits) -#### `Elixir` Utilities - -1. Useful: -[dwyl/**useful**](https://github.com/dwyl/useful) - utility library. -2. Content: -[dwyl/**content**](https://github.com/dwyl/content) - content negotiation. +### `Elixir` Utilities + +Along our journey building apps for clients and ourselves, +we've created a few reusable packages: + +1. `fields`: + [dwyl/**fields**](https://github.com/dwyl/useful) - + field definitions + with validation and transparent encryption/decryption. +2. `useful`: + [dwyl/**useful**](https://github.com/dwyl/useful) - + utility library. +3. `content`: + [dwyl/**content**](https://github.com/dwyl/content) - + content negotiation. +4. `link`: + [dwyl/**link**](https://github.com/dwyl/link) - + parse, shorten and format links. +5. `auth_plug`: + [dwyl/**auth_plug**](https://github.com/dwyl/auth_plug) - + seamlessly add authentication to any Phoenix App. + +All the code we write is extensively documented, +comprehensively tested and regularly maintained (where required). +One of the many beauties of `Elixir` code +is that it requires _very_ low maintenance; +it just keeps working year after year. ### **`Flutter`** @@ -442,27 +466,52 @@ Microsoft Windows Desktop & Server. ## Continuous Integration -We are using `GitHub` actions -for Continuous Integration / -Continuous Deployment. +We are using +[`GitHub` actions](https://docs.github.com/en/actions/get-started/continuous-integration) +for +[Continuous Integration](https://en.wikipedia.org/wiki/Continuous_integration) +& +[Deployment/Delivery](https://en.wikipedia.org/wiki/Continuous_deployment). +It's **free**/included with `GitHub` +and easily meets our needs. For an example of this, including automatic deployment to **Fly.io** -see: +see: [`.github/workflows/ci.yml`](https://github.com/dwyl/mvp/blob/main/.github/workflows/ci.yml) +We have used other continuous integration platforms in the past +and at the request of clients, +e.g: +[`GitLab`](https://docs.gitlab.com/ci/), +[`Travis-CI`](https://www.travis-ci.com/), +[`Circle-CI`](https://circleci.com/) +or self-hosted `Jenkins`. +We can easily adapt to the needs of the project. + ## Deployment We make a point of deploying our work as _soon_ as -there is _something_ worth showing +there is _something_ worth showing to the target audience of "_end users_" -so that we can get ***feedback*** as early as possible. +so that we can get **_feedback_** as early as possible. -Lately we have been using +Lately we have been using [**Fly.io**](https://github.com/dwyl/learn-devops/issues/72#issuecomment-917442712) for deploying our Apps. The experience is superb. ❤️ +We have used every major Cloud infrastructure provider +over the last nearly 2 decades +starting with `AWS` in 2009. +Over the years we have captured much of our knowledge +`public` repos e.g: +[dwyl/**learn-devops**](https://github.com/dwyl/learn-devops) +and +[dwyl/**learn-aws-lambda**](https://github.com/dwyl/learn-aws-lambda) + +Many people have found our notes helpful. + #### Application Server The Phoenix Application Server is hosted on (_a minimum of_) @@ -722,6 +771,22 @@ The _good_ news is that see: [phoenixframework.org/blog/the-road-to-2-million-websocket-connections](https://www.phoenixframework.org/blog/the-road-to-2-million-websocket-connections) +This post was published in **`2015`** +and was one of the catlysts +that made us pay attention to `Elixir` and `Phoenix`. +We had been building apps with `Node.js` +(what we refer to as our "[legacy stack](/legacy)") +since `2009` and deployment/scalability was always a chore. +Seeing that a **single `Phoenix` server** +could handle **2 Million Concurrent Connections** +was an eye-opener that made us immediately **try** `Elixir`. + +Highly recommend watching Joe Armstrong's talk +for a balanced primer on scalability: +"Systems that run forever self-heal and scale": +[youtu.be/cNICGEwmXLU](https://youtu.be/cNICGEwmXLU) + + #### TL;DR Yes, scalability and especially **fault tolerance** is **important**. @@ -944,4 +1009,8 @@ If anything the JS ecosystem is even _more_ fragmented and the non-Elixir frameworks haven't caught-up to Phoenix which just keeps getting better with each new release. +For a good primer on **Faults, Scaling, and Erlang Concurrency** +watch Joe Armstrong's Stanford Seminar: +[youtu.be/YaUPdgtUYko](https://youtu.be/YaUPdgtUYko) + [![HitCount](https://hits.dwyl.com/dwyl/technology-stack.svg?style=flat-square)](https://hits.dwyl.com/dwyl/technology-stack) \ No newline at end of file From c79fb883be17d0f1f34d538eb0dd3e484c5914cf Mon Sep 17 00:00:00 2001 From: nelsonic Date: Fri, 31 Jul 2026 17:02:30 +0100 Subject: [PATCH 12/19] update PETAL diagram for 2026 closes #171 #1 --- README.md | 215 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 133 insertions(+), 82 deletions(-) diff --git a/README.md b/README.md index e8dce2c..fd22c5b 100644 --- a/README.md +++ b/README.md @@ -15,28 +15,28 @@ The software and systems we use to build **`@dwyl`**. - [Why?](#why) - [What?](#what) - [The `PETAL` Stack](#the-petal-stack) - - [**`Phoenix`**](#phoenix) + - [**`Phoenix`** 🐦‍🔥](#phoenix-) - [`Phoenix` the "Most Loved" Framework](#phoenix-the-most-loved-framework) - - [**`Elixir`**](#elixir) + - [**`Elixir`** 💧](#elixir-) - [`Elixir` Remains Most Loved Language](#elixir-remains-most-loved-language) - - [`Tailwind CSS`](#tailwind-css) - - [`Alpine.js` (Optional)](#alpinejs-optional) + - [`Tailwind CSS` 😍](#tailwind-css-) + - [`Alpine.js` (Optional) ✨](#alpinejs-optional-) - [`LiveView`](#liveview) - [_Beginner_ Tutorials?](#beginner-tutorials) - [`Phoenix` / `Elixir`](#phoenix--elixir) - - [Small Projects That Showcase `Phoenix`](#small-projects-that-showcase-phoenix) + - [_Small_ Projects That Showcase `Phoenix`](#small-projects-that-showcase-phoenix) - [`Elixir` Utilities](#elixir-utilities) - [**`Flutter`**](#flutter) - [Miscellaneous](#miscellaneous) - [Our `MVP`](#our-mvp) - [Database?](#database) - [We _Prefer_ `PostgreSQL`](#we-prefer-postgresql) - - [List of Organizations Using PostgreSQL](#list-of-organizations-using-postgresql) + - [List of Organizations Using PostgreSQL](#list-of-organizations-using-postgresql) - [Operating System?](#operating-system) - [Continuous Integration](#continuous-integration) - [Deployment](#deployment) - - [Application Server](#application-server) - - [SSL/TLS Encryption](#ssltls-encryption) + - [Application Server](#application-server) + - [SSL/TLS Encryption](#ssltls-encryption) - [tl;dr](#tldr) - [Why Try a "New Stack"?](#why-try-a-new-stack) - [Why Try Something New When We're _Already_ Good with the "Old"...?](#why-try-something-new-when-were-already-good-with-the-old) @@ -93,42 +93,47 @@ and _**world-class quality**_! ## The `PETAL` Stack -![dwyl-technology-stack-diagram-PETAL](https://user-images.githubusercontent.com/194400/184719877-a6112c04-7cd9-441f-a293-e6b133d4b67c.png) +![dwyl-technology-stack-diagram-PETAL-2](https://github.com/user-attachments/assets/8e0d17f7-9a4d-4e3d-a269-06965aeea8eb) -"PETAL" is an acronym1 +**`PETAL`** is an **acronym** for the following elements: -+ **P**hoenix - the Web Application Framework. -+ **E**lixir - the functional fault-tolerant programming language. -+ **T**ailwind - the **interface** library + +- **P**hoenix - the Web App framework + that organizes routes, schemas, controllers and tests + like a well-oiled machine. +- **E**lixir - the functional fault-tolerant programming language. +- **T**ailwind - the **interface** library used for building beautiful mobile-first & responsive web apps that feel fast. -+ **A**lpine.js - the tiny effects & enhancements JavaScript library +- **A**lpine.js - the tiny effects & enhancements JavaScript library that loads fast and progressively enhances the user experience. This is 100% optional, apps work fine without it. -+ **L**iveView - the system that significantly simplifies creating interfaces +- **L**iveView - the system that significantly simplifies creating interfaces that update in real-time whenever a change is made by anyone else. Let's go through each of these in a bit more detail. -### **`Phoenix`** +### **`Phoenix`** 🐦‍🔥 **`Phoenix`** is the Web Application Framework that **does not compromise** on **speed**
(both when building apps/features and serving requests), **reliability** or **maintainability**!
+ **`Phoenix`** is the _successor_ to the incredibly popular [Ruby-on-Rails](https://rubyonrails.org/) framework -(commonly referred to as just `Rails`) +(commonly referred to as `Rails`) that was used by many startups and successful companies e.g: `AirBnB`, `GitHub`, `Shopify` and `Twitter` (most of which have migrated away from `Rails` for scalability reasons). -`Phoenix` was built _from scratch_ + +**`Phoenix`** was built _from scratch_ by highly experienced engineers who worked on/with `Rails`. It _solves_ @@ -136,13 +141,14 @@ all of the speed/socket/scaling/concurrency issues people felt when building/using Rails apps. The list of _**benefits**_ `Phoenix` has over (_virtually every_) other Web Frameworks is _extensive_.
-Please see: +See: [dwyl/**learn-phoenix-framework**#our-**top-10-reasons**-why-phoenix](https://github.com/dwyl/learn-phoenix-framework#our-top-10-reasons-why-phoenix)
#### `Phoenix` the "Most Loved" Framework **`Phoenix`** tops the list of "**Most Loved**" Frameworks -on the for the **3rd year in a row** on the +for the **3rd year in a row**
+on the [2025 StackOverflow Developer Survey](https://survey.stackoverflow.co/2025/technology#2-web-frameworks-and-technologies). ❤️ ![stackoverflow-most-loved-framework-phoenix](https://user-images.githubusercontent.com/194400/184833098-0e9cd055-9e4f-4c93-96ed-4411e1a8154c.png) @@ -154,9 +160,9 @@ This is not a the votes are private/confidential. When software engineering community collectively votes that a framework is their "most loved", +you know that they _love_ using it. - -### **`Elixir`** +### **`Elixir`** 💧 **`Elixir`** is the _functional_ programming language used by the **`Phoenix`** framework. @@ -192,7 +198,7 @@ in the language. And as we all know people who _enjoy_ their work are _better_ at doing it! -### `Tailwind CSS` +### `Tailwind CSS` 😍 **`Tailwind`** is the most _sane_ way of creating a _beautiful_ web app UI @@ -211,7 +217,7 @@ We paid for a license for It has hundreds of carefully crafted UI templates that can easily be customized. -### `Alpine.js` (Optional) +### `Alpine.js` (Optional) ✨ **`Alpine.js`** is a **lightweight** library for enhancing interactions in a web application. @@ -228,11 +234,38 @@ the size footprint drops down to roughly `14 KB`. This means it loads in under **`200ms`** (1/5 second) even on a slower **`3G`** connection. +For a concrete example of how we are using `Alpine.js`, +read: +[`app.js`](https://github.com/dwyl/mvp/blob/main/assets/js/app.js) +it handles the drag-and-drop and effects in the `MVP`. + ### `LiveView` **`LiveView`** is a radically simplified way -of building **realtime web apps** with significantly less code. - +of building **realtime web apps** +with **_significantly_ less code**. + +`Phoenix` + `LiveView` allows us +to build rich interactive web apps +with realtime reactive UI +(no page refresh when data updates) +without writing `JavaScript`! +This enables building +incredible interactive experiences +in less time and +with considerably less code. + +For more detail, on the "Why? What? How?" of `LiveView`, +please see: +[dwyl/phoenix-liveview-counter-tutorial#liveview](https://github.com/dwyl/phoenix-liveview-counter-tutorial/tree/764308bca4b23a1a1c55de12577d9b5cffd15d00#liveview) + +> **Note**: We only use `LiveView` +> where **appropriate** to the **desired UI/UX**; +> it's not a shiny object we _must_ use everywhere. +> If live updates are **not needed** +> e.g: in `Auth` or `Payment` flows +> we use server-side rendered controllers +> with _bare minimum_ client-side validation.
@@ -240,12 +273,14 @@ of building **realtime web apps** with significantly less code. We have _crafted_ a "**_Complete Beginner's_ Guide**" for each element in the stack, so that we: -- **Document our collective learning** + +1. **Document our collective learning** `while` we are building projects.
(_because as humans we **forget fast** unless we **capture** it **immediately**_!) -- **_Share_** our knowledge with other people so we can + +2. **_Share_** our knowledge with other people so we can - Help to train (_potential_) new team members as quickly/effectively as possible. - **_Collectively iterate_** on our knowledge @@ -259,7 +294,8 @@ unless we **capture** it **immediately**_!) interested in _understanding_ the project. - Enlighten other teams/organizations/agencies/etc. we aren't in _direct_ contact with that there is a "_more fun_" way of building software! -- Make _everyone's_ life easier/better + +3. Make _everyone's_ life easier/better by having a "launch pad" for [_rapid_ learning](https://youtu.be/hOZnP4dZYK0 "Matrix Easter Egg ;-)")! @@ -278,12 +314,12 @@ pertaining to `Phoenix` and `Phoenix Liveview`. [dwyl/learn-**phoenix**-framework](https://github.com/dwyl/learn-phoenix-framework) 3. Counter (`LiveView`): [dwyl/phoenix-liveview-**counter**-tutorial](https://github.com/dwyl/phoenix-liveview-counter-tutorial) -4. Todo List (`LiveView`): +4. Chat (`Phoenix` + `Channels`): +[dwyl/phoenix-**chat**-example](https://github.com/dwyl/phoenix-chat-example) +5. Todo List (`LiveView`): [dwyl/phoenix-liveview-**todo-list**-tutorial](https://github.com/dwyl/phoenix-liveview-todo-list-tutorial) -5. Stopwatch (`LiveView`): +6. Stopwatch (`LiveView`): [dwyl/phoenix-liveview-**stopwatch**](https://github.com/dwyl/phoenix-liveview-stopwatch) -6. Chat: -[dwyl/phoenix-**chat**-example](https://github.com/dwyl/phoenix-chat-example) 7. Chat (`LiveView`): [dwyl/phoenix-**liveview-chat**-example](https://github.com/dwyl/phoenix-liveview-chat-example) 8. Realtime cursor tracking (`LiveView`): @@ -293,16 +329,19 @@ pertaining to `Phoenix` and `Phoenix Liveview`. 10. `Flutter` and `Phoenix`: [dwyl/**flutter-phoenix**-channels-demo](https://github.com/dwyl/flutter-phoenix-channels-demo) -### Small Projects That Showcase `Phoenix` +### _Small_ Projects That Showcase `Phoenix` We have a couple of "internal" (but Open Source) projects that use `Phoenix` and serve as a good showcase for the stack: -1. Labels: -[dwyl/**labels**](https://github.com/dwyl/labels) -2. Hits: -[dwyl/**hits**](https://github.com/dwyl/hits) +1. Hits: + [dwyl/**hits**](https://github.com/dwyl/hits) +2. Image Uploads: + [dwyl/**imgup**](https://github.com/dwyl/imgup) +3. Labels: + [dwyl/**labels**](https://github.com/dwyl/labels) + ### `Elixir` Utilities @@ -332,26 +371,26 @@ One of the many beauties of `Elixir` code is that it requires _very_ low maintenance; it just keeps working year after year. -### **`Flutter`** +### **`Flutter`** In this section you will find learning repositories where you can learn `Flutter` -*and* how to use it with other technologies. +_and_ how to use it with other technologies. 1. Learn `Flutter`: [dwyl/learn-**flutter**](https://github.com/dwyl/learn-flutter) 2. Learn `Dart`: [dwyl/learn-**dart**](https://github.com/dwyl/learn-dart) -3. `Supabase` and `Flutter`: -[dwyl/**supabase**-flutter-demo](https://github.com/dwyl/supabase-flutter-demo) -4. Counter: +3. Counter: [dwyl/flutter-**counter**-example](https://github.com/dwyl/flutter-counter-example) -5. Stopwatch: +4. Stopwatch: [dwyl/flutter-**stopwatch**-tutorial](https://github.com/dwyl/flutter-stopwatch-tutorial) -6. Todo list: +5. Todo list: [dwyl/flutter-**todo-list**-tutorial](https://github.com/dwyl/flutter-todo-list-tutorial) -7. `Bloc`: +6. `Bloc`: [dwyl/flutter-**bloc**-tutorial](https://github.com/dwyl/flutter-bloc-tutorial) +7. `Supabase` and `Flutter`: +[dwyl/**supabase**-flutter-demo](https://github.com/dwyl/supabase-flutter-demo) ### Miscellaneous @@ -380,11 +419,11 @@ Check it out at ## Database? The _reason_ we do not _specify_ our Database -in the "PETAL" Acronym is
+in the `PETAL` acronym is that **`Phoenix`** abstracts its' database access via [`Ecto`](https://phoenix.hexdocs.pm/ecto.html) -to provide built-in support +to provide built-in support to the following **databases**: * `PostgreSQL` (via [`postgrex`](https://github.com/elixir-ecto/postgrex)) @@ -394,7 +433,7 @@ to the following **databases**: * `SQLite3` (via [`ecto_sqlite3`](https://github.com/elixir-sqlite/ecto_sqlite3)) By _abstracting_ the data layer -using "Ecto" the application is "_decoupled_" +using `Ecto` the application is "_decoupled_" from the database.
This means that if a client _asks_ us to deploy to `MySQL` or `Microsoft SQL Server`
@@ -407,14 +446,11 @@ is all that is needed. ### We _Prefer_ `PostgreSQL` -postgres logo - -Our "_standard_" (_preference_) @dwyl is for `Postgres`. +Our "_standard_" (_preferred_) DB @dwyl is `Postgres`. see: [dwyl/**learn-postgresql**](https://github.com/dwyl/learn-postgresql)
-Postgres is the most "_mature_" Open Source Relational Database. +`Postgres` is the most "_mature_" Open Source Relational Database. It's ***100% Free*** (_including all **"advanced"** features_) and has been deployed and ***battle-tested*** in ***every*** environment from `AWS` to "Bare Metal" and `Google Cloud` to `Microsoft Azure`! @@ -427,7 +463,7 @@ based on who `else` is using it,_
> _but it's **good to know** that **plenty** of teams are getting **excellent results** with `Postgres`!_ -##### [List of Organizations Using PostgreSQL](https://github.com/dwyl/learn-postgresql/issues/31) +#### [List of Organizations Using PostgreSQL](https://github.com/dwyl/learn-postgresql/issues/31) We have used _most_ of the "_popular_" Relational Databases. e.g: `MySQL`, `Microsoft SQL Server`, @@ -435,11 +471,14 @@ e.g: `MySQL`, `Microsoft SQL Server`, all [RDBMS](https://en.wikipedia.org/wiki/Relational_database_management_system) have their pros/cons.
-The ***reason*** we like/use **`Postgres`** -is because the ***community*** is _superb_. +The **_reason_** we like/use **`Postgres`** +is because the **_community_** is _superb_.
There is a great "_bank_" of _answered_ questions on -[StackOverflow](https://stackoverflow.com/questions/tagged/postgresql) +[StackOverflow](https://stackoverflow.com/questions/tagged/postgresql?tab=Votes) and new questions get answered _fast_. +This means you don't _need_ +to have an _expert/full-time_ DBA on your team/staff, +if you get stuck ask the internet! From 2023 to 2025 `Postgres` has remained the **most used** and **most desired** Database: @@ -469,9 +508,9 @@ Microsoft Windows Desktop & Server. We are using [`GitHub` actions](https://docs.github.com/en/actions/get-started/continuous-integration) for -[Continuous Integration](https://en.wikipedia.org/wiki/Continuous_integration) +[Continuous Integration](https://en.wikipedia.org/wiki/Continuous_integration) & -[Deployment/Delivery](https://en.wikipedia.org/wiki/Continuous_deployment). +[Deployment/Delivery](https://en.wikipedia.org/wiki/Continuous_deployment).
It's **free**/included with `GitHub` and easily meets our needs. @@ -512,14 +551,14 @@ and Many people have found our notes helpful. -#### Application Server +## Application Server -The Phoenix Application Server is hosted on (_a minimum of_) -Two Linux Servers.
+The `Phoenix` Application Server is hosted on (_a minimum of_) +**Two Servers**.
(_often many more which send **messages** one another to distribute load as a cluster_).
The "_cluster_" is managed by Erlang's "Supervisor". -The Erlang Supervisor +The Erlang Supervisor is the "_Gold Standard_" in infrastructure management, having been used by Telecoms companies for over 20 years in production @@ -528,30 +567,30 @@ with some Telcos reporting 99.9999999% > It's _far_ more likely that the _infrastructure_ provider (_e.g. AWS/Azure_) will have a fault in their network/datacenter than an Erlang server "crashing". +An individual request/process may crash but never the whole server. -#### SSL/TLS Encryption +## SSL/TLS Encryption All communication is over secure/encrypted channel (_by default at all times_)
to protect the data/privacy of people using the applications we make.
-We recommend using the "Let's Encrypt" service for SSL Certificates -it's ***100% Free*** (and _provided by a Non-Profit foundation_)
+We recommend using the **Let's Encrypt** service for SSL Certificates +it's **_100% Free_** +(and _provided by a Non-Profit foundation_)
to help you get started, we wrote a -***step-by-step setup guide*** for apps deployed to Heroku: -[SSL-certificate-step-by-step-setup-instructions.md](https://github.com/dwyl/learn-heroku/blob/master/SSL-certificate-step-by-step-setup-instructions.md) - - +**_step-by-step setup guide_** for apps deployed to any infrastructure: +[/letsencrypt-wildcard-certificate.md](https://github.com/dwyl/learn-devops/blob/main/nginx/letsencrypt-wildcard-certificate.md)


- # tl;dr There is _no shortage_ of options available for -Technology Stack!
-See: https://www.google.com/search?q=technology+stack&tbm=isch
+Technology Stack! +See: +[google.com/search?q=technology+stack](https://www.google.com/search?q=technology+stack&tbm=isch)
So, _how_ did we _arrive_ at the conclusion that `PETAL` was "_the **one**_" for us...?
We _already_ had a _really_ good @@ -909,19 +948,21 @@ If we were to _consider_ an alternative to `SQL`, we would use `RethinkDB`: https://rethinkdb.com
But we are _relieved_ that the `Phoenix` team -is _focussed_ on PostgreSQL because that _eliminates_
+is _focussed_ on `Postgres` because that _eliminates_
the "ambiguity" or "discussion" of "_which database_" to use! -Postgres is a _fantastic_ "_general purpose_"
-store that has a _rich_ ("_structured_") query language +`Postgres` is a _fantastic_ "_general purpose_"
+db that has a _rich_ ("_structured_") query language that lets you JOIN data!!
-Also, now that [`Citus DB` is Open Source](https://www.citusdata.com/blog/2016/03/24/citus-unforks-goes-open-source) -we _know_ that `Postgres` -can _easily_ handle ***billions*** of writes per day! +Also, now that `Citus DB` is fully Open Source +we _know_ that `Postgres` +can _easily_ handle **_billions_** of writes per day. +See: +[citusdata.com](https://www.citusdata.com/overview/) ## Radical Simplicity > “_If it takes an hour to figure out what’s going on, well,
-> that’s an hour that wasn’t spent +> that’s an hour that wasn’t spent > doing something else more useful and interesting_."
> ~ > [Rachel Kroll](https://rachelbythebay.com/w/2021/09/05/clever/) @@ -930,11 +971,21 @@ Please read: https://www.radicalsimpli.city
In the site/manifesto [Stephan](https://www.linkedin.com/in/stephanjschmidt/) -makes the case that Apps in 2021 +makes the case that Apps have gotten far too complex: ![radical-simplicity-complexity](https://user-images.githubusercontent.com/194400/185086864-1e1dd075-18a8-45ff-9b51-84f9e17fe116.png) +> **Note**: the "**Complexity 2021**" +> is just the year when complex Single Page Apps (SPAs) +> reached the fever pitch +> Many people were using the `React` +> [**hammer**](https://en.wikipedia.org/wiki/Law_of_the_instrument#Computer_programming) +> to build slow-loading apps with complex architectures. +> Thankfully, many people/teams +> have realized that it's a poor UX +> and moved away from it now. + He advocates for a return to basics: ![image](https://user-images.githubusercontent.com/194400/185088113-b40f169f-71c7-4139-b984-cf518e4bc0f4.png) From da3b404a9b58f2c93edec8daa9efadaed3a408c4 Mon Sep 17 00:00:00 2001 From: nelsonic Date: Fri, 31 Jul 2026 19:01:26 +0100 Subject: [PATCH 13/19] tidy flutter.md #165 --- README.md | 51 +++++++++++++++++++++++++++------------------------ flutter.md | 18 ++++++++++-------- 2 files changed, 37 insertions(+), 32 deletions(-) diff --git a/README.md b/README.md index fd22c5b..73a3c43 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ The software and systems we use to build **`@dwyl`**. - [What?](#what) - [The `PETAL` Stack](#the-petal-stack) - [**`Phoenix`** 🐦‍🔥](#phoenix-) - - [`Phoenix` the "Most Loved" Framework](#phoenix-the-most-loved-framework) + - [`Phoenix` the "Most Loved" Framework ❤️](#phoenix-the-most-loved-framework-️) - [**`Elixir`** 💧](#elixir-) - [`Elixir` Remains Most Loved Language](#elixir-remains-most-loved-language) - [`Tailwind CSS` 😍](#tailwind-css-) @@ -26,7 +26,7 @@ The software and systems we use to build **`@dwyl`**. - [`Phoenix` / `Elixir`](#phoenix--elixir) - [_Small_ Projects That Showcase `Phoenix`](#small-projects-that-showcase-phoenix) - [`Elixir` Utilities](#elixir-utilities) - - [**`Flutter`**](#flutter) + - [`Flutter` 📱](#flutter-) - [Miscellaneous](#miscellaneous) - [Our `MVP`](#our-mvp) - [Database?](#database) @@ -119,10 +119,7 @@ Let's go through each of these in a bit more detail. ### **`Phoenix`** 🐦‍🔥 **`Phoenix`** is the Web Application Framework -that **does not compromise** -on **speed**
-(both when building apps/features and serving requests), -**reliability** or **maintainability**!
+that **does not compromise**. **`Phoenix`** is the _successor_ to the incredibly popular @@ -144,7 +141,7 @@ The list of _**benefits**_ `Phoenix` has over See: [dwyl/**learn-phoenix-framework**#our-**top-10-reasons**-why-phoenix](https://github.com/dwyl/learn-phoenix-framework#our-top-10-reasons-why-phoenix)
-#### `Phoenix` the "Most Loved" Framework +#### `Phoenix` the "Most Loved" Framework ❤️ **`Phoenix`** tops the list of "**Most Loved**" Frameworks for the **3rd year in a row**
@@ -164,14 +161,14 @@ you know that they _love_ using it. ### **`Elixir`** 💧 -**`Elixir`** is the _functional_ programming language -used by the **`Phoenix`** framework. +**`Elixir`** is the _functional_ programming language +used by the **`Phoenix`** framework. **`Elixir`** is a _beautiful_ language -written _from scratch_ to be +written _from scratch_ to be ***friendly, concise and efficient***. -***Yes***, `Elixir` not as +**_Yes_**, `Elixir` not as ["_mainstream_"](https://github.com/dwyl/learn-elixir/issues/102#issuecomment-1105416646) -as `JavaScript`, `Java`, `C#` or `PHP`, +as `JavaScript`, `Java`, `C#` or `Python`, but the adoption is _growing rapidly_ and most importantly many _experienced_ developers are gravitating towards and describing it as their ["most wanted"](https://github.com/dwyl/the-book#you-will-learn-in-demand-tech-toolsskills) @@ -185,13 +182,17 @@ see: #### `Elixir` Remains Most Loved Language +For the 3rd year running, `Elixir` is the 2nd "Most Loved" programming language: +[survey.stackoverflow.co/2025/technology/#2-programming-scripting](https://survey.stackoverflow.co/2025/technology/#2-programming-scripting-and-markup-languages) -https://survey.stackoverflow.co/2022/#section-most-loved-dreaded-and-wanted-programming-scripting-and-markup-languages ![stackoverflow-survey-elixir](https://user-images.githubusercontent.com/194400/184831055-7f22484b-4c2b-472a-bf09-9165ef5fc7f9.png) +First appeared on: +https://survey.stackoverflow.co/2022/#section-most-loved-dreaded-and-wanted-programming-scripting-and-markup-languages + This is a good measure of how much people _enjoy_ working in the language. @@ -342,7 +343,6 @@ and serve as a good showcase for the stack: 3. Labels: [dwyl/**labels**](https://github.com/dwyl/labels) - ### `Elixir` Utilities Along our journey building apps for clients and ourselves, @@ -371,25 +371,28 @@ One of the many beauties of `Elixir` code is that it requires _very_ low maintenance; it just keeps working year after year. -### **`Flutter`** +### `Flutter` 📱 + +We are using `Flutter` for our **Native Mobile App**. +See: [`/flutter.md`](https://github.com/dwyl/technology-stack/blob/main/flutter.md) -In this section you will find learning repositories -where you can learn `Flutter` -_and_ how to use it with other technologies. +Along the way +we've created several learning resources for `Flutter` +and how to use it with other technologies: 1. Learn `Flutter`: [dwyl/learn-**flutter**](https://github.com/dwyl/learn-flutter) -2. Learn `Dart`: +1. Learn `Dart`: [dwyl/learn-**dart**](https://github.com/dwyl/learn-dart) -3. Counter: +1. Counter: [dwyl/flutter-**counter**-example](https://github.com/dwyl/flutter-counter-example) -4. Stopwatch: +1. Stopwatch: [dwyl/flutter-**stopwatch**-tutorial](https://github.com/dwyl/flutter-stopwatch-tutorial) -5. Todo list: +1. Todo list: [dwyl/flutter-**todo-list**-tutorial](https://github.com/dwyl/flutter-todo-list-tutorial) -6. `Bloc`: +1. `Bloc`: [dwyl/flutter-**bloc**-tutorial](https://github.com/dwyl/flutter-bloc-tutorial) -7. `Supabase` and `Flutter`: +1. `Supabase` and `Flutter`: [dwyl/**supabase**-flutter-demo](https://github.com/dwyl/supabase-flutter-demo) ### Miscellaneous diff --git a/flutter.md b/flutter.md index 184fe2c..fd1d337 100644 --- a/flutter.md +++ b/flutter.md @@ -37,12 +37,13 @@ If I was **starting** my journey **from _scratch_** now If we could keep all the knowledge/wisdom and experience gained -over 20+ years of programming +over 20+ years building Apps, but avoid any preconceptions and biases -i.e. -["sunk cost bias"](https://en.wikipedia.org/wiki/Sunk_cost#Fallacy_effect). -Would we still choose the tech/tools we are _currently_ using? -Or would we pick something else completely different? +(e.g: +[**sunk cost bias**](https://en.wikipedia.org/wiki/Sunk_cost#Fallacy_effect) +). +Would we **still choose** the **tech/tools** we are **_currently_ using**? +Or would we pick something else **completely different**? The people/teams/organizations that can _objectively_ question why they use particular tech/tools @@ -57,16 +58,17 @@ _before_ diving into any discussion of which technology/language/framework we should or shouldn't use is: -## What _Problem_ Are _Solving_?** +## What _Problem_ Are _Solving_? We are trying to deploy a **`Native` Mobile App** that **launches fast** and **performs well** (with a low memory footprint) on both `Android` and `IOs`. -`Flutter` solves this for us and allows maximum cross-platform code-reuse. +`Flutter` solves this for us +and allows maximum cross-platform code-reuse. When we (_initially_) looked at `Flutter` in early 2018, -it did _not_ meet all our needs for a UI framework. +it did _not_ meet all our needs for a UI framework.
At the time, it was focussed on `Android`, didn't support Web/PWAs and only had partial/beta support for `IOs`. From 1709c87348cf9a22974bf5d5250118078ed21c4a Mon Sep 17 00:00:00 2001 From: nelsonic Date: Fri, 31 Jul 2026 23:48:41 +0100 Subject: [PATCH 14/19] tidy beginner tutorials section #165 --- README.md | 57 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 73a3c43..f48b86c 100644 --- a/README.md +++ b/README.md @@ -21,8 +21,8 @@ The software and systems we use to build **`@dwyl`**. - [`Elixir` Remains Most Loved Language](#elixir-remains-most-loved-language) - [`Tailwind CSS` 😍](#tailwind-css-) - [`Alpine.js` (Optional) ✨](#alpinejs-optional-) - - [`LiveView`](#liveview) - - [_Beginner_ Tutorials?](#beginner-tutorials) + - [`LiveView` 🚀](#liveview-) + - [_Beginner_ Tutorials? 🔰](#beginner-tutorials-) - [`Phoenix` / `Elixir`](#phoenix--elixir) - [_Small_ Projects That Showcase `Phoenix`](#small-projects-that-showcase-phoenix) - [`Elixir` Utilities](#elixir-utilities) @@ -240,7 +240,7 @@ read: [`app.js`](https://github.com/dwyl/mvp/blob/main/assets/js/app.js) it handles the drag-and-drop and effects in the `MVP`. -### `LiveView` +### `LiveView` 🚀 **`LiveView`** is a radically simplified way of building **realtime web apps** @@ -270,7 +270,7 @@ please see:
-## _Beginner_ Tutorials? +## _Beginner_ Tutorials? 🔰 We have _crafted_ a "**_Complete Beginner's_ Guide**" for each element in the stack, so that we: @@ -281,22 +281,23 @@ for each element in the stack, so that we: we **forget fast** unless we **capture** it **immediately**_!) -2. **_Share_** our knowledge with other people so we can - - Help to train (_potential_) new team members - as quickly/effectively as possible. - - **_Collectively iterate_** on our knowledge - and "_level-up_" as a _team_! - - "Onboard" the client team (_who may want/need_) to - support/maintain the codebase/project - if/when we _seamlessly_ "hand over". - - Inform the wider community - of both technical _and_ non-technical - people ("stake holders") who are _generally_ - interested in _understanding_ the project. - - Enlighten other teams/organizations/agencies/etc. we aren't in - _direct_ contact with that there is a "_more fun_" way of building software! - -3. Make _everyone's_ life easier/better +2. **_Share_** our knowledge with other people so we can: + +- Help to train (_potential_) new team members +as quickly/effectively as possible. +- **_Collectively iterate_** on our knowledge +and "_level-up_" as a _team_! +- "Onboard" the client team (_who may want/need_) to +support/maintain the codebase/project +if/when we _seamlessly_ "hand over". +- Inform the wider community +of both technical _and_ non-technical +people ("stake holders") who are _generally_ +interested in _understanding_ the project. +- Enlighten other teams/organizations/agencies/etc. we aren't in +_direct_ contact with that there is a "_more fun_" way of building software! + +1. Make _everyone's_ life easier/better by having a "launch pad" for [_rapid_ learning](https://youtu.be/hOZnP4dZYK0 "Matrix Easter Egg ;-)")! @@ -415,7 +416,7 @@ while developing our [`app`](https://github.com/dwyl/app). ### Our `MVP` -We have built a fully working MVP version of our App! +We have built a working MVP version of our App! Check it out at [dwyl/**mvp**](https://github.com/dwyl/mvp)! @@ -623,8 +624,8 @@ and In November 2016 we (_once again_) **questioned our _assumptions_**, -***re-examined*** and -[***surveyed***](https://github.com/dwyl/learn-elm/issues/10) +**_re-examined_** and +[**_surveyed_**](https://github.com/dwyl/learn-elm/issues/10) the "landscape" of "_emerging trends_" in web app development. We were ~~pleasantly surprised~~ ***delighted*** to see the _amazing progress_ made by the people in the `Elixir` / `Phoenix` community! @@ -638,15 +639,15 @@ which technologies and tools you will use to deliver the desired solution/benefit to the "_end users_". Most people have the Tech/Tools decision made _for_ them -by the company/organisation/boss they work for -(_e.g: `Java` -> `Spring`, -`Ruby` -> `Rails` +by the company/organization/boss they work for +(_e.g: `Java` -> `Spring`, +`Ruby` -> `Rails` or `PHP` -> `WordPress` or `Laravel`, etc._) -This is because most companies +This is because most companies _already_ have an _existing_ app in "production", which you have been hired to extend. -Occasionally you will get the chance +Occasionally you will get the chance to build an app from "_scratch_" however _most_ of the time someone `else` (_the "Architect"_) will make the decision for what "_stack_" to use on your behalf, From 801d35362dbf69ab791a6b408c5b6429fc8f637e Mon Sep 17 00:00:00 2001 From: nelsonic Date: Sat, 1 Aug 2026 00:18:58 +0100 Subject: [PATCH 15/19] add emoji #165 --- README.md | 181 +++++++++++++++++++++++++++--------------------------- 1 file changed, 89 insertions(+), 92 deletions(-) diff --git a/README.md b/README.md index f48b86c..c4c270e 100644 --- a/README.md +++ b/README.md @@ -23,29 +23,28 @@ The software and systems we use to build **`@dwyl`**. - [`Alpine.js` (Optional) ✨](#alpinejs-optional-) - [`LiveView` 🚀](#liveview-) - [_Beginner_ Tutorials? 🔰](#beginner-tutorials-) - - [`Phoenix` / `Elixir`](#phoenix--elixir) - - [_Small_ Projects That Showcase `Phoenix`](#small-projects-that-showcase-phoenix) - - [`Elixir` Utilities](#elixir-utilities) + - [`Phoenix` / `Elixir` 📝](#phoenix--elixir-) + - [_Small_ Apps That Showcase `Phoenix` 💡](#small-apps-that-showcase-phoenix-) + - [`Elixir` Utilities 🔪](#elixir-utilities-) - [`Flutter` 📱](#flutter-) - [Miscellaneous](#miscellaneous) - [Our `MVP`](#our-mvp) - [Database?](#database) - [We _Prefer_ `PostgreSQL`](#we-prefer-postgresql) - - [List of Organizations Using PostgreSQL](#list-of-organizations-using-postgresql) - - [Operating System?](#operating-system) - - [Continuous Integration](#continuous-integration) - - [Deployment](#deployment) + - [Operating System? 🧠](#operating-system-) + - [Continuous Integration ✅](#continuous-integration-) + - [Deployment 🚀](#deployment-) - [Application Server](#application-server) - [SSL/TLS Encryption](#ssltls-encryption) - [tl;dr](#tldr) - [Why Try a "New Stack"?](#why-try-a-new-stack) - - [Why Try Something New When We're _Already_ Good with the "Old"...?](#why-try-something-new-when-were-already-good-with-the-old) + - [Why Try Something New When We're _Already_ Good with the "Old"...?](#why-try-something-new-when-were-already-good-with-the-old) - [Making Difficult Decisions](#making-difficult-decisions) - - [_Most_ "_Application Architects_" will pick one of these 3 options:](#most-application-architects-will-pick-one-of-these-3-options) - - [Toast Knife Analogy](#toast-knife-analogy) + - [_Most_ "_Application Architects_" Pick One Of These 3 Options:](#most-application-architects-pick-one-of-these-3-options) + - [Toast Knife Analogy 🔪](#toast-knife-analogy-) - [Focussing on Long-term Benefits](#focussing-on-long-term-benefits) - [Further Reading on Long-term Thinking](#further-reading-on-long-term-thinking) - - [*Contextualising* Technology Adoption (_Mini History Lesson_)](#contextualising-technology-adoption-mini-history-lesson) + - [_Contextualising_ Technology Adoption (_Mini History Lesson_)](#contextualising-technology-adoption-mini-history-lesson) - [Does it _Scale_?](#does-it-scale) - [TL;DR](#tldr-1) - [What About _Full Stack `JavaScript`_?](#what-about-full-stack-javascript) @@ -305,10 +304,10 @@ We have written several **_beginner_ tutorials** that span our technology stack and tools we actively use in development. -### `Phoenix` / `Elixir` +### `Phoenix` / `Elixir` 📝 -Here are a few of our learning repositories -pertaining to `Phoenix` and `Phoenix Liveview`. +A few of our learning repositories +specific to `Phoenix` and `Phoenix Liveview`. 1. Learn `Elixir`: [dwyl/learn-elixir](https://github.com/dwyl/learn-elixir) @@ -331,20 +330,20 @@ pertaining to `Phoenix` and `Phoenix Liveview`. 10. `Flutter` and `Phoenix`: [dwyl/**flutter-phoenix**-channels-demo](https://github.com/dwyl/flutter-phoenix-channels-demo) -### _Small_ Projects That Showcase `Phoenix` +### _Small_ Apps That Showcase `Phoenix` 💡 We have a couple of "internal" (but Open Source) projects that use `Phoenix` and serve as a good showcase for the stack: 1. Hits: - [dwyl/**hits**](https://github.com/dwyl/hits) + [dwyl/**hits**](https://github.com/dwyl/hits) 📈 2. Image Uploads: - [dwyl/**imgup**](https://github.com/dwyl/imgup) + [dwyl/**imgup**](https://github.com/dwyl/imgup) 🖼️ 3. Labels: - [dwyl/**labels**](https://github.com/dwyl/labels) + [dwyl/**labels**](https://github.com/dwyl/labels) 🏷️ -### `Elixir` Utilities +### `Elixir` Utilities 🔪 Along our journey building apps for clients and ourselves, we've created a few reusable packages: @@ -396,7 +395,7 @@ and how to use it with other technologies: 1. `Supabase` and `Flutter`: [dwyl/**supabase**-flutter-demo](https://github.com/dwyl/supabase-flutter-demo) -### Miscellaneous +### Miscellaneous In this section, we will list a few repos that explain @@ -443,7 +442,7 @@ This means that if a client _asks_ us to deploy to `MySQL` or `Microsoft SQL Server`
(_e.g. because they already have in-house capability for maintaining one of these databases_)
-we can easily accommodate that +we can _easily_ accommodate that without re-writing _any_ of the `Phoenix` app! Changing a couple of lines of configuration is all that is needed. @@ -451,15 +450,14 @@ is all that is needed. ### We _Prefer_ `PostgreSQL` Our "_standard_" (_preferred_) DB @dwyl is `Postgres`. -see: -[dwyl/**learn-postgresql**](https://github.com/dwyl/learn-postgresql) +see: +[dwyl/**learn-postgresql**](https://github.com/dwyl/learn-postgresql) 🐘
`Postgres` is the most "_mature_" Open Source Relational Database. -It's ***100% Free*** (_including all **"advanced"** features_) -and has been deployed and ***battle-tested*** in ***every*** environment +It's **_100% Free_** (_including all "**advanced**" features_) +and has been deployed and **_battle-tested_** in **_every_** environment from `AWS` to "Bare Metal" and `Google Cloud` to `Microsoft Azure`! - > _**Many** well-known/successful apps rely on `Postgres` as their `main` database_.
> _**NOT** that you should adopt a particular technology @@ -467,11 +465,12 @@ based on who `else` is using it,_
> _but it's **good to know** that **plenty** of teams are getting **excellent results** with `Postgres`!_ -#### [List of Organizations Using PostgreSQL](https://github.com/dwyl/learn-postgresql/issues/31) +See: +[List of Organizations Using PostgreSQL](https://github.com/dwyl/learn-postgresql/issues/31) We have used _most_ of the "_popular_" Relational Databases. -e.g: `MySQL`, `Microsoft SQL Server`, -`Oracle` and `Aurora`, etc; +e.g: `MySQL`, `Microsoft SQL Server`, +`Oracle` and `Aurora`, etc; all [RDBMS](https://en.wikipedia.org/wiki/Relational_database_management_system) have their pros/cons.
@@ -480,9 +479,6 @@ is because the **_community_** is _superb_.
There is a great "_bank_" of _answered_ questions on [StackOverflow](https://stackoverflow.com/questions/tagged/postgresql?tab=Votes) and new questions get answered _fast_. -This means you don't _need_ -to have an _expert/full-time_ DBA on your team/staff, -if you get stuck ask the internet! From 2023 to 2025 `Postgres` has remained the **most used** and **most desired** Database: @@ -490,24 +486,25 @@ the **most used** and **most desired** Database: 46.5% of respondants use `Postgres` more than double `MySQL` (20.5%). -## Operating System? +## Operating System? 🧠 A _"traditional"_ [**LAMP** stack](https://en.wikipedia.org/wiki/LAMP_(software_bundle)) includes the **Linux** Operating System in the _name_.
-The "**PETAL**" stack runs +The "**PETAL**" stack runs on _any_ (_desktop/server_) Operating System
and can be deployed to any "_cloud_" infrastructure provider.
-While we have a _strong_ preference -for `Unix` (e.g. `FreeBSD`) or +While we have a _strong_ preference +for `Unix` (e.g. `OpenBSD`) or `Linux` (_e.g. `Ubuntu` or `CentOS`_) we know that
_both_ `Phoenix` and `Postgres` run on almost _any_ environment including Microsoft Windows Desktop & Server. +We typically deploy our `Phoenix` Apps using `Ubuntu` + `Docker`. -## Continuous Integration +## Continuous Integration ✅ We are using [`GitHub` actions](https://docs.github.com/en/actions/get-started/continuous-integration) @@ -532,7 +529,7 @@ e.g: or self-hosted `Jenkins`. We can easily adapt to the needs of the project. -## Deployment +## Deployment 🚀 We make a point of deploying our work as _soon_ as there is _something_ worth showing @@ -555,7 +552,7 @@ and Many people have found our notes helpful. -## Application Server +## Application Server The `Phoenix` Application Server is hosted on (_a minimum of_) **Two Servers**.
@@ -564,9 +561,9 @@ one another to distribute load as a cluster_).
The "_cluster_" is managed by Erlang's "Supervisor". The Erlang Supervisor is the "_Gold Standard_" in infrastructure management, -having been used by Telecoms companies +having been used by Telecoms companies for over 20 years in production -with some Telcos reporting 99.9999999% +with some Telcos reporting 99.9999999% ("_nine nines_") of "_up-time_". > It's _far_ more likely that the _infrastructure_ provider (_e.g. AWS/Azure_) @@ -589,7 +586,7 @@ to help you get started, we wrote a


-# tl;dr +# tl;dr There is _no shortage_ of options available for Technology Stack! @@ -601,10 +598,9 @@ We _already_ had a _really_ good [Node.js Stack](https://github.com/dwyl/technology-stack/blob/main/legacy) which worked well for us and our clients. so . . . - ## Why Try a "New Stack"? -#### Why Try Something New When We're _Already_ Good with the "Old"...? +### Why Try Something New When We're _Already_ Good with the "Old"...? Our _reasoning_ for _considering_ an alternative approach/stack for building web apps @@ -622,14 +618,14 @@ and > LIFE Magazine (2 May 1955) p. 64” --> -In November 2016 we (_once again_) +In November 2016 we (_once again_) **questioned our _assumptions_**, **_re-examined_** and [**_surveyed_**](https://github.com/dwyl/learn-elm/issues/10) the "landscape" of "_emerging trends_" in web app development. -We were ~~pleasantly surprised~~ ***delighted*** to see the _amazing progress_ +We were ~~pleasantly surprised~~ **_delighted_** to see the _amazing progress_ made by the people in the `Elixir` / `Phoenix` community! -Please see: +Please see: [dwyl/learn-phoenix-framework#**questions**](https://github.com/dwyl/learn-phoenix-framework#questions) ## Making Difficult Decisions @@ -658,38 +654,39 @@ trends and investigated the "_new and promising_" technologies e.g: Stack Overflow ["Most Wanted" list](https://github.com/dwyl/the-book#most-wanted-programming-languages). +### _Most_ "_Application Architects_" Pick One Of These 3 Options: -#### _Most_ "_Application Architects_" will pick one of these 3 options: - -1. ***Go with what you (already) know***, use _existing_ stack +1. **_Stick with what you (already) know_**, use _existing_ stack with a minor variation because it's "easy to deploy" with the existing infrastructure and will not get questioned by the "Executives", DevOps team or "Compliance" department. This is the easy choice and nobody ever got "_fired_" for sticking with what they know "_works_". -2. Buy the whizz-bang all-in-one solution sold to them by the "Consultant" -from "Big Vendor XYZ" (_outsource the thinking to a sales person who last - wrote code in the 90's ... seems like a great idea ... NOT!_) +2. Buy the whizz-bang all-in-one solution sold to them by the "**Consultant**" +from "**Big Vendor XYZ**"; +this can _feel_ like a safe option, +but it results in +[vendor lock-in](https://en.wikipedia.org/wiki/Vendor_lock-in). -3. Be "Bold" and try "***Popular Framework XYZ***" +3. **Be Bold** and try "**_Popular Framework XYZ_**" and hire an _external_ -team to build the new magic app. +team to build the new magic app. Then attempt to "_up-skill_" the _internal_ team to _maintain_ the code written by the consultants. -None of these choices is _optimal_, +None of these choices is _optimal_, all have different levels of risk/reward. -The "_hardest_" choice to make +The "_hardest_" choice to make is the one where you try something _totally_ different. The _reality_ is that very few people -have the time/resources/mindset/inclination +have the time/resources/mindset/inclination to take a step back -and open their minds -to the idea that there _might_ -be a "_better tool_" for the job +and open their minds +to the idea that there _might_ +be a "_better tool_" for the job than the one they are _currently_ using. -### Toast Knife Analogy +### Toast Knife Analogy 🔪 Imagine Want to Make Yourself Some **Toast**.
The "_user story_" for this would be: @@ -702,7 +699,7 @@ The "_user story_" for this would be: to reduce the options for solutions for simplicity
i.e. not baking from scratch!_ ) -The "_traditional_" way to "_solve_" +The "_traditional_" way to "_solve_" the challenge of making toast:
1. Cut bread with bread knife @@ -710,27 +707,26 @@ the challenge of making toast:
3. Turn on toaster for pre-determined amount of time 4. Wait patiently for toaster to make toast - But ... what if instead the "_old_" way we just described, -someone invented a way +someone invented a way to _toast_ the bread `while` slicing it...?! ![b4df5698-914e-4dd2-b271-9c00881b6599-274-0000001c8c73f018_tmp](https://cloud.githubusercontent.com/assets/194400/22363833/07798ad6-e465-11e6-9d92-44898a774148.png) ![9f9fc56d-b22a-4e77-b60f-f3619254023b-274-0000001ce1dcb22a_tmp](https://cloud.githubusercontent.com/assets/194400/22363837/0d860594-e465-11e6-9dcd-292f441983b0.png) -Simply by using the "***New Tool***" for the job - +Simply by using the "**_New Tool_**" for the job - _in this case the -["**Toast Knife**"](https://youtu.be/3ttzWuaPGMo?t=1m1s)_ - +["**Toast Knife**"](https://youtu.be/3ttzWuaPGMo?t=1m1s)_ - you can -simplify the process to a ***single step***!
+simplify the process to a **_single step_**!
This is the power of being _open_ to considering "New" Tools/Technologies!
-Get the ***same result*** in **fewer** than half the "**steps**"! +Get the **_same result_** in **fewer** than half the "**steps**"! ### Focussing on Long-term Benefits The _short-term_ cost of learning a new stack (_programming language or framework_) is time, -We contend that the 1 week learning time +We contend that the 1 week learning time (_depending on the focus of learners_) will pay for itself within 1 month (_often sooner if the team is large/distributed because the **structure** @@ -739,22 +735,22 @@ will pay for itself within 1 month #### Further Reading on Long-term Thinking -+ https://hbr.org/2012/08/thinking-long-term-in-a-short -+ https://hbr.org/2011/03/capitalism-for-the-long-term +- https://hbr.org/2012/08/thinking-long-term-in-a-short +- https://hbr.org/2011/03/capitalism-for-the-long-term -### *Contextualising* Technology Adoption (_Mini History Lesson_) +### _Contextualising_ Technology Adoption (_Mini History Lesson_) In **1996** Nokia introduced the -["***Communicator***"](https://en.wikipedia.org/wiki/Nokia_Communicator) +["**Communicator**"](https://en.wikipedia.org/wiki/Nokia_Communicator) and was a **_incredible_ revolutionary innovation**! -**Internet, Email and _Fax_** in your ***Pocket***!!
+**Internet, Email and _Fax_** in your **_Pocket_**!!
![nokia-communicator](https://cloud.githubusercontent.com/assets/194400/23014351/89c07b64-f426-11e6-8c5a-f93b71a3aa53.jpg)
Nokia continued to _dominate_ the mobile phone industry/market for the next -***decade*** producing the _best-selling_ +**decade** producing the _best-selling_ [**5110**](https://en.wikipedia.org/wiki/Nokia_5110) -and +and [**3310**](https://en.wikipedia.org/wiki/Nokia_3310) some of us are old enough to remember!
But by being "_ahead_" Nokia was _unable_ to see the "_contender_" @@ -762,17 +758,19 @@ coming "_out of nowhere_" to challenge their position. In 2006 _nobody_ was making/buying "smart" mobile phones with glass touch screens that ran "apps" ...
-in +in [January 2007 Steve Jobs introduced the iPhone](https://www.youtube.com/results?search_query=Steve+Jobs+iPhone+Introduction+2007) and _literally_ changed the industry! ![Steve Jobs introduces iphone](https://cloud.githubusercontent.com/assets/194400/22934275/4bc76090-f2c6-11e6-9b90-91226e39ea09.png) The dominant/incumbent mobile phone maker **Nokia** had -[***49% market share in 2007***](https://www.bbc.co.uk/news/technology-23947212) +[**_49% market share_ in 2007**](https://www.bbc.co.uk/news/technology-23947212) _mocked_ Apple's lack of features, poor battery life and high price.
-By 2013 Nokia had 3% Market Share (_for new device sales_) and was sold off "for parts" to Microsoft -while Apple was the [most valuable company](https://www.statista.com/statistics/263264/top-companies-in-the-world-by-market-value/) +By 2013 Nokia had **3% Market Share** (_for new device sales_) +and was sold off "for parts" to Microsoft +while Apple became the +[most valuable company](https://www.statista.com/statistics/263264/top-companies-in-the-world-by-market-value/) in history! > _Many **people still buy** "**feature phones**" @@ -792,7 +790,7 @@ but if you can **inexpensively switch**
to something **demonstrably better** in **every aspect**, why would you stick with the "feature phone" of web frameworks...?_
_It's like taking the Bus to work when there's a perfectly -good teleporter right next to the bus stop!! Madness._ +good **teleporter** right next to the bus stop!! Madness._ We are not _suggesting_ that _everyone_ is going to _suddenly_ flock to the "**PETAL**" stack @@ -888,7 +886,7 @@ to make it _available_ to more people! ![no-javascript](https://cloud.githubusercontent.com/assets/194400/22939705/88d3e524-f2d7-11e6-91c6-47513f6b4fa7.jpg) -This not the place to "diss" JavaScript; +This not the place to "diss" `JavaScript`; _plenty_ of people have written blog posts/tweets "_ranting_" about the ["_State of Web Development_"](https://medium.com/@wob/the-sad-state-of-web-development-1603a861d29f). @@ -903,7 +901,6 @@ why do we even _need_ to have an _expression_ for that? why can't ***elegant*** asynchronous control flow be the **_only_ way** to write code? - The **fact** is: we _only_ use JavaScript because it is the ["***Lingua Franca***"](https://en.wikipedia.org/wiki/Lingua_franca) that _all_ web browsers "_understand_".
@@ -935,12 +932,12 @@ If you're in any doubt, ***Just Do it***._ ### What About _Full Stack `JavaScript`_? -We still think that -"***Full Stack `JavaScript`***" -is a ***compelling proposition*** +We still think that +"**Full Stack `JavaScript`**" +is a **_compelling_ proposition** _especially_ for people who are just starting out! It allows you to write _one_ programming language -on both the client and server; we get it! +on both the client and server; we _get_ it! However we have learned from years of experience that it requires **a _lot_ more code and _maintenance_** than **`PETAL`** for an **_inferior_ result** @@ -950,7 +947,7 @@ in terms of UX/performance and developer productivity. If we were to _consider_ an alternative to `SQL`, we would use `RethinkDB`: -https://rethinkdb.com
+[rethinkdb.com](https://rethinkdb.com)
But we are _relieved_ that the `Phoenix` team is _focussed_ on `Postgres` because that _eliminates_
the "ambiguity" or "discussion" of "_which database_" to use! @@ -968,7 +965,7 @@ See: > “_If it takes an hour to figure out what’s going on, well,
> that’s an hour that wasn’t spent > doing something else more useful and interesting_."
-> ~ +> ~ > [Rachel Kroll](https://rachelbythebay.com/w/2021/09/05/clever/) Please read: @@ -998,12 +995,12 @@ No need for microservices message queues or other complex tech that is only relevant to 0.1% of mega scale companies: ![image](https://user-images.githubusercontent.com/194400/185088279-241c2d23-3986-4820-9b59-7acb6f9b8235.png) -We agree. +We agree.
If by some luck our product reaches the point where -we _need_ mega scale +we _need_ mega scale (_millions of `people` creating billions of `items`_) we know that our chosen stack will scale just fine. From baa5d086c6a3a188d22f310c1f98dd627826b5f2 Mon Sep 17 00:00:00 2001 From: nelsonic Date: Sat, 1 Aug 2026 00:28:29 +0100 Subject: [PATCH 16/19] fix numbering in list #165 --- README.md | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index c4c270e..055f19a 100644 --- a/README.md +++ b/README.md @@ -27,15 +27,15 @@ The software and systems we use to build **`@dwyl`**. - [_Small_ Apps That Showcase `Phoenix` 💡](#small-apps-that-showcase-phoenix-) - [`Elixir` Utilities 🔪](#elixir-utilities-) - [`Flutter` 📱](#flutter-) - - [Miscellaneous](#miscellaneous) - - [Our `MVP`](#our-mvp) - - [Database?](#database) - - [We _Prefer_ `PostgreSQL`](#we-prefer-postgresql) + - [Miscellaneous 💳](#miscellaneous-) + - [Our `MVP` 💡](#our-mvp-) + - [Database? 🗄️](#database-️) + - [We _Prefer_ `PostgreSQL` 🫶](#we-prefer-postgresql-) - [Operating System? 🧠](#operating-system-) - [Continuous Integration ✅](#continuous-integration-) - [Deployment 🚀](#deployment-) - - [Application Server](#application-server) - - [SSL/TLS Encryption](#ssltls-encryption) + - [Application Server 🏢](#application-server-) + - [SSL/TLS Encryption 🔐](#ssltls-encryption-) - [tl;dr](#tldr) - [Why Try a "New Stack"?](#why-try-a-new-stack) - [Why Try Something New When We're _Already_ Good with the "Old"...?](#why-try-something-new-when-were-already-good-with-the-old) @@ -86,7 +86,7 @@ we use for **`dwyl`** products/projects. Each element in our stack was _carefully_ selected based on its individual merits.
-When _assembled_ into a seamless "machine", +When _assembled_ into a seamless machine, the stack is _unrivaled_ for **developer effectiveness** and _**world-class quality**_! @@ -296,7 +296,7 @@ interested in _understanding_ the project. - Enlighten other teams/organizations/agencies/etc. we aren't in _direct_ contact with that there is a "_more fun_" way of building software! -1. Make _everyone's_ life easier/better +3. Make _everyone's_ life easier/better by having a "launch pad" for [_rapid_ learning](https://youtu.be/hOZnP4dZYK0 "Matrix Easter Egg ;-)")! @@ -395,7 +395,7 @@ and how to use it with other technologies: 1. `Supabase` and `Flutter`: [dwyl/**supabase**-flutter-demo](https://github.com/dwyl/supabase-flutter-demo) -### Miscellaneous +### Miscellaneous 💳 In this section, we will list a few repos that explain @@ -413,13 +413,13 @@ while developing our [`app`](https://github.com/dwyl/app). 1. `Github Pages` deployment: [dwyl/learn-**github-pages**](https://github.com/dwyl/learn-github-pages) -### Our `MVP` +### Our `MVP` 💡 We have built a working MVP version of our App! Check it out at -[dwyl/**mvp**](https://github.com/dwyl/mvp)! +[dwyl/**mvp**](https://github.com/dwyl/mvp)! 📱 -## Database? +## Database? 🗄️ The _reason_ we do not _specify_ our Database in the `PETAL` acronym is @@ -447,7 +447,7 @@ without re-writing _any_ of the `Phoenix` app! Changing a couple of lines of configuration is all that is needed. -### We _Prefer_ `PostgreSQL` +### We _Prefer_ `PostgreSQL` 🫶 Our "_standard_" (_preferred_) DB @dwyl is `Postgres`. see: @@ -552,14 +552,15 @@ and Many people have found our notes helpful. -## Application Server +## Application Server 🏢 The `Phoenix` Application Server is hosted on (_a minimum of_) **Two Servers**.
(_often many more which send **messages** one another to distribute load as a cluster_).
The "_cluster_" is managed by Erlang's "Supervisor". -The Erlang Supervisor +The +[Erlang Supervisor](https://learnyousomeerlang.com/supervisors) is the "_Gold Standard_" in infrastructure management, having been used by Telecoms companies for over 20 years in production @@ -570,7 +571,7 @@ with some Telcos reporting 99.9999999% will have a fault in their network/datacenter than an Erlang server "crashing". An individual request/process may crash but never the whole server. -## SSL/TLS Encryption +## SSL/TLS Encryption 🔐 All communication is over secure/encrypted channel (_by default at all times_)
From ff44c2029b7e506640235cf3ddb0e1b38695d4cb Mon Sep 17 00:00:00 2001 From: nelsonic Date: Sat, 1 Aug 2026 00:32:25 +0100 Subject: [PATCH 17/19] this is definitely too long ... #165 --- README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/README.md b/README.md index 055f19a..f37f9c8 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,6 @@ The software and systems we use to build **`@dwyl`**. - [Further Reading on Long-term Thinking](#further-reading-on-long-term-thinking) - [_Contextualising_ Technology Adoption (_Mini History Lesson_)](#contextualising-technology-adoption-mini-history-lesson) - [Does it _Scale_?](#does-it-scale) - - [TL;DR](#tldr-1) - [What About _Full Stack `JavaScript`_?](#what-about-full-stack-javascript) - [Alternative Databases?](#alternative-databases) - [Radical Simplicity](#radical-simplicity) @@ -829,8 +828,6 @@ for a balanced primer on scalability: [youtu.be/cNICGEwmXLU](https://youtu.be/cNICGEwmXLU) -#### TL;DR - Yes, scalability and especially **fault tolerance** is **important**. And **`Phoenix`** has your back with all of the above. It lets you **focus** on **User Experience** From d8531526ef20b053efc4a6cd9601eb14f7f7bbc8 Mon Sep 17 00:00:00 2001 From: nelsonic Date: Mon, 3 Aug 2026 20:09:01 +0100 Subject: [PATCH 18/19] add deep link to https://github.com/dwyl/learn-alpine.js/blob/main/drag-and-drop.md --- README.md | 50 ++++++++++++++++++++++++++++---------------------- 1 file changed, 28 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index f37f9c8..7c65ca5 100644 --- a/README.md +++ b/README.md @@ -73,21 +73,21 @@ to make product(s) that are --> > _If **anything** is **unclear** or you have **any questions** please_ -[***ask***](https://github.com/dwyl/technology-stack/issues).
+[**_ask_**](https://github.com/dwyl/technology-stack/issues).
We are always happy to answer tech stack related questions.
-But please make sure you read the whole doc first. +Please make sure you read the whole doc first. # What? This document + diagrams _describe_ -the full "**`PETAL`**" Technology Stack +the full **`PETAL`** Technology Stack we use for **`dwyl`** products/projects. Each element in our stack was _carefully_ selected based on its individual merits.
When _assembled_ into a seamless machine, the stack is _unrivaled_ for **developer effectiveness** -and _**world-class quality**_! +and _**world-class reliability**_! ## The `PETAL` Stack @@ -103,14 +103,17 @@ for the following elements: - **P**hoenix - the Web App framework that organizes routes, schemas, controllers and tests like a well-oiled machine. -- **E**lixir - the functional fault-tolerant programming language. +- **E**lixir - the **functional** fault-tolerant **programming language** +that is a _joy_ to work with. - **T**ailwind - the **interface** library -used for building beautiful mobile-first & responsive web apps that feel fast. -- **A**lpine.js - the tiny effects & enhancements JavaScript library -that loads fast and progressively enhances the user experience. -This is 100% optional, apps work fine without it. -- **L**iveView - the system that significantly simplifies creating interfaces -that update in real-time whenever a change is made by anyone else. +used for building **beautiful mobile-first** & **responsive web apps** +that feel fast and are easy to extend. +- **A**lpine.js - the _tiny_ effects & enhancements `JavaScript` library +that loads fast and **progressively enhances** the **user experience**. +This is **100% optional**, apps work fine without it. +- **L**iveView - the system that **_significantly_ simplifies** +creating interfaces that update in **real-time** +whenever a change is made by anyone else. Let's go through each of these in a bit more detail. @@ -123,14 +126,14 @@ that **does not compromise**. to the incredibly popular [Ruby-on-Rails](https://rubyonrails.org/) framework -(commonly referred to as `Rails`) -that was used by many startups and successful companies +(commonly referred to as `Rails`). +That was used by many startups and successful companies e.g: `AirBnB`, `GitHub`, `Shopify` and `Twitter` (most of which have migrated away from `Rails` for scalability reasons). **`Phoenix`** was built _from scratch_ by highly experienced engineers -who worked on/with `Rails`. +who worked on/with `Rails`.
It _solves_ all of the speed/socket/scaling/concurrency issues people felt when building/using Rails apps. @@ -151,11 +154,11 @@ on the https://survey.stackoverflow.co/2022/#section-most-loved-dreaded-and-wanted-web-frameworks-and-technologies This is not a -[popularity contest](https://en.wikipedia.org/wiki/Popularity_contest), +[popularity contest](https://en.wikipedia.org/wiki/Popularity_contest); the votes are private/confidential. -When software engineering community collectively -votes that a framework is their "most loved", -you know that they _love_ using it. +When software engineering community _collectively_ +votes that a framework is their "**most loved**", +you know that they **_love_ using it**. ### **`Elixir`** 💧 @@ -175,14 +178,14 @@ to do with the intellectual inertia people/companies have because they allow existing (_legacy_) codebases to dictate future development; i.e. [_**sunk cost bias**_](https://www.investopedia.com/terms/s/sunk-cost-trap.asp). -see: +see: [dwyl/**learn-elixir#key-advantages**](https://github.com/dwyl/learn-elixir#key-advantages-) #### `Elixir` Remains Most Loved Language For the 3rd year running, -`Elixir` is the 2nd -"Most Loved" programming language: +`Elixir` is the 3rd +"Most Loved" programming language in the world: [survey.stackoverflow.co/2025/technology/#2-programming-scripting](https://survey.stackoverflow.co/2025/technology/#2-programming-scripting-and-markup-languages) @@ -219,8 +222,9 @@ that can easily be customized. ### `Alpine.js` (Optional) ✨ **`Alpine.js`** is a **lightweight** library -for enhancing interactions in a web application. +for enhancing interactions in a web application.
It's **declarative**, responsive and easy to learn. + `Alphine.js` plays well with `LiveView` for [progressive enhancements](https://en.wikipedia.org/wiki/Progressive_enhancement). see: @@ -237,6 +241,8 @@ For a concrete example of how we are using `Alpine.js`, read: [`app.js`](https://github.com/dwyl/mvp/blob/main/assets/js/app.js) it handles the drag-and-drop and effects in the `MVP`. +This is **_fully_ documented** in: +[`/drag-and-drop.md`](https://github.com/dwyl/learn-alpine.js/blob/main/drag-and-drop.md) ### `LiveView` 🚀 From 17a0f11182d055f570c054e0ea11dea5e4654203 Mon Sep 17 00:00:00 2001 From: nelsonic Date: Mon, 3 Aug 2026 20:25:03 +0100 Subject: [PATCH 19/19] expand Elixir section. #165 --- README.md | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 7c65ca5..77abf4d 100644 --- a/README.md +++ b/README.md @@ -101,14 +101,14 @@ https://github.com/dwyl/technology-stack/issues/1 for the following elements: - **P**hoenix - the Web App framework - that organizes routes, schemas, controllers and tests - like a well-oiled machine. + that **_organizes_ routes, schemas, controllers** and **tests _logically_**. - **E**lixir - the **functional** fault-tolerant **programming language** that is a _joy_ to work with. -- **T**ailwind - the **interface** library -used for building **beautiful mobile-first** & **responsive web apps** +- **T**ailwind - the **interface library** +for building **beautiful mobile-first** & **responsive web apps** that feel fast and are easy to extend. -- **A**lpine.js - the _tiny_ effects & enhancements `JavaScript` library +With hundreds of templates & examples. +- **A**lpine.js - the **_tiny_ effects and enhancements `JavaScript` library** that loads fast and **progressively enhances** the **user experience**. This is **100% optional**, apps work fine without it. - **L**iveView - the system that **_significantly_ simplifies** @@ -162,17 +162,26 @@ you know that they **_love_ using it**. ### **`Elixir`** 💧 -**`Elixir`** is the _functional_ programming language -used by the **`Phoenix`** framework. -**`Elixir`** is a _beautiful_ language +**`Elixir`** is the **_functional_ programming language** +used by the **`Phoenix`** framework.
+**`Elixir`** is a **_beautiful_ language** written _from scratch_ to be -***friendly, concise and efficient***. +**_friendly, concise and efficient_**. +What this means is that you can write +elegant expressive programs +that achieve impressive results with fewer words. +And because it's **functional** (with immutable data), +it's considerably easier to follow the logic +even when reading someone else's code +or your own you're returning to after a few years. + **_Yes_**, `Elixir` not as ["_mainstream_"](https://github.com/dwyl/learn-elixir/issues/102#issuecomment-1105416646) as `JavaScript`, `Java`, `C#` or `Python`, but the adoption is _growing rapidly_ and most importantly -many _experienced_ developers are gravitating towards and -describing it as their ["most wanted"](https://github.com/dwyl/the-book#you-will-learn-in-demand-tech-toolsskills) +many **_experienced_ engineers** are gravitating towards and +describing it as their +["most wanted"](https://github.com/dwyl/learn-elixir/issues/102#issuecomment-3214201950) Also a language's popularity has more to do with the intellectual inertia people/companies have because they allow existing (_legacy_) codebases to dictate future development; @@ -191,7 +200,7 @@ For the 3rd year running, ![stackoverflow-survey-elixir](https://user-images.githubusercontent.com/194400/184831055-7f22484b-4c2b-472a-bf09-9165ef5fc7f9.png) -First appeared on: +First appeared on: https://survey.stackoverflow.co/2022/#section-most-loved-dreaded-and-wanted-programming-scripting-and-markup-languages This is a good measure @@ -200,6 +209,10 @@ in the language. And as we all know people who _enjoy_ their work are _better_ at doing it! +> **Note**: The 2026 StackOverflow Survey +> will be released later this year, +> we will update this repo accordingly. + ### `Tailwind CSS` 😍 **`Tailwind`** is the most _sane_ way