# notes

path: Omnivore/2023-10-14 - Using CSS custom properties like this is a waste - YouTube.md
sortable_path: Omnivore2023-10-14 - Using CSS custom properties like this is a waste - YouTube.md
title: Using CSS custom properties like this is a waste - YouTube
lead: # Using CSS custom properties like this is a waste - YouTube
checksum: 7b4f0c6ce0b3a10ebb68fd083e706dadf8b8e5096ee4f2f4bdf1de3bc643617e
created: 2024-09-15 00:40:56.600505623+00:00
modified: 2024-09-22 22:40:13.391511002+00:00
body:
  # Using CSS custom properties like this is a waste - YouTube

  ## Notes

  Definir _"variables locales"_ en la clase más alta de un _componente_ (Ej: ˋ.cardˋ), esta variable se puede utilizar para hacer variantes del componente de manera más rápida y limpia y se puede utilizar en los decendientes de la clase.

  Esto tiene la ventaja de:
  1. Para crear una variante de nuestro componente solo debemos crear una nueva clase y añadirla junto a la clase más alta (ˋ.card-successˋ), y ya solo debemos sobre escribir las variables en vez de tener que actualizar cada parte del componente (ˋ.card.card-success .buttonˋ & ˋ.card.card-success .card-header h3ˋ).
  2. Si tenemos propiedades complejas o animaciones donde solo varia una parte de ellas (Ej: ˋdrop-shadowˋ) no tenemos que re-escribir en cada variante la propiedad completa.

  ## Original

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,sQQWw6iRP7foFYzYmrRdXk9An2XA-R-aURCV45HDFUPA/data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMjE2IiBoZWlnaHQ9IjQyNSIgdmlld0JveD0iMCAwIDIyMTYgNDI1IiBmaWxsPSJub25lIj48cGF0aCBkPSJNMjg3LjYyIDQxNi4yNUMzNzcuNzQgNDE2LjA1IDQ4Mi4wNyA0MTIuODAgNTEzLjc0IDQwNC4wN0M1MzguMDkgMzk3LjU4IDU1Ni45NyAzNzguNzAgNTYzLjQ3IDM1NC4xNEM1NzIuMTkgMzIyLjQ4IDU3NS42NCAyNjIuMzkgNTc1Ljg1IDIxNC45MEM1NzUuNjQgMTY3LjgxIDU3Mi4xOSAxMDcuOTMgNTYzLjQ3IDc2LjY3QzU1Ni45NyA1MS45MCA1MzguMyAzMy4yMyA1MTMuNzQgMjYuNzNDNDgyLjA3IDE4LjAxIDM3Ny43NCAxNC41NiAyODcuNjIgMTQuMzVDMTk3LjcwIDE0LjU2IDkzLjU3IDE4LjAxIDYyLjExIDI2LjczQzM3Ljc1IDMzLjIzIDE4Ljg3IDUyLjExIDExLjk3IDc2LjY3QzMuNDUgMTA3LjkzIC4yMCAxNjcuODEgMCAyMTQuOTBDMC4yMCAyNjIuMzkgMy40NSAzMjIuNDggMTEuOTcgMzU0LjE0QzE4Ljg3IDM3OC41MCAzNy45NSAzOTcuNTggNjIuMTEgNDA0LjA3QzkzLjU3IDQxMi44MCAxOTcuNzAgNDE2LjA1IDI4Ny42MiA0MTYuMjVaTTIzMi4wMCAxMzEuNjdMMzc2LjMyIDIxNC45MEwyMzIuMDAgMjk4LjczVjEzMS42N1oiIGZpbGw9IndoaXRlIiAvPjxwYXRoIGQ9Ik03MzEuNTUgNDI1VjBIODYyLjYxVjcxLjg3SDgxNC45NVYxNzVIODU2LjMzVjI0Ni4yNUg4MTQuOTVWNDI1SDczMS41NVpNODc4LjczIDQyNVYwSDk2MS41MVY0MjVIODc4LjczWk05ODAuNjEgNDI1VjBIMTExMS42N1Y3MS44N0gxMDY0LjAyVjE3NUgxMTA1LjRWMjQ2LjI1SDEwNjQuMDJWNDI1SDk4MC42MVpNMTE1NS40MSA0MjVWNzEuODdIMTEyNC42N1YwSDEyNjkuNTNWNzEuODdIMTIzOC43OVY0MjVIMTE1NS40MVpNMTMzMC41NiA0MjVWMjc3LjUwTDEyODEuMDMgMEgxMzYyLjU2TDEzNzIuNTkgMTczLjc0SDEzNzMuODRMMTM4NS43NSAwSDE0NjUuMzlMMTQxNC42IDI3Ni4yNFY0MjQuOThIMTMzMC41NlY0MjVaTTE1NTcuMTUgNDI1VjBIMTY0My42OEMxNzAwLjEzIDAgMTczMy4zNiAzNC4zNyAxNzMzLjM2IDg5LjM3VjMzNi4yNEMxNzMzLjM2IDM5MS4yNCAxNjk5LjUgNDI1IDE2NDMuNjggNDI1SDE1NTcuMTVaTTE3NTEuNDkgNDI1VjBIMTg3OS40MlY3MS44N0gxODM0LjkxVjE3NUgxODc0LjRWMjQ2LjI1SDE4MzQuODlWMzUzLjc0SDE4NzkuNDFWNDI1SDE3NTEuNDlaTTE4OTYuMjQgNDI1VjBIMjAyNC4xN1Y3MS44N0gxOTc5LjY1VjE3NUgyMDE5LjE0VjI0Ni4yNUgxOTc5LjY1VjM1My43NEgyMDI0LjE3VjQyNUgxODk2LjI0Wk0yMDQwLjk4IDQyNVYwSDIxMzAuNjVDMjE5Ny4xMyAwIDIyMTUuOTQgMjkuOTkgMjIxNS45NCA4OS45OVYxNjkuMzdDMjIxNS45NCAyMzEuMjQgMjE5Mi4xMSAyNjEuODcgMjEyNy41MyAyNjEuODdIMjEyNC4zOVY0MjVIMjA0MC45OFoiIGZpbGw9IndoaXRlIiAvPjwvc3ZnPg==)

  0:02 / 16:11•Watch full video

  [![](https://proxy-prod.omnivore-image-cache.app/40x0,sUOpLNtzeeUoCYwskk1a5QzW3BGsoVGnMK_ykZEtZE5c/https://yt3.ggpht.com/ytc/APkrFKa6XiLa13mMVPzkmmTBcgNPjjqCGPrY86KfJFmf5w=s48-c-k-c0x00ffffff-no-rj)](https://m.youtube.com/@KevinPowell) 

  45K views 2 days ago [#css](https://m.youtube.com/hashtag/css) 

  If you're interested in checking out ICodeThis, you can find it here: [https://icodethis.com/?ref=kevin](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqbVZsbWpVZ3M1NUdacFdJSVZha3BFQ0ZIaTNoZ3xBQ3Jtc0ttWG5nU0ltOTdzSE9YSDQ3aWlsUVFGcEVoMlRFaVhLb0hrczRKRVgta3N0bXBIeC1Sc1ZtTWJHY2MycUpfdVN6OE5pWDlfTG9WQlhTMlRzcW1YX2p1MTY4bjVybTd1ZG02RV9zM1l0QkFWeTNybjBtcw&q=https%3A%2F%2Ficodethis.com%2F%3Fref%3Dkevin&v=%5F2LwjfYc1x8) and if you want to sign up for one of their premium plans, use KEVIN at checkout for an extra 10% off. Custom properties are amazing, but a lot of people don’t take advantage of how awesome they are. They set them up in the :root and that’s it, but they can be so much more useful than that! So, in this …

  ...more

  ...more 

   45,645 views • Oct 12, 2023 • #css

  #### License 

  Shop the Kevin Powell store

raw_content:
  ---
  id: 23360258-5e55-4f51-ae84-83f073539aef
  title: |
    Using CSS custom properties like this is a waste - YouTube
  status: ARCHIVED
  tags:
    - read-later
    - Youtube
  date_added: 2023-10-14 20:11:15
  url_omnivore: |
    https://omnivore.app/me/using-css-custom-properties-like-this-is-a-waste-you-tube-18b30754bdc
  url_original: |
    https://m.youtube.com/watch?index=12&list=WL&pp=gAQBiAQB&v=_2LwjfYc1x8
  ---

  # Using CSS custom properties like this is a waste - YouTube

  ## Notes

  Definir _"variables locales"_ en la clase más alta de un _componente_ (Ej: ˋ.cardˋ), esta variable se puede utilizar para hacer variantes del componente de manera más rápida y limpia y se puede utilizar en los decendientes de la clase.

  Esto tiene la ventaja de:
  1. Para crear una variante de nuestro componente solo debemos crear una nueva clase y añadirla junto a la clase más alta (ˋ.card-successˋ), y ya solo debemos sobre escribir las variables en vez de tener que actualizar cada parte del componente (ˋ.card.card-success .buttonˋ & ˋ.card.card-success .card-header h3ˋ).
  2. Si tenemos propiedades complejas o animaciones donde solo varia una parte de ellas (Ej: ˋdrop-shadowˋ) no tenemos que re-escribir en cada variante la propiedad completa.

  ## Original

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,sQQWw6iRP7foFYzYmrRdXk9An2XA-R-aURCV45HDFUPA/data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyMjE2IiBoZWlnaHQ9IjQyNSIgdmlld0JveD0iMCAwIDIyMTYgNDI1IiBmaWxsPSJub25lIj48cGF0aCBkPSJNMjg3LjYyIDQxNi4yNUMzNzcuNzQgNDE2LjA1IDQ4Mi4wNyA0MTIuODAgNTEzLjc0IDQwNC4wN0M1MzguMDkgMzk3LjU4IDU1Ni45NyAzNzguNzAgNTYzLjQ3IDM1NC4xNEM1NzIuMTkgMzIyLjQ4IDU3NS42NCAyNjIuMzkgNTc1Ljg1IDIxNC45MEM1NzUuNjQgMTY3LjgxIDU3Mi4xOSAxMDcuOTMgNTYzLjQ3IDc2LjY3QzU1Ni45NyA1MS45MCA1MzguMyAzMy4yMyA1MTMuNzQgMjYuNzNDNDgyLjA3IDE4LjAxIDM3Ny43NCAxNC41NiAyODcuNjIgMTQuMzVDMTk3LjcwIDE0LjU2IDkzLjU3IDE4LjAxIDYyLjExIDI2LjczQzM3Ljc1IDMzLjIzIDE4Ljg3IDUyLjExIDExLjk3IDc2LjY3QzMuNDUgMTA3LjkzIC4yMCAxNjcuODEgMCAyMTQuOTBDMC4yMCAyNjIuMzkgMy40NSAzMjIuNDggMTEuOTcgMzU0LjE0QzE4Ljg3IDM3OC41MCAzNy45NSAzOTcuNTggNjIuMTEgNDA0LjA3QzkzLjU3IDQxMi44MCAxOTcuNzAgNDE2LjA1IDI4Ny42MiA0MTYuMjVaTTIzMi4wMCAxMzEuNjdMMzc2LjMyIDIxNC45MEwyMzIuMDAgMjk4LjczVjEzMS42N1oiIGZpbGw9IndoaXRlIiAvPjxwYXRoIGQ9Ik03MzEuNTUgNDI1VjBIODYyLjYxVjcxLjg3SDgxNC45NVYxNzVIODU2LjMzVjI0Ni4yNUg4MTQuOTVWNDI1SDczMS41NVpNODc4LjczIDQyNVYwSDk2MS41MVY0MjVIODc4LjczWk05ODAuNjEgNDI1VjBIMTExMS42N1Y3MS44N0gxMDY0LjAyVjE3NUgxMTA1LjRWMjQ2LjI1SDEwNjQuMDJWNDI1SDk4MC42MVpNMTE1NS40MSA0MjVWNzEuODdIMTEyNC42N1YwSDEyNjkuNTNWNzEuODdIMTIzOC43OVY0MjVIMTE1NS40MVpNMTMzMC41NiA0MjVWMjc3LjUwTDEyODEuMDMgMEgxMzYyLjU2TDEzNzIuNTkgMTczLjc0SDEzNzMuODRMMTM4NS43NSAwSDE0NjUuMzlMMTQxNC42IDI3Ni4yNFY0MjQuOThIMTMzMC41NlY0MjVaTTE1NTcuMTUgNDI1VjBIMTY0My42OEMxNzAwLjEzIDAgMTczMy4zNiAzNC4zNyAxNzMzLjM2IDg5LjM3VjMzNi4yNEMxNzMzLjM2IDM5MS4yNCAxNjk5LjUgNDI1IDE2NDMuNjggNDI1SDE1NTcuMTVaTTE3NTEuNDkgNDI1VjBIMTg3OS40MlY3MS44N0gxODM0LjkxVjE3NUgxODc0LjRWMjQ2LjI1SDE4MzQuODlWMzUzLjc0SDE4NzkuNDFWNDI1SDE3NTEuNDlaTTE4OTYuMjQgNDI1VjBIMjAyNC4xN1Y3MS44N0gxOTc5LjY1VjE3NUgyMDE5LjE0VjI0Ni4yNUgxOTc5LjY1VjM1My43NEgyMDI0LjE3VjQyNUgxODk2LjI0Wk0yMDQwLjk4IDQyNVYwSDIxMzAuNjVDMjE5Ny4xMyAwIDIyMTUuOTQgMjkuOTkgMjIxNS45NCA4OS45OVYxNjkuMzdDMjIxNS45NCAyMzEuMjQgMjE5Mi4xMSAyNjEuODcgMjEyNy41MyAyNjEuODdIMjEyNC4zOVY0MjVIMjA0MC45OFoiIGZpbGw9IndoaXRlIiAvPjwvc3ZnPg==)

  0:02 / 16:11•Watch full video

  [![](https://proxy-prod.omnivore-image-cache.app/40x0,sUOpLNtzeeUoCYwskk1a5QzW3BGsoVGnMK_ykZEtZE5c/https://yt3.ggpht.com/ytc/APkrFKa6XiLa13mMVPzkmmTBcgNPjjqCGPrY86KfJFmf5w=s48-c-k-c0x00ffffff-no-rj)](https://m.youtube.com/@KevinPowell) 

  45K views 2 days ago [#css](https://m.youtube.com/hashtag/css) 

  If you're interested in checking out ICodeThis, you can find it here: [https://icodethis.com/?ref=kevin](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqbVZsbWpVZ3M1NUdacFdJSVZha3BFQ0ZIaTNoZ3xBQ3Jtc0ttWG5nU0ltOTdzSE9YSDQ3aWlsUVFGcEVoMlRFaVhLb0hrczRKRVgta3N0bXBIeC1Sc1ZtTWJHY2MycUpfdVN6OE5pWDlfTG9WQlhTMlRzcW1YX2p1MTY4bjVybTd1ZG02RV9zM1l0QkFWeTNybjBtcw&q=https%3A%2F%2Ficodethis.com%2F%3Fref%3Dkevin&v=%5F2LwjfYc1x8) and if you want to sign up for one of their premium plans, use KEVIN at checkout for an extra 10% off. Custom properties are amazing, but a lot of people don’t take advantage of how awesome they are. They set them up in the :root and that’s it, but they can be so much more useful than that! So, in this …

  ...more

  ...more 

   45,645 views • Oct 12, 2023 • #css

  #### License 

  Shop the Kevin Powell store

metadata:
  {"date_added":"2023-10-14 20:11:15","id":"23360258-5e55-4f51-ae84-83f073539aef","status":"ARCHIVED","tags":["read-later","Youtube"],"title":"Using CSS custom properties like this is a waste - YouTube\n","url_omnivore":"https://omnivore.app/me/using-css-custom-properties-like-this-is-a-waste-you-tube-18b30754bdc\n","url_original":"https://m.youtube.com/watch?index=12\u0026list=WL\u0026pp=gAQBiAQB\u0026v=_2LwjfYc1x8\n"}


path: Omnivore/2023-10-14 - You Don’t Actually Want Open World Games - YouTube.md
sortable_path: Omnivore2023-10-14 - You Don’t Actually Want Open World Games - YouTube.md
title: You Don’t Actually Want Open World Games - YouTube
lead: # You Don’t Actually Want Open World Games - YouTube
checksum: dd60c98346abfb879b354d3f8a81b19d8925147fe8b61293a87bb21bb1f40931
created: 2024-09-15 00:40:56.635440595+00:00
modified: 2024-09-22 22:40:13.391511002+00:00
body:
  # You Don’t Actually Want Open World Games - YouTube

  ## Notes

  > Realmente no queremos juegos _"open world"_, queremos la libertad que creemos que nos dará

  Los juegos open world no están excentos de necesitar un buen diseño para proveer una experiencia divertida de jugar. En este caso particular se debe principalmente a 2 fenomenos:

  ### No nos gusta que nos digan que hacer

  Por lo que si encontramos una forma de impedimento para poder avanzar en cierta dirección podemos tener 2 posibles reacciones:

  1. Rebeldía al querer desafiar este impedimento solo porque se nos dijo que **NO**.
  2. Apatía y/o frustración ya que se nos quitó la _"libertad"_ de elección.

  ### Demaciadas elecciones son abrumantes

  Según estudios, las personas son más seguras y quedan más contentas con sus elecciones si es que las opciones son más limitadas (Ej: 5 vs 30). Esto se debe principalmente a que al realizar una elección de algo, también elegimos no tener acceso al resto de opciones.

  Si bien esta en la mayoría de los casos esta inaccesibilidad es temporal , aún existe, probocando una sensación de de angustia cuando se van multiplicando y multiplicando sin control.

  ### Conclusión

  Al igual que en otros casos, una buena idea mal implementada puede llevar al fracaso, es por eso que se necesita un buen diseño para mantener el balance entre _"guiar sutilmente_" al jugador sin imponer una tajante limitación que le quite totalmente la libertad.

  Juegos que han implementan esta idea son:
  - [TLOZ - Breath of the wild](games/the-legend-of-zelda-breath-of-the-wild)
  - [Metroid Dread](games/metroid-dread)
  ## Original

  ## Chapters 

  ## Description 

  You Don’t Actually Want Open World Games 

  Daryl Talks Games 

   Daryl Talks Games

  23K Likes 

  343,299 Views 

  2022 Jul 9 

  Get 20% OFF + Free Shipping with code “DARYL” at [https://mnscpd.com/daryl](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqa1AxdEdWTE4xQ1ljVllOczNhaEtQR0JXbkk1d3xBQ3Jtc0ttOE9WYWZHVkZWV1VUMHhOZnFtZUZYT0dmRlFMTjZXaGNmQlBodHdEaDZQTDNRSkw5NkhoVmIwVW9TQlIyb2xkQmQ4d0ozS1RlNnJuYTlyclFYUlJaODlRRVRDNUFsMVBScEN0dkkwZW1GdGZ1eU16QQ&q=https%3A%2F%2Fmnscpd.com%2Fdaryl&v=-O3oe8sSRhQ) [#ad](https://m.youtube.com/hashtag/ad)Are you a fan of being told “No”? Do you like it when a person keeps you from doing what you want to do, do you enjoy when a game limits your options? Probably not. In fact if anything, being told no likely makes you want that thing even more. Today on Psych of Play, were going to take a look at Psychological Reactance and how it affects our time with a game. And more specifically, we’ll take a look at how it influences your time with open world games. Buckle up, this is gonna be a good one. Amazing thumbnail art by Kloir! - [https://twitter.com/kloirr/status/139...](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqbmRPeTdhUGdMT1dkNHl3RU9VWU92N1BPQTlXQXxBQ3Jtc0tsSkpTc1RuZ0NzMFM0Q1NBQVpya1JGSHNZbGVBR051Nzd6enI1ck1YU3lKQm5ETHJjUFJlZzRRQ0xicHhhcXpwUm1HZlFuMzl4T3lycmx1M0paeUtUaktTc0NkNGtDQ3ptbTF5M21jbkVLMmt1MWlIaw&q=https%3A%2F%2Ftwitter.com%2Fkloirr%2Fstatus%2F1394322065528745984%3Fs%3D20%26t%3DbIFXtmU3NBNY8MRrDynG5w&v=-O3oe8sSRhQ)Support Daryl Talks Games on Patreon! ▶▶ [https://www.patreon.com/daryltalksgames](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqbFlTM1JTTHlXcEN6VzFZLUJwVHVxR3VlMGlMZ3xBQ3Jtc0trOG5EZEQ2eWg5bzJveUZ0Z3VYdlk3SUlISWJvWlhWN2t1aUxjclhYdjZ1SGR0bFhQeDZFay10akFqb3czbmxwelg2VnNPc1UzX1ltYU02TEZSU1dsT3hFUF9KZ3hBMGJlMWhMTXVpVTZwYTNTY0cxVQ&q=https%3A%2F%2Fwww.patreon.com%2Fdaryltalksgames&v=-O3oe8sSRhQ)Bonus content, early access, YOUR name at the end of videos, and more all for $1/month! Twitter ▶[https://twitter.com/DarylTalksGames](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqbW9pZ0lCN2FzLWVNY0FjMGZfVGNhalNuX0RWZ3xBQ3Jtc0trRUFSam4xY21sUWFidmlYS3VhOE9kN3AySktZQ1htb0JOODlycWZ3M2ZyS1YtYXBNV2NUd1VmRUxMUGNyOEhsc1JWZm5VXzJxN29FVnhaSEttZmRIaE9KYkVZaE1tWE5VSlpJUllHU1cwTmVqVER5dw&q=https%3A%2F%2Ftwitter.com%2FDarylTalksGames&v=-O3oe8sSRhQ)Twitch ▶[https://www.twitch.tv/daryltalksgames](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqbE5WYTVGQ1U5SGc3R1BiSGJZZ1FteGRpVGp1Z3xBQ3Jtc0ttQmtzRUloblVKeC1TQ2lfVDRrcjhXM09xc1VadEdyeVZsdnVNVmxGQ3NUbzdHakFDemRfSEV0VlE5YVVMeUh2cFRRUVNNY3dtU1dVMzhhOVFOOW93N0VELWJNdGk0VE94TTk5bnNKYkJrSUlyWGlKOA&q=https%3A%2F%2Fwww.twitch.tv%2Fdaryltalksgames&v=-O3oe8sSRhQ)Manscaped: Do it for the boys ([0:00](https://m.youtube.com/watch?v=-O3oe8sSRhQ&t=0s)​) A Trip Down Memory Lane ([1:21](https://m.youtube.com/watch?v=-O3oe8sSRhQ&t=81s)) What is Reactance? ([3:25](https://m.youtube.com/watch?v=-O3oe8sSRhQ&t=205s)) The Mistaken Allure of Open Worlds ([7:15](https://m.youtube.com/watch?v=-O3oe8sSRhQ&t=435s)) Internal vs External Reactance ([9:38](https://m.youtube.com/watch?v=-O3oe8sSRhQ&t=578s)) How Games Can Avoid Both ([12:15](https://m.youtube.com/watch?v=-O3oe8sSRhQ&t=735s)) When Reactance is Good! ([15:16](https://m.youtube.com/watch?v=-O3oe8sSRhQ&t=916s)) Whale ([17:21](https://m.youtube.com/watch?v=-O3oe8sSRhQ&t=1041s)) Credits and Next Time ;) ([18:25](https://m.youtube.com/watch?v=-O3oe8sSRhQ&t=1105s)) ▶Games Shown Elden Ring (2022) -FromSoftware The Legend of Zelda: Breath of the Wild (2017) - Nintendo Ghost of Tsushima (2020) - Sucker Punch Productions Metroid Dread (2021) - Mercury Steam Persona 5: Royal (2019) - Atlus, P Studio The Legend of Zelda: Wind Waker (2002) - Nintendo The Legend of Zelda: Twilight Princess (2006) - Nintendo Hades (2020) - Supergiant Games No Man’s Sky (2016) - Hello Games Pokemon Legends: Arceus (2022) - Game Freak Red Dead Redemption 2 (2018) - Rockstar Games Horizon Zero Dawn (2017) - Guerilla Games Horizon Forbidden West (2021) - Guerrilla Games Far Cry 5 (2018) - Ubisoft Fallout 4 (2015) - Bethesda Skyrim (2011) - Bethesda BioShock (2007) - 2K Games Genshin Impact (2020) - miHoYo Pokemon Crystal (2000) - Game Freak Pokémon X and Y (2013) - Game Freak OMORI (2020) - OMOCAT, LLC Zelda: Wind Waker (2002) - Nintendo Super Mario Sunshine (2002) - Nintendo Neon White (2022) - Ben Esposito Final Fantasy VII Remake (2020) - Square Enix Ghostwire: Tokyo (2022) - Tango Gameworks Metro Exodus (2019) - 4A Games Phantasy Star Online 2 (2012) - Sega Sunset Overdrive (2014) - Insomniac Games Batman: Arkham Knight (2015) - Rocksteady Studios Sonic Frontiers (2022) - Sonic Team Forspoken (2023) - Luminous Productions Far Cry 6 (2021) - Ubisoft Pokemon Sword & Shield (2019) - Game Freak Danganronpa: Trigger Happy Havoc (2010) - Spike Chunsoft Cyberpunk 2077 (2020) - CD Projekt RED The Witcher 3: Wild Hunt (2015) - CD Projekt RED Grand Theft Auto V (2013) - Rockstar Games The Walking Dead (2012) - Telltale Games 10 Minutes Till Dawn (2022) - Flanne The Quarry (2022) - Supermassive Games Sable (2021) - Shedworks Starfield (2023) - Bethesda Fallout: New Vegas (2010) - Obsidian Entertainment Unpacking (2021) - Witch Beam ▶Media/Clips/Considerations:[  • Reactance PoP ](https://m.youtube.com/playlist?list=PLwABHajSLTc%5FbPASy3YrBC7uYYzYKLEv7) [  • Playlist ](https://m.youtube.com/playlist?list=PLwABHajSLTc9XTktQrlXVia0kRqOpH8wD)Icons from flaticon:[https://www.flaticon.com/free-icons/p...](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqbTktcFJ4ZWxPVTl4bW9neXplVVpVSTZPU2Zhd3xBQ3Jtc0trUG5HclhQMFRPLVlPcjZ5S3lIRnFQc01YTFdITVpSdmZsY1kyZXJrRXBxczU2MnlmeExnb3NZem42NHRhbzlBMVlsSE5sR1NfOXlnNVByNnowN1FUSk5iSGJhMnV3cG54LXcxYndRNEtvOFJISU5Eaw&q=https%3A%2F%2Fwww.flaticon.com%2Ffree-icons%2Fperfume-bottle&v=-O3oe8sSRhQ) [https://www.flaticon.com/free-icons/c...](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqbGV1azYzM2JWaE9vYmFKLU5IM0xHRU1reG8wZ3xBQ3Jtc0ttTHJSU2xpODdTV19vaTd1OGN1WWViR3VuWHhkMnNxMjFtVG1IZHEteTVxNW8xWGlSOWw4Nng3aUZHeW9KbUFJTWNUV3lTLVo1RHhGLXc2eDlFZFRSX21qd2VyU3ZXdXRaNTlfNmVkRmxXSktYSVRCVQ&q=https%3A%2F%2Fwww.flaticon.com%2Ffree-icons%2Fclock&v=-O3oe8sSRhQ) [https://www.flaticon.com/free-icons/m...](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqbDZjOHZqaWd4SUdrY2RxUnl2TWJaWmw3c2lYUXxBQ3Jtc0tseUFrNnNKb005dl9xR2ppWklCZV8zX3otZi1BaWsyY1ZqTGsyb3FzeHBScFRYXzZydUh0X19nS2p6TjlwUWRHNmgwWUh4UUZIckF1bGpiWHBuS0FzOW9PVElrUnpyRk5KeDVJVGUzcUdHeHhLSHl5Zw&q=https%3A%2F%2Fwww.flaticon.com%2Ffree-icons%2Fmoney&v=-O3oe8sSRhQ)▶Music Sources (in Order): Saints Row IV OST - Hail to the Chief Remix de Blob OST - Blissful Skyrim OST - Far Horizons Pokemon Colosseum OST - Semi Final Battle Gran Turismo 5 OST - feels so good (KEMMEI ADACHI) Breath of the Wild OST - Riding at night Breath of the Wild OST - Field Battle Breath of the Wild OST - Guardian Metroid Prime OST - Phendrana Drifts (Depths) stiig - Gently Pass ([https://stiig.bandcamp.com/track/gent...](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqbVZZOU8wUEk3NWtvT0JUdmpOZDJLbFZ0UXc5QXxBQ3Jtc0trSkVKSDA5Nzg4d0JFeG9EVWZsMHE4ODEtSi1iY1NoUWFGRXFLOVJ0WW94a2FyVnRIdTJYLVctbzdldWhwS2NDajYyV0RxX21CMjFnN3lkWWJESS1OOTJOMDdaM1NhenBvWVdpOXZCUlBWdnBMVHhSWQ&q=https%3A%2F%2Fstiig.bandcamp.com%2Ftrack%2Fgently-pass&v=-O3oe8sSRhQ)) Machinarium OST - The Bottom - DLJ - Flowers - Provided by Lofi Records - Watch: [  • DLJ - Flowers ](https://m.youtube.com/watch?v=M03fDyewvJc&t=0s)\- Download/Stream: [https://fanlink.to/AfterLifeAlbum](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqbnV6S3gzb2hpSERjaXRzU2tSc215UlF3ZnFKd3xBQ3Jtc0tsTWVyaHA5NTR6TGlRd0g5dE9yTkxrT2dCLUxmbXpuZmN3QkpzejJSZU1wUU5yUXVUX1dfemMzMjVmYW1GVlhjQk84UURFU2JsbnRORWxCUVlKdi1HLXd3d2xHWV94cjlkX1dDSFJrNFM0ZmpHS2g0dw&q=https%3A%2F%2Ffanlink.to%2FAfterLifeAlbum&v=-O3oe8sSRhQ)▶Research Articles Cited [https://docs.google.com/document/d/1C...](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqbWg4TGtnS1lHSC1vYWRveVFkUGxaZ3ptbmhKd3xBQ3Jtc0tsUHVFMFZUWmlMRWlZS0xMVG1JVFlyRUtfRmJncW8zdjBTbnZYclQ1Z0FKd0lMMFdxb2RGV3dpR1hrWlhIZEVlQXNWQXhEMWVMM29MN3B6ZWZqVFkxUUt0WE54TDN6ZlcwRTFMeHpWeDdnSmxEZnV4aw&q=https%3A%2F%2Fdocs.google.com%2Fdocument%2Fd%2F1Cdv5oLFP0iq7OOf7vSyU%5FsNWt9W2z5LYlJ1-zYjPxG4%2Fedit%3Fusp%3Dsharing&v=-O3oe8sSRhQ) [#PsychofPlay](https://m.youtube.com/hashtag/psychofplay) 

  ### Transcript

  Follow along using the transcript.

  [ Daryl Talks Games  487K subscribers ](https://m.youtube.com/@DarylTalksGames) 

  ## Comments 1.7K 

  ## Transcript

raw_content:
  ---
  id: d7652dec-ed7a-4473-8d58-5ef8bf4eeefd
  title: |
    You Don’t Actually Want Open World Games - YouTube
  status: ARCHIVED
  tags:
    - read-later
    - Youtube
  date_added: 2023-10-14 20:08:13
  url_omnivore: |
    https://omnivore.app/me/you-don-t-actually-want-open-world-games-you-tube-18b307286a6
  url_original: |
    https://m.youtube.com/watch?index=2&list=WL&pp=gAQBiAQB&v=-O3oe8sSRhQ
  ---

  # You Don’t Actually Want Open World Games - YouTube

  ## Notes

  > Realmente no queremos juegos _"open world"_, queremos la libertad que creemos que nos dará

  Los juegos open world no están excentos de necesitar un buen diseño para proveer una experiencia divertida de jugar. En este caso particular se debe principalmente a 2 fenomenos:

  ### No nos gusta que nos digan que hacer

  Por lo que si encontramos una forma de impedimento para poder avanzar en cierta dirección podemos tener 2 posibles reacciones:

  1. Rebeldía al querer desafiar este impedimento solo porque se nos dijo que **NO**.
  2. Apatía y/o frustración ya que se nos quitó la _"libertad"_ de elección.

  ### Demaciadas elecciones son abrumantes

  Según estudios, las personas son más seguras y quedan más contentas con sus elecciones si es que las opciones son más limitadas (Ej: 5 vs 30). Esto se debe principalmente a que al realizar una elección de algo, también elegimos no tener acceso al resto de opciones.

  Si bien esta en la mayoría de los casos esta inaccesibilidad es temporal , aún existe, probocando una sensación de de angustia cuando se van multiplicando y multiplicando sin control.

  ### Conclusión

  Al igual que en otros casos, una buena idea mal implementada puede llevar al fracaso, es por eso que se necesita un buen diseño para mantener el balance entre _"guiar sutilmente_" al jugador sin imponer una tajante limitación que le quite totalmente la libertad.

  Juegos que han implementan esta idea son:
  - [TLOZ - Breath of the wild](games/the-legend-of-zelda-breath-of-the-wild)
  - [Metroid Dread](games/metroid-dread)
  ## Original

  ## Chapters 

  ## Description 

  You Don’t Actually Want Open World Games 

  Daryl Talks Games 

   Daryl Talks Games

  23K Likes 

  343,299 Views 

  2022 Jul 9 

  Get 20% OFF + Free Shipping with code “DARYL” at [https://mnscpd.com/daryl](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqa1AxdEdWTE4xQ1ljVllOczNhaEtQR0JXbkk1d3xBQ3Jtc0ttOE9WYWZHVkZWV1VUMHhOZnFtZUZYT0dmRlFMTjZXaGNmQlBodHdEaDZQTDNRSkw5NkhoVmIwVW9TQlIyb2xkQmQ4d0ozS1RlNnJuYTlyclFYUlJaODlRRVRDNUFsMVBScEN0dkkwZW1GdGZ1eU16QQ&q=https%3A%2F%2Fmnscpd.com%2Fdaryl&v=-O3oe8sSRhQ) [#ad](https://m.youtube.com/hashtag/ad)Are you a fan of being told “No”? Do you like it when a person keeps you from doing what you want to do, do you enjoy when a game limits your options? Probably not. In fact if anything, being told no likely makes you want that thing even more. Today on Psych of Play, were going to take a look at Psychological Reactance and how it affects our time with a game. And more specifically, we’ll take a look at how it influences your time with open world games. Buckle up, this is gonna be a good one. Amazing thumbnail art by Kloir! - [https://twitter.com/kloirr/status/139...](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqbmRPeTdhUGdMT1dkNHl3RU9VWU92N1BPQTlXQXxBQ3Jtc0tsSkpTc1RuZ0NzMFM0Q1NBQVpya1JGSHNZbGVBR051Nzd6enI1ck1YU3lKQm5ETHJjUFJlZzRRQ0xicHhhcXpwUm1HZlFuMzl4T3lycmx1M0paeUtUaktTc0NkNGtDQ3ptbTF5M21jbkVLMmt1MWlIaw&q=https%3A%2F%2Ftwitter.com%2Fkloirr%2Fstatus%2F1394322065528745984%3Fs%3D20%26t%3DbIFXtmU3NBNY8MRrDynG5w&v=-O3oe8sSRhQ)Support Daryl Talks Games on Patreon! ▶▶ [https://www.patreon.com/daryltalksgames](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqbFlTM1JTTHlXcEN6VzFZLUJwVHVxR3VlMGlMZ3xBQ3Jtc0trOG5EZEQ2eWg5bzJveUZ0Z3VYdlk3SUlISWJvWlhWN2t1aUxjclhYdjZ1SGR0bFhQeDZFay10akFqb3czbmxwelg2VnNPc1UzX1ltYU02TEZSU1dsT3hFUF9KZ3hBMGJlMWhMTXVpVTZwYTNTY0cxVQ&q=https%3A%2F%2Fwww.patreon.com%2Fdaryltalksgames&v=-O3oe8sSRhQ)Bonus content, early access, YOUR name at the end of videos, and more all for $1/month! Twitter ▶[https://twitter.com/DarylTalksGames](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqbW9pZ0lCN2FzLWVNY0FjMGZfVGNhalNuX0RWZ3xBQ3Jtc0trRUFSam4xY21sUWFidmlYS3VhOE9kN3AySktZQ1htb0JOODlycWZ3M2ZyS1YtYXBNV2NUd1VmRUxMUGNyOEhsc1JWZm5VXzJxN29FVnhaSEttZmRIaE9KYkVZaE1tWE5VSlpJUllHU1cwTmVqVER5dw&q=https%3A%2F%2Ftwitter.com%2FDarylTalksGames&v=-O3oe8sSRhQ)Twitch ▶[https://www.twitch.tv/daryltalksgames](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqbE5WYTVGQ1U5SGc3R1BiSGJZZ1FteGRpVGp1Z3xBQ3Jtc0ttQmtzRUloblVKeC1TQ2lfVDRrcjhXM09xc1VadEdyeVZsdnVNVmxGQ3NUbzdHakFDemRfSEV0VlE5YVVMeUh2cFRRUVNNY3dtU1dVMzhhOVFOOW93N0VELWJNdGk0VE94TTk5bnNKYkJrSUlyWGlKOA&q=https%3A%2F%2Fwww.twitch.tv%2Fdaryltalksgames&v=-O3oe8sSRhQ)Manscaped: Do it for the boys ([0:00](https://m.youtube.com/watch?v=-O3oe8sSRhQ&t=0s)​) A Trip Down Memory Lane ([1:21](https://m.youtube.com/watch?v=-O3oe8sSRhQ&t=81s)) What is Reactance? ([3:25](https://m.youtube.com/watch?v=-O3oe8sSRhQ&t=205s)) The Mistaken Allure of Open Worlds ([7:15](https://m.youtube.com/watch?v=-O3oe8sSRhQ&t=435s)) Internal vs External Reactance ([9:38](https://m.youtube.com/watch?v=-O3oe8sSRhQ&t=578s)) How Games Can Avoid Both ([12:15](https://m.youtube.com/watch?v=-O3oe8sSRhQ&t=735s)) When Reactance is Good! ([15:16](https://m.youtube.com/watch?v=-O3oe8sSRhQ&t=916s)) Whale ([17:21](https://m.youtube.com/watch?v=-O3oe8sSRhQ&t=1041s)) Credits and Next Time ;) ([18:25](https://m.youtube.com/watch?v=-O3oe8sSRhQ&t=1105s)) ▶Games Shown Elden Ring (2022) -FromSoftware The Legend of Zelda: Breath of the Wild (2017) - Nintendo Ghost of Tsushima (2020) - Sucker Punch Productions Metroid Dread (2021) - Mercury Steam Persona 5: Royal (2019) - Atlus, P Studio The Legend of Zelda: Wind Waker (2002) - Nintendo The Legend of Zelda: Twilight Princess (2006) - Nintendo Hades (2020) - Supergiant Games No Man’s Sky (2016) - Hello Games Pokemon Legends: Arceus (2022) - Game Freak Red Dead Redemption 2 (2018) - Rockstar Games Horizon Zero Dawn (2017) - Guerilla Games Horizon Forbidden West (2021) - Guerrilla Games Far Cry 5 (2018) - Ubisoft Fallout 4 (2015) - Bethesda Skyrim (2011) - Bethesda BioShock (2007) - 2K Games Genshin Impact (2020) - miHoYo Pokemon Crystal (2000) - Game Freak Pokémon X and Y (2013) - Game Freak OMORI (2020) - OMOCAT, LLC Zelda: Wind Waker (2002) - Nintendo Super Mario Sunshine (2002) - Nintendo Neon White (2022) - Ben Esposito Final Fantasy VII Remake (2020) - Square Enix Ghostwire: Tokyo (2022) - Tango Gameworks Metro Exodus (2019) - 4A Games Phantasy Star Online 2 (2012) - Sega Sunset Overdrive (2014) - Insomniac Games Batman: Arkham Knight (2015) - Rocksteady Studios Sonic Frontiers (2022) - Sonic Team Forspoken (2023) - Luminous Productions Far Cry 6 (2021) - Ubisoft Pokemon Sword & Shield (2019) - Game Freak Danganronpa: Trigger Happy Havoc (2010) - Spike Chunsoft Cyberpunk 2077 (2020) - CD Projekt RED The Witcher 3: Wild Hunt (2015) - CD Projekt RED Grand Theft Auto V (2013) - Rockstar Games The Walking Dead (2012) - Telltale Games 10 Minutes Till Dawn (2022) - Flanne The Quarry (2022) - Supermassive Games Sable (2021) - Shedworks Starfield (2023) - Bethesda Fallout: New Vegas (2010) - Obsidian Entertainment Unpacking (2021) - Witch Beam ▶Media/Clips/Considerations:[  • Reactance PoP ](https://m.youtube.com/playlist?list=PLwABHajSLTc%5FbPASy3YrBC7uYYzYKLEv7) [  • Playlist ](https://m.youtube.com/playlist?list=PLwABHajSLTc9XTktQrlXVia0kRqOpH8wD)Icons from flaticon:[https://www.flaticon.com/free-icons/p...](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqbTktcFJ4ZWxPVTl4bW9neXplVVpVSTZPU2Zhd3xBQ3Jtc0trUG5HclhQMFRPLVlPcjZ5S3lIRnFQc01YTFdITVpSdmZsY1kyZXJrRXBxczU2MnlmeExnb3NZem42NHRhbzlBMVlsSE5sR1NfOXlnNVByNnowN1FUSk5iSGJhMnV3cG54LXcxYndRNEtvOFJISU5Eaw&q=https%3A%2F%2Fwww.flaticon.com%2Ffree-icons%2Fperfume-bottle&v=-O3oe8sSRhQ) [https://www.flaticon.com/free-icons/c...](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqbGV1azYzM2JWaE9vYmFKLU5IM0xHRU1reG8wZ3xBQ3Jtc0ttTHJSU2xpODdTV19vaTd1OGN1WWViR3VuWHhkMnNxMjFtVG1IZHEteTVxNW8xWGlSOWw4Nng3aUZHeW9KbUFJTWNUV3lTLVo1RHhGLXc2eDlFZFRSX21qd2VyU3ZXdXRaNTlfNmVkRmxXSktYSVRCVQ&q=https%3A%2F%2Fwww.flaticon.com%2Ffree-icons%2Fclock&v=-O3oe8sSRhQ) [https://www.flaticon.com/free-icons/m...](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqbDZjOHZqaWd4SUdrY2RxUnl2TWJaWmw3c2lYUXxBQ3Jtc0tseUFrNnNKb005dl9xR2ppWklCZV8zX3otZi1BaWsyY1ZqTGsyb3FzeHBScFRYXzZydUh0X19nS2p6TjlwUWRHNmgwWUh4UUZIckF1bGpiWHBuS0FzOW9PVElrUnpyRk5KeDVJVGUzcUdHeHhLSHl5Zw&q=https%3A%2F%2Fwww.flaticon.com%2Ffree-icons%2Fmoney&v=-O3oe8sSRhQ)▶Music Sources (in Order): Saints Row IV OST - Hail to the Chief Remix de Blob OST - Blissful Skyrim OST - Far Horizons Pokemon Colosseum OST - Semi Final Battle Gran Turismo 5 OST - feels so good (KEMMEI ADACHI) Breath of the Wild OST - Riding at night Breath of the Wild OST - Field Battle Breath of the Wild OST - Guardian Metroid Prime OST - Phendrana Drifts (Depths) stiig - Gently Pass ([https://stiig.bandcamp.com/track/gent...](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqbVZZOU8wUEk3NWtvT0JUdmpOZDJLbFZ0UXc5QXxBQ3Jtc0trSkVKSDA5Nzg4d0JFeG9EVWZsMHE4ODEtSi1iY1NoUWFGRXFLOVJ0WW94a2FyVnRIdTJYLVctbzdldWhwS2NDajYyV0RxX21CMjFnN3lkWWJESS1OOTJOMDdaM1NhenBvWVdpOXZCUlBWdnBMVHhSWQ&q=https%3A%2F%2Fstiig.bandcamp.com%2Ftrack%2Fgently-pass&v=-O3oe8sSRhQ)) Machinarium OST - The Bottom - DLJ - Flowers - Provided by Lofi Records - Watch: [  • DLJ - Flowers ](https://m.youtube.com/watch?v=M03fDyewvJc&t=0s)\- Download/Stream: [https://fanlink.to/AfterLifeAlbum](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqbnV6S3gzb2hpSERjaXRzU2tSc215UlF3ZnFKd3xBQ3Jtc0tsTWVyaHA5NTR6TGlRd0g5dE9yTkxrT2dCLUxmbXpuZmN3QkpzejJSZU1wUU5yUXVUX1dfemMzMjVmYW1GVlhjQk84UURFU2JsbnRORWxCUVlKdi1HLXd3d2xHWV94cjlkX1dDSFJrNFM0ZmpHS2g0dw&q=https%3A%2F%2Ffanlink.to%2FAfterLifeAlbum&v=-O3oe8sSRhQ)▶Research Articles Cited [https://docs.google.com/document/d/1C...](https://www.youtube.com/redirect?event=video%5Fdescription&redir%5Ftoken=QUFFLUhqbWg4TGtnS1lHSC1vYWRveVFkUGxaZ3ptbmhKd3xBQ3Jtc0tsUHVFMFZUWmlMRWlZS0xMVG1JVFlyRUtfRmJncW8zdjBTbnZYclQ1Z0FKd0lMMFdxb2RGV3dpR1hrWlhIZEVlQXNWQXhEMWVMM29MN3B6ZWZqVFkxUUt0WE54TDN6ZlcwRTFMeHpWeDdnSmxEZnV4aw&q=https%3A%2F%2Fdocs.google.com%2Fdocument%2Fd%2F1Cdv5oLFP0iq7OOf7vSyU%5FsNWt9W2z5LYlJ1-zYjPxG4%2Fedit%3Fusp%3Dsharing&v=-O3oe8sSRhQ) [#PsychofPlay](https://m.youtube.com/hashtag/psychofplay) 

  ### Transcript

  Follow along using the transcript.

  [ Daryl Talks Games  487K subscribers ](https://m.youtube.com/@DarylTalksGames) 

  ## Comments 1.7K 

  ## Transcript 

metadata:
  {"date_added":"2023-10-14 20:08:13","id":"d7652dec-ed7a-4473-8d58-5ef8bf4eeefd","status":"ARCHIVED","tags":["read-later","Youtube"],"title":"You Don’t Actually Want Open World Games - YouTube\n","url_omnivore":"https://omnivore.app/me/you-don-t-actually-want-open-world-games-you-tube-18b307286a6\n","url_original":"https://m.youtube.com/watch?index=2\u0026list=WL\u0026pp=gAQBiAQB\u0026v=-O3oe8sSRhQ\n"}


checksum: ea1828570f528a288a96df628abb01ddd3084cf7b649e1b4ded902fa91b7c943
created: 2024-09-15 00:40:56.701017663+00:00
modified: 2024-09-22 22:40:13.392511014+00:00
path:
  Omnivore/2023-10-15 - Highlighting fold text, community fork of null-ls, leetcode integration, reduce ram ....md

sortable_path:
  Omnivore2023-10-15 - Highlighting fold text, community fork of null-ls, leetcode integration, reduce ram ....md

title:
  Highlighting fold text, community fork of null-ls, leetcode integration, reduce ram usage of LSP servers, svelte inspector integration

lead:
  # Highlighting fold text, community fork of null-ls, leetcode integration, reduce ram usage of LSP servers, svelte inspector integration

body:
  # Highlighting fold text, community fork of null-ls, leetcode integration, reduce ram usage of LSP servers, svelte inspector integration

  ## Highlights

  hinell/duplicate.nvim 

  > [!note]
  > Add to nvim config

  [source](https://omnivore.app/me/highlighting-fold-text-community-fork-of-null-ls-leetcode-integr-18b3533f57b#5de369b4-f406-446f-b59a-358d59dd9eb1)  #Todo 

  ---

  ## Original

  ## Introduction

  This week we have new features in Neovim Core, new plugins and new releases. Some new Neovim features include `:fclose` to close floating windows, support spaces in in directory names, treesitter highlighting in folds and NVIM\_APPNAME supports relative paths.

  We have several new plugins, e.g. you can now grind LeetCode inside Neovim, mini.pick a new fuzzy finder + selector added to the mini.nvim library, and a plugin to start/stop LSP servers upon demand to keep RAM usage low etc..

  Hope you enjoy!

  ## Neovim core

  > Updates of Neovim itself, which are available on Neovim nightly.

  > * [@neovim](https://twitter.com/neovim) on Twitter
  > * [Neovim news](https://neovim.io/doc/user/news.html)
  > * `:h news.txt` updates in Neovim directly
  > * [PR's on GitHub](https://github.com/neovim/neovim/pulls)

  * [:fclose to close floating window](https://github.com/neovim/neovim/commit/fd39f5ce8c9bbda1b77ff6c03553148fadac5d57)
  * [Spaces can be used to separate directory names. To have a space in a directory name, precede it with an extra backslash, and escape the space](https://github.com/neovim/neovim/commit/f5eabaa9407ae3d1ccf6592337453c423eff3d9a)
  * [Ignore swapfile for running Nvim processes](https://github.com/neovim/neovim/commit/29fe883aa9166bdbcae3f935523c75a8aa56fe45)
  * [vim.lsp.util.parse\_snippet() will now strictly follow the snippet grammar defined by LSP, and hence previously parsed snippets might now be considered invalid input.](https://github.com/neovim/neovim/commit/eb1f0e8fcca756a00d287e23bf87554e0e7f6dfd)
  * [vim.treesitter.foldtext() applies treesitter highlighting to foldtext.](https://github.com/neovim/neovim/commit/9ce1623837a817c3f4f5deff9c8ba862578b6009)
  * [Better cmdline completion for string option value](https://github.com/neovim/neovim/commit/01c51a491330bd10202c73aff92c0978984c0692)
  * [Support toggling showing of float window](https://github.com/neovim/neovim/commit/4200a0f1678c06c6da4e4cfb0184c29c1174ed21)
  * [NVIM\_APPNAME now supports relative paths](https://github.com/neovim/neovim/commit/a66b0fdfaa35715c832b98b8941cc5673505e0c2)

  ### Highlighted folds on Neovim Nightly

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,ss9FR9nPpf2xd7VL3QE_RfLsetWTtmxbY61RRMWJImHA/https://user-images.githubusercontent.com/76068197/275348092-0703f60e-6593-46d5-9c71-a24bd2d66e0c.png)

  * [PR](https://github.com/neovim/neovim/pull/25209)
  * [Reddit](https://www.reddit.com/r/neovim/comments/16sqyjz/finally%5Fwe%5Fcan%5Fhave%5Fhighlighted%5Ffolds/)

  ## Neovim Plugin Community

  > Neovim is full of active plugins. This section is about the community and what is going on.

  ---

  ### Resources & articles

  #### Open Neovim From Your Browser - Integrating nvim with Svelte’s Inspector

  * [Blog](https://theosteiner.de/open-neovim-from-your-browser-integrating-nvim-with-sveltes-inspector)
  * [Reddit](https://www.reddit.com/r/neovim/comments/177p9fj/open%5Fneovim%5Ffrom%5Fyour%5Fbrowser%5Fintegrating%5Fnvim/)

  ---

  ### New plugins

  #### none-ls.nvim is a community fork of null-ls.nvim

  > null-ls.nvim reloaded / Use Neovim as a language server to inject LSP diagnostics, code actions, and more via Lua. 

  null-ls.nvim fork, maintained by the community. Only the repository name has changed for compatibility reasons. All the API's will stay as is.

  Migrate by replacing `jose-elias-alvarez/null-ls.nvim` with `nvimtools/none-ls.nvim` in your package manager.

  * [GitHub](https://github.com/nvimtools/none-ls.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/nvimtools/none-ls.nvim)
  * [Reddit](https://www.reddit.com/r/neovim/comments/16wystn/nonelsnvim%5Fis%5Fa%5Fcommunity%5Ffork%5Fof%5Fnulllsnvim/)

  #### kawre/leetcode.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,s-nS7H-H7wHHTmPvfG-wYq6Nm4dc-d7uCDI5EGUQUPi4/https://user-images.githubusercontent.com/76068197/275347053-9da7144f-3228-458a-8b4a-d90c0697a5ad.png)

  > A Neovim plugin enabling you to solve LeetCode problems within Neovim. 

  * [GitHub](https://github.com/kawre/leetcode.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/kawre/leetcode.nvim)
  * [Reddit](https://www.reddit.com/r/neovim/comments/173ctlz/leetcodenvim%5Fsolve%5Fleetcode%5Fproblems%5Fwithin%5Fneovim/)

  #### echasnovski/mini.pick

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,s39XpvBv25BzmpXHxoR7A457BdtASjng52-Nraygomjo/https://user-images.githubusercontent.com/76068197/275347316-ab621b68-d2a8-4386-a78d-ca5fdac782a9.png)

  > pick anything. Interactive non-blocking picker with one window design, toggleable preview, fast default matching, built-in pickers, and more

  * [GitHub](https://github.com/echasnovski/mini.pick)
  * [Dotfyle](https://dotfyle.com/plugins/echasnovski/mini.pick)
  * [Reddit](https://www.reddit.com/r/neovim/comments/176yv8g/minipick%5Fpick%5Fanything%5Finteractive%5Fnonblocking/)

  #### hinell/lsp-timeout.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,sgj8zqD5oSQCb-ORZmumOFzudjNHrLNufD7JlTpy5urI/https://user-images.githubusercontent.com/76068197/275345414-3aa97afd-c01b-4fe8-b366-27bc0d8bfb4f.png)

  > Start/stop LSP servers upon demand; keeps RAM usage low

  Some LSP servers are terribly inefficient at memory management and can easily take up gigabytes of RAM MBs if left unattended (just like VS Code huh?!). This plugin prevents excessive memory usage by stopping and restarting LSP servers automatically upon gaining or loosing window focus, keeping neovim fast.

  * [GitHub](https://github.com/hinell/lsp-timeout.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/hinell/lsp-timeout.nvim)
  * [Reddit](https://www.reddit.com/r/neovim/comments/16vkkj8/lsptimeoutnvim/)

  ---

  #### luckasRanarison/clear-action.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,seOp3qhUyv-KN0pPWVksq0S1sQrzgNR1ebFvWYsFGHYw/https://github.com/luckasRanarison/clear-action.nvim/assets/101930730/bdf6be6c-e463-4b60-98f7-d5d2aea4450d)

  > Predictable LSP code actions

  A simple Neovim plugin that enhances LSP code actions with fully customizable signs, personalized actions, and server-specific mappings, making code actions more predictable.

  * [GitHub](https://github.com/luckasRanarison/clear-action.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/luckasRanarison/clear-action.nvim)
  * [Reddit](https://www.reddit.com/r/neovim/comments/16v32p5/clearactionnvim%5Fmakes%5Flsp%5Fcode%5Factions/)

  ---

  #### JMarkin/gentags.lua

  > autogenerate tags for neovim

  * [GitHub](https://github.com/JMarkin/gentags.lua)
  * [Dotfyle](https://dotfyle.com/plugins/JMarkin/gentags.lua)

  ---

  #### roobert/palette.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,s8b0Q9_Xq79ZxkXKntykjcCCimV7CZNvJCliwh7P3BWY/https://github.com/roobert/palette.nvim/assets/226654/2d7ff03c-f1d5-46b9-9359-973fcf7002ed)

  > 🎨 Palette - A beautiful, versatile, systematic, Neovim theme system

  Palette is a Neovim theme system to make creating and customizing themes easy.

  Highlight groups are logically arranged to strike a harmonious balance between clarity and aesthetic appeal.

  Caching ensures themes are performant.

  Build easily distributable themes using the provided build script.

  Generate application color schemes, such as for LS\_COLORS and iterm2 for matching terminal feel.

  * [GitHub](https://github.com/roobert/palette.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/roobert/palette.nvim)
  * [Reddit](https://www.reddit.com/r/neovim/comments/16smdr6/introducing%5Froobertpalettenvim%5Fa%5Fbeautiful/)

  ---

  #### MunifTanjim/nougat.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,sBQFkFPJmYnt_ybC-QlTLMUDHmtH1dUWINAJLYuzPkV8/https://raw.githubusercontent.com/wiki/MunifTanjim/nougat.nvim/media/bubbly-statusline.png) ![](https://proxy-prod.omnivore-image-cache.app/0x0,s8721VcLMluVw2o5zbqpq42Cou9n_DNRnQ-6EEYIaZDA/https://raw.githubusercontent.com/wiki/MunifTanjim/nougat.nvim/media/pointy-statusline.png) ![](https://proxy-prod.omnivore-image-cache.app/0x0,sdxJRzRzMam9Pp5vuY69AdXlipU1JYPRZ4t_bLOL0y_g/https://raw.githubusercontent.com/wiki/MunifTanjim/nougat.nvim/media/slanty-statusline.png)

  > 🍫 Hyperextensible Statusline / Tabline / Winbar for Neovim 🚀

  * [GitHub](https://github.com/MunifTanjim/nougat.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/MunifTanjim/nougat.nvim)

  ---

  #### trimclain/builder.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,ssQSPS4kiVqJmf8x8O7zqevhYjyAgS-oxuOyaaU2VRLg/https://github.com/trimclain/builder.nvim/assets/84108846/6f94dc76-b652-4ac8-b54e-c3d19aaebdaa)

  > Simple building plugin for neovim 

  * [GitHub](https://github.com/trimclain/builder.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/trimclain/builder.nvim)
  * [Reddit](https://www.reddit.com/r/neovim/comments/16qwcl7/buildernvim%5Fsimple%5Fbuild%5Fplugin%5Ffor%5Fneovim/)

  ---

  #### niuiic/git-log.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,suRdnhdGKggw0zuXb7Axpp8Ykw_8unFeoGTBiquP2o84/https://user-images.githubusercontent.com/76068197/275345480-b7d2cc41-5e59-4a13-a5b7-cadf3e5ecbdd.png)

  > Check git log of the selected code.

  * [GitHub](https://github.com/niuiic/git-log.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/niuiic/git-log.nvim)

  ---

  #### 2KAbhishek/nerdy.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,sO3ro_AEJRwkyAM2Zgz3qr5ZpUkndJ4K7GkSz9HLc0oQ/https://user-images.githubusercontent.com/76068197/275345538-f957e324-fbd6-408c-a0c2-810b29559a6e.png)

  > Find Nerd Glyphs Easily 🤓🔭

  Do you like Nerd fonts, but don't like going over to the site just to find a glyph? nerdy.nvim, is a super handy plugin that lets you easily search, preview and insert any nerd font glyph from Neovim!

  * [GitHub](https://github.com/2KAbhishek/nerdy.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/2KAbhishek/nerdy.nvim)
  * [Reddit](https://www.reddit.com/r/neovim/comments/16qr135/nerdynvim%5Feasily%5Ffind%5Fand%5Finsert%5Fnerd%5Ffont%5Fglyphs/)

  ---

  #### David-Kunz/gen.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,sDEgBaEypwAzP6zU-c2NJ7cP01Q09bjxV4HNeiC_XbrU/https://user-images.githubusercontent.com/1009936/273126287-7b5f2b40-c678-47c5-8f21-edf9516f6034.jpg)

  > Neovim plugin to generate text using LLMs with customizable prompts

  * [GitHub](https://github.com/David-Kunz/gen.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/David-Kunz/gen.nvim)
  * [Reddit](https://www.reddit.com/r/neovim/comments/16x1zf7/local%5Fllms%5Fin%5Fneovim%5Fgennvim/)
  * [Youtube](https://www.youtube.com/watch?v=FIZt7MinpMY)

  ---

  #### VidocqH/data-viewer.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,srNNDmEeUxRH-7_Y1wRlwYn94Oat2ouVMlUCBmdHneEI/https://github.com/VidocqH/data-viewer.nvim/assets/16725418/7b933b3a-fd4e-4758-9917-9055c35796db)

  > Table view for data files, csv, tsv

  Lightweight neovim plugin provides a table view for inspect data files such as csv, tsv

  * [GitHub](https://github.com/VidocqH/data-viewer.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/VidocqH/data-viewer.nvim)

  ---

  #### ==hinell/duplicate.nvim==

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,slEysMO2620IzV16kXsH9RrCm7Ei5n-k7nnKR6htL-2Q/https://user-images.githubusercontent.com/76068197/275346764-065046c6-d267-4c8f-bf52-6b9fa0683229.png)

  > Duplicate visual selection, lines, and textobjects

  Duplicate lines in different directions (up/down) by specified offset Duplicate visual selection & line-wise blocks

  * [GitHub](https://github.com/hinell/duplicate.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/hinell/duplicate.nvim)
  * [Reddit](https://www.reddit.com/r/neovim/comments/16vkd4x/duplicatenvim/)

  ---

  #### niuiic/remote.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,sltK2sIjx8vjII6g18eOoH3oI0BmzGHzVDlVE9RdUdLA/https://raw.githubusercontent.com/niuiic/assets/main/remote.nvim/usage.gif)

  > Edit remote files locally.

  Edit remote files with local neovim configuration.

  Edit them as local directories.

  No other dependencies required for remote machine except ssh.

  * [GitHub](https://github.com/niuiic/remote.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/niuiic/remote.nvim)

  ---

  #### niuiic/typst-preview.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,sE0IeNg46_eRW_AAomtq470uTgYbmvFlRqfrozGff0FY/https://raw.githubusercontent.com/niuiic/assets/main/typst-preview.nvim/usage.gif)

  > Neovim plugin to preview typst document.

  Generate pdf files by typst compile. Respond to subsequent file changes with typst-lsp. Redirect these pdf files to a fixed path when you switch buffer. Preview this pdf by a pdf viewer with the ability to respond to the file changes.

  * [GitHub](https://github.com/niuiic/typst-preview.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/niuiic/typst-preview.nvim)

  ---

  #### SalOrak/whaler.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,sFs6Ddy-8eYOlxjXwza6MvJFpi5bUL_iCLP3Ipz6DvL0/https://raw.githubusercontent.com/SalOrak/whaler.nvim/main/whaler-example.gif)

  > Telescope extension to change between directories blazingly fast

  Whaler is a Telescope extension to move between directories. It is based on the concept of [tmux-windowizer](https://github.com/ThePrimeagen/.dotfiles/blob/master/bin/.local/scripts/tmux-windowizer) which uses a set of directories and fzf to move to another directory whilst creating a new tmux session.

  * [GitHub](https://github.com/SalOrak/whaler.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/SalOrak/whaler.nvim)
  * [Reddit](https://www.reddit.com/r/neovim/comments/16wgw0b/whalernvim/)

  ---

  #### gsuuon/note.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,sBOuCCo6p72mfZPAiqP1Ivk-u3waye8dHKUsd-UNJfxY/https://github.com/gsuuon/note.nvim/assets/6422188/813e74e7-d9dc-4b5f-b433-4ef294491797)

  > Notes in neovim

  A simple Neovim note taking plugin with daily notes, task tracking and syntax highlighting.

  note.nvim makes it easy to take working notes and track tasks. It adds commands to help manipulate task items, create daily notes, and navigate within (and between) notes.

  * [GitHub](https://github.com/gsuuon/note.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/gsuuon/note.nvim)

  ---

  #### A retrospective on why Nyoom is archived

  * [Reddit](https://www.reddit.com/r/neovim/comments/16sk266/nyoom%5Fwhy%5Fim%5Fultimately%5Farchiving%5Fit%5Fa%5Fshort/)

  #### indent-blankline.nvim v3 is released

  * [GitHub](https://github.com/lukas-reineke/indent-blankline.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/lukas-reineke/indent-blankline.nvim)
  * [Migration guide](https://github.com/lukas-reineke/indent-blankline.nvim/wiki/Migrate-to-version-3)
  * [Reddit](https://www.reddit.com/r/neovim/comments/16u5abl/indent%5Fblankline%5Fv3%5Fis%5Freleased/)

  #### LazyVim 10.0.0 has been released!

  * [GitHub](https://github.com/LazyVim/LazyVim)
  * [Dotfyle](https://dotfyle.com/plugins/LazyVim/LazyVim)
  * [Changelog](https://github.com/LazyVim/LazyVim/blob/main/CHANGELOG.md)
  * [Reddit](https://www.reddit.com/r/neovim/comments/1766fl1/lazyvim%5F1000%5Fhas%5Fbeen%5Freleased/)

  ---

  ## Contributing

  Add your the plugin in either of the following to be featured in This Week in Neovim and Dotfyle: 

  * [rockerBOO/awesome-neovim](https://github.com/rockerBOO/awesome-neovim)
  * [SUBMITTED\_PLUGINS.md](https://github.com/codicocodes/dotfyle/blob/main/SUBMITTED-PLUGINS.md)

  Contribute to the development of Dotfyle:

  * File issues and submit pull requests on [GitHub](https://github.com/codicocodes/dotfyle)
  * Discuss ideas on [Discord](https://discord.gg/AMbnnN5eep)

raw_content:
  ---
  id: 512f7bbc-6ba0-11ee-be2a-83432433f852
  title: |
    Highlighting fold text, community fork of null-ls, leetcode integration, reduce ram usage of LSP servers, svelte inspector integration
  status: ARCHIVED
  tags:
    - read-later
    - RSS
  date_added: 2023-10-15 16:10:23
  url_omnivore: |
    https://omnivore.app/me/highlighting-fold-text-community-fork-of-null-ls-leetcode-integr-18b3533f57b
  url_original: |
    https://dotfyle.com/this-week-in-neovim/55
  ---

  # Highlighting fold text, community fork of null-ls, leetcode integration, reduce ram usage of LSP servers, svelte inspector integration

  ## Highlights

  hinell/duplicate.nvim 

  > [!note]
  > Add to nvim config

  [source](https://omnivore.app/me/highlighting-fold-text-community-fork-of-null-ls-leetcode-integr-18b3533f57b#5de369b4-f406-446f-b59a-358d59dd9eb1)  #Todo 

  ---

  ## Original

  ## Introduction

  This week we have new features in Neovim Core, new plugins and new releases. Some new Neovim features include `:fclose` to close floating windows, support spaces in in directory names, treesitter highlighting in folds and NVIM\_APPNAME supports relative paths.

  We have several new plugins, e.g. you can now grind LeetCode inside Neovim, mini.pick a new fuzzy finder + selector added to the mini.nvim library, and a plugin to start/stop LSP servers upon demand to keep RAM usage low etc..

  Hope you enjoy!

  ## Neovim core

  > Updates of Neovim itself, which are available on Neovim nightly.

  > * [@neovim](https://twitter.com/neovim) on Twitter
  > * [Neovim news](https://neovim.io/doc/user/news.html)
  > * `:h news.txt` updates in Neovim directly
  > * [PR's on GitHub](https://github.com/neovim/neovim/pulls)

  * [:fclose to close floating window](https://github.com/neovim/neovim/commit/fd39f5ce8c9bbda1b77ff6c03553148fadac5d57)
  * [Spaces can be used to separate directory names. To have a space in a directory name, precede it with an extra backslash, and escape the space](https://github.com/neovim/neovim/commit/f5eabaa9407ae3d1ccf6592337453c423eff3d9a)
  * [Ignore swapfile for running Nvim processes](https://github.com/neovim/neovim/commit/29fe883aa9166bdbcae3f935523c75a8aa56fe45)
  * [vim.lsp.util.parse\_snippet() will now strictly follow the snippet grammar defined by LSP, and hence previously parsed snippets might now be considered invalid input.](https://github.com/neovim/neovim/commit/eb1f0e8fcca756a00d287e23bf87554e0e7f6dfd)
  * [vim.treesitter.foldtext() applies treesitter highlighting to foldtext.](https://github.com/neovim/neovim/commit/9ce1623837a817c3f4f5deff9c8ba862578b6009)
  * [Better cmdline completion for string option value](https://github.com/neovim/neovim/commit/01c51a491330bd10202c73aff92c0978984c0692)
  * [Support toggling showing of float window](https://github.com/neovim/neovim/commit/4200a0f1678c06c6da4e4cfb0184c29c1174ed21)
  * [NVIM\_APPNAME now supports relative paths](https://github.com/neovim/neovim/commit/a66b0fdfaa35715c832b98b8941cc5673505e0c2)

  ### Highlighted folds on Neovim Nightly

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,ss9FR9nPpf2xd7VL3QE_RfLsetWTtmxbY61RRMWJImHA/https://user-images.githubusercontent.com/76068197/275348092-0703f60e-6593-46d5-9c71-a24bd2d66e0c.png)

  * [PR](https://github.com/neovim/neovim/pull/25209)
  * [Reddit](https://www.reddit.com/r/neovim/comments/16sqyjz/finally%5Fwe%5Fcan%5Fhave%5Fhighlighted%5Ffolds/)

  ## Neovim Plugin Community

  > Neovim is full of active plugins. This section is about the community and what is going on.

  ---

  ### Resources & articles

  #### Open Neovim From Your Browser - Integrating nvim with Svelte’s Inspector

  * [Blog](https://theosteiner.de/open-neovim-from-your-browser-integrating-nvim-with-sveltes-inspector)
  * [Reddit](https://www.reddit.com/r/neovim/comments/177p9fj/open%5Fneovim%5Ffrom%5Fyour%5Fbrowser%5Fintegrating%5Fnvim/)

  ---

  ### New plugins

  #### none-ls.nvim is a community fork of null-ls.nvim

  > null-ls.nvim reloaded / Use Neovim as a language server to inject LSP diagnostics, code actions, and more via Lua. 

  null-ls.nvim fork, maintained by the community. Only the repository name has changed for compatibility reasons. All the API's will stay as is.

  Migrate by replacing `jose-elias-alvarez/null-ls.nvim` with `nvimtools/none-ls.nvim` in your package manager.

  * [GitHub](https://github.com/nvimtools/none-ls.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/nvimtools/none-ls.nvim)
  * [Reddit](https://www.reddit.com/r/neovim/comments/16wystn/nonelsnvim%5Fis%5Fa%5Fcommunity%5Ffork%5Fof%5Fnulllsnvim/)

  #### kawre/leetcode.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,s-nS7H-H7wHHTmPvfG-wYq6Nm4dc-d7uCDI5EGUQUPi4/https://user-images.githubusercontent.com/76068197/275347053-9da7144f-3228-458a-8b4a-d90c0697a5ad.png)

  > A Neovim plugin enabling you to solve LeetCode problems within Neovim. 

  * [GitHub](https://github.com/kawre/leetcode.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/kawre/leetcode.nvim)
  * [Reddit](https://www.reddit.com/r/neovim/comments/173ctlz/leetcodenvim%5Fsolve%5Fleetcode%5Fproblems%5Fwithin%5Fneovim/)

  #### echasnovski/mini.pick

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,s39XpvBv25BzmpXHxoR7A457BdtASjng52-Nraygomjo/https://user-images.githubusercontent.com/76068197/275347316-ab621b68-d2a8-4386-a78d-ca5fdac782a9.png)

  > pick anything. Interactive non-blocking picker with one window design, toggleable preview, fast default matching, built-in pickers, and more

  * [GitHub](https://github.com/echasnovski/mini.pick)
  * [Dotfyle](https://dotfyle.com/plugins/echasnovski/mini.pick)
  * [Reddit](https://www.reddit.com/r/neovim/comments/176yv8g/minipick%5Fpick%5Fanything%5Finteractive%5Fnonblocking/)

  #### hinell/lsp-timeout.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,sgj8zqD5oSQCb-ORZmumOFzudjNHrLNufD7JlTpy5urI/https://user-images.githubusercontent.com/76068197/275345414-3aa97afd-c01b-4fe8-b366-27bc0d8bfb4f.png)

  > Start/stop LSP servers upon demand; keeps RAM usage low

  Some LSP servers are terribly inefficient at memory management and can easily take up gigabytes of RAM MBs if left unattended (just like VS Code huh?!). This plugin prevents excessive memory usage by stopping and restarting LSP servers automatically upon gaining or loosing window focus, keeping neovim fast.

  * [GitHub](https://github.com/hinell/lsp-timeout.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/hinell/lsp-timeout.nvim)
  * [Reddit](https://www.reddit.com/r/neovim/comments/16vkkj8/lsptimeoutnvim/)

  ---

  #### luckasRanarison/clear-action.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,seOp3qhUyv-KN0pPWVksq0S1sQrzgNR1ebFvWYsFGHYw/https://github.com/luckasRanarison/clear-action.nvim/assets/101930730/bdf6be6c-e463-4b60-98f7-d5d2aea4450d)

  > Predictable LSP code actions

  A simple Neovim plugin that enhances LSP code actions with fully customizable signs, personalized actions, and server-specific mappings, making code actions more predictable.

  * [GitHub](https://github.com/luckasRanarison/clear-action.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/luckasRanarison/clear-action.nvim)
  * [Reddit](https://www.reddit.com/r/neovim/comments/16v32p5/clearactionnvim%5Fmakes%5Flsp%5Fcode%5Factions/)

  ---

  #### JMarkin/gentags.lua

  > autogenerate tags for neovim

  * [GitHub](https://github.com/JMarkin/gentags.lua)
  * [Dotfyle](https://dotfyle.com/plugins/JMarkin/gentags.lua)

  ---

  #### roobert/palette.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,s8b0Q9_Xq79ZxkXKntykjcCCimV7CZNvJCliwh7P3BWY/https://github.com/roobert/palette.nvim/assets/226654/2d7ff03c-f1d5-46b9-9359-973fcf7002ed)

  > 🎨 Palette - A beautiful, versatile, systematic, Neovim theme system

  Palette is a Neovim theme system to make creating and customizing themes easy.

  Highlight groups are logically arranged to strike a harmonious balance between clarity and aesthetic appeal.

  Caching ensures themes are performant.

  Build easily distributable themes using the provided build script.

  Generate application color schemes, such as for LS\_COLORS and iterm2 for matching terminal feel.

  * [GitHub](https://github.com/roobert/palette.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/roobert/palette.nvim)
  * [Reddit](https://www.reddit.com/r/neovim/comments/16smdr6/introducing%5Froobertpalettenvim%5Fa%5Fbeautiful/)

  ---

  #### MunifTanjim/nougat.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,sBQFkFPJmYnt_ybC-QlTLMUDHmtH1dUWINAJLYuzPkV8/https://raw.githubusercontent.com/wiki/MunifTanjim/nougat.nvim/media/bubbly-statusline.png) ![](https://proxy-prod.omnivore-image-cache.app/0x0,s8721VcLMluVw2o5zbqpq42Cou9n_DNRnQ-6EEYIaZDA/https://raw.githubusercontent.com/wiki/MunifTanjim/nougat.nvim/media/pointy-statusline.png) ![](https://proxy-prod.omnivore-image-cache.app/0x0,sdxJRzRzMam9Pp5vuY69AdXlipU1JYPRZ4t_bLOL0y_g/https://raw.githubusercontent.com/wiki/MunifTanjim/nougat.nvim/media/slanty-statusline.png)

  > 🍫 Hyperextensible Statusline / Tabline / Winbar for Neovim 🚀

  * [GitHub](https://github.com/MunifTanjim/nougat.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/MunifTanjim/nougat.nvim)

  ---

  #### trimclain/builder.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,ssQSPS4kiVqJmf8x8O7zqevhYjyAgS-oxuOyaaU2VRLg/https://github.com/trimclain/builder.nvim/assets/84108846/6f94dc76-b652-4ac8-b54e-c3d19aaebdaa)

  > Simple building plugin for neovim 

  * [GitHub](https://github.com/trimclain/builder.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/trimclain/builder.nvim)
  * [Reddit](https://www.reddit.com/r/neovim/comments/16qwcl7/buildernvim%5Fsimple%5Fbuild%5Fplugin%5Ffor%5Fneovim/)

  ---

  #### niuiic/git-log.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,suRdnhdGKggw0zuXb7Axpp8Ykw_8unFeoGTBiquP2o84/https://user-images.githubusercontent.com/76068197/275345480-b7d2cc41-5e59-4a13-a5b7-cadf3e5ecbdd.png)

  > Check git log of the selected code.

  * [GitHub](https://github.com/niuiic/git-log.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/niuiic/git-log.nvim)

  ---

  #### 2KAbhishek/nerdy.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,sO3ro_AEJRwkyAM2Zgz3qr5ZpUkndJ4K7GkSz9HLc0oQ/https://user-images.githubusercontent.com/76068197/275345538-f957e324-fbd6-408c-a0c2-810b29559a6e.png)

  > Find Nerd Glyphs Easily 🤓🔭

  Do you like Nerd fonts, but don't like going over to the site just to find a glyph? nerdy.nvim, is a super handy plugin that lets you easily search, preview and insert any nerd font glyph from Neovim!

  * [GitHub](https://github.com/2KAbhishek/nerdy.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/2KAbhishek/nerdy.nvim)
  * [Reddit](https://www.reddit.com/r/neovim/comments/16qr135/nerdynvim%5Feasily%5Ffind%5Fand%5Finsert%5Fnerd%5Ffont%5Fglyphs/)

  ---

  #### David-Kunz/gen.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,sDEgBaEypwAzP6zU-c2NJ7cP01Q09bjxV4HNeiC_XbrU/https://user-images.githubusercontent.com/1009936/273126287-7b5f2b40-c678-47c5-8f21-edf9516f6034.jpg)

  > Neovim plugin to generate text using LLMs with customizable prompts

  * [GitHub](https://github.com/David-Kunz/gen.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/David-Kunz/gen.nvim)
  * [Reddit](https://www.reddit.com/r/neovim/comments/16x1zf7/local%5Fllms%5Fin%5Fneovim%5Fgennvim/)
  * [Youtube](https://www.youtube.com/watch?v=FIZt7MinpMY)

  ---

  #### VidocqH/data-viewer.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,srNNDmEeUxRH-7_Y1wRlwYn94Oat2ouVMlUCBmdHneEI/https://github.com/VidocqH/data-viewer.nvim/assets/16725418/7b933b3a-fd4e-4758-9917-9055c35796db)

  > Table view for data files, csv, tsv

  Lightweight neovim plugin provides a table view for inspect data files such as csv, tsv

  * [GitHub](https://github.com/VidocqH/data-viewer.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/VidocqH/data-viewer.nvim)

  ---

  #### ==hinell/duplicate.nvim==

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,slEysMO2620IzV16kXsH9RrCm7Ei5n-k7nnKR6htL-2Q/https://user-images.githubusercontent.com/76068197/275346764-065046c6-d267-4c8f-bf52-6b9fa0683229.png)

  > Duplicate visual selection, lines, and textobjects

  Duplicate lines in different directions (up/down) by specified offset Duplicate visual selection & line-wise blocks

  * [GitHub](https://github.com/hinell/duplicate.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/hinell/duplicate.nvim)
  * [Reddit](https://www.reddit.com/r/neovim/comments/16vkd4x/duplicatenvim/)

  ---

  #### niuiic/remote.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,sltK2sIjx8vjII6g18eOoH3oI0BmzGHzVDlVE9RdUdLA/https://raw.githubusercontent.com/niuiic/assets/main/remote.nvim/usage.gif)

  > Edit remote files locally.

  Edit remote files with local neovim configuration.

  Edit them as local directories.

  No other dependencies required for remote machine except ssh.

  * [GitHub](https://github.com/niuiic/remote.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/niuiic/remote.nvim)

  ---

  #### niuiic/typst-preview.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,sE0IeNg46_eRW_AAomtq470uTgYbmvFlRqfrozGff0FY/https://raw.githubusercontent.com/niuiic/assets/main/typst-preview.nvim/usage.gif)

  > Neovim plugin to preview typst document.

  Generate pdf files by typst compile. Respond to subsequent file changes with typst-lsp. Redirect these pdf files to a fixed path when you switch buffer. Preview this pdf by a pdf viewer with the ability to respond to the file changes.

  * [GitHub](https://github.com/niuiic/typst-preview.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/niuiic/typst-preview.nvim)

  ---

  #### SalOrak/whaler.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,sFs6Ddy-8eYOlxjXwza6MvJFpi5bUL_iCLP3Ipz6DvL0/https://raw.githubusercontent.com/SalOrak/whaler.nvim/main/whaler-example.gif)

  > Telescope extension to change between directories blazingly fast

  Whaler is a Telescope extension to move between directories. It is based on the concept of [tmux-windowizer](https://github.com/ThePrimeagen/.dotfiles/blob/master/bin/.local/scripts/tmux-windowizer) which uses a set of directories and fzf to move to another directory whilst creating a new tmux session.

  * [GitHub](https://github.com/SalOrak/whaler.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/SalOrak/whaler.nvim)
  * [Reddit](https://www.reddit.com/r/neovim/comments/16wgw0b/whalernvim/)

  ---

  #### gsuuon/note.nvim

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,sBOuCCo6p72mfZPAiqP1Ivk-u3waye8dHKUsd-UNJfxY/https://github.com/gsuuon/note.nvim/assets/6422188/813e74e7-d9dc-4b5f-b433-4ef294491797)

  > Notes in neovim

  A simple Neovim note taking plugin with daily notes, task tracking and syntax highlighting.

  note.nvim makes it easy to take working notes and track tasks. It adds commands to help manipulate task items, create daily notes, and navigate within (and between) notes.

  * [GitHub](https://github.com/gsuuon/note.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/gsuuon/note.nvim)

  ---

  #### A retrospective on why Nyoom is archived

  * [Reddit](https://www.reddit.com/r/neovim/comments/16sk266/nyoom%5Fwhy%5Fim%5Fultimately%5Farchiving%5Fit%5Fa%5Fshort/)

  #### indent-blankline.nvim v3 is released

  * [GitHub](https://github.com/lukas-reineke/indent-blankline.nvim)
  * [Dotfyle](https://dotfyle.com/plugins/lukas-reineke/indent-blankline.nvim)
  * [Migration guide](https://github.com/lukas-reineke/indent-blankline.nvim/wiki/Migrate-to-version-3)
  * [Reddit](https://www.reddit.com/r/neovim/comments/16u5abl/indent%5Fblankline%5Fv3%5Fis%5Freleased/)

  #### LazyVim 10.0.0 has been released!

  * [GitHub](https://github.com/LazyVim/LazyVim)
  * [Dotfyle](https://dotfyle.com/plugins/LazyVim/LazyVim)
  * [Changelog](https://github.com/LazyVim/LazyVim/blob/main/CHANGELOG.md)
  * [Reddit](https://www.reddit.com/r/neovim/comments/1766fl1/lazyvim%5F1000%5Fhas%5Fbeen%5Freleased/)

  ---

  ## Contributing

  Add your the plugin in either of the following to be featured in This Week in Neovim and Dotfyle: 

  * [rockerBOO/awesome-neovim](https://github.com/rockerBOO/awesome-neovim)
  * [SUBMITTED\_PLUGINS.md](https://github.com/codicocodes/dotfyle/blob/main/SUBMITTED-PLUGINS.md)

  Contribute to the development of Dotfyle:

  * File issues and submit pull requests on [GitHub](https://github.com/codicocodes/dotfyle)
  * Discuss ideas on [Discord](https://discord.gg/AMbnnN5eep)

metadata:
  {"date_added":"2023-10-15 16:10:23","id":"512f7bbc-6ba0-11ee-be2a-83432433f852","status":"ARCHIVED","tags":["read-later","RSS"],"title":"Highlighting fold text, community fork of null-ls, leetcode integration, reduce ram usage of LSP servers, svelte inspector integration\n","url_omnivore":"https://omnivore.app/me/highlighting-fold-text-community-fork-of-null-ls-leetcode-integr-18b3533f57b\n","url_original":"https://dotfyle.com/this-week-in-neovim/55\n"}


path: Omnivore/2023-10-18 - The Unreasonable Effectiveness Of Plain Text.md
sortable_path: Omnivore2023-10-18 - The Unreasonable Effectiveness Of Plain Text.md
title: The Unreasonable Effectiveness Of Plain Text
lead: # The Unreasonable Effectiveness Of Plain Text
checksum: df441c4a054a502ab3d4e0de147935edca362a55c4b40e1629fc1205c4c7ca3d
created: 2024-09-15 00:40:56.74693532+00:00
modified: 2024-09-22 22:40:13.392511014+00:00
body:
  # The Unreasonable Effectiveness Of Plain Text

  ## Highlights

  ## [Tie Yourself to the Mast](#tie-yourself-to-the-mast)

  %%pron. oh diss e us%% In the Odyssey, Odysseus (confusingly called Ulysses in English literature) had to travel through siren-infested waters.

  This was a well-understood problem in his world. Sailors would simply solve this by putting wax in their ears, so the sirens' tempting song wouldn't lure them to their deaths.

  But Odysseus had a challenge: He WANTED to hear the Sirens' beautiful song. He certainly didn't want to drown, so he ordered his crew to tie him to the mast of the ship, and to ignore any of his pleas to let him go, until safety.

  This way, he was able to guard against future bad decisions he knew he would make by setting up a framework to control his future self.

  This is the Ulysses pact, and it's a very common trick:

  * Leaving your credit card or car keys at home when going out drinking is a Ulysses pact.
  * Publishing a warrant canary on your company's website is a Ulysses pact,
  * and standardising all your tools on plain text is a Ulysses pact. 

  > [!note]
  > El pacto de Ulysses es una estrategia (o framework) en donde tomamos medidas tempranamente para prevenir malas desiciones en un futuro.

  [source](https://omnivore.app/me/noboilerplate-scripts-34-plain-text-team-md-at-main-0-atman-nobo-18b42e0d185#7466a699-a115-4b9f-99fc-416852b5aef2)  #frameworks 

  ---

  "The difference between science and screwing around is _writing it down_."

  ## [— Adam Savage](#-adam-savage) 

  > [!note]
  > This was just a cool quote...

  [source](https://omnivore.app/me/noboilerplate-scripts-34-plain-text-team-md-at-main-0-atman-nobo-18b42e0d185#9a030eb7-6269-4863-8e5e-61b59a1704b6)  #quote 

  ---

  ## Original

  <style> :root {--r-code-font: "FiraCode Nerd Font";} .reveal .hljs {min-height: 50%;} </style>

  !\[\[git-logo.png|500\]\]

  ## [Plain-Text Team](#plain-text-team)

  notes: %%

  * Tell them what you're going to tell them
  * Tell them
  * Tell them what you told them %% Hi friends my name is Tris and this is No Boilerplate, focusing on fast, technical videos.

  All good teams are alike; each bad team is bad in its own way. %% to paraphrase Tolstoy %%

  Software is an incredible thing, isn't it? Combined with the internet, a small team of friends can change the world overnight.

  Every company, no matter what their industry, must now run a tech team, even if only to maintain their website.

  So why are they all so bad at it?

  ---

  !\[\[cc-logo.png\]\]

  ## [Public Domain Videos](#public-domain-videos)

  <https://github.com/0atman/noboilerplate/>

  notes: Everything you see in this video: script, links, and images are part of a plain-text markdown document available freely on GitHub under a public domain licence.

  ---

  ## [First World Problems](#first-world-problems)

  notes: If you've worked in a web team, tech team or any digital creative team, you've likely felt the pain.

  * Bad software,
  * constantly changing processes,
  * and lots and lots of meetings.

  I discussed some of these problems in my Agile video that made me a lot of friends. But today, I want to go bigger. You can solve all these problems in a single blow.

  The secret is, in order to do more, you must have the discipline to do LESS.

  ---

  !\[\[rework-book.png|400\]\]

  !\[\[remote-book.png|400\]\]

  notes:

  A lot of the ideas that I will mention today are not new. They've been well-understood in the startup and digital world for a long time.

  But regression to the mean is prevalent.

  It's not just enough to argue for good tools today, you must stop the future churn of new apps and processes that solve the same things in different, but equivalent ways.

  And you do this with a Ulysses pact.

  ---

  !\[\[ulysses-and-the-sirens-waterhouse.jpg\]\]

  _"Ulysses and the Sirens"_ [John William Waterhouse](https://en.wikipedia.org/wiki/John%5FWilliam%5FWaterhouse)

  notes:

  ## ==[Tie Yourself to the Mast](#tie-yourself-to-the-mast)==

  ==%%pron. oh diss e us%%
  In the Odyssey, Odysseus (confusingly called Ulysses in English literature) had to travel through siren-infested waters.==

  ==This was a well-understood problem in his world.
  Sailors would simply solve this by putting wax in their ears, so the sirens' tempting song wouldn't lure them to their deaths.==

  ==But Odysseus had a challenge: He WANTED to hear the Sirens' beautiful song. He certainly didn't want to drown, so he ordered his crew to tie him to the mast of the ship, and to ignore any of his pleas to let him go, until safety.==

  ==This way, he was able to guard against future bad decisions he knew he would make by setting up a framework to control his future self.==

  ==This is the Ulysses pact, and it's a very common trick:==

  * ==Leaving your credit card or car keys at home when going out drinking is a Ulysses pact.==
  * ==Publishing a warrant canary on your company's website is a Ulysses pact,==
  * ==and standardising all your tools on plain text is a Ulysses pact.==

  ---

  !\[\[the-fbi-has-not-been-here.png\]\]

  An example of a warrant canary

  notes:

  In the future, you, or your successor, or your team might well be tempted to try the latest hot project management software, or documentation tool or scrum system.

  While it might be good for a while, the act of changing tools constantly is an enormous overhead for your team, and one that gives the lasting impression that anything we write is likely to be legacy very soon, trapped in a deprecated app that "we just don't use any more", so why bother writing anything down.

  Tying yourself to the mast by standardising on one tool, and not only that, but a plain text tool, means your data will live forever, and the network effect can make it more and more valuable over time, instead of less and less.

  ---

  "The greatest problem in communication is the _illusion_ that it has been achieved."

  ## [— William H. Whyte](#-william-h-whyte)

  [(not George Bernard Shaw, apparently)](https://quoteinvestigator.com/2014/08/31/illusion/)

  notes:

  ## [Decoupled Organisation Through Plain Text](#decoupled-organisation-through-plain-text)

  Teams of people need to be on the same page. Both literally and figuratively.

  The natural way to do this is by talking to one another. But talking does not scale, and is extremely impermanent. After the sound waves have bounced off the walls and reverberated for a second... the words are gone, and what is left is our memory of them.

  ---

  =="The difference between science and screwing around is== _==writing it down==_==."==

  ## ==[— Adam Savage](#-adam-savage)==

  notes:

  Human memory is extremely unreliable, subjective, and the root cause of many problems.

  After a discussion, it is not apparent that everyone has agreed upon exactly the same thing. And you now need another meeting to double-check that.

  The solution is documentation.

  ---

  ## [Documentation-First Teams](#documentation-first-teams)

  notes: Communication is most reliable when it is in black and white.

  Everyone understands this, from 10,000-page government specifications to an email sign-off from the client you're making a 3-minute track for.

  Yes, have more immediate conversations, by video, or chat, but write down what you concluded, and get the other person to confirm it.

  ---

  ## [](#documenting-architecture-decisions)["Documenting Architecture Decisions"](https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions)

  (aka the _ADR_ process)

  — [Michael Nygard](https://cognitect.com/authors/MichaelNygard.html)

  notes: You can improve every part of your team, business, or organisation by recording what decisions you have made, and WHY, in a system that allows for asynchronous discussion and improvements.

  The ADR process is excellent for this, for example.

  There are a thousand competing apps that claim to solve these problems for you.

  ---

  !\[\[gdocs-screenshot.png|200\]\]

  !\[\[jamboard-photo.png|200\]\]

  !\[\[confluence-screenshot.png|200\]\]

  !\[\[pivotal-tracker-screenshot.png|200\]\]

  !\[\[notion-screenshot.png|200\]\]

  !\[\[trello-screenshot.png|200\]\]

  notes: These apps all re-invent the wheel in their own way, and new ones are being released every week. I've used most of them, perhaps you have too, and they're all rubbish.

  But there is a group of people who are extremely practised at managing enormous distributed, concurrent, text projects:

  _Programmers!_

  As an example, if you use Google Docs, your small team can collaborate on a few files a day, in a drive of perhaps a hundred or two hundred. And just like in most other documentation systems, that won't scale.

  Programmers simultaneously edit thousands of files a day, across repositories of data so numerous that we don't keep count.

  What are programmers using, and can non-programmers use it too?

  ---

  ## [Enter Git](#enter-git)

  * GitHub
  * GitLab
  * Bitbucket
  * SourceForge
  * Etc.

  notes:

  The answer is yes, yes we can.

  I recommend you use the most popular distributed version control system on the planet: Git.

  You'll use this through one of the many git web hosts, the largest of which is GitHub, which I recommend for most people.

  ---

  ## [Popularity Matters](#popularity-matters)

  notes:

  Though I mention GitHub primarily in this video, I'm not sponsored by them, or anything like that, I just acknowledge that popularity matters. Support, experience, and integrations with other services will all be far, far easier if you use the standard.

  All these tools started as a web interface around the incredible tool: Git.

  ---

  ## [Aside:](#aside)

  ## [Linux & Git](#linux--git)

  notes: By the way, the creator of Linux, Linus Torvalds, also later created git, to solve the problem that he created: that the Linux project had become SO LARGE that existing plain text collaboration tools were not scaling.

  He jokes that he named his first project, Linux, after himself, and so it was natural to name the second one after himself too!

  ---

  ## [Github Et Al. Are Greater Than the Sum of Their Parts](#github-et-al-are-greater-than-the-sum-of-their-parts)

  notes: From simple code-hosting beginnings, these git services have grown to be so much more than that, trusted by the largest projects in the world, built by the largest companies in the world.

  The foundation of my ideal team uses the raw materials that GitHub has given us.

  What are the raw materials?

  I'll show you this with a demo: We're going to build a GitHub organisation for No Boilerplate.

  This video is not sponsored by GitHub, my work is possible, thanks to viewers like you.

  ---

  !\[\[nb-patreon-aug-23.png|700\]\]

  <https://www.patreon.com/noboilerplate>

  notes:

  If you'd like to see and give feedback on my videos up to a week early, as well as get discord perks, and even your name in the credits, it would be very kind of you to check my Patreon.

  I'm also offering a limited number of mentoring slots. If you'd like 1:1 tuition on Rust, Python, Web tech, Personal organisation, or anything that I talk about in my videos, do sign up and let's chat!

  It's just me running this channel, and I'm so grateful to everyone for supporting me on this wild adventure.

  Let's make our plain text team:

  ---

  !\[\[repo.png\]\]

  ## [Repos](#repos)

  notes: The foundational unit with any git host is the repo. This doesn't just correspond with one git repository, but one logical project or subproject. Organisational tools like the Wiki (for documentation), Projects (for project management) and more can sit here, right next to your project's files, right where you need them.

  ---

  !\[\[wiki2.png\]\]

  ## [Wikis](#wikis)

  notes: Each GitHub repository has a wiki, a folder of linked markdown files that anyone with access can edit, either in the friendly web editor, or, by cloning the wiki with git, on their own computer with whatever editor they like.

  This is the minimum viable documentation tool, and it's useful for when git's full collaboration system isn't needed, and you just want to throw some linked markdown files together quickly.

  ---

  ## [\# This is a Heading](#-this-is-a-heading)

  ### [\### This is a Sub Heading](#-this-is-a-sub-heading)

  _\_this is italic text\__

  **\*\*this is bold\*\***

  \[[this is a link](https://github.com/0atman/noboilerplate/blob/main/scripts)\]([http://example.com](http://example.com/))

  _(learn more: [markdownguide.org/basic-syntax/](https://www.markdownguide.org/basic-syntax/))_

  notes:

  ## [Aside: Markdown is Great](#aside-markdown-is-great)

  Github, GitLab, and most of the Internet have standardised on Markdown. Just like Slack, Discord, many websites, and sometimes Facebook depending on the phase of the moon, they all format text using this lightweight standard called Markdown.

  Markdown is my favourite text format, it's really simple to use, and is designed to look good both in plain text and rendered as rich text, unlike HTML, which is unreadable by most people unless rendered in a browser.

  Here we've got a heading, denoted by the hash symbol, italic with underscores, bold with double asterisks, and links using this bracket pairing syntax.

  There are a few more options available, which you can look up at markdownguide.org, but this is the overwhelming majority of formatting you'll need on a day-to-day basis.

  ---

  !\[\[obsidian-kanban-paint.png\]\]

  notes:

  The genius of storing your data in this universal plain-text format is that should you wish to migrate from GitHub to another similar platform, your data is portable and under your control.

  GitHub formats Markdown very nicely, but you can export it in any format you like, and edit it with any tool you like, present and future.

  Including my favourite tool here, Obsidian.

  Markdown keeps your team focussed on what is important by allowing you just enough formatting, but no rich customisation options. You're not making a beautiful client brochure, so you shouldn't use 90s desktop publishing tools to make your company's critical documentation.

  Back to GitHub's features:

  ---

  !\[\[issues.png\]\]

  ## [Issues](#issues)

  notes:

  Though not part of the git system, Issues are a natural addition that all git hosts have implemented: A simple task system for capturing work that needs doing. These could be new features, customer requests, bug reports, or ideas. They have a rich comment thread for discussion, can be assigned to team members, and tagged with custom tags.

  This minimum viable project management system could be all you need. Certainly, for a solo or small team, capturing requirements in Issues might be enough.

  But if you need more, you need Milestones.

  ---

  !\[\[milestones.png\]\]

  ## [Milestones](#milestones)

  notes: GH milestones are a grouping of issues with a deadline.

  They typically represent a target, a release, or something the team is working towards. Milestones just have a title, a description, and a date. No burndown charts, no swim lanes, no complex statistics, just a progress bar.

  This might be enough project management for you. If not, it is time for GH Projects.

  ---

  !\[\[projects.png\]\]

  ## [Projects](#projects)

  notes:

  Each GitHub repo, team, and organisation can have a project board, a lightweight kanban board with customisable columns, allowing you to group your issues together, and observe their progress through your current iteration.

  This represents the information radiator for your team, a bird's-eye view of what is happening with the project, and something you might gather around for your morning catchup meeting.

  You don't need all the features of Trello, JIRA, or anything like that. You need the minimum viable board.

  This bare-bones tool completely side-steps 'the JIRA effect', which is if you have a tool that is packed full of time tracking, velocity points, and so on, the temptation is to use all these features, even if they give no value, and complicate your processes.

  ---

  ## [Aside:](#aside-1)

  ## [Standups Are Great](#standups-are-great)

  notes:

  If you have one meeting a day, it should be a standup. Good standups replace other meetings and accelerate your project dramatically.

  The way I like to do standups is not by asking everyone what they did yesterday and what they intend to do today.

  That's a great way to find out at length what Dave did on his day off, but not a good way to find out what's happening with the project specifically.

  I recommend walking your board, backwards, from right to left. Everyone is timeboxed, keeping the meeting tight. If you don't have an issue on the board, you don't speak yet. Perhaps you could write or pick up a task from the backlog and talk about it tomorrow.

  At the end, the team member who is facilitating the meeting asks if anyone has any blockers, and we're done.

  The most important part of this most important meeting is asking if you have any blockers. A good standup means that no-one can get lost or delayed by more than 24 hours.

  Note I didn't say the PM or DM or scrum master or whoever facilitates. That person doesn't exist in my team. These are not roles, they are hats.

  I don't know if your team needs any other meetings, but it is vital that you do a standup.

  Back to GitHub.

  ---

  !\[\[org-public.png\]\]

  ## [Organisations](#organisations)

  notes: GitHub provides an umbrella group of users called an organisation. This is your company, and if you're building your products in the open, as I recommend you do, you won't pay GitHub a thing. Most git hosts provide their services for free for open-source companies. If you have too much money, you can pay GitHub for a plan to make your data closed.

  If you require more subdivision, Organisations are divided into Teams.

  ---

  !\[\[teams.png\]\]

  ## [Teams](#teams)

  notes:

  Teams on GitHub allow you to granularly scope repo, project, wiki, and other permissions to the different teams in your organisation.

  I recommend allowing everyone to write and contribute to all projects, you want the network effect and low admin overhead. This pattern is called "internal open source".

  But if you wish, perhaps for regulatory reasons, read and write access to repos can be restricted by team.

  ---

  !\[\[PR.png\]\]

  ## [Pull Requests](#pull-requests)

  notes:

  Now we're getting into the detail of GitHub. I adore pull requests, sometimes called merge requests in other systems. PRs represent a change to the files in a repo, with an explanation of what you did, some links, and a discussion.

  ---

  !\[\[PR diff.png\]\]

  ## [Pull Requests (diffs)](#pull-requests-diffs)

  notes:

  After the discussion is satisfied, perhaps as simply as a colleague saying "LGTM" or as heavy weight as a full change review with an audit trail that would satisfy a bank, the changes are merged into the repo.

  PRs can have powerful automation, called Actions

  ---

  !\[\[action.png\]\]

  ## [Github Actions](#github-actions)

  notes:

  PRs and actions can run your company for you if you let them. Though Actions were built for running tests on source code, with a little imagination, they can be used for anything:

  * If you're uploading vector images, an action can build all the rasterised resolutions the client wants.
  * If you're uploading video or audio clips, an action can run them through plugins to remove noise, add a music track, and upload the draft to YouTube.
  * If you're checking in company documents, an action can simply spellcheck it.

  Actions can run hundreds of times an hour, always adhere to best practice, and never make mistakes.

  Automating your company gives you an enormous competitive speed and quality advantage.

  ---

  !\[\[language-tool-on-premise.png\]\]

  notes: You could also, for example, set up style guide enforcement, blocking the PR if the phrase "on premise" has been found.

  ---

  !\[\[nvme.png\]\] notes:

  ## [Offline Work](#offline-work)

  When your company's code, visual assets, and administration, are all in git repositories, you gain another huge superpower.

  All of this becomes accessible offline. Every file, every photo, every design, and document can be on your computer. The magic of offline isn't necessarily that you don't need the internet (though that is a handy feature on a plane) But that it's FAST, the data is RIGHT HERE on your computer, and you can do ANYTHING with it. If you need to change the company's name across 10,000 files, it's trivial. It's find and replace.

  If you, instead, had 5-15 different web services that you scattered all your team's data across, you'd have to log in to each one, and hope they had the feature to find and replace within their own walled garden.

  Most, somehow, don't have this basic feature.

  ---

  ## [Who is flying this thing?](#who-is-flying-this-thing)

  notes:

  GOOGLE DOCS doesn't have this basic feature: you can't find and replace across a drive of files!?

  And the reason for this, I suspect, is that would be TERRIFYING, wouldn't it? What if a new hire accidentally did that, you'd have to roll back all those files manually, that could take days!

  But with git, it would be a PR, clearly showing what was happening, and mistakes are trivial to fix.

  Plain-text files, with just enough Markdown syntax to convey meaning, allow you and your team to work with this data in the way that they want, not the way that google or Atlassian or WHOEVER thinks is best.

  Doesn't this take up a lot of space on your disk? Not plain text. But even if you're storing large files, storage is cheap if you're smart. A topic for another video, perhaps.

  ---

  ## [Future-Proofing](#future-proofing)

  notes: The benefits of git, especially for teams already using it for code and text collaboration, are that

  1. you're already paying for it, and
  2. It's never going away.

  It is impossible to imagine a management reshuffle that might decide on another tool just because it is the flavour of the month. Git and GitHub dominate the coding world, and I recommend GitHub not only because it is the biggest but also the most featureful.

  ---

  !\[\[killed-by-google-10-23.png\]\]

  [https://killedbygoogle.com](https://killedbygoogle.com/)

  notes:

  Even if you don't think git and plain text are the best option, I still suggest you use them because stability is far, far better than a constantly churning tool choice, as staff come, and go and fashions change, and Google decommission ANOTHER product.

  RIP Jamboard :-(

  ---

  ## [Conclusion](#conclusion)

  Click around my demo organisation for yourself:<https://github.com/noboilerplate>

  notes:

  You can't do all these utopian things in most companies, I'm painfully aware.

  But you CAN do SOME of these things, even just in your immediate team, or only for yourself.

  I'd be interested to know what other ways good teams buck the hype cycle in favour of sane, evidence-based improvements.

  Thank you.

  ---

  !\[\[tri-hex-moon-white-transparent.png|300\]\]

  ## [Thank You](#thank-you)

  ## [](#patreoncomnoboilerplate)[Patreon.com/NoBoilerplate](http://www.patreon.com/noboilerplate)

  notes:

  ## [OUTRO](#outro)

  If you would like to support my channel, get early ad-free and tracking-free videos, vip discord access or 1:1 mentoring, head to patreon.com/noboilerplate.

  If you're interested in transhumanism and hopepunk stories, please check out my weekly sci-fi podcast, Lost Terminal.

  Or if urban fantasy is more your bag, do listen to a strange and beautiful podcast I produce every full moon called Modem Prometheus.

  Transcripts and compile-checked markdown source code are available on GitHub, links in the description, and corrections are in the pinned ERRATA comment.

  Thank you so much for watching, talk to you on Discord.

  %% NOW READ THE INTRO AGAIN %%

raw_content:
  ---
  id: 07f91eda-1940-4aaa-8e27-78b0bf176193
  title: |
    The Unreasonable Effectiveness Of Plain Text
  status: ARCHIVED
  tags:
    - read-later
  date_added: 2023-10-18 10:01:51
  url_omnivore: |
    https://omnivore.app/me/noboilerplate-scripts-34-plain-text-team-md-at-main-0-atman-nobo-18b42e0d185
  url_original: |
    https://github.com/0atman/noboilerplate/blob/main/scripts/34-Plain-Text-Team.md
  ---

  # The Unreasonable Effectiveness Of Plain Text

  ## Highlights

  ## [Tie Yourself to the Mast](#tie-yourself-to-the-mast)

  %%pron. oh diss e us%% In the Odyssey, Odysseus (confusingly called Ulysses in English literature) had to travel through siren-infested waters.

  This was a well-understood problem in his world. Sailors would simply solve this by putting wax in their ears, so the sirens' tempting song wouldn't lure them to their deaths.

  But Odysseus had a challenge: He WANTED to hear the Sirens' beautiful song. He certainly didn't want to drown, so he ordered his crew to tie him to the mast of the ship, and to ignore any of his pleas to let him go, until safety.

  This way, he was able to guard against future bad decisions he knew he would make by setting up a framework to control his future self.

  This is the Ulysses pact, and it's a very common trick:

  * Leaving your credit card or car keys at home when going out drinking is a Ulysses pact.
  * Publishing a warrant canary on your company's website is a Ulysses pact,
  * and standardising all your tools on plain text is a Ulysses pact. 

  > [!note]
  > El pacto de Ulysses es una estrategia (o framework) en donde tomamos medidas tempranamente para prevenir malas desiciones en un futuro.

  [source](https://omnivore.app/me/noboilerplate-scripts-34-plain-text-team-md-at-main-0-atman-nobo-18b42e0d185#7466a699-a115-4b9f-99fc-416852b5aef2)  #frameworks 

  ---

  "The difference between science and screwing around is _writing it down_."

  ## [— Adam Savage](#-adam-savage) 

  > [!note]
  > This was just a cool quote...

  [source](https://omnivore.app/me/noboilerplate-scripts-34-plain-text-team-md-at-main-0-atman-nobo-18b42e0d185#9a030eb7-6269-4863-8e5e-61b59a1704b6)  #quote 

  ---

  ## Original

  <style> :root {--r-code-font: "FiraCode Nerd Font";} .reveal .hljs {min-height: 50%;} </style>

  !\[\[git-logo.png|500\]\]

  ## [Plain-Text Team](#plain-text-team)

  notes: %%

  * Tell them what you're going to tell them
  * Tell them
  * Tell them what you told them %% Hi friends my name is Tris and this is No Boilerplate, focusing on fast, technical videos.

  All good teams are alike; each bad team is bad in its own way. %% to paraphrase Tolstoy %%

  Software is an incredible thing, isn't it? Combined with the internet, a small team of friends can change the world overnight.

  Every company, no matter what their industry, must now run a tech team, even if only to maintain their website.

  So why are they all so bad at it?

  ---

  !\[\[cc-logo.png\]\]

  ## [Public Domain Videos](#public-domain-videos)

  <https://github.com/0atman/noboilerplate/>

  notes: Everything you see in this video: script, links, and images are part of a plain-text markdown document available freely on GitHub under a public domain licence.

  ---

  ## [First World Problems](#first-world-problems)

  notes: If you've worked in a web team, tech team or any digital creative team, you've likely felt the pain.

  * Bad software,
  * constantly changing processes,
  * and lots and lots of meetings.

  I discussed some of these problems in my Agile video that made me a lot of friends. But today, I want to go bigger. You can solve all these problems in a single blow.

  The secret is, in order to do more, you must have the discipline to do LESS.

  ---

  !\[\[rework-book.png|400\]\]

  !\[\[remote-book.png|400\]\]

  notes:

  A lot of the ideas that I will mention today are not new. They've been well-understood in the startup and digital world for a long time.

  But regression to the mean is prevalent.

  It's not just enough to argue for good tools today, you must stop the future churn of new apps and processes that solve the same things in different, but equivalent ways.

  And you do this with a Ulysses pact.

  ---

  !\[\[ulysses-and-the-sirens-waterhouse.jpg\]\]

  _"Ulysses and the Sirens"_ [John William Waterhouse](https://en.wikipedia.org/wiki/John%5FWilliam%5FWaterhouse)

  notes:

  ## ==[Tie Yourself to the Mast](#tie-yourself-to-the-mast)==

  ==%%pron. oh diss e us%%
  In the Odyssey, Odysseus (confusingly called Ulysses in English literature) had to travel through siren-infested waters.==

  ==This was a well-understood problem in his world.
  Sailors would simply solve this by putting wax in their ears, so the sirens' tempting song wouldn't lure them to their deaths.==

  ==But Odysseus had a challenge: He WANTED to hear the Sirens' beautiful song. He certainly didn't want to drown, so he ordered his crew to tie him to the mast of the ship, and to ignore any of his pleas to let him go, until safety.==

  ==This way, he was able to guard against future bad decisions he knew he would make by setting up a framework to control his future self.==

  ==This is the Ulysses pact, and it's a very common trick:==

  * ==Leaving your credit card or car keys at home when going out drinking is a Ulysses pact.==
  * ==Publishing a warrant canary on your company's website is a Ulysses pact,==
  * ==and standardising all your tools on plain text is a Ulysses pact.==

  ---

  !\[\[the-fbi-has-not-been-here.png\]\]

  An example of a warrant canary

  notes:

  In the future, you, or your successor, or your team might well be tempted to try the latest hot project management software, or documentation tool or scrum system.

  While it might be good for a while, the act of changing tools constantly is an enormous overhead for your team, and one that gives the lasting impression that anything we write is likely to be legacy very soon, trapped in a deprecated app that "we just don't use any more", so why bother writing anything down.

  Tying yourself to the mast by standardising on one tool, and not only that, but a plain text tool, means your data will live forever, and the network effect can make it more and more valuable over time, instead of less and less.

  ---

  "The greatest problem in communication is the _illusion_ that it has been achieved."

  ## [— William H. Whyte](#-william-h-whyte)

  [(not George Bernard Shaw, apparently)](https://quoteinvestigator.com/2014/08/31/illusion/)

  notes:

  ## [Decoupled Organisation Through Plain Text](#decoupled-organisation-through-plain-text)

  Teams of people need to be on the same page. Both literally and figuratively.

  The natural way to do this is by talking to one another. But talking does not scale, and is extremely impermanent. After the sound waves have bounced off the walls and reverberated for a second... the words are gone, and what is left is our memory of them.

  ---

  =="The difference between science and screwing around is== _==writing it down==_==."==

  ## ==[— Adam Savage](#-adam-savage)==

  notes:

  Human memory is extremely unreliable, subjective, and the root cause of many problems.

  After a discussion, it is not apparent that everyone has agreed upon exactly the same thing. And you now need another meeting to double-check that.

  The solution is documentation.

  ---

  ## [Documentation-First Teams](#documentation-first-teams)

  notes: Communication is most reliable when it is in black and white.

  Everyone understands this, from 10,000-page government specifications to an email sign-off from the client you're making a 3-minute track for.

  Yes, have more immediate conversations, by video, or chat, but write down what you concluded, and get the other person to confirm it.

  ---

  ## [](#documenting-architecture-decisions)["Documenting Architecture Decisions"](https://cognitect.com/blog/2011/11/15/documenting-architecture-decisions)

  (aka the _ADR_ process)

  — [Michael Nygard](https://cognitect.com/authors/MichaelNygard.html)

  notes: You can improve every part of your team, business, or organisation by recording what decisions you have made, and WHY, in a system that allows for asynchronous discussion and improvements.

  The ADR process is excellent for this, for example.

  There are a thousand competing apps that claim to solve these problems for you.

  ---

  !\[\[gdocs-screenshot.png|200\]\]

  !\[\[jamboard-photo.png|200\]\]

  !\[\[confluence-screenshot.png|200\]\]

  !\[\[pivotal-tracker-screenshot.png|200\]\]

  !\[\[notion-screenshot.png|200\]\]

  !\[\[trello-screenshot.png|200\]\]

  notes: These apps all re-invent the wheel in their own way, and new ones are being released every week. I've used most of them, perhaps you have too, and they're all rubbish.

  But there is a group of people who are extremely practised at managing enormous distributed, concurrent, text projects:

  _Programmers!_

  As an example, if you use Google Docs, your small team can collaborate on a few files a day, in a drive of perhaps a hundred or two hundred. And just like in most other documentation systems, that won't scale.

  Programmers simultaneously edit thousands of files a day, across repositories of data so numerous that we don't keep count.

  What are programmers using, and can non-programmers use it too?

  ---

  ## [Enter Git](#enter-git)

  * GitHub
  * GitLab
  * Bitbucket
  * SourceForge
  * Etc.

  notes:

  The answer is yes, yes we can.

  I recommend you use the most popular distributed version control system on the planet: Git.

  You'll use this through one of the many git web hosts, the largest of which is GitHub, which I recommend for most people.

  ---

  ## [Popularity Matters](#popularity-matters)

  notes:

  Though I mention GitHub primarily in this video, I'm not sponsored by them, or anything like that, I just acknowledge that popularity matters. Support, experience, and integrations with other services will all be far, far easier if you use the standard.

  All these tools started as a web interface around the incredible tool: Git.

  ---

  ## [Aside:](#aside)

  ## [Linux & Git](#linux--git)

  notes: By the way, the creator of Linux, Linus Torvalds, also later created git, to solve the problem that he created: that the Linux project had become SO LARGE that existing plain text collaboration tools were not scaling.

  He jokes that he named his first project, Linux, after himself, and so it was natural to name the second one after himself too!

  ---

  ## [Github Et Al. Are Greater Than the Sum of Their Parts](#github-et-al-are-greater-than-the-sum-of-their-parts)

  notes: From simple code-hosting beginnings, these git services have grown to be so much more than that, trusted by the largest projects in the world, built by the largest companies in the world.

  The foundation of my ideal team uses the raw materials that GitHub has given us.

  What are the raw materials?

  I'll show you this with a demo: We're going to build a GitHub organisation for No Boilerplate.

  This video is not sponsored by GitHub, my work is possible, thanks to viewers like you.

  ---

  !\[\[nb-patreon-aug-23.png|700\]\]

  <https://www.patreon.com/noboilerplate>

  notes:

  If you'd like to see and give feedback on my videos up to a week early, as well as get discord perks, and even your name in the credits, it would be very kind of you to check my Patreon.

  I'm also offering a limited number of mentoring slots. If you'd like 1:1 tuition on Rust, Python, Web tech, Personal organisation, or anything that I talk about in my videos, do sign up and let's chat!

  It's just me running this channel, and I'm so grateful to everyone for supporting me on this wild adventure.

  Let's make our plain text team:

  ---

  !\[\[repo.png\]\]

  ## [Repos](#repos)

  notes: The foundational unit with any git host is the repo. This doesn't just correspond with one git repository, but one logical project or subproject. Organisational tools like the Wiki (for documentation), Projects (for project management) and more can sit here, right next to your project's files, right where you need them.

  ---

  !\[\[wiki2.png\]\]

  ## [Wikis](#wikis)

  notes: Each GitHub repository has a wiki, a folder of linked markdown files that anyone with access can edit, either in the friendly web editor, or, by cloning the wiki with git, on their own computer with whatever editor they like.

  This is the minimum viable documentation tool, and it's useful for when git's full collaboration system isn't needed, and you just want to throw some linked markdown files together quickly.

  ---

  ## [\# This is a Heading](#-this-is-a-heading)

  ### [\### This is a Sub Heading](#-this-is-a-sub-heading)

  _\_this is italic text\__

  **\*\*this is bold\*\***

  \[[this is a link](https://github.com/0atman/noboilerplate/blob/main/scripts)\]([http://example.com](http://example.com/))

  _(learn more: [markdownguide.org/basic-syntax/](https://www.markdownguide.org/basic-syntax/))_

  notes:

  ## [Aside: Markdown is Great](#aside-markdown-is-great)

  Github, GitLab, and most of the Internet have standardised on Markdown. Just like Slack, Discord, many websites, and sometimes Facebook depending on the phase of the moon, they all format text using this lightweight standard called Markdown.

  Markdown is my favourite text format, it's really simple to use, and is designed to look good both in plain text and rendered as rich text, unlike HTML, which is unreadable by most people unless rendered in a browser.

  Here we've got a heading, denoted by the hash symbol, italic with underscores, bold with double asterisks, and links using this bracket pairing syntax.

  There are a few more options available, which you can look up at markdownguide.org, but this is the overwhelming majority of formatting you'll need on a day-to-day basis.

  ---

  !\[\[obsidian-kanban-paint.png\]\]

  notes:

  The genius of storing your data in this universal plain-text format is that should you wish to migrate from GitHub to another similar platform, your data is portable and under your control.

  GitHub formats Markdown very nicely, but you can export it in any format you like, and edit it with any tool you like, present and future.

  Including my favourite tool here, Obsidian.

  Markdown keeps your team focussed on what is important by allowing you just enough formatting, but no rich customisation options. You're not making a beautiful client brochure, so you shouldn't use 90s desktop publishing tools to make your company's critical documentation.

  Back to GitHub's features:

  ---

  !\[\[issues.png\]\]

  ## [Issues](#issues)

  notes:

  Though not part of the git system, Issues are a natural addition that all git hosts have implemented: A simple task system for capturing work that needs doing. These could be new features, customer requests, bug reports, or ideas. They have a rich comment thread for discussion, can be assigned to team members, and tagged with custom tags.

  This minimum viable project management system could be all you need. Certainly, for a solo or small team, capturing requirements in Issues might be enough.

  But if you need more, you need Milestones.

  ---

  !\[\[milestones.png\]\]

  ## [Milestones](#milestones)

  notes: GH milestones are a grouping of issues with a deadline.

  They typically represent a target, a release, or something the team is working towards. Milestones just have a title, a description, and a date. No burndown charts, no swim lanes, no complex statistics, just a progress bar.

  This might be enough project management for you. If not, it is time for GH Projects.

  ---

  !\[\[projects.png\]\]

  ## [Projects](#projects)

  notes:

  Each GitHub repo, team, and organisation can have a project board, a lightweight kanban board with customisable columns, allowing you to group your issues together, and observe their progress through your current iteration.

  This represents the information radiator for your team, a bird's-eye view of what is happening with the project, and something you might gather around for your morning catchup meeting.

  You don't need all the features of Trello, JIRA, or anything like that. You need the minimum viable board.

  This bare-bones tool completely side-steps 'the JIRA effect', which is if you have a tool that is packed full of time tracking, velocity points, and so on, the temptation is to use all these features, even if they give no value, and complicate your processes.

  ---

  ## [Aside:](#aside-1)

  ## [Standups Are Great](#standups-are-great)

  notes:

  If you have one meeting a day, it should be a standup. Good standups replace other meetings and accelerate your project dramatically.

  The way I like to do standups is not by asking everyone what they did yesterday and what they intend to do today.

  That's a great way to find out at length what Dave did on his day off, but not a good way to find out what's happening with the project specifically.

  I recommend walking your board, backwards, from right to left. Everyone is timeboxed, keeping the meeting tight. If you don't have an issue on the board, you don't speak yet. Perhaps you could write or pick up a task from the backlog and talk about it tomorrow.

  At the end, the team member who is facilitating the meeting asks if anyone has any blockers, and we're done.

  The most important part of this most important meeting is asking if you have any blockers. A good standup means that no-one can get lost or delayed by more than 24 hours.

  Note I didn't say the PM or DM or scrum master or whoever facilitates. That person doesn't exist in my team. These are not roles, they are hats.

  I don't know if your team needs any other meetings, but it is vital that you do a standup.

  Back to GitHub.

  ---

  !\[\[org-public.png\]\]

  ## [Organisations](#organisations)

  notes: GitHub provides an umbrella group of users called an organisation. This is your company, and if you're building your products in the open, as I recommend you do, you won't pay GitHub a thing. Most git hosts provide their services for free for open-source companies. If you have too much money, you can pay GitHub for a plan to make your data closed.

  If you require more subdivision, Organisations are divided into Teams.

  ---

  !\[\[teams.png\]\]

  ## [Teams](#teams)

  notes:

  Teams on GitHub allow you to granularly scope repo, project, wiki, and other permissions to the different teams in your organisation.

  I recommend allowing everyone to write and contribute to all projects, you want the network effect and low admin overhead. This pattern is called "internal open source".

  But if you wish, perhaps for regulatory reasons, read and write access to repos can be restricted by team.

  ---

  !\[\[PR.png\]\]

  ## [Pull Requests](#pull-requests)

  notes:

  Now we're getting into the detail of GitHub. I adore pull requests, sometimes called merge requests in other systems. PRs represent a change to the files in a repo, with an explanation of what you did, some links, and a discussion.

  ---

  !\[\[PR diff.png\]\]

  ## [Pull Requests (diffs)](#pull-requests-diffs)

  notes:

  After the discussion is satisfied, perhaps as simply as a colleague saying "LGTM" or as heavy weight as a full change review with an audit trail that would satisfy a bank, the changes are merged into the repo.

  PRs can have powerful automation, called Actions

  ---

  !\[\[action.png\]\]

  ## [Github Actions](#github-actions)

  notes:

  PRs and actions can run your company for you if you let them. Though Actions were built for running tests on source code, with a little imagination, they can be used for anything:

  * If you're uploading vector images, an action can build all the rasterised resolutions the client wants.
  * If you're uploading video or audio clips, an action can run them through plugins to remove noise, add a music track, and upload the draft to YouTube.
  * If you're checking in company documents, an action can simply spellcheck it.

  Actions can run hundreds of times an hour, always adhere to best practice, and never make mistakes.

  Automating your company gives you an enormous competitive speed and quality advantage.

  ---

  !\[\[language-tool-on-premise.png\]\]

  notes: You could also, for example, set up style guide enforcement, blocking the PR if the phrase "on premise" has been found.

  ---

  !\[\[nvme.png\]\] notes:

  ## [Offline Work](#offline-work)

  When your company's code, visual assets, and administration, are all in git repositories, you gain another huge superpower.

  All of this becomes accessible offline. Every file, every photo, every design, and document can be on your computer. The magic of offline isn't necessarily that you don't need the internet (though that is a handy feature on a plane) But that it's FAST, the data is RIGHT HERE on your computer, and you can do ANYTHING with it. If you need to change the company's name across 10,000 files, it's trivial. It's find and replace.

  If you, instead, had 5-15 different web services that you scattered all your team's data across, you'd have to log in to each one, and hope they had the feature to find and replace within their own walled garden.

  Most, somehow, don't have this basic feature.

  ---

  ## [Who is flying this thing?](#who-is-flying-this-thing)

  notes:

  GOOGLE DOCS doesn't have this basic feature: you can't find and replace across a drive of files!?

  And the reason for this, I suspect, is that would be TERRIFYING, wouldn't it? What if a new hire accidentally did that, you'd have to roll back all those files manually, that could take days!

  But with git, it would be a PR, clearly showing what was happening, and mistakes are trivial to fix.

  Plain-text files, with just enough Markdown syntax to convey meaning, allow you and your team to work with this data in the way that they want, not the way that google or Atlassian or WHOEVER thinks is best.

  Doesn't this take up a lot of space on your disk? Not plain text. But even if you're storing large files, storage is cheap if you're smart. A topic for another video, perhaps.

  ---

  ## [Future-Proofing](#future-proofing)

  notes: The benefits of git, especially for teams already using it for code and text collaboration, are that

  1. you're already paying for it, and
  2. It's never going away.

  It is impossible to imagine a management reshuffle that might decide on another tool just because it is the flavour of the month. Git and GitHub dominate the coding world, and I recommend GitHub not only because it is the biggest but also the most featureful.

  ---

  !\[\[killed-by-google-10-23.png\]\]

  [https://killedbygoogle.com](https://killedbygoogle.com/)

  notes:

  Even if you don't think git and plain text are the best option, I still suggest you use them because stability is far, far better than a constantly churning tool choice, as staff come, and go and fashions change, and Google decommission ANOTHER product.

  RIP Jamboard :-(

  ---

  ## [Conclusion](#conclusion)

  Click around my demo organisation for yourself:<https://github.com/noboilerplate>

  notes:

  You can't do all these utopian things in most companies, I'm painfully aware.

  But you CAN do SOME of these things, even just in your immediate team, or only for yourself.

  I'd be interested to know what other ways good teams buck the hype cycle in favour of sane, evidence-based improvements.

  Thank you.

  ---

  !\[\[tri-hex-moon-white-transparent.png|300\]\]

  ## [Thank You](#thank-you)

  ## [](#patreoncomnoboilerplate)[Patreon.com/NoBoilerplate](http://www.patreon.com/noboilerplate)

  notes:

  ## [OUTRO](#outro)

  If you would like to support my channel, get early ad-free and tracking-free videos, vip discord access or 1:1 mentoring, head to patreon.com/noboilerplate.

  If you're interested in transhumanism and hopepunk stories, please check out my weekly sci-fi podcast, Lost Terminal.

  Or if urban fantasy is more your bag, do listen to a strange and beautiful podcast I produce every full moon called Modem Prometheus.

  Transcripts and compile-checked markdown source code are available on GitHub, links in the description, and corrections are in the pinned ERRATA comment.

  Thank you so much for watching, talk to you on Discord.

  %% NOW READ THE INTRO AGAIN %%

metadata:
  {"date_added":"2023-10-18 10:01:51","id":"07f91eda-1940-4aaa-8e27-78b0bf176193","status":"ARCHIVED","tags":["read-later"],"title":"The Unreasonable Effectiveness Of Plain Text\n","url_omnivore":"https://omnivore.app/me/noboilerplate-scripts-34-plain-text-team-md-at-main-0-atman-nobo-18b42e0d185\n","url_original":"https://github.com/0atman/noboilerplate/blob/main/scripts/34-Plain-Text-Team.md\n"}


path: Omnivore/2023-10-21 - How Game Reviews Actually Affect You.md
sortable_path: Omnivore2023-10-21 - How Game Reviews Actually Affect You.md
title: How Game Reviews Actually Affect You
lead: # How Game Reviews Actually Affect You
checksum: 39d42a75637e2e9f05c6a1e0e31e0d60952679d4bad755ffdc84fd6dc5813400
created: 2024-09-15 00:40:56.940127929+00:00
modified: 2024-09-22 22:40:13.392511014+00:00
body:
  # How Game Reviews Actually Affect You

  ## Notes

  Según estudios, los jugadores se ven afectados por reviews que leen/ven, ya sean por críticos o por otros jugadores. Destacar que en ambos casos, pero principalmente en otros jugadores hay opiniones que pueden decir lo mismo pero con una altas carga emocional, lo que amplifica su impacto.

  Estas críticas tienen un impacto inconciente en el jugador en forma de _"self fulfilling prophecy"_ ó _"probar lo contrario"_.

  Esto nos afecta  queramos o no, por lo que es mejor evitar opiniones lo más posible y solo disfrutar el juego por lo que es, podemos validar nuestras opiniones luego de terminar el juego.
  ## Original

  [How Game Reviews Actually Affect You](https://youtu.be/8LbLvi9llCI?si=7MMwTZTpCb-mHDH5)

  By [Daryl Talks Games](https://www.youtube.com/@DarylTalksGames)

raw_content:
  ---
  id: f07b145f-4fc5-4acf-99a4-4e3201c009b9
  title: |
    How Game Reviews Actually Affect You
  status: ARCHIVED
  tags:
    - read-later
    - Youtube
  date_added: 2023-10-21 16:01:08
  url_omnivore: |
    https://omnivore.app/me/how-game-reviews-actually-affect-you-18b539cd3a3
  url_original: |
    https://youtu.be/8LbLvi9llCI?si=7MMwTZTpCb-mHDH5
  ---

  # How Game Reviews Actually Affect You

  ## Notes

  Según estudios, los jugadores se ven afectados por reviews que leen/ven, ya sean por críticos o por otros jugadores. Destacar que en ambos casos, pero principalmente en otros jugadores hay opiniones que pueden decir lo mismo pero con una altas carga emocional, lo que amplifica su impacto.

  Estas críticas tienen un impacto inconciente en el jugador en forma de _"self fulfilling prophecy"_ ó _"probar lo contrario"_.

  Esto nos afecta  queramos o no, por lo que es mejor evitar opiniones lo más posible y solo disfrutar el juego por lo que es, podemos validar nuestras opiniones luego de terminar el juego.
  ## Original

  [How Game Reviews Actually Affect You](https://youtu.be/8LbLvi9llCI?si=7MMwTZTpCb-mHDH5)

  By [Daryl Talks Games](https://www.youtube.com/@DarylTalksGames)

metadata:
  {"date_added":"2023-10-21 16:01:08","id":"f07b145f-4fc5-4acf-99a4-4e3201c009b9","status":"ARCHIVED","tags":["read-later","Youtube"],"title":"How Game Reviews Actually Affect You\n","url_omnivore":"https://omnivore.app/me/how-game-reviews-actually-affect-you-18b539cd3a3\n","url_original":"https://youtu.be/8LbLvi9llCI?si=7MMwTZTpCb-mHDH5\n"}


checksum: 9404826ed925052a80e5002171754df81d83438528eebf8fac7143cd0a73fc40
created: 2024-09-15 00:40:56.974770253+00:00
modified: 2024-09-22 22:40:13.392511014+00:00
path:
  Omnivore/2023-10-23 - Study shows stronger brain activity after writing on paper than on tablet or smartph....md

sortable_path:
  Omnivore2023-10-23 - Study shows stronger brain activity after writing on paper than on tablet or smartph....md

title:
  Study shows stronger brain activity after writing on paper than on tablet or smartphone | ScienceDaily

lead:
  # Study shows stronger brain activity after writing on paper than on tablet or smartphone | ScienceDaily

body:
  # Study shows stronger brain activity after writing on paper than on tablet or smartphone | ScienceDaily

  ## Highlights

  "Our take-home message is to use paper notebooks for information we need to learn or memorize," said Sakai. 

  [source](https://omnivore.app/me/study-shows-stronger-brain-activity-after-writing-on-paper-than--18b5cd2abed#1c9a0a5a-c3a9-40d8-a6de-9e986dd27aec) 

  ---

  Researchers say that personalizing digital documents by highlighting, underlining, circling, drawing arrows, handwriting color-coded notes in the margins, adding virtual sticky notes, or other types of unique mark-ups can mimic analog-style spatial enrichment that may enhance memory. 

  [source](https://omnivore.app/me/study-shows-stronger-brain-activity-after-writing-on-paper-than--18b5cd2abed#85a6ad74-1b87-4f32-95b3-f0a549d32089) 

  ---

  Although the current research focused on learning and memorization, the researchers encourage using paper for creative pursuits as well.

  "It is reasonable that one's creativity will likely become more fruitful if prior knowledge is stored with stronger learning and more precisely retrieved from memory. For art, composing music, or other creative works, I would emphasize the use of paper instead of digital methods," said Sakai. 

  [source](https://omnivore.app/me/study-shows-stronger-brain-activity-after-writing-on-paper-than--18b5cd2abed#aeb79efa-7582-4493-94e1-6a7004b5ed80) 

  ---

  ## Original

  FULL STORY

  ---

  A study of Japanese university students and recent graduates has revealed that writing on physical paper can lead to more brain activity when remembering the information an hour later. Researchers say that the unique, complex, spatial and tactile information associated with writing by hand on physical paper is likely what leads to improved memory.

  "Actually, paper is more advanced and useful compared to electronic documents because paper contains more one-of-a-kind information for stronger memory recall," said Professor Kuniyoshi L. Sakai, a neuroscientist at the University of Tokyo and corresponding author of the research recently published in _Frontiers in Behavioral Neuroscience_. The research was completed with collaborators from the NTT Data Institute of Management Consulting.

  Contrary to the popular belief that digital tools increase efficiency, volunteers who used paper completed the note-taking task about 25% faster than those who used digital tablets or smartphones.

  Although volunteers wrote by hand both with pen and paper or stylus and digital tablet, researchers say paper notebooks contain more complex spatial information than digital paper. Physical paper allows for tangible permanence, irregular strokes, and uneven shape, like folded corners. In contrast, digital paper is uniform, has no fixed position when scrolling, and disappears when you close the app.

  =="Our take-home message is to use paper notebooks for information we need to learn or memorize," said Sakai.==

  In the study, a total of 48 volunteers read a fictional conversation between characters discussing their plans for two months in the near future, including 14 different class times, assignment due dates and personal appointments. Researchers performed pre-test analyses to ensure that the volunteers, all 18-29 years old and recruited from university campuses or NTT offices, were equally sorted into three groups based on memory skills, personal preference for digital or analog methods, gender, age and other aspects.

  Volunteers then recorded the fictional schedule using a paper datebook and pen, a calendar app on a digital tablet and a stylus, or a calendar app on a large smartphone and a touch-screen keyboard. There was no time limit and volunteers were asked to record the fictional events in the same way as they would for their real-life schedules, without spending extra time to memorize the schedule.

  After one hour, including a break and an interference task to distract them from thinking about the calendar, volunteers answered a range of simple (When is the assignment due?) and complex (Which is the earlier due date for the assignments?) multiple choice questions to test their memory of the schedule. While they completed the test, volunteers were inside a magnetic resonance imaging (MRI) scanner, which measures blood flow around the brain. This is a technique called functional MRI (fMRI), and increased blood flow observed in a specific region of the brain is a sign of increased neuronal activity in that area.

  Participants who used a paper datebook filled in the calendar within about 11 minutes. Tablet users took 14 minutes and smartphone users took about 16 minutes. Volunteers who used analog methods in their personal life were just as slow at using the devices as volunteers who regularly use digital tools, so researchers are confident that the difference in speed was related to memorization or associated encoding in the brain, not just differences in the habitual use of the tools.

  Volunteers who used analog methods scored better than other volunteers only on simple test questions. However, researchers say that the brain activation data revealed significant differences.

  Volunteers who used paper had more brain activity in areas associated with language, imaginary visualization, and in the hippocampus -- an area known to be important for memory and navigation. Researchers say that the activation of the hippocampus indicates that analog methods contain richer spatial details that can be recalled and navigated in the mind's eye.

  "Digital tools have uniform scrolling up and down and standardized arrangement of text and picture size, like on a webpage. But if you remember a physical textbook printed on paper, you can close your eyes and visualize the photo one-third of the way down on the left-side page, as well as the notes you added in the bottom margin," Sakai explained.

  Researchers say that personalizing digital documents by highlighting, underlining, circling, drawing arrows, handwriting color-coded notes in the margins, adding virtual sticky notes, or other types of unique mark-ups can mimic analog-style spatial enrichment that may enhance memory.

  Although they have no data from younger volunteers, researchers suspect that the difference in brain activation between analog and digital methods is likely to be stronger in younger people.

  "High school students' brains are still developing and are so much more sensitive than adult brains," said Sakai.

  Although the current research focused on learning and memorization, the researchers encourage using paper for creative pursuits as well.

  "It is reasonable that one's creativity will likely become more fruitful if prior knowledge is stored with stronger learning and more precisely retrieved from memory. For art, composing music, or other creative works, I would emphasize the use of paper instead of digital methods," said Sakai.

raw_content:
  ---
  id: bcb6f4ba-cb8e-4e8d-847f-911cda184b83
  title: |
    Study shows stronger brain activity after writing on paper than on tablet or smartphone | ScienceDaily
  status: ARCHIVED
  tags:
    - read-later
  date_added: 2023-10-23 10:56:32
  url_omnivore: |
    https://omnivore.app/me/study-shows-stronger-brain-activity-after-writing-on-paper-than--18b5cd2abed
  url_original: |
    https://www.sciencedaily.com/releases/2021/03/210319080820.htm
  ---

  # Study shows stronger brain activity after writing on paper than on tablet or smartphone | ScienceDaily

  ## Highlights

  "Our take-home message is to use paper notebooks for information we need to learn or memorize," said Sakai. 

  [source](https://omnivore.app/me/study-shows-stronger-brain-activity-after-writing-on-paper-than--18b5cd2abed#1c9a0a5a-c3a9-40d8-a6de-9e986dd27aec) 

  ---

  Researchers say that personalizing digital documents by highlighting, underlining, circling, drawing arrows, handwriting color-coded notes in the margins, adding virtual sticky notes, or other types of unique mark-ups can mimic analog-style spatial enrichment that may enhance memory. 

  [source](https://omnivore.app/me/study-shows-stronger-brain-activity-after-writing-on-paper-than--18b5cd2abed#85a6ad74-1b87-4f32-95b3-f0a549d32089) 

  ---

  Although the current research focused on learning and memorization, the researchers encourage using paper for creative pursuits as well.

  "It is reasonable that one's creativity will likely become more fruitful if prior knowledge is stored with stronger learning and more precisely retrieved from memory. For art, composing music, or other creative works, I would emphasize the use of paper instead of digital methods," said Sakai. 

  [source](https://omnivore.app/me/study-shows-stronger-brain-activity-after-writing-on-paper-than--18b5cd2abed#aeb79efa-7582-4493-94e1-6a7004b5ed80) 

  ---

  ## Original

  FULL STORY

  ---

  A study of Japanese university students and recent graduates has revealed that writing on physical paper can lead to more brain activity when remembering the information an hour later. Researchers say that the unique, complex, spatial and tactile information associated with writing by hand on physical paper is likely what leads to improved memory.

  "Actually, paper is more advanced and useful compared to electronic documents because paper contains more one-of-a-kind information for stronger memory recall," said Professor Kuniyoshi L. Sakai, a neuroscientist at the University of Tokyo and corresponding author of the research recently published in _Frontiers in Behavioral Neuroscience_. The research was completed with collaborators from the NTT Data Institute of Management Consulting.

  Contrary to the popular belief that digital tools increase efficiency, volunteers who used paper completed the note-taking task about 25% faster than those who used digital tablets or smartphones.

  Although volunteers wrote by hand both with pen and paper or stylus and digital tablet, researchers say paper notebooks contain more complex spatial information than digital paper. Physical paper allows for tangible permanence, irregular strokes, and uneven shape, like folded corners. In contrast, digital paper is uniform, has no fixed position when scrolling, and disappears when you close the app.

  =="Our take-home message is to use paper notebooks for information we need to learn or memorize," said Sakai.==

  In the study, a total of 48 volunteers read a fictional conversation between characters discussing their plans for two months in the near future, including 14 different class times, assignment due dates and personal appointments. Researchers performed pre-test analyses to ensure that the volunteers, all 18-29 years old and recruited from university campuses or NTT offices, were equally sorted into three groups based on memory skills, personal preference for digital or analog methods, gender, age and other aspects.

  Volunteers then recorded the fictional schedule using a paper datebook and pen, a calendar app on a digital tablet and a stylus, or a calendar app on a large smartphone and a touch-screen keyboard. There was no time limit and volunteers were asked to record the fictional events in the same way as they would for their real-life schedules, without spending extra time to memorize the schedule.

  After one hour, including a break and an interference task to distract them from thinking about the calendar, volunteers answered a range of simple (When is the assignment due?) and complex (Which is the earlier due date for the assignments?) multiple choice questions to test their memory of the schedule. While they completed the test, volunteers were inside a magnetic resonance imaging (MRI) scanner, which measures blood flow around the brain. This is a technique called functional MRI (fMRI), and increased blood flow observed in a specific region of the brain is a sign of increased neuronal activity in that area.

  Participants who used a paper datebook filled in the calendar within about 11 minutes. Tablet users took 14 minutes and smartphone users took about 16 minutes. Volunteers who used analog methods in their personal life were just as slow at using the devices as volunteers who regularly use digital tools, so researchers are confident that the difference in speed was related to memorization or associated encoding in the brain, not just differences in the habitual use of the tools.

  Volunteers who used analog methods scored better than other volunteers only on simple test questions. However, researchers say that the brain activation data revealed significant differences.

  Volunteers who used paper had more brain activity in areas associated with language, imaginary visualization, and in the hippocampus -- an area known to be important for memory and navigation. Researchers say that the activation of the hippocampus indicates that analog methods contain richer spatial details that can be recalled and navigated in the mind's eye.

  "Digital tools have uniform scrolling up and down and standardized arrangement of text and picture size, like on a webpage. But if you remember a physical textbook printed on paper, you can close your eyes and visualize the photo one-third of the way down on the left-side page, as well as the notes you added in the bottom margin," Sakai explained.

  Researchers say that personalizing digital documents by highlighting, underlining, circling, drawing arrows, handwriting color-coded notes in the margins, adding virtual sticky notes, or other types of unique mark-ups can mimic analog-style spatial enrichment that may enhance memory.

  Although they have no data from younger volunteers, researchers suspect that the difference in brain activation between analog and digital methods is likely to be stronger in younger people.

  "High school students' brains are still developing and are so much more sensitive than adult brains," said Sakai.

  Although the current research focused on learning and memorization, the researchers encourage using paper for creative pursuits as well.

  "It is reasonable that one's creativity will likely become more fruitful if prior knowledge is stored with stronger learning and more precisely retrieved from memory. For art, composing music, or other creative works, I would emphasize the use of paper instead of digital methods," said Sakai.

metadata:
  {"date_added":"2023-10-23 10:56:32","id":"bcb6f4ba-cb8e-4e8d-847f-911cda184b83","status":"ARCHIVED","tags":["read-later"],"title":"Study shows stronger brain activity after writing on paper than on tablet or smartphone | ScienceDaily\n","url_omnivore":"https://omnivore.app/me/study-shows-stronger-brain-activity-after-writing-on-paper-than--18b5cd2abed\n","url_original":"https://www.sciencedaily.com/releases/2021/03/210319080820.htm\n"}


path: Omnivore/2023-10-23 - Train Your Brain to Be More Creative.md
sortable_path: Omnivore2023-10-23 - Train Your Brain to Be More Creative.md
title: Train Your Brain to Be More Creative
lead: # Train Your Brain to Be More Creative
checksum: 3c90e08eadc1ab874c470867674ea17882c99fde3037711bd528b34a2452d51b
created: 2024-09-15 00:40:57.01151188+00:00
modified: 2024-09-22 22:40:13.392511014+00:00
body:
  # Train Your Brain to Be More Creative

  ## Highlights

  ## **Engage with nature**

  It’s been proven that [spending time in nature](https://greatergood.berkeley.edu/article/item/how%5Fnature%5Fmakes%5Fyou%5Fkinder%5Fhappier%5Fmore%5Fcreative) makes us more creative. Looking at trees and leaves — instead of our electronic devices — reduces our anxiety, lowers our heart rates, soothes us, and allows our brains to make [connections more easily](https://bjsm.bmj.com/content/49/4/272.abstract?sid=56b97a4c-0e75-46d0-a6ba-41c7f41a089c).

  By spending time in nature, I’m not referring to a trek in the wilderness either. Walking in an urban green space for just 25 minutes can quiet our brains and help us switch into autopilot node. According to the [_British Journal of Sports Medicine_](https://bjsm.bmj.com/content/49/4/272?sid=56b97a4c-0e75-46d0-a6ba-41c7f41a089c), this state sparks our present awareness and fuels imagination. We are more easily able to connect existing notions, thoughts, and images to form a new, relevant, and useable concept. 

  [source](https://omnivore.app/me/train-your-brain-to-be-more-creative-18b5cd2a390#9190b653-c9fe-4438-b02d-10ac2095ecd1) 

  ---

  You may have heard that creativity uses your right brain while your left brain is triggered during more analytical tasks. Well, [neuroscientists have found](https://www.livescience.com/39671-roots-of-creativity-found-in-brain.html) that creativity actually draws on your _entire_ brain — and meditation can you give you access to it. 

  [source](https://omnivore.app/me/train-your-brain-to-be-more-creative-18b5cd2a390#6b9b547e-2d87-4b4e-8fb5-76c0fe82be37) 

  ---

  Try to add workout time on your calendar and make sure not to skip it. If you feel you don’t have time for a dedicated workout, block 20 minutes on your calendar and spend that time doing stretches at your desk. 

  [source](https://omnivore.app/me/train-your-brain-to-be-more-creative-18b5cd2a390#339a25cd-d9b8-4c5c-90bb-34f31965dea8) 

  ---

  ## Original

  [ ![](https://proxy-prod.omnivore-image-cache.app/0x0,soxosZVFQZnXwxzP9rgu_9TRZBUG3bjD3lZNejHcEJZc/https://hbr.org/resources/css/images/ascend/Ascend-Landing-FINAL.png) ](https://hbr.org/ascend) 

  Where your work meets your life.

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,sMVn7kBr4jEHmNBxbTdR1-qfuR5jP7cDJsmkVG0w5jRY/https://hbr.org/resources/images/article_assets/2021/06/A_Jun21_16_1255250589.jpg)

  Anastasia Usenko/Getty Images 

  Creativity isn’t inherent. You have to hone it. Here are a few ways to do that, based on neuroscience. Engage with nature: Looking at trees and leaves, instead of our electronic devices, reduces our anxiety, lowers our heart rates, soothes us, and allows our brains to... 

  [![Ascend logo](https://proxy-prod.omnivore-image-cache.app/105x20,sdbRjRBiTtM89dGr0O-MZ2bZF4PuOMPYm7J_ky4ZT0M4/https://hbr.org/resources/images/article_assets/2020/10/Ascend_Logo_2020_2x.png)](https://hbr.org/insight-center/ascend)

  Where your work meets your life. See more from Ascend [here](https://hbr.org/insight-center/ascend).

  I don’t do ruts.

  Not because I’m some brilliant creative, but because I’ve learned how my brain works. Your brain needs fuel, and it needs to be stretched to create those “OMG!” moments on demand.

  Think about it. Great athletes train their bodies for days, weeks, and years to whip them into peak performance. Why, then, wouldn’t a creator do the same with their brain?

  I’ve spent more than two decades (and counting) in the advertising industry, and contrary to popular belief, creativity isn’t inherent. You have to hone it. Over time, I’ve figured out what I need to do to get ideas flowing freely, and a lot of that insight comes from my interest in neuroscience. The more we learn about the workings of our gray matter, the better we can train it, control it, and make it do what we want.

  Here a few things that have worked for me over the years.

  ## **==Engage with nature==**

  ==It’s been proven that== ==[spending time in nature](https://greatergood.berkeley.edu/article/item/how%5Fnature%5Fmakes%5Fyou%5Fkinder%5Fhappier%5Fmore%5Fcreative)== ==makes us more creative. Looking at trees and leaves — instead of our electronic devices — reduces our anxiety, lowers our heart rates, soothes us, and allows our brains to make== ==[connections more easily](https://bjsm.bmj.com/content/49/4/272.abstract?sid=56b97a4c-0e75-46d0-a6ba-41c7f41a089c)====.==

  ==By spending time in nature, I’m not referring to a trek in the wilderness either. Walking in an urban green space for just 25 minutes can quiet our brains and help us switch into autopilot node. According to the== [_British Journal of Sports Medicine_](https://bjsm.bmj.com/content/49/4/272?sid=56b97a4c-0e75-46d0-a6ba-41c7f41a089c)==, this state sparks our present awareness and fuels imagination. We are more easily able to connect existing notions, thoughts, and images to form a new, relevant, and useable concept.==

  So make disconnecting a priority. Take a walk in your neighborhood park, stroll along the beach, or just add plants to your balcony and spend some time out there. For me, walking my dog — even when my name is not on the family schedule — works. You’ll feel the benefits of moving away from screens almost immediately.

  ## **Meditate** 

  I know, I know, you’ve heard this a million times: [Meditation](https://www.frontiersin.org/articles/10.3389/fpsyg.2013.01020/full) clears our minds of jumbled thoughts, and gives our brains the space to observe and reflect, improving task concentration and enhancing our ability to make smart decisions.

  But did you know that meditation also puts the entire brain to work?

  ==You may have heard that creativity uses your right brain while your left brain is triggered during more analytical tasks. Well,== ==[neuroscientists have found](https://www.livescience.com/39671-roots-of-creativity-found-in-brain.html)== ==that creativity actually draws on your== _==entire==_ ==brain — and meditation can you give you access to it.==

  This intentional practice can be as simple as closing your eyes and focusing on your breath. Headspace, the popular meditation app, even has guided meditations for inspiring creativity. The idea is that when we intentionally pause in awareness, [we allow our minds the freedom and space to be still and creative](https://www.headspace.com/meditation/creativity). I practice this between meetings. I find a quiet space, focus on my breathing, and get my brain into an alpha state, or a wakeful state of relaxation. This allows me to disconnect from my initial ideas (after all, the human brain is hardwired to take the path of least resistance) and create new pathways in my mind.

  ## **Get moving**

  [Steve Jobs](https://financialpost.com/executive/c-suite/steve-jobs-was-right-about-walking) was a big advocate for walking meetings for a reason. Moving around [has been linked to increased performance](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC1332529/pdf/brjsmed00003-0076.pdf) on creative tests. Exercising releases endorphins — chemicals our bodies produce to relieve stress and pain. When we are less stressed, our brains venture into more fruitful territory.

  In fact, [a recent article](https://www.irishexaminer.com/lifestyle/healthandwellbeing/arid-40251431.html) compared the chemical that our brain releases during physical activity to Miracle-Gro, the water-soluble plant food that helps grow bigger, healthier plants. The good part is moving around is super simple to do, especially when you’re working at home. I often attend meetings while cycling on a stationary bike or plan short walks in between (and this can be done in an office too).

  ==Try to add workout time on your calendar and make sure not to skip it. If you feel you don’t have time for a dedicated workout, block 20 minutes on your calendar and spend that time doing stretches at your desk.==

  Find a routine that works for you.

   Ascend 

   Career and life advice for young professionals. 

  ## **Connect with different kinds of people**

  When consciously seeking inspiration, not enough can be said about diversity. Remember the brain and its predisposition to take the lazy way out? Diversity makes the brain work harder [by challenging stereotypes.](https://www.theguardian.com/lifeandstyle/2015/nov/01/diversity-good-for-your-brain-mind-multicultural) In addition, researchers at Johns Hopkins University [found](https://muse.jhu.edu/article/536530/summary) that “exposure to diversity experiences might foster the development of more complex forms of thought, including the ability to think critically.”

  I make it a point to surround myself with people who come from different backgrounds than I do because their perspectives are a catalyst for creative thinking. Contrasting opinions sparks new possibilities, and allow us to make connections we hadn’t seen before, leading to better decisions. There was something to be said about Abraham Lincoln filling his cabinet with [a “team of rivals.”](https://bigthink.com/in-their-own-words/you-can-be-your-own-team-of-rivals) Productive discussions, brainstorms, and debates often result in wiser outcomes. At my agency, we’ve set up an “inspiration council,” which brings together our people from various regions, cultures, genders, and more, to initiate these kind of discussions.

  Today, the distributed working model born out of the pandemic has made it even easier to bring people together. I recommend using social media channels like LinkedIn and Instagram to follow and connect with people who have backgrounds and experiences that diverge from your own. Don’t limit yourself by geography when you’re reaching out to someone or expanding your network. We are much better at creative problem-solving when we don’t have the comfort of knowing what to expect, which can happen if we only surround ourselves with people just like us.

  Use these principles of neuroscience to give your brain the exercise that it needs. It will get you out of any rut. Or prevent you from getting into one in the first place.

  #### Readers Also Viewed These Items

  * [Bas Korsten](https://hbr.org/search?term=bas%20korsten&search%5Ftype=search-all) is the Global Chief Creative Officer at Wunderman Thompson.

raw_content:
  ---
  id: 6f1925bb-b86c-40d2-9363-6784aa2d402f
  title: |
    Train Your Brain to Be More Creative
  status: ARCHIVED
  tags:
    - read-later
  date_added: 2023-10-23 10:56:30
  url_omnivore: |
    https://omnivore.app/me/train-your-brain-to-be-more-creative-18b5cd2a390
  url_original: |
    https://hbr.org/2021/06/train-your-brain-to-be-more-creative
  ---

  # Train Your Brain to Be More Creative

  ## Highlights

  ## **Engage with nature**

  It’s been proven that [spending time in nature](https://greatergood.berkeley.edu/article/item/how%5Fnature%5Fmakes%5Fyou%5Fkinder%5Fhappier%5Fmore%5Fcreative) makes us more creative. Looking at trees and leaves — instead of our electronic devices — reduces our anxiety, lowers our heart rates, soothes us, and allows our brains to make [connections more easily](https://bjsm.bmj.com/content/49/4/272.abstract?sid=56b97a4c-0e75-46d0-a6ba-41c7f41a089c).

  By spending time in nature, I’m not referring to a trek in the wilderness either. Walking in an urban green space for just 25 minutes can quiet our brains and help us switch into autopilot node. According to the [_British Journal of Sports Medicine_](https://bjsm.bmj.com/content/49/4/272?sid=56b97a4c-0e75-46d0-a6ba-41c7f41a089c), this state sparks our present awareness and fuels imagination. We are more easily able to connect existing notions, thoughts, and images to form a new, relevant, and useable concept. 

  [source](https://omnivore.app/me/train-your-brain-to-be-more-creative-18b5cd2a390#9190b653-c9fe-4438-b02d-10ac2095ecd1) 

  ---

  You may have heard that creativity uses your right brain while your left brain is triggered during more analytical tasks. Well, [neuroscientists have found](https://www.livescience.com/39671-roots-of-creativity-found-in-brain.html) that creativity actually draws on your _entire_ brain — and meditation can you give you access to it. 

  [source](https://omnivore.app/me/train-your-brain-to-be-more-creative-18b5cd2a390#6b9b547e-2d87-4b4e-8fb5-76c0fe82be37) 

  ---

  Try to add workout time on your calendar and make sure not to skip it. If you feel you don’t have time for a dedicated workout, block 20 minutes on your calendar and spend that time doing stretches at your desk. 

  [source](https://omnivore.app/me/train-your-brain-to-be-more-creative-18b5cd2a390#339a25cd-d9b8-4c5c-90bb-34f31965dea8) 

  ---

  ## Original

  [ ![](https://proxy-prod.omnivore-image-cache.app/0x0,soxosZVFQZnXwxzP9rgu_9TRZBUG3bjD3lZNejHcEJZc/https://hbr.org/resources/css/images/ascend/Ascend-Landing-FINAL.png) ](https://hbr.org/ascend) 

  Where your work meets your life.

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,sMVn7kBr4jEHmNBxbTdR1-qfuR5jP7cDJsmkVG0w5jRY/https://hbr.org/resources/images/article_assets/2021/06/A_Jun21_16_1255250589.jpg)

  Anastasia Usenko/Getty Images 

  Creativity isn’t inherent. You have to hone it. Here are a few ways to do that, based on neuroscience. Engage with nature: Looking at trees and leaves, instead of our electronic devices, reduces our anxiety, lowers our heart rates, soothes us, and allows our brains to... 

  [![Ascend logo](https://proxy-prod.omnivore-image-cache.app/105x20,sdbRjRBiTtM89dGr0O-MZ2bZF4PuOMPYm7J_ky4ZT0M4/https://hbr.org/resources/images/article_assets/2020/10/Ascend_Logo_2020_2x.png)](https://hbr.org/insight-center/ascend)

  Where your work meets your life. See more from Ascend [here](https://hbr.org/insight-center/ascend).

  I don’t do ruts.

  Not because I’m some brilliant creative, but because I’ve learned how my brain works. Your brain needs fuel, and it needs to be stretched to create those “OMG!” moments on demand.

  Think about it. Great athletes train their bodies for days, weeks, and years to whip them into peak performance. Why, then, wouldn’t a creator do the same with their brain?

  I’ve spent more than two decades (and counting) in the advertising industry, and contrary to popular belief, creativity isn’t inherent. You have to hone it. Over time, I’ve figured out what I need to do to get ideas flowing freely, and a lot of that insight comes from my interest in neuroscience. The more we learn about the workings of our gray matter, the better we can train it, control it, and make it do what we want.

  Here a few things that have worked for me over the years.

  ## **==Engage with nature==**

  ==It’s been proven that== ==[spending time in nature](https://greatergood.berkeley.edu/article/item/how%5Fnature%5Fmakes%5Fyou%5Fkinder%5Fhappier%5Fmore%5Fcreative)== ==makes us more creative. Looking at trees and leaves — instead of our electronic devices — reduces our anxiety, lowers our heart rates, soothes us, and allows our brains to make== ==[connections more easily](https://bjsm.bmj.com/content/49/4/272.abstract?sid=56b97a4c-0e75-46d0-a6ba-41c7f41a089c)====.==

  ==By spending time in nature, I’m not referring to a trek in the wilderness either. Walking in an urban green space for just 25 minutes can quiet our brains and help us switch into autopilot node. According to the== [_British Journal of Sports Medicine_](https://bjsm.bmj.com/content/49/4/272?sid=56b97a4c-0e75-46d0-a6ba-41c7f41a089c)==, this state sparks our present awareness and fuels imagination. We are more easily able to connect existing notions, thoughts, and images to form a new, relevant, and useable concept.==

  So make disconnecting a priority. Take a walk in your neighborhood park, stroll along the beach, or just add plants to your balcony and spend some time out there. For me, walking my dog — even when my name is not on the family schedule — works. You’ll feel the benefits of moving away from screens almost immediately.

  ## **Meditate** 

  I know, I know, you’ve heard this a million times: [Meditation](https://www.frontiersin.org/articles/10.3389/fpsyg.2013.01020/full) clears our minds of jumbled thoughts, and gives our brains the space to observe and reflect, improving task concentration and enhancing our ability to make smart decisions.

  But did you know that meditation also puts the entire brain to work?

  ==You may have heard that creativity uses your right brain while your left brain is triggered during more analytical tasks. Well,== ==[neuroscientists have found](https://www.livescience.com/39671-roots-of-creativity-found-in-brain.html)== ==that creativity actually draws on your== _==entire==_ ==brain — and meditation can you give you access to it.==

  This intentional practice can be as simple as closing your eyes and focusing on your breath. Headspace, the popular meditation app, even has guided meditations for inspiring creativity. The idea is that when we intentionally pause in awareness, [we allow our minds the freedom and space to be still and creative](https://www.headspace.com/meditation/creativity). I practice this between meetings. I find a quiet space, focus on my breathing, and get my brain into an alpha state, or a wakeful state of relaxation. This allows me to disconnect from my initial ideas (after all, the human brain is hardwired to take the path of least resistance) and create new pathways in my mind.

  ## **Get moving**

  [Steve Jobs](https://financialpost.com/executive/c-suite/steve-jobs-was-right-about-walking) was a big advocate for walking meetings for a reason. Moving around [has been linked to increased performance](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC1332529/pdf/brjsmed00003-0076.pdf) on creative tests. Exercising releases endorphins — chemicals our bodies produce to relieve stress and pain. When we are less stressed, our brains venture into more fruitful territory.

  In fact, [a recent article](https://www.irishexaminer.com/lifestyle/healthandwellbeing/arid-40251431.html) compared the chemical that our brain releases during physical activity to Miracle-Gro, the water-soluble plant food that helps grow bigger, healthier plants. The good part is moving around is super simple to do, especially when you’re working at home. I often attend meetings while cycling on a stationary bike or plan short walks in between (and this can be done in an office too).

  ==Try to add workout time on your calendar and make sure not to skip it. If you feel you don’t have time for a dedicated workout, block 20 minutes on your calendar and spend that time doing stretches at your desk.==

  Find a routine that works for you.

   Ascend 

   Career and life advice for young professionals. 

  ## **Connect with different kinds of people**

  When consciously seeking inspiration, not enough can be said about diversity. Remember the brain and its predisposition to take the lazy way out? Diversity makes the brain work harder [by challenging stereotypes.](https://www.theguardian.com/lifeandstyle/2015/nov/01/diversity-good-for-your-brain-mind-multicultural) In addition, researchers at Johns Hopkins University [found](https://muse.jhu.edu/article/536530/summary) that “exposure to diversity experiences might foster the development of more complex forms of thought, including the ability to think critically.”

  I make it a point to surround myself with people who come from different backgrounds than I do because their perspectives are a catalyst for creative thinking. Contrasting opinions sparks new possibilities, and allow us to make connections we hadn’t seen before, leading to better decisions. There was something to be said about Abraham Lincoln filling his cabinet with [a “team of rivals.”](https://bigthink.com/in-their-own-words/you-can-be-your-own-team-of-rivals) Productive discussions, brainstorms, and debates often result in wiser outcomes. At my agency, we’ve set up an “inspiration council,” which brings together our people from various regions, cultures, genders, and more, to initiate these kind of discussions.

  Today, the distributed working model born out of the pandemic has made it even easier to bring people together. I recommend using social media channels like LinkedIn and Instagram to follow and connect with people who have backgrounds and experiences that diverge from your own. Don’t limit yourself by geography when you’re reaching out to someone or expanding your network. We are much better at creative problem-solving when we don’t have the comfort of knowing what to expect, which can happen if we only surround ourselves with people just like us.

  Use these principles of neuroscience to give your brain the exercise that it needs. It will get you out of any rut. Or prevent you from getting into one in the first place.

  #### Readers Also Viewed These Items

  * [Bas Korsten](https://hbr.org/search?term=bas%20korsten&search%5Ftype=search-all) is the Global Chief Creative Officer at Wunderman Thompson.

metadata:
  {"date_added":"2023-10-23 10:56:30","id":"6f1925bb-b86c-40d2-9363-6784aa2d402f","status":"ARCHIVED","tags":["read-later"],"title":"Train Your Brain to Be More Creative\n","url_omnivore":"https://omnivore.app/me/train-your-brain-to-be-more-creative-18b5cd2a390\n","url_original":"https://hbr.org/2021/06/train-your-brain-to-be-more-creative\n"}


path: Omnivore/2023-10-25 - Let's Get Webby! 🦀 🕸️.md
sortable_path: Omnivore2023-10-25 - Let's Get Webby! 🦀 🕸️.md
title: Let's Get Webby! 🦀 🕸️
lead: # Let's Get Webby! 🦀 🕸️
checksum: 6eeb43636bce2a42dea6e86c61052f62b75ba2f88d71750fe9ef1507b38b018f
created: 2024-09-15 00:40:57.043759283+00:00
modified: 2024-09-22 22:40:13.392511014+00:00
body:
  # Let's Get Webby! 🦀 🕸️

  ## Highlights

  ...and front-end frameworks like [Yew](https://letsgetrusty.krtra.com/c/y9r3LFJzeRCp/OQKy) and [Seed](https://letsgetrusty.krtra.com/c/mN30voJhWLXc/OQKy) letting you write web apps in Rust! 

  > [!note]
  > I can create front end web apps with this libraries

  [source](https://omnivore.app/me/let-s-get-webby-18b6705008a#7065ade5-765c-4d60-bd89-1ecb0d919389) 

  ---

  ## Original

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,s4bBfm-ltnUNFUa4ETTgSxP2wMeHZVVuOj5N9oi2Ba2I/https://kartrausers.s3.amazonaws.com/letsgetrusty/25597207_1643064007NFuWebsite_Header.png) 

  Hey Alexander,

  JavaScript isn't the fastest language out there.

  In fact, it's **pretty dang slow** compared to C/C++!

  Unfortunately, this limits the type of web apps we could build.

  How great would it be if we could write code that runs **at native speeds** in the browser?

  This would allow computationally intensive apps like video editors, AAA games, and IDEs to be run in the browser!

  Great news... **this is possible today** with the help of WebAssembly.

  WebAssembly or WASM for short, is a technology that allows code written in languages such as C/C++, Java, Swift, and Rust to run in the browser at native speeds!

  **And Rust has first-class support for WASM!** 

  With crates such as [wasm-bindgen ](https://letsgetrusty.krtra.com/c/Fv1n9JiwhxdT/OQKy)facilitating high-level interactions between Rust and JavaScript...  

  ==...and front-end frameworks like== ==[Yew](https://letsgetrusty.krtra.com/c/y9r3LFJzeRCp/OQKy)== ==and== ==[Seed](https://letsgetrusty.krtra.com/c/mN30voJhWLXc/OQKy)== ==letting you write web apps in Rust!==  

  Are you ready to give Rust + WASM a try?

  Check out this video I made: **[\>> Building a Rust App with Yew! <<](https://letsgetrusty.krtra.com/c/6AUVThScIsa4/OQKy)**

  Have you built any WASM projects in Rust? Let me know!

  Stay Rusty my friend!

  Bogdan, Let's Get Rusty

  **[Website](https://letsgetrusty.krtra.com/c/FBKvcPOtTzlF/OQKy)** | **[YouTube](https://letsgetrusty.krtra.com/c/4KIGD3ocszdT/OQKy)**

  © Copyrights by Let's Get Rusty. All Rights Reserved.

raw_content:
  ---
  id: 46eadaec-733a-11ee-aae2-4b1c5b8d8405
  title: |
    Let's Get Webby! 🦀 🕸️
  status: ARCHIVED
  tags:
    - read-later
    - Newsletter
  date_added: 2023-10-25 10:27:43
  url_omnivore: |
    https://omnivore.app/me/let-s-get-webby-18b6705008a
  url_original: |
    https://omnivore.app/no_url?q=bec70357-3199-44e0-9c84-40dd5a7bf774
  ---

  # Let's Get Webby! 🦀 🕸️

  ## Highlights

  ...and front-end frameworks like [Yew](https://letsgetrusty.krtra.com/c/y9r3LFJzeRCp/OQKy) and [Seed](https://letsgetrusty.krtra.com/c/mN30voJhWLXc/OQKy) letting you write web apps in Rust! 

  > [!note]
  > I can create front end web apps with this libraries

  [source](https://omnivore.app/me/let-s-get-webby-18b6705008a#7065ade5-765c-4d60-bd89-1ecb0d919389) 

  ---

  ## Original

  ![](https://proxy-prod.omnivore-image-cache.app/0x0,s4bBfm-ltnUNFUa4ETTgSxP2wMeHZVVuOj5N9oi2Ba2I/https://kartrausers.s3.amazonaws.com/letsgetrusty/25597207_1643064007NFuWebsite_Header.png) 

  Hey Alexander,

  JavaScript isn't the fastest language out there.

  In fact, it's **pretty dang slow** compared to C/C++!

  Unfortunately, this limits the type of web apps we could build.

  How great would it be if we could write code that runs **at native speeds** in the browser?

  This would allow computationally intensive apps like video editors, AAA games, and IDEs to be run in the browser!

  Great news... **this is possible today** with the help of WebAssembly.

  WebAssembly or WASM for short, is a technology that allows code written in languages such as C/C++, Java, Swift, and Rust to run in the browser at native speeds!

  **And Rust has first-class support for WASM!** 

  With crates such as [wasm-bindgen ](https://letsgetrusty.krtra.com/c/Fv1n9JiwhxdT/OQKy)facilitating high-level interactions between Rust and JavaScript...  

  ==...and front-end frameworks like== ==[Yew](https://letsgetrusty.krtra.com/c/y9r3LFJzeRCp/OQKy)== ==and== ==[Seed](https://letsgetrusty.krtra.com/c/mN30voJhWLXc/OQKy)== ==letting you write web apps in Rust!==  

  Are you ready to give Rust + WASM a try?

  Check out this video I made: **[\>> Building a Rust App with Yew! <<](https://letsgetrusty.krtra.com/c/6AUVThScIsa4/OQKy)**

  Have you built any WASM projects in Rust? Let me know!

  Stay Rusty my friend!

  Bogdan, Let's Get Rusty

  **[Website](https://letsgetrusty.krtra.com/c/FBKvcPOtTzlF/OQKy)** | **[YouTube](https://letsgetrusty.krtra.com/c/4KIGD3ocszdT/OQKy)**

  © Copyrights by Let's Get Rusty. All Rights Reserved.

metadata:
  {"date_added":"2023-10-25 10:27:43","id":"46eadaec-733a-11ee-aae2-4b1c5b8d8405","status":"ARCHIVED","tags":["read-later","Newsletter"],"title":"Let's Get Webby! 🦀 🕸️\n","url_omnivore":"https://omnivore.app/me/let-s-get-webby-18b6705008a\n","url_original":"https://omnivore.app/no_url?q=bec70357-3199-44e0-9c84-40dd5a7bf774\n"}


path: Omnivore/2023-10-25 - What the Rust Book didn't tell you about testing....md
sortable_path: Omnivore2023-10-25 - What the Rust Book didn't tell you about testing....md
title: What the Rust Book didn't tell you about testing...
lead: # What the Rust Book didn't tell you about testing...
checksum: 8e5b761d7243d0a2669c4f3d29106847e8c14fe8b9293ebbb6273554063b5c9e
created: 2024-09-15 00:40:57.075625849+00:00
modified: 2024-09-22 22:40:13.392511014+00:00
body:
  # What the Rust Book didn't tell you about testing...

  ## Highlights

  We want to test _get\_user_ without making real database queries.

  The solution is to mock the _Database_ trait and assert _execute\_query_ is called with the correct query. But how?

  We can use the [mockall crate](https://letsgetrusty.us6.list-manage.com/track/click?u=9f28b35c1658c447f3b962a54&id=00a07042b3&e=d0eb971086)! 

  [source](https://omnivore.app/me/what-the-rust-book-didn-t-tell-you-about-testing-18b6707a120#f9650419-c778-4974-9da2-aabce209609f) 

  ---

  ## Original

    
  The Rust Book has an [entire chapter dedicated to testing](https://letsgetrusty.us6.list-manage.com/track/click?u=9f28b35c1658c447f3b962a54&id=a95a715235&e=d0eb971086), but it's missing a critical piece…

  What happens when your code needs to make API calls or database queries?

  Unit tests should be be fast, reliable, and deterministic.

  We don't want to make expensive calls that might fail for various reasons.

    
  Well here is some good news… we don't have to!

  We can use mocking to substitute real objects for mock objects and assert certain expectations…

  What's that? You want an example? Consider the following code…

  trait Database {
      fn execute_query(&self, query: String);
  }

  fn get_user(db: impl Database, id: i32) {
      let query = format!("SELECT * from Users where id={}", id);
      db.execute_query(query);
  }
  We want to test _get\_user_ without making real database queries.

  The solution is to mock the _Database_ trait and assert _execute\_query_ is called with the correct query. But how?

  We can use the [mockall crate](https://letsgetrusty.us6.list-manage.com/track/click?u=9f28b35c1658c447f3b962a54&id=00a07042b3&e=d0eb971086)!

  Here is how we would test _get\_user_…

  #[cfg(test)]
  use mockall::{automock, predicate::*};

  #[cfg_attr(test, automock)]
  trait Database {
      fn execute_query(&self, query: String);
  }

  fn get_user(db: impl Database, id: i32) {
      let query = format!("SELECT * from Users where id={}", id);
      db.execute_query(query);
  }

  #[cfg(test)]
  mod tests {
      use super::*;

      #[test]
      fn get_user_executes_correct_query() {
          let mut mock_database = MockDatabase::new();
          mock_database.expect_execute_query()
              .with(eq("SELECT * from Users where id=22".to_owned()))
              .once()
              .returning(|_x| ());

          get_user(mock_database, 22);
      }
  }
  Boom! Now we have a unit test that's fast, reliable, and deterministic!

  If you haven't seen my [intro to testing in Rust video](https://letsgetrusty.us6.list-manage.com/track/click?u=9f28b35c1658c447f3b962a54&id=90d4167901&e=d0eb971086) make sure to check it out!  
    
    
  Happy testing, and stay Rusty!

raw_content:
  ---
  id: ad8a0732-733a-11ee-b2ab-13f1d6012322
  title: |
    What the Rust Book didn't tell you about testing...
  status: ARCHIVED
  tags:
    - read-later
    - Newsletter
  date_added: 2023-10-25 10:30:35
  url_omnivore: |
    https://omnivore.app/me/what-the-rust-book-didn-t-tell-you-about-testing-18b6707a120
  url_original: |
    https://omnivore.app/no_url?q=1fed5fd7-7706-46cf-9947-927b26a77112
  ---

  # What the Rust Book didn't tell you about testing...

  ## Highlights

  We want to test _get\_user_ without making real database queries.

  The solution is to mock the _Database_ trait and assert _execute\_query_ is called with the correct query. But how?

  We can use the [mockall crate](https://letsgetrusty.us6.list-manage.com/track/click?u=9f28b35c1658c447f3b962a54&id=00a07042b3&e=d0eb971086)! 

  [source](https://omnivore.app/me/what-the-rust-book-didn-t-tell-you-about-testing-18b6707a120#f9650419-c778-4974-9da2-aabce209609f) 

  ---

  ## Original

    
  The Rust Book has an [entire chapter dedicated to testing](https://letsgetrusty.us6.list-manage.com/track/click?u=9f28b35c1658c447f3b962a54&id=a95a715235&e=d0eb971086), but it's missing a critical piece…

  What happens when your code needs to make API calls or database queries?

  Unit tests should be be fast, reliable, and deterministic.

  We don't want to make expensive calls that might fail for various reasons.

    
  Well here is some good news… we don't have to!

  We can use mocking to substitute real objects for mock objects and assert certain expectations…

  What's that? You want an example? Consider the following code…

  trait Database {
      fn execute_query(&self, query: String);
  }

  fn get_user(db: impl Database, id: i32) {
      let query = format!("SELECT * from Users where id={}", id);
      db.execute_query(query);
  }
  We want to test _get\_user_ without making real database queries.

  The solution is to mock the _Database_ trait and assert _execute\_query_ is called with the correct query. But how?

  We can use the [mockall crate](https://letsgetrusty.us6.list-manage.com/track/click?u=9f28b35c1658c447f3b962a54&id=00a07042b3&e=d0eb971086)!

  Here is how we would test _get\_user_…

  #[cfg(test)]
  use mockall::{automock, predicate::*};

  #[cfg_attr(test, automock)]
  trait Database {
      fn execute_query(&self, query: String);
  }

  fn get_user(db: impl Database, id: i32) {
      let query = format!("SELECT * from Users where id={}", id);
      db.execute_query(query);
  }

  #[cfg(test)]
  mod tests {
      use super::*;

      #[test]
      fn get_user_executes_correct_query() {
          let mut mock_database = MockDatabase::new();
          mock_database.expect_execute_query()
              .with(eq("SELECT * from Users where id=22".to_owned()))
              .once()
              .returning(|_x| ());

          get_user(mock_database, 22);
      }
  }
  Boom! Now we have a unit test that's fast, reliable, and deterministic!

  If you haven't seen my [intro to testing in Rust video](https://letsgetrusty.us6.list-manage.com/track/click?u=9f28b35c1658c447f3b962a54&id=90d4167901&e=d0eb971086) make sure to check it out!  
    
    
  Happy testing, and stay Rusty! 

metadata:
  {"date_added":"2023-10-25 10:30:35","id":"ad8a0732-733a-11ee-b2ab-13f1d6012322","status":"ARCHIVED","tags":["read-later","Newsletter"],"title":"What the Rust Book didn't tell you about testing...\n","url_omnivore":"https://omnivore.app/me/what-the-rust-book-didn-t-tell-you-about-testing-18b6707a120\n","url_original":"https://omnivore.app/no_url?q=1fed5fd7-7706-46cf-9947-927b26a77112\n"}


path: Omnivore/2023-10-31 - Use cases for Rust.md
sortable_path: Omnivore2023-10-31 - Use cases for Rust.md
title: Use cases for Rust
lead: # Use cases for Rust
checksum: 3f70f0dfadbad50a0d53961989f6100cfdf43e446b02a29ac54cebadb9b2c8f2
created: 2024-09-15 00:40:57.103764289+00:00
modified: 2024-09-22 22:40:13.392511014+00:00
body:
  # Use cases for Rust

  ## Highlights

  Some popular server-side web frameworks written in Rust include Actix Web, Warp, and Axum. 

  [source](https://omnivore.app/me/use-cases-for-rust-18b85df6f3a#64793bd7-d3bd-4597-9f2c-9b4697217661) 

  ---

  ## Original

  ![](https://proxy-prod.omnivore-image-cache.app/374x0,sWwbkQPNcQS05Cyma-JsPnEwyj7_G5D8tak-9k2Pm7g8/https://kartrausers.s3.amazonaws.com/letsgetrusty/25597207_1643064007NFuWebsite_Header.png) 

  Hi Rustaceans,  

  Rust is fast, safe and hip.  

  But, what can you actually build with Rust?  

  …whether you want to use Rust professionally or as a hobbyist.  

  Here are a few common types of applications built using Rust:  

  **Blockchain**  

  * Rust is a great choice for blockchain applications because it is fast and secure.
  * You can write both smart contracts and entire blockchains using Rust.
  * Some popular blockchain projects written in Rust include Solana, Polkadot, and Near.

  **Embedded programs**  

  * Rust is also well-suited for embedded programs, such as those used in cars, airplanes, and other devices.
  * This is because Rust is memory-safe, memory-efficient and can be compiled to run on a variety of platforms.

  **Server-side applications / Microservices**  

  * Rust is a great choice for server-side applications and microservices because it is fast and efficient.
  * ==Some popular server-side web frameworks written in Rust include Actix Web, Warp, and Axum.==
  * Many companies are migrating their critical microservices to Rust because of its safety and performance guarantees.

  **WebAssembly**  

  * Rust can be compiled to WebAssembly, which means that you can use Rust to build web applications.
  * Rust’s small runtime and first-class support for WebAssembly often make it the first contender for any WebAssembly projects.

  This is only a small sample of what you can build in Rust.  

  In general, Rust is a great choice if you are looking for speed, safety and versatility.  

  If you want more details, here’s a YouTube video I made on the same topic.  

  **[\>>> What can you build in Rust?!](https://letsgetrusty.krtra.com/c/BgXaOx7YGua4/OQKy)**   

  Have fun building!  

  Bogdan  

  \---

  PS - Looking for a Rust job? Apply here - [https://letsgetrusty.com/jobs](https://letsgetrusty.krtra.com/c/ysWbInNFr59c/OQKy)

raw_content:
  ---
  id: 7b7ae540-77ef-11ee-9aed-e318464fef5a
  title: |
    Use cases for Rust
  status: ARCHIVED
  tags:
    - read-later
    - Newsletter
  date_added: 2023-10-31 10:14:54
  url_omnivore: |
    https://omnivore.app/me/use-cases-for-rust-18b85df6f3a
  url_original: |
    https://omnivore.app/no_url?q=9e2f3a10-e4fd-4c33-85a3-ff3609f3c4d6
  ---

  # Use cases for Rust

  ## Highlights

  Some popular server-side web frameworks written in Rust include Actix Web, Warp, and Axum. 

  [source](https://omnivore.app/me/use-cases-for-rust-18b85df6f3a#64793bd7-d3bd-4597-9f2c-9b4697217661) 

  ---

  ## Original

  ![](https://proxy-prod.omnivore-image-cache.app/374x0,sWwbkQPNcQS05Cyma-JsPnEwyj7_G5D8tak-9k2Pm7g8/https://kartrausers.s3.amazonaws.com/letsgetrusty/25597207_1643064007NFuWebsite_Header.png) 

  Hi Rustaceans,  

  Rust is fast, safe and hip.  

  But, what can you actually build with Rust?  

  …whether you want to use Rust professionally or as a hobbyist.  

  Here are a few common types of applications built using Rust:  

  **Blockchain**  

  * Rust is a great choice for blockchain applications because it is fast and secure.
  * You can write both smart contracts and entire blockchains using Rust.
  * Some popular blockchain projects written in Rust include Solana, Polkadot, and Near.

  **Embedded programs**  

  * Rust is also well-suited for embedded programs, such as those used in cars, airplanes, and other devices.
  * This is because Rust is memory-safe, memory-efficient and can be compiled to run on a variety of platforms.

  **Server-side applications / Microservices**  

  * Rust is a great choice for server-side applications and microservices because it is fast and efficient.
  * ==Some popular server-side web frameworks written in Rust include Actix Web, Warp, and Axum.==
  * Many companies are migrating their critical microservices to Rust because of its safety and performance guarantees.

  **WebAssembly**  

  * Rust can be compiled to WebAssembly, which means that you can use Rust to build web applications.
  * Rust’s small runtime and first-class support for WebAssembly often make it the first contender for any WebAssembly projects.

  This is only a small sample of what you can build in Rust.  

  In general, Rust is a great choice if you are looking for speed, safety and versatility.  

  If you want more details, here’s a YouTube video I made on the same topic.  

  **[\>>> What can you build in Rust?!](https://letsgetrusty.krtra.com/c/BgXaOx7YGua4/OQKy)**   

  Have fun building!  

  Bogdan  

  \---

  PS - Looking for a Rust job? Apply here - [https://letsgetrusty.com/jobs](https://letsgetrusty.krtra.com/c/ysWbInNFr59c/OQKy)

metadata:
  {"date_added":"2023-10-31 10:14:54","id":"7b7ae540-77ef-11ee-9aed-e318464fef5a","status":"ARCHIVED","tags":["read-later","Newsletter"],"title":"Use cases for Rust\n","url_omnivore":"https://omnivore.app/me/use-cases-for-rust-18b85df6f3a\n","url_original":"https://omnivore.app/no_url?q=9e2f3a10-e4fd-4c33-85a3-ff3609f3c4d6\n"}


path: Omnivore/2023-11-01 - Why Signals Are Better Than React Hooks.md
sortable_path: Omnivore2023-11-01 - Why Signals Are Better Than React Hooks.md
title: Why Signals Are Better Than React Hooks
lead: # Why Signals Are Better Than React Hooks
checksum: 2d9a8cb0f724617ca49e974eee1a0420a88be646fdcd1af6baf2e915451ac2b0
created: 2024-09-15 00:40:57.129509114+00:00
modified: 2024-09-22 22:40:13.392511014+00:00
body:
  # Why Signals Are Better Than React Hooks

  ## Notes

  Signals ayuda a la performance y legibilidad de una aplicación haciendo que la funcionalidades que normalmente se realizarían con los hooks `useState` y `useEffect` se realizen dentro de `signals`.

  Esto permite compartir este _"estado"_ entre componentes pero solo actualizar los involucrados y no todos los desendientes del componente mayor.

  Además, podemos extraer toda la lógica del estado a un archivo aparte que solo tenga código relevante, y en los componentes se mantiene solo la implementación.

  Es obviamente más rápido de implementar y más limpio que hacer custom hooks, pero es añadir otra dependencia, habrá otras ventajas y desventajas??
  ## Original

  [Why Signals Are Better Than React Hooks](https://youtu.be/SO8lBVWF2Y8?si=zyGlIeHlAiPgW5Xo)

  By [Web Dev Simplified](https://www.youtube.com/@WebDevSimplified)

raw_content:
  ---
  id: e41b4086-963e-45e7-9ef7-2cfee7061047
  title: |
    Why Signals Are Better Than React Hooks
  status: ARCHIVED
  tags:
    - read-later
  date_added: 2023-11-01 14:16:42
  url_omnivore: |
    https://omnivore.app/me/https-youtu-be-so-8-l-bvwf-2-y-8-si-zy-gl-ie-hl-ai-pg-w-5-xo-18b8be328e5
  url_original: |
    https://youtu.be/SO8lBVWF2Y8?si=zyGlIeHlAiPgW5Xo
  ---

  # Why Signals Are Better Than React Hooks

  ## Notes

  Signals ayuda a la performance y legibilidad de una aplicación haciendo que la funcionalidades que normalmente se realizarían con los hooks `useState` y `useEffect` se realizen dentro de `signals`.

  Esto permite compartir este _"estado"_ entre componentes pero solo actualizar los involucrados y no todos los desendientes del componente mayor.

  Además, podemos extraer toda la lógica del estado a un archivo aparte que solo tenga código relevante, y en los componentes se mantiene solo la implementación.

  Es obviamente más rápido de implementar y más limpio que hacer custom hooks, pero es añadir otra dependencia, habrá otras ventajas y desventajas??
  ## Original

  [Why Signals Are Better Than React Hooks](https://youtu.be/SO8lBVWF2Y8?si=zyGlIeHlAiPgW5Xo)

  By [Web Dev Simplified](https://www.youtube.com/@WebDevSimplified)

metadata:
  {"date_added":"2023-11-01 14:16:42","id":"e41b4086-963e-45e7-9ef7-2cfee7061047","status":"ARCHIVED","tags":["read-later"],"title":"Why Signals Are Better Than React Hooks\n","url_omnivore":"https://omnivore.app/me/https-youtu-be-so-8-l-bvwf-2-y-8-si-zy-gl-ie-hl-ai-pg-w-5-xo-18b8be328e5\n","url_original":"https://youtu.be/SO8lBVWF2Y8?si=zyGlIeHlAiPgW5Xo\n"}


path: Omnivore/2023-11-02 - The First Rule of Comments in Code.md
sortable_path: Omnivore2023-11-02 - The First Rule of Comments in Code.md
title: The First Rule of Comments in Code
lead: # The First Rule of Comments in Code
checksum: 8778e91a2a1d5fa56e9904a7162ecc347955cb13ce1b62a4458f73e6504d12ff
created: 2024-09-15 00:40:57.163057174+00:00
modified: 2024-09-22 22:40:13.393511027+00:00
body:
  # The First Rule of Comments in Code

  ## Notes

  Comments are bad by nature:
  - They get outdated pretty quickly, and you don't know if the comments is updated with the code.
  - A comments is most probably noise, because it's not gonna provide more information than the code itself.
  - Commented code is broken code, because it's probably outdated compared to it's context.

  Some rules to evade writing comments:

  **Code that needs a comment, needs to be rewritten**. Always try to put the information in the code. if it needs a comment, it's not good enough.

  **Move information somewhere else**. this is similar to the previous, move to a variable name, or to a documentation file in the worst case.

  **How quickly the information will goes out of date**. It's so simple that a comments goes out of sync with the code, to prevent that transform the comment in code.

  **If a comment gives no more information than the code, delete it**.

  **"I need to explain the complexity"**. No, you need to fix the complexity. If the complexity is so big, put in the documentation instead. A comment cannot fix complexity, and will require hard work to change that code.

  **Don't comment out code, delete it**.  Commented code goes quickly out of sync with it's context, is not tested in any way and the effort of updating it is almost the same if not higher that writing it over with better knowledge, so it's better to just delete it. If we need this code back, we can recover it with git.
  ## Original

  [The First Rule of Comments in Code](https://youtu.be/hxsx3vbf-QQ?si=-C5QyMMg8JYhcBBQ)

  By [Bran van der Meer](https://www.youtube.com/@branvandermeer)

raw_content:
  ---
  id: 24bd8d1e-b118-4930-a86d-3929f2dad34c
  title: |
    The First Rule of Comments in Code
  status: ARCHIVED
  tags:
    - read-later
  date_added: 2023-11-02 23:25:19
  url_omnivore: |
    https://omnivore.app/me/https-youtu-be-hxsx-3-vbf-qq-si-c-5-qy-m-mg-8-j-yhc-bbq-18b92ffccf6
  url_original: |
    https://youtu.be/hxsx3vbf-QQ?si=-C5QyMMg8JYhcBBQ
  ---

  # The First Rule of Comments in Code

  ## Notes

  Comments are bad by nature:
  - They get outdated pretty quickly, and you don't know if the comments is updated with the code.
  - A comments is most probably noise, because it's not gonna provide more information than the code itself.
  - Commented code is broken code, because it's probably outdated compared to it's context.

  Some rules to evade writing comments:

  **Code that needs a comment, needs to be rewritten**. Always try to put the information in the code. if it needs a comment, it's not good enough.

  **Move information somewhere else**. this is similar to the previous, move to a variable name, or to a documentation file in the worst case.

  **How quickly the information will goes out of date**. It's so simple that a comments goes out of sync with the code, to prevent that transform the comment in code.

  **If a comment gives no more information than the code, delete it**.

  **"I need to explain the complexity"**. No, you need to fix the complexity. If the complexity is so big, put in the documentation instead. A comment cannot fix complexity, and will require hard work to change that code.

  **Don't comment out code, delete it**.  Commented code goes quickly out of sync with it's context, is not tested in any way and the effort of updating it is almost the same if not higher that writing it over with better knowledge, so it's better to just delete it. If we need this code back, we can recover it with git.
  ## Original

  [The First Rule of Comments in Code](https://youtu.be/hxsx3vbf-QQ?si=-C5QyMMg8JYhcBBQ)

  By [Bran van der Meer](https://www.youtube.com/@branvandermeer)

metadata:
  {"date_added":"2023-11-02 23:25:19","id":"24bd8d1e-b118-4930-a86d-3929f2dad34c","status":"ARCHIVED","tags":["read-later"],"title":"The First Rule of Comments in Code\n","url_omnivore":"https://omnivore.app/me/https-youtu-be-hxsx-3-vbf-qq-si-c-5-qy-m-mg-8-j-yhc-bbq-18b92ffccf6\n","url_original":"https://youtu.be/hxsx3vbf-QQ?si=-C5QyMMg8JYhcBBQ\n"}


path: Omnivore/2023-11-02 - Web Accessibility Tips for Developers – A11y Principles Explained.md
sortable_path: Omnivore2023-11-02 - Web Accessibility Tips for Developers – A11y Principles Explained.md
title: Web Accessibility Tips for Developers – A11y Principles Explained
lead: # Web Accessibility Tips for Developers – A11y Principles Explained
checksum: 75289c3283f9495e1b8e073fb9f9fc378673d2df55f992f99d419b9901fb4e55
created: 2024-09-15 00:40:57.201838986+00:00
modified: 2024-09-22 22:40:13.393511027+00:00
body:
  # Web Accessibility Tips for Developers – A11y Principles Explained

  ## Highlights

  you can provide captions for audio and video materials. 

  [source](https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5#a243f9e5-2cf7-437b-afdb-725d69408fa5) 

  ---

  color contrast for text and background 

  [source](https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5#7da331b9-d92c-40b1-b9ff-03cd350b19e0) 

  ---

  it's a good idea to include descriptive alternative text (alt text) for images, explaining what they depict and their purpose. 

  [source](https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5#c2a6ebd3-44b3-4bac-b723-be08ec3191d3) 

  ---

  You should also describe your icon buttons. 

  [source](https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5#644def06-75fc-41b3-ad64-8b0eb34eb055) 

  ---

  First, make sure you use clear and consistent headings. 

  [source](https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5#5d22dea1-4451-4052-a211-ffbc432cb3be) 

  ---

  And make sure you think about [keyboard accessibility](https://www.freecodecamp.org/news/designing-keyboard-accessibility-for-complex-react-experiences/) so users can navigate and communicate using the keyboard, and not exclusively using a mouse. 

  [source](https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5#a6f33320-f395-41f2-92e4-7e5c70337377) 

  ---

  Organize content using headings, subheadings, and bullet points to enhance readability. 

  > [!note]
  > Use semantic HTML

  [source](https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5#d6c8b9dc-b9e7-4ab7-8b53-0057246fea9a) 

  ---

  * Use [HTML5 semantic elements](https://www.freecodecamp.org/news/semantic-html-alternatives-to-using-divs/) like ``, ``, ``, and `` to enhance the document's structure.
  * Ensure that your [JavaScript code is efficient](https://www.freecodecamp.org/news/javascript-performance-async-defer/) and doesn't block the rendering process.
  * Utilize [browser developer tools](https://www.freecodecamp.org/news/learn-how-to-use-the-chrome-devtools-to-troubleshoot-websites/) and online testing services to identify and fix compatibility issues.
  * Conduct [usability testing](https://www.freecodecamp.org/news/10-best-ux-testing-software-tools/) with a diverse group of users, including those who rely on assistive technologies, to gather feedback and make improvements.
  * Optimize your website for fast loading times and low data usage using techniques like [caching](https://www.freecodecamp.org/news/a-detailed-guide-to-pre-caching/) and [tools like CDNs](https://www.freecodecamp.org/news/cdns-speed-up-performance-by-reducing-latency/) to reduce latency. This benefits both accessibility and user experience.
  * Document your code and accessibility features for future maintainers.
  * Test [website compatibility across various browsers](https://www.freecodecamp.org/news/cross-browser-compatibility-testing-best-practices-for-web-developers/). Testing website compatibility involves ensuring that your website functions correctly and looks good on a variety of devices, browsers, and assistive technologies. 

  [source](https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5#ade773c1-f3e3-499b-8b34-c9d8a2c084e3) 

  ---

  ## Original

  ![Web Accessibility Tips for Developers – A11y Principles Explained](https://proxy-prod.omnivore-image-cache.app/2000x2000,sLi0R_mqQEUImakjW-uLiNCHUb_gUQOi3alWrqxEZEdI/https://www.freecodecamp.org/news/content/images/size/w2000/2023/10/51314.jpg) 

  Accessibility isn't just something you check off as done when you're building websites and web apps. It's a basic part of making the online world a better and fairer place for everyone. 

  In this article, you'll learn what accessibility means, and why it's important to make accessibility a part of your regular workflow. I'll also give you practical tips with examples to make your websites more accessible. 

  Let's explore the key parts of web accessibility together and help you make a website that includes everyone.

  ## What is Web Accessibility?

  [Web accessibility](https://www.freecodecamp.org/news/accessibility-best-practices-to-make-web-apps-accessible/) refers to the practice of designing and developing websites, applications, and digital content in a way that ensures people with disabilities can perceive, understand, navigate, and interact with them effectively.

  ## Principles of Web Accessibility

  To effectively enhance the accessibility of your websites and apps, you'll want to follow these fundamental principles outlined by the Web Content Accessibility Guidelines ([WCAG](https://www.w3.org/WAI/WCAG21/quickref/?versions=2.0)):

  ### Is it Perceivable?

  Content should be displayed in a manner that all users can understand, regardless of their sensory abilities. Here are some ways you can make your content more perceivable:

  First, ==you can provide captions for audio and video materials.== Adding captions to your website or application allows those with hearing disabilities to understand the information being shared, and make the content more accessible to everyone.

  You can see an example of adding captions to a video in the image below: 

  ![img](https://proxy-prod.omnivore-image-cache.app/600x400,s7JqQDCWlwfKv-nbThftb-4yQ3i9ewlt7dUGAOYpaZEw/https://www.freecodecamp.org/news/content/images/2023/10/img.jpg)

  Image of a video illustrating the use of captions.

  Next, make sure you use proper ==color contrast for text and background== elements.

  Colors are an important part of a website, and we can describe them in terms of hue, lightness, and saturation.

  There are several categories of colors which include warm colors, cool colors, and neutral colors

  **Warm Colors:** Warm colors include red, orange, and yellow, and variations of  
  those three colors. These are the colors of fire, fall leaves, sunsets, and sunrises, and are generally energizing, passionate, and positive. 

  **Cool Colors:** Cool colors include green, blue, and purple, are often more  
  subdued than warm colors. They are the colors of night, water, of nature, and are usually calming, relaxing, and somewhat reserved.

  **Neutral Colors:** Neutral colors often serve as the backdrop in design. They’re  
  commonly combined with brighter accent colors. But they can also be used on their own in designs and can create very sophisticated layouts. Neutral colors include black, white, gray, cream, and beige.

  Examples of colors that will make good contrast are white and blue, purple and white, yellow and white, light purple and black, green and white, black and white, and so on – basically any colors that are different enough from each other to create that contrast.

  Examples of colors that will make a bad contrast are gray and white, brown and orange, red and purple, and so on.

  Here is an example that shows good color contrast that's easy to read:

  ![1](https://proxy-prod.omnivore-image-cache.app/600x400,spVLqkxfdpXB-5frjoYMtKQEeDQOoEbzW9pxOwGx5O_M/https://www.freecodecamp.org/news/content/images/2023/10/1.png)

  Image illustrating good contrast using a dark blue background with white text

  And here's an image with poor color contrast that's hard to read:

  ![2](https://proxy-prod.omnivore-image-cache.app/600x400,s13rNy0QO-cvE8T395BejB0TpXsi54-iolzLNTmS3bJk/https://www.freecodecamp.org/news/content/images/2023/10/2.png)

  Image Illustrating bad contrast using a white background with light grey text

  Also, ==it's a good idea to include descriptive alternative text (alt text) for images, explaining what they depict and their purpose.==

  So for example, when you want to add an image to your website, you can add alt text to it explaining what it depicts. 

  Here is a markup description of how to add alt text to an image:

  ```routeros
      <img src="Dog.png" alt="Image of a dog">

  ```

  Here is an example that shows an image of two (2) dogs:

  ![dog](https://proxy-prod.omnivore-image-cache.app/600x400,s6zcOQSeNNFcbuGihDt5hMqHPhzrqgvYvQged6TAj_8o/https://www.freecodecamp.org/news/content/images/2023/10/dog.jpg)

  Image of two dogs

  And here's an example of an image that illustrates the use of alt text:

  ![dog1-1](https://proxy-prod.omnivore-image-cache.app/600x400,sXHxH9U-xfHDWpum3b4_FwBqU3n6zQ04pphIEvAkY5JA/https://www.freecodecamp.org/news/content/images/2023/10/dog1-1.jpg)

  Image of dog with alt text displayed

  ==You should also describe your icon buttons.==

  Icons can be easily understood most of the time. It's widely recognized that an x symbol, like this ❌, typically closes a window, a check mark ✅ signifies completion, a forward arrow ▶ signifies send (or play), and a plus sign ➕ represents addition. 

  But this is clear only for individuals with visual capabilities. For people who aren't able to see the buttons, you'll need to provide a description so they know what that button does.

  Let's take a look at this HTML and CSS code that shows how to make buttons access:

  Document 

  Here's the result of the code implemented above:

  ![code1](https://proxy-prod.omnivore-image-cache.app/600x400,shhm4_h1vW3_Etmiiy2C9La0vhNBfDbaNa_p0azyu_vo/https://www.freecodecamp.org/news/content/images/2023/10/code1.jpg)

  ### Is it Operable?

  Users should be able to navigate and interact with the interface quickly. Consider the following factors:

  ==First, make sure you use clear and consistent headings.==

  This is what clear and consistent headings look like:

  ## I am a Title

  ## I am a Subtitle

  ### This is heading 3

  #### This is Heading 4

  ##### This is Heading 5

  ###### This is heading 6

  As you can see, these headings go from largest to smallest in order. We have an H1 heading first, followed by H2, H3, and so on.

  Here are some headings that don't follow the proper hierarchy: 

  ###### This is heading 6

  ##### This is Heading 5

  #### This is Heading 4

  ### This is heading 3

  ## I am a Subtitle

  ## I am a Title

  In this example, the headings go in reverse order, starting from H6 and moving up through H5, H4, and so on. 

  Just remember to use proper heading hierarchy – don't use an H2 and then jump straight to H4 for a subheading, for example, as this is visually jarring and doesn't convey the proper importance or hierarchy of the text.

  Here's why heading hierarchy is important:

  * A clear heading hierarchy helps readers easily navigate and understand the content of a document.
  * Heading hierarchy is crucial for accessibility, as it helps screen readers and assistive technologies interpret the structure of the content. This is important for individuals with visual impairments who rely on such tools to access information.
  * A well-organized heading hierarchy implement a logical flow of information, ensuring that topics are presented in a coherent order.

  Also, refrain from using elements that might trigger physical discomfort, like bright flashing lights.

  ==And make sure you think about== ==[keyboard accessibility](https://www.freecodecamp.org/news/designing-keyboard-accessibility-for-complex-react-experiences/)== ==so users can navigate and communicate using the keyboard, and not exclusively using a mouse.==

  ### Is it Understandable?

  Content and functionality should be presented clearly and understandably. Consider the following factors:

  * ==Organize content using headings, subheadings, and bullet points to enhance readability.==
  * Provide instructions and error messages that are easy to understand.
  * Use simple and concise language, avoid complex terms.

  ### Is it Robust?

  Websites should be built using robust and widely supported technologies to enable compatibility across devices and assistive technologies. 

  You'll want to maximize compatibility with current and future user agents, including assistive technologies.

  Here are some of the ways you can maximize compatibility with current and future agents, including assistive tools:

  * ==Use== ==[HTML5 semantic elements](https://www.freecodecamp.org/news/semantic-html-alternatives-to-using-divs/)== ==like== `==&lt;====header====&gt;==`==,== `==&lt;====nav====&gt;==`==,== `==&lt;====main====&gt;==`==, and== `==&lt;====footer====&gt;==` ==to enhance the document's structure.==
  * ==Ensure that your== ==[JavaScript code is efficient](https://www.freecodecamp.org/news/javascript-performance-async-defer/)== ==and doesn't block the rendering process.==
  * ==Utilize== ==[browser developer tools](https://www.freecodecamp.org/news/learn-how-to-use-the-chrome-devtools-to-troubleshoot-websites/)== ==and online testing services to identify and fix compatibility issues.==
  * ==Conduct== ==[usability testing](https://www.freecodecamp.org/news/10-best-ux-testing-software-tools/)== ==with a diverse group of users, including those who rely on assistive technologies, to gather feedback and make improvements.==
  * ==Optimize your website for fast loading times and low data usage using techniques like== ==[caching](https://www.freecodecamp.org/news/a-detailed-guide-to-pre-caching/)== ==and== ==[tools like CDNs](https://www.freecodecamp.org/news/cdns-speed-up-performance-by-reducing-latency/)== ==to reduce latency. This benefits both accessibility and user experience.==
  * ==Document your code and accessibility features for future maintainers.==
  * ==Test== ==[website compatibility across various browsers](https://www.freecodecamp.org/news/cross-browser-compatibility-testing-best-practices-for-web-developers/)====. Testing website compatibility involves ensuring that your website functions correctly and looks good on a variety of devices, browsers, and assistive technologies.==

  Here are the steps you can follow to test website compatibility effectively:

  1. **Device Testing**: Test your website on various devices, such as desktop computers, laptops, tablets, and smartphones. This includes both iOS and Android devices.
  2. **Browser Testing**: Check your website's performance and appearance on multiple browsers, including but not limited to Google Chrome, Mozilla Firefox, Apple Safari, and Microsoft Edge.
  3. **User Testing**: Conduct usability testing with real users. Ask them to use your website on different devices and browsers and collect feedback on compatibility issues.
  4. **Performance Testing**: Assess website loading times, and optimize for speed using tools like Google PageSpeed Insights, GTmetrix, or Lighthouse. Check for compatibility with slow internet connections.

  ## Conclusion

  Understanding web accessibility can enhance the user experience by creating a smooth and seamless interaction with websites and web applications.

  Implementing these tips can improve the overall user-friendliness and navigability of your app. It'll help create a more enjoyable experience for all users, and will also allow people with disabilities to perceive, understand, navigate, and interact with your sites effectively.

  ---

  ---

   Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. [Get started](https://www.freecodecamp.org/learn/)

raw_content:
  ---
  id: 88b1e080-79be-11ee-b19c-971f00999697
  title: |
    Web Accessibility Tips for Developers – A11y Principles Explained
  status: ARCHIVED
  tags:
    - read-later
    - RSS
  date_added: 2023-11-02 11:17:51
  url_omnivore: |
    https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5
  url_original: |
    https://www.freecodecamp.org/news/web-accessibility-for-devs/
  ---

  # Web Accessibility Tips for Developers – A11y Principles Explained

  ## Highlights

  you can provide captions for audio and video materials. 

  [source](https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5#a243f9e5-2cf7-437b-afdb-725d69408fa5) 

  ---

  color contrast for text and background 

  [source](https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5#7da331b9-d92c-40b1-b9ff-03cd350b19e0) 

  ---

  it's a good idea to include descriptive alternative text (alt text) for images, explaining what they depict and their purpose. 

  [source](https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5#c2a6ebd3-44b3-4bac-b723-be08ec3191d3) 

  ---

  You should also describe your icon buttons. 

  [source](https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5#644def06-75fc-41b3-ad64-8b0eb34eb055) 

  ---

  First, make sure you use clear and consistent headings. 

  [source](https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5#5d22dea1-4451-4052-a211-ffbc432cb3be) 

  ---

  And make sure you think about [keyboard accessibility](https://www.freecodecamp.org/news/designing-keyboard-accessibility-for-complex-react-experiences/) so users can navigate and communicate using the keyboard, and not exclusively using a mouse. 

  [source](https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5#a6f33320-f395-41f2-92e4-7e5c70337377) 

  ---

  Organize content using headings, subheadings, and bullet points to enhance readability. 

  > [!note]
  > Use semantic HTML

  [source](https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5#d6c8b9dc-b9e7-4ab7-8b53-0057246fea9a) 

  ---

  * Use [HTML5 semantic elements](https://www.freecodecamp.org/news/semantic-html-alternatives-to-using-divs/) like ``, ``, ``, and `` to enhance the document's structure.
  * Ensure that your [JavaScript code is efficient](https://www.freecodecamp.org/news/javascript-performance-async-defer/) and doesn't block the rendering process.
  * Utilize [browser developer tools](https://www.freecodecamp.org/news/learn-how-to-use-the-chrome-devtools-to-troubleshoot-websites/) and online testing services to identify and fix compatibility issues.
  * Conduct [usability testing](https://www.freecodecamp.org/news/10-best-ux-testing-software-tools/) with a diverse group of users, including those who rely on assistive technologies, to gather feedback and make improvements.
  * Optimize your website for fast loading times and low data usage using techniques like [caching](https://www.freecodecamp.org/news/a-detailed-guide-to-pre-caching/) and [tools like CDNs](https://www.freecodecamp.org/news/cdns-speed-up-performance-by-reducing-latency/) to reduce latency. This benefits both accessibility and user experience.
  * Document your code and accessibility features for future maintainers.
  * Test [website compatibility across various browsers](https://www.freecodecamp.org/news/cross-browser-compatibility-testing-best-practices-for-web-developers/). Testing website compatibility involves ensuring that your website functions correctly and looks good on a variety of devices, browsers, and assistive technologies. 

  [source](https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5#ade773c1-f3e3-499b-8b34-c9d8a2c084e3) 

  ---

  ## Original

  ![Web Accessibility Tips for Developers – A11y Principles Explained](https://proxy-prod.omnivore-image-cache.app/2000x2000,sLi0R_mqQEUImakjW-uLiNCHUb_gUQOi3alWrqxEZEdI/https://www.freecodecamp.org/news/content/images/size/w2000/2023/10/51314.jpg) 

  Accessibility isn't just something you check off as done when you're building websites and web apps. It's a basic part of making the online world a better and fairer place for everyone. 

  In this article, you'll learn what accessibility means, and why it's important to make accessibility a part of your regular workflow. I'll also give you practical tips with examples to make your websites more accessible. 

  Let's explore the key parts of web accessibility together and help you make a website that includes everyone.

  ## What is Web Accessibility?

  [Web accessibility](https://www.freecodecamp.org/news/accessibility-best-practices-to-make-web-apps-accessible/) refers to the practice of designing and developing websites, applications, and digital content in a way that ensures people with disabilities can perceive, understand, navigate, and interact with them effectively.

  ## Principles of Web Accessibility

  To effectively enhance the accessibility of your websites and apps, you'll want to follow these fundamental principles outlined by the Web Content Accessibility Guidelines ([WCAG](https://www.w3.org/WAI/WCAG21/quickref/?versions=2.0)):

  ### Is it Perceivable?

  Content should be displayed in a manner that all users can understand, regardless of their sensory abilities. Here are some ways you can make your content more perceivable:

  First, ==you can provide captions for audio and video materials.== Adding captions to your website or application allows those with hearing disabilities to understand the information being shared, and make the content more accessible to everyone.

  You can see an example of adding captions to a video in the image below: 

  ![img](https://proxy-prod.omnivore-image-cache.app/600x400,s7JqQDCWlwfKv-nbThftb-4yQ3i9ewlt7dUGAOYpaZEw/https://www.freecodecamp.org/news/content/images/2023/10/img.jpg)

  Image of a video illustrating the use of captions.

  Next, make sure you use proper ==color contrast for text and background== elements.

  Colors are an important part of a website, and we can describe them in terms of hue, lightness, and saturation.

  There are several categories of colors which include warm colors, cool colors, and neutral colors

  **Warm Colors:** Warm colors include red, orange, and yellow, and variations of  
  those three colors. These are the colors of fire, fall leaves, sunsets, and sunrises, and are generally energizing, passionate, and positive. 

  **Cool Colors:** Cool colors include green, blue, and purple, are often more  
  subdued than warm colors. They are the colors of night, water, of nature, and are usually calming, relaxing, and somewhat reserved.

  **Neutral Colors:** Neutral colors often serve as the backdrop in design. They’re  
  commonly combined with brighter accent colors. But they can also be used on their own in designs and can create very sophisticated layouts. Neutral colors include black, white, gray, cream, and beige.

  Examples of colors that will make good contrast are white and blue, purple and white, yellow and white, light purple and black, green and white, black and white, and so on – basically any colors that are different enough from each other to create that contrast.

  Examples of colors that will make a bad contrast are gray and white, brown and orange, red and purple, and so on.

  Here is an example that shows good color contrast that's easy to read:

  ![1](https://proxy-prod.omnivore-image-cache.app/600x400,spVLqkxfdpXB-5frjoYMtKQEeDQOoEbzW9pxOwGx5O_M/https://www.freecodecamp.org/news/content/images/2023/10/1.png)

  Image illustrating good contrast using a dark blue background with white text

  And here's an image with poor color contrast that's hard to read:

  ![2](https://proxy-prod.omnivore-image-cache.app/600x400,s13rNy0QO-cvE8T395BejB0TpXsi54-iolzLNTmS3bJk/https://www.freecodecamp.org/news/content/images/2023/10/2.png)

  Image Illustrating bad contrast using a white background with light grey text

  Also, ==it's a good idea to include descriptive alternative text (alt text) for images, explaining what they depict and their purpose.==

  So for example, when you want to add an image to your website, you can add alt text to it explaining what it depicts. 

  Here is a markup description of how to add alt text to an image:

  ```routeros
      <img src="Dog.png" alt="Image of a dog">

  ```

  Here is an example that shows an image of two (2) dogs:

  ![dog](https://proxy-prod.omnivore-image-cache.app/600x400,s6zcOQSeNNFcbuGihDt5hMqHPhzrqgvYvQged6TAj_8o/https://www.freecodecamp.org/news/content/images/2023/10/dog.jpg)

  Image of two dogs

  And here's an example of an image that illustrates the use of alt text:

  ![dog1-1](https://proxy-prod.omnivore-image-cache.app/600x400,sXHxH9U-xfHDWpum3b4_FwBqU3n6zQ04pphIEvAkY5JA/https://www.freecodecamp.org/news/content/images/2023/10/dog1-1.jpg)

  Image of dog with alt text displayed

  ==You should also describe your icon buttons.==

  Icons can be easily understood most of the time. It's widely recognized that an x symbol, like this ❌, typically closes a window, a check mark ✅ signifies completion, a forward arrow ▶ signifies send (or play), and a plus sign ➕ represents addition. 

  But this is clear only for individuals with visual capabilities. For people who aren't able to see the buttons, you'll need to provide a description so they know what that button does.

  Let's take a look at this HTML and CSS code that shows how to make buttons access:

  Document 

  Here's the result of the code implemented above:

  ![code1](https://proxy-prod.omnivore-image-cache.app/600x400,shhm4_h1vW3_Etmiiy2C9La0vhNBfDbaNa_p0azyu_vo/https://www.freecodecamp.org/news/content/images/2023/10/code1.jpg)

  ### Is it Operable?

  Users should be able to navigate and interact with the interface quickly. Consider the following factors:

  ==First, make sure you use clear and consistent headings.==

  This is what clear and consistent headings look like:

  ## I am a Title

  ## I am a Subtitle

  ### This is heading 3

  #### This is Heading 4

  ##### This is Heading 5

  ###### This is heading 6

  As you can see, these headings go from largest to smallest in order. We have an H1 heading first, followed by H2, H3, and so on.

  Here are some headings that don't follow the proper hierarchy: 

  ###### This is heading 6

  ##### This is Heading 5

  #### This is Heading 4

  ### This is heading 3

  ## I am a Subtitle

  ## I am a Title

  In this example, the headings go in reverse order, starting from H6 and moving up through H5, H4, and so on. 

  Just remember to use proper heading hierarchy – don't use an H2 and then jump straight to H4 for a subheading, for example, as this is visually jarring and doesn't convey the proper importance or hierarchy of the text.

  Here's why heading hierarchy is important:

  * A clear heading hierarchy helps readers easily navigate and understand the content of a document.
  * Heading hierarchy is crucial for accessibility, as it helps screen readers and assistive technologies interpret the structure of the content. This is important for individuals with visual impairments who rely on such tools to access information.
  * A well-organized heading hierarchy implement a logical flow of information, ensuring that topics are presented in a coherent order.

  Also, refrain from using elements that might trigger physical discomfort, like bright flashing lights.

  ==And make sure you think about== ==[keyboard accessibility](https://www.freecodecamp.org/news/designing-keyboard-accessibility-for-complex-react-experiences/)== ==so users can navigate and communicate using the keyboard, and not exclusively using a mouse.==

  ### Is it Understandable?

  Content and functionality should be presented clearly and understandably. Consider the following factors:

  * ==Organize content using headings, subheadings, and bullet points to enhance readability.==
  * Provide instructions and error messages that are easy to understand.
  * Use simple and concise language, avoid complex terms.

  ### Is it Robust?

  Websites should be built using robust and widely supported technologies to enable compatibility across devices and assistive technologies. 

  You'll want to maximize compatibility with current and future user agents, including assistive technologies.

  Here are some of the ways you can maximize compatibility with current and future agents, including assistive tools:

  * ==Use== ==[HTML5 semantic elements](https://www.freecodecamp.org/news/semantic-html-alternatives-to-using-divs/)== ==like== `==&lt;====header====&gt;==`==,== `==&lt;====nav====&gt;==`==,== `==&lt;====main====&gt;==`==, and== `==&lt;====footer====&gt;==` ==to enhance the document's structure.==
  * ==Ensure that your== ==[JavaScript code is efficient](https://www.freecodecamp.org/news/javascript-performance-async-defer/)== ==and doesn't block the rendering process.==
  * ==Utilize== ==[browser developer tools](https://www.freecodecamp.org/news/learn-how-to-use-the-chrome-devtools-to-troubleshoot-websites/)== ==and online testing services to identify and fix compatibility issues.==
  * ==Conduct== ==[usability testing](https://www.freecodecamp.org/news/10-best-ux-testing-software-tools/)== ==with a diverse group of users, including those who rely on assistive technologies, to gather feedback and make improvements.==
  * ==Optimize your website for fast loading times and low data usage using techniques like== ==[caching](https://www.freecodecamp.org/news/a-detailed-guide-to-pre-caching/)== ==and== ==[tools like CDNs](https://www.freecodecamp.org/news/cdns-speed-up-performance-by-reducing-latency/)== ==to reduce latency. This benefits both accessibility and user experience.==
  * ==Document your code and accessibility features for future maintainers.==
  * ==Test== ==[website compatibility across various browsers](https://www.freecodecamp.org/news/cross-browser-compatibility-testing-best-practices-for-web-developers/)====. Testing website compatibility involves ensuring that your website functions correctly and looks good on a variety of devices, browsers, and assistive technologies.==

  Here are the steps you can follow to test website compatibility effectively:

  1. **Device Testing**: Test your website on various devices, such as desktop computers, laptops, tablets, and smartphones. This includes both iOS and Android devices.
  2. **Browser Testing**: Check your website's performance and appearance on multiple browsers, including but not limited to Google Chrome, Mozilla Firefox, Apple Safari, and Microsoft Edge.
  3. **User Testing**: Conduct usability testing with real users. Ask them to use your website on different devices and browsers and collect feedback on compatibility issues.
  4. **Performance Testing**: Assess website loading times, and optimize for speed using tools like Google PageSpeed Insights, GTmetrix, or Lighthouse. Check for compatibility with slow internet connections.

  ## Conclusion

  Understanding web accessibility can enhance the user experience by creating a smooth and seamless interaction with websites and web applications.

  Implementing these tips can improve the overall user-friendliness and navigability of your app. It'll help create a more enjoyable experience for all users, and will also allow people with disabilities to perceive, understand, navigate, and interact with your sites effectively.

  ---

  ---

   Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. [Get started](https://www.freecodecamp.org/learn/) 

metadata:
  {"date_added":"2023-11-02 11:17:51","id":"88b1e080-79be-11ee-b19c-971f00999697","status":"ARCHIVED","tags":["read-later","RSS"],"title":"Web Accessibility Tips for Developers – A11y Principles Explained\n","url_omnivore":"https://omnivore.app/me/web-accessibility-tips-for-developers-a-11-y-principles-explaine-18b91ba16e5\n","url_original":"https://www.freecodecamp.org/news/web-accessibility-for-devs/\n"}


path: Omnivore/2023-11-04 - Git Merge vs Rebase vs Squash ¿Qué estrategia debemos elegir-.md
sortable_path: Omnivore2023-11-04 - Git Merge vs Rebase vs Squash ¿Qué estrategia debemos elegir-.md
title: Git Merge vs Rebase vs Squash ¿Qué estrategia debemos elegir?
lead: # Git Merge vs Rebase vs Squash ¿Qué estrategia debemos elegir?
checksum: 6c0fd96debacb4dff7b81311fe3fd4d9e44cc63792e811e712d9a49a8dc05c88
created: 2024-09-15 00:40:57.243896911+00:00
modified: 2024-09-22 22:40:13.393511027+00:00
body:
  # Git Merge vs Rebase vs Squash ¿Qué estrategia debemos elegir?

  ## Notes

  - Merge commit: Se crea un commit que tiene 2 padres, el último commit de main y la feature branch, se mantiene la trazabilidad hacia la feature branch pero el historial queda visualmente más complejo
  - Rebase: Se copian los commits de la feature branch a main como nuevos commits, se pierde la trazabilidad hacia la feature branch pero queda un historial lineal en main
  - Squash commit: Se juntan todos los commits en uno solo con un squash que queda en main, se pierde la trazabilidad hacia la feature branch pero queda un historial lineal en main
  ## Original

  [Git Merge vs Rebase vs Squash ¿Qué estrategia debemos elegir?](https://www.youtube.com/watch?pp=ygUKZ2l0IHNxdWFzaA%253D%253D&v=HlmZLXMOpEM)

  By [CodelyTV - Redescubre la programación](https://www.youtube.com/@CodelyTV)

raw_content:
  ---
  id: fc51bf82-66d3-451f-8f64-17d6add50f92
  title: |
    Git Merge vs Rebase vs Squash ¿Qué estrategia debemos elegir?
  status: ARCHIVED
  tags:
    - read-later
    - Youtube
  date_added: 2023-11-04 14:14:49
  url_omnivore: |
    https://omnivore.app/me/https-www-youtube-com-watch-pp-yg-ukz-2-l-0-ih-nxd-w-fza-a-253-d-18b9b548407
  url_original: |
    https://www.youtube.com/watch?pp=ygUKZ2l0IHNxdWFzaA%253D%253D&v=HlmZLXMOpEM
  ---

  # Git Merge vs Rebase vs Squash ¿Qué estrategia debemos elegir?

  ## Notes

  - Merge commit: Se crea un commit que tiene 2 padres, el último commit de main y la feature branch, se mantiene la trazabilidad hacia la feature branch pero el historial queda visualmente más complejo
  - Rebase: Se copian los commits de la feature branch a main como nuevos commits, se pierde la trazabilidad hacia la feature branch pero queda un historial lineal en main
  - Squash commit: Se juntan todos los commits en uno solo con un squash que queda en main, se pierde la trazabilidad hacia la feature branch pero queda un historial lineal en main
  ## Original

  [Git Merge vs Rebase vs Squash ¿Qué estrategia debemos elegir?](https://www.youtube.com/watch?pp=ygUKZ2l0IHNxdWFzaA%253D%253D&v=HlmZLXMOpEM)

  By [CodelyTV - Redescubre la programación](https://www.youtube.com/@CodelyTV)

metadata:
  {"date_added":"2023-11-04 14:14:49","id":"fc51bf82-66d3-451f-8f64-17d6add50f92","status":"ARCHIVED","tags":["read-later","Youtube"],"title":"Git Merge vs Rebase vs Squash ¿Qué estrategia debemos elegir?\n","url_omnivore":"https://omnivore.app/me/https-www-youtube-com-watch-pp-yg-ukz-2-l-0-ih-nxd-w-fza-a-253-d-18b9b548407\n","url_original":"https://www.youtube.com/watch?pp=ygUKZ2l0IHNxdWFzaA%253D%253D\u0026v=HlmZLXMOpEM\n"}


path: Omnivore/2023-11-06 - How to Write Components that Work in Any Framework.md
sortable_path: Omnivore2023-11-06 - How to Write Components that Work in Any Framework.md
title: How to Write Components that Work in Any Framework
lead: # How to Write Components that Work in Any Framework
checksum: 015374cc77d0786dd4b229eb56fc1c2f17353d14d17dc0c1b064183f42dac065
created: 2024-09-15 00:40:57.278372484+00:00
modified: 2024-09-22 22:40:13.393511027+00:00
body:
  # How to Write Components that Work in Any Framework

  ## Highlights

  With Custom Elements you can author your own custom HTML elements that you can reuse across your site. They can be as simple as text, images, or visual decorations. You can push them further and build interactive components, complex widgets, or entire web applications. 

  [source](https://omnivore.app/me/how-to-write-components-that-work-in-any-framework-18ba72d0079#bceef8c0-728e-422a-aed6-b047736cb395) 

  ---

  ### Writing a web component requires understanding all of its underlying technologies

  As we saw above, web components are made up of three technologies. You can also see in the hello world code snippet, that we explicitly need to know and understand these three technologies.

  1. We’re creating a **template element** and setting its inner HTML
  2. We’re creating a **shadow root**, and explicitly setting its mode to ‘open’.
  3. We’re cloning our **template** and appending it to our **shadow root**
  4. We’re registering a new **custom element** to the document 

  [source](https://omnivore.app/me/how-to-write-components-that-work-in-any-framework-18ba72d0079#46fc130a-1549-40c8-b950-42035c227bc4) 

  ---

  As web component authors, we need to consider a lot of things:

  * Setting up the shadow DOM
  * Setting up the HTML templates
  * Cleaning up event listeners
  * Defining properties that we want to observe
  * Reacting to properties when they change
  * Handling type conversions for attributes 

  [source](https://omnivore.app/me/how-to-write-components-that-work-in-any-framework-18ba72d0079#855f444c-49f1-4176-9537-aaeeb6a01355) 

  ---

  One such tool is called Lit, which is developed by a team at Google. [Lit](https://lit.dev/) is a lightweight library designed to make writing web components simple, by removing the need for the boilerplate we’ve already seen above. 

  [source](https://omnivore.app/me/how-to-write-components-that-work-in-any-framework-18ba72d0079#385d9ef8-13fb-4799-bff5-ef767b3df67f) 

  ---

  ## Original

  ![How to Write Components that Work in Any Framework](https://proxy-prod.omnivore-image-cache.app/1200x600,sbNnkMyaVUIiiSYXNfn_YVuWBIhu0N84ey_fbF6pQlVw/https://www.freecodecamp.org/news/content/images/size/w2000/2023/11/og-button.png) 

  The browser has a built-in way of writing reusable components in the form of **web components**. They’re an excellent choice for building interactive and reusable components that work in any frontend framework. 

  With that said, writing highly interactive and robust web components isn’t simple. They require a lot of boilerplate and feel much less intuitive than the components you may have written in frameworks like React, Svelte, or Vue.

  In this tutorial, I’ll give you an example of an interactive component written as a web component, and then refactor it using a library that softens the edges and removes heaps of boilerplate.

  Don’t sweat it if you’re not familiar with web components. In the next section, I’ll do a (brief) overview of what web components are, and what they’re made out of. If you have some basic experience with them, you can skip the next section.

  ## What are Web Components?

  Before web components, the browser didn’t have a standard way of writing reusable components. Many libraries solve this problem, but they often run into limitations like performance, interoperability, and issues with web standards.

  Web components are a technology made up of 3 different browser features:

  * Custom elements
  * Shadow DOM
  * HTML Templates

  We’ll do a quick crash course covering these technologies, but it’s by no means a comprehensive breakdown.

  ### What are Custom Elements?

  ==With Custom Elements you can author your own custom HTML elements that you can reuse across your site. They can be as simple as text, images, or visual decorations. You can push them further and build interactive components, complex widgets, or entire web applications.==

  You’re not just limited to using them in your projects, but you can publish them and allow other developers to use them on their sites.

  Here are some of the reusable components from my library [A2K](https://a2000-docs.netlify.app/). You can see that they come in all shapes and sizes, and have a range of different functionalities. Using them in your projects is similar to using any old HTML element.

  ![A small collection of web components from the A2K library](https://proxy-prod.omnivore-image-cache.app/1936x1576,sJHqJR3aX72y4hbKfS4SGGmJwoFGcBRrCJxB2ozU2rIU/https://www.freecodecamp.org/news/content/images/2023/11/web-components.png)

  A small collection of web components from the A2K library

  Here’s how you’d use the progress element in your project:

  ```xml
  <!DOCTYPE html>
  <html>
  	<head>
  		<title>Quick Start</title>
  		<meta charset="UTF-8" />
  	</head>

  	<body>
  		<!-- Use web components in your HTML like regular built-in elements. -->
  		<a2k-progress progress="50" />

  		<!-- a2k web components use standard JavaScript modules. -->
  		<script type="module">
  			import 'https://cdn.jsdelivr.net/npm/@a2000/progress@0.0.5/lib/src/a2k-progress.js';
  		</script>
  	</body>
  </html>

  ```

  Once you’ve imported the third-party scripts, you can start using the component, `a2k-progress` in this case, just like any other HTML element.

  If you’re building your own web components, there’s virtually no limit to how complex you can make your custom elements. 

  I recently created a web component that renders a CodeSandbox code editor in the browser. And because it’s a web component, you can use it in any framework you like! If you’d like to learn a little more about that, [you can read more here](https://component-odyssey.com/articles/00-sandpack-lit-universal).

  ### What is the Shadow DOM?

  If you have a working knowledge of CSS, you’ll know that vanilla CSS is scoped globally. Writing something like this in your global.css:

  ```css
  p {
    color: tomato;
  }

  ```

  will give all `p` elements a nice orange/red color, assuming that no other, more specific CSS selectors are applied to a `p` element.

  Take this select menu, for example:

  ![A select menu component with a visual design reminiscent of the old Windows operating systems](https://proxy-prod.omnivore-image-cache.app/1034x502,s9CkMnQ9nLrjRpsbeELOUs7SesB_nfO2NrbzcalU2UFE/https://www.freecodecamp.org/news/content/images/2023/11/a2k-select-menu.png)

  It has a distinct character which is driven by the visual design. You might want to use this component, but if your global styles affect things like the font family, the color, or the font size, it could cause issues with the appearance of the component:

  ```xml
  <head>
  	<style>
  		body {
  			color: blue;
  			font-size: 12px;
  			font-family: system-ui;
  		}
  	</style>
  </head>

  <body>
  	<a2k-select></a2k-select>
  </body>

  ```

  ![The same select menu, but with a lot of its defining characteristics overridden by global CSS.](https://proxy-prod.omnivore-image-cache.app/1904x824,s6vwLXZ-23v_oU3NRFu4pagLJRfGUCz14nw0IkGnQuPU/https://www.freecodecamp.org/news/content/images/2023/11/a2k-select-menu-2.png)

  This is where the Shadow DOM comes in. The Shadow DOM is an encapsulation mechanism that prevents the rest of the DOM from interfering with your web components. It ensures that the global styles of the web application don’t interfere with any components that you consume. It also means that component library developers can author their components with the confidence that they’ll look and behave as expected across different web applications.

  There’s a lot more nuance when it comes to the Shadow DOM, as well as other features that we’re not going to touch on in this article. If you’d like to learn more about web components though, I have an entire course ([Component Odyssey](https://component-odyssey.com/)) dedicated to teaching you how to build reusable components that work in any framework.

  ### HTML Templates

  The last feature in our whistle-stop tour of web component features is HTML Templates.

  What makes this HTML element different from other elements, is that the browser doesn’t render its content to the page. If you were to write the following HTML you wouldn’t see the text “I’m a header” displayed on the page:

  ```xml
  <body>
  	<template>
  		<h1>I'm a header</h1>
  	</template>
  </body>

  ```

  Instead of being used to render the content directly, the content of the template is designed to be copied. The copied template can then be used to render content to the page. 

  You can think of the template element much like the template for a 3D print. The template isn’t a physical entity, but it’s used to create real-life clones.

  You would then reference the template element in your web component, clone it, and render the clone as the markup for your component.

  I won’t spend any more time on these web component features, but you’ve probably already noticed that to write vanilla web components, there are a lot of new browser features that you need to know and understand. 

  You’ll see in the next section that the mental model for building web components doesn’t feel as streamlined as it does for other component frameworks.

  ## How to Build a Basic Web Component

  Now that we’ve briefly covered the fundamental technologies powering a web component, here’s how to build a _hello world_ component:

  ```scala
  const template = document.createElement('template');
  template.innerHTML = `<p>Hello World</p>`;

  class HelloWorld extends HTMLElement {
  	constructor() {
  		super();
  		this.attachShadow({ mode: 'open' });
  		this.shadowRoot.append(template.content.cloneNode(true));
  	}
  }

  customElements.define('hello-world', HelloWorld);

  ```

  This is the most simple component you can write, but there’s already so much going on. For someone completely new to web components, and without the background knowledge I provided above, they’re going to be left with a lot of questions, and a lot of confusion.

  For me, there are at least two key reasons why web components can be challenging to write, at least within the context of the hello world examples.

  ### The markup is decoupled from the component logic

  In many frameworks, the markup of the component is often treated as a first-class citizen. It’s often the content that gets returned from the component function, or has direct access to the component’s state, or has built-in utilities to help manipulate markup (like loops, conditionals, and so on).

  This isn’t the case for web components. In fact, the markup is often defined outside of the component’s class. There’s also no built-in way for the template to reference the current state of the component. This becomes a cumbersome limitation as the complexity of a component grows.

  In the world of frontend, components are designed to help developers reuse markup in several pages. As a result, the markup and the component logic are inextricably linked, and so they should be colocated with one another.

  ### ==Writing a web component requires understanding all of its underlying technologies==

  ==As we saw above, web components are made up of three technologies. You can also see in the hello world code snippet, that we explicitly need to know and understand these three technologies.==

  1. ==We’re creating a== **==template element==** ==and setting its inner HTML==
  2. ==We’re creating a== **==shadow root==**==, and explicitly setting its mode to ‘open’.==
  3. ==We’re cloning our== **==template==** ==and appending it to our== **==shadow root==**
  4. ==We’re registering a new== **==custom element==** ==to the document==

  There’s nothing inherently wrong with this, since web components are supposed to be a “lower-level” browser API, making them prime for building abstractions on top of. But for a developer coming from a React or a Svelte background, having to understand these new browser features, and then having to write components with them can feel like too much friction.

  ## More Advanced Web Components

  Let’s take a look at a more advanced web component, a counter button.

  ![A simple counter button. There's a clickable button, and some text showing how many times the button has been clicked](https://proxy-prod.omnivore-image-cache.app/388x228,sHWCz4gELDISUuDwuoPIHQHGqCm0zEx5YHunEIzF9BE0/https://www.freecodecamp.org/news/content/images/2023/11/counter-button.png)

  You click the button, and the counter increments.

  The following example contains a few extra web component concepts, like lifecycle functions and observable attributes. You don’t need to understand everything going on in the code snippet. This example is really only used to illustrate how much boilerplate is required for the most basic of interactive interfaces, a counter button:

  ```kotlin
  const templateEl = document.createElement("template");

  templateEl.innerHTML = `
  <button>Press me!</button>
  <p>You pressed me 0 times.</p>
  `;

  export class OdysseyButton extends HTMLElement {
    constructor() {
      super();
      this.attachShadow({ mode: "open" });
      this.shadowRoot.appendChild(templateEl.content.cloneNode(true));
      this.button = this.shadowRoot.querySelector("button");
      this.p = this.shadowRoot.querySelector("p");
      this.setAttribute("count", "0");
    }

  	// Note: Web components have lifecycle methods,
    // If we're setting event listeners when the component is added to the DOM, it's our job to clean
    // them up when it gets removed from the DOM
    connectedCallback() {
      this.button.addEventListener("click", this.handleClick);
    }

    disconnectedCallback() {
      this.button.removeEventListener("click", this.handleClick);
    }

    // Unlike frameworks like React, Web Components don't automatically rerender when a prop (or attribute)
    // changes. Instead, we need to explicitly define which attributes we want to observe.
    static get observedAttributes() {
      return ["disabled", "count"];
    }

    // When one of the above attributes changes, this lifecycle method runs, and we can
    // react to the new attribute's value accordingly.
    attributeChangedCallback(name, _, newVal) {
      if (name === "count") {
        this.p.innerHTML = `You pressed me ${newVal} times.`;
      }
      if (name === "disabled") {
        this.button.disabled = true;
      }
    }

    // In HTML, attribute values are always strings. This means that it's our job to
    // convert types. You can see below that we're converting a string -> number, and then back to a string
    handleClick = () => {
      const counter = Number(this.getAttribute("count"));
      this.setAttribute("count", `${counter + 1}`);
    };

  ```

  ==As web component authors, we need to consider a lot of things:==

  * ==Setting up the shadow DOM==
  * ==Setting up the HTML templates==
  * ==Cleaning up event listeners==
  * ==Defining properties that we want to observe==
  * ==Reacting to properties when they change==
  * ==Handling type conversions for attributes==

  And there are still so many other things to consider that I haven’t touched on in this article.

  That isn’t to say that web components are bad and that you shouldn’t write them. In fact, I’d argue that you learn so much about the browser platform by building with them. 

  But I feel that there are better ways to write components if your priority is to write interoperable components in a much more streamlined and ergonomic way.

  ## How to Write Web Components with Less Boilerplate

  As I mentioned earlier, there are a lot of tools out there to help make writing web components much easier. 

  ==One such tool is called Lit, which is developed by a team at Google.== ==[Lit](https://lit.dev/)== ==is a lightweight library designed to make writing web components simple, by removing the need for the boilerplate we’ve already seen above.==

  As we’ll see, Lit does a lot of heavy lifting under-the-hood to help cut down the total lines of code by nearly half! And because Lit is a wrapper around web components and other native browser features, all your existing knowledge about web components is transferable.

  To start seeing how Lit simplifies your web components. Here’s the **hello world** example from earlier, but refactored to use Lit instead of a vanilla web component:

  ```scala
  import { LitElement, html } from "lit";

  export class HelloWorld extends LitElement {
    render() {
      return html`<p>Hello World!</p>`;
    }
  }`

  customElements.define('hello-world', HelloWorld);

  ```

  There’s a lot less boilerplate with the Lit component, and Lit handles the two problems I mentioned earlier, a little bit differently. Let’s see how:

  1. The markup is directly defined from within the component class. While you can define your templates outside of the class, it’s common practice to return the template from the `render` function. This is more in line with the mental model presented in other UI frameworks, where the UI is a function of the state.
  2. Lit also doesn’t require developers to attach the shadow DOM, or create templates and clone template elements. While having an understanding of the underlying web component features will help when developing Lit components, they’re not required for getting started, so the barrier for entry is much lower.

  So now for the big finale, what does the counter component look like once we’ve migrated it over to Lit?

  ```typescript
  import { LitElement, html } from "lit";

  export class OdysseyCounter extends LitElement {
    static properties = {
  		// We define the component's properties as well as their type.
  		// These properties will trigger the component to re-render when their values change.
  		// While they're not the same, you can think of these "properties" as being
  		// Lit's alternatives to "observed attributes"
  		// If the value is passed down as an attribute, Lit converts the value
  		// to the correct type
      count: { type: Number },
      disabled: { type: Boolean },
    };

    constructor() {
      super();
  		// There's no need to create a shadow DOM, clone the template,
  		// or store references to our DOM nodes.
      this.count = 0;
    }

    onCount() {
      this.count = this.count + 1;
    }

    render() {
  		// Instead of using the attributeChangedCallback lifecycle, the
  		// render function has access to all of the component's properties,
  		// which simplifies the process of manipulating our templates.
      return html`
        <button ?disabled=${this.disabled} @click=${this.onCount}>
          Press me!
        </button>
        <p>You pressed me ${this.count} times.</p>
      `;
    }
  }`

  ```

  The amount of code we’re writing is cut down by almost half! And this difference becomes more noticeable when creating more complex user interfaces.

  ## Why am I going on about Lit?

  I’m a big believer in web components, but I recognise that the barrier to entry is high for many developers. Writing complex web components requires understanding heaps of browser features and the education around web components isn’t as comprehensive as other technologies, like React or Vue.

  This is why I think it’s important to use tools like Lit can make writing performant and interoperable web components much easier. This is great if you want your components to work within any frontend framework.

  If you’d like to learn even more, this is the approach I teach in my upcoming course [Component Odyssey](https://component-odyssey.com/). This course is excellent for anyone who wants to understand how to write components that work in any framework. 

  I do this by covering the absolute basics of web components, before moving on to tools like Lit that simplify the process of writing web components without complicating your development environment. By the end, you’ll learn how to build and publish a component library that works across any frontend framework.

  If you want early-bird discount codes for Component Odyssey, then head on [over to the site to get notified](https://component-odyssey.com/subscribe).

  ---

  ---

   Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. [Get started](https://www.freecodecamp.org/learn/)

raw_content:
  ---
  id: 616d5d08-7d04-11ee-8eaa-9f56108b78ec
  title: |
    How to Write Components that Work in Any Framework
  status: ARCHIVED
  tags:
    - read-later
    - RSS
  date_added: 2023-11-06 17:25:12
  url_omnivore: |
    https://omnivore.app/me/how-to-write-components-that-work-in-any-framework-18ba72d0079
  url_original: |
    https://www.freecodecamp.org/news/write-components-that-work-in-any-framework/
  ---

  # How to Write Components that Work in Any Framework

  ## Highlights

  With Custom Elements you can author your own custom HTML elements that you can reuse across your site. They can be as simple as text, images, or visual decorations. You can push them further and build interactive components, complex widgets, or entire web applications. 

  [source](https://omnivore.app/me/how-to-write-components-that-work-in-any-framework-18ba72d0079#bceef8c0-728e-422a-aed6-b047736cb395) 

  ---

  ### Writing a web component requires understanding all of its underlying technologies

  As we saw above, web components are made up of three technologies. You can also see in the hello world code snippet, that we explicitly need to know and understand these three technologies.

  1. We’re creating a **template element** and setting its inner HTML
  2. We’re creating a **shadow root**, and explicitly setting its mode to ‘open’.
  3. We’re cloning our **template** and appending it to our **shadow root**
  4. We’re registering a new **custom element** to the document 

  [source](https://omnivore.app/me/how-to-write-components-that-work-in-any-framework-18ba72d0079#46fc130a-1549-40c8-b950-42035c227bc4) 

  ---

  As web component authors, we need to consider a lot of things:

  * Setting up the shadow DOM
  * Setting up the HTML templates
  * Cleaning up event listeners
  * Defining properties that we want to observe
  * Reacting to properties when they change
  * Handling type conversions for attributes 

  [source](https://omnivore.app/me/how-to-write-components-that-work-in-any-framework-18ba72d0079#855f444c-49f1-4176-9537-aaeeb6a01355) 

  ---

  One such tool is called Lit, which is developed by a team at Google. [Lit](https://lit.dev/) is a lightweight library designed to make writing web components simple, by removing the need for the boilerplate we’ve already seen above. 

  [source](https://omnivore.app/me/how-to-write-components-that-work-in-any-framework-18ba72d0079#385d9ef8-13fb-4799-bff5-ef767b3df67f) 

  ---

  ## Original

  ![How to Write Components that Work in Any Framework](https://proxy-prod.omnivore-image-cache.app/1200x600,sbNnkMyaVUIiiSYXNfn_YVuWBIhu0N84ey_fbF6pQlVw/https://www.freecodecamp.org/news/content/images/size/w2000/2023/11/og-button.png) 

  The browser has a built-in way of writing reusable components in the form of **web components**. They’re an excellent choice for building interactive and reusable components that work in any frontend framework. 

  With that said, writing highly interactive and robust web components isn’t simple. They require a lot of boilerplate and feel much less intuitive than the components you may have written in frameworks like React, Svelte, or Vue.

  In this tutorial, I’ll give you an example of an interactive component written as a web component, and then refactor it using a library that softens the edges and removes heaps of boilerplate.

  Don’t sweat it if you’re not familiar with web components. In the next section, I’ll do a (brief) overview of what web components are, and what they’re made out of. If you have some basic experience with them, you can skip the next section.

  ## What are Web Components?

  Before web components, the browser didn’t have a standard way of writing reusable components. Many libraries solve this problem, but they often run into limitations like performance, interoperability, and issues with web standards.

  Web components are a technology made up of 3 different browser features:

  * Custom elements
  * Shadow DOM
  * HTML Templates

  We’ll do a quick crash course covering these technologies, but it’s by no means a comprehensive breakdown.

  ### What are Custom Elements?

  ==With Custom Elements you can author your own custom HTML elements that you can reuse across your site. They can be as simple as text, images, or visual decorations. You can push them further and build interactive components, complex widgets, or entire web applications.==

  You’re not just limited to using them in your projects, but you can publish them and allow other developers to use them on their sites.

  Here are some of the reusable components from my library [A2K](https://a2000-docs.netlify.app/). You can see that they come in all shapes and sizes, and have a range of different functionalities. Using them in your projects is similar to using any old HTML element.

  ![A small collection of web components from the A2K library](https://proxy-prod.omnivore-image-cache.app/1936x1576,sJHqJR3aX72y4hbKfS4SGGmJwoFGcBRrCJxB2ozU2rIU/https://www.freecodecamp.org/news/content/images/2023/11/web-components.png)

  A small collection of web components from the A2K library

  Here’s how you’d use the progress element in your project:

  ```xml
  <!DOCTYPE html>
  <html>
  	<head>
  		<title>Quick Start</title>
  		<meta charset="UTF-8" />
  	</head>

  	<body>
  		<!-- Use web components in your HTML like regular built-in elements. -->
  		<a2k-progress progress="50" />

  		<!-- a2k web components use standard JavaScript modules. -->
  		<script type="module">
  			import 'https://cdn.jsdelivr.net/npm/@a2000/progress@0.0.5/lib/src/a2k-progress.js';
  		</script>
  	</body>
  </html>

  ```

  Once you’ve imported the third-party scripts, you can start using the component, `a2k-progress` in this case, just like any other HTML element.

  If you’re building your own web components, there’s virtually no limit to how complex you can make your custom elements. 

  I recently created a web component that renders a CodeSandbox code editor in the browser. And because it’s a web component, you can use it in any framework you like! If you’d like to learn a little more about that, [you can read more here](https://component-odyssey.com/articles/00-sandpack-lit-universal).

  ### What is the Shadow DOM?

  If you have a working knowledge of CSS, you’ll know that vanilla CSS is scoped globally. Writing something like this in your global.css:

  ```css
  p {
    color: tomato;
  }

  ```

  will give all `p` elements a nice orange/red color, assuming that no other, more specific CSS selectors are applied to a `p` element.

  Take this select menu, for example:

  ![A select menu component with a visual design reminiscent of the old Windows operating systems](https://proxy-prod.omnivore-image-cache.app/1034x502,s9CkMnQ9nLrjRpsbeELOUs7SesB_nfO2NrbzcalU2UFE/https://www.freecodecamp.org/news/content/images/2023/11/a2k-select-menu.png)

  It has a distinct character which is driven by the visual design. You might want to use this component, but if your global styles affect things like the font family, the color, or the font size, it could cause issues with the appearance of the component:

  ```xml
  <head>
  	<style>
  		body {
  			color: blue;
  			font-size: 12px;
  			font-family: system-ui;
  		}
  	</style>
  </head>

  <body>
  	<a2k-select></a2k-select>
  </body>

  ```

  ![The same select menu, but with a lot of its defining characteristics overridden by global CSS.](https://proxy-prod.omnivore-image-cache.app/1904x824,s6vwLXZ-23v_oU3NRFu4pagLJRfGUCz14nw0IkGnQuPU/https://www.freecodecamp.org/news/content/images/2023/11/a2k-select-menu-2.png)

  This is where the Shadow DOM comes in. The Shadow DOM is an encapsulation mechanism that prevents the rest of the DOM from interfering with your web components. It ensures that the global styles of the web application don’t interfere with any components that you consume. It also means that component library developers can author their components with the confidence that they’ll look and behave as expected across different web applications.

  There’s a lot more nuance when it comes to the Shadow DOM, as well as other features that we’re not going to touch on in this article. If you’d like to learn more about web components though, I have an entire course ([Component Odyssey](https://component-odyssey.com/)) dedicated to teaching you how to build reusable components that work in any framework.

  ### HTML Templates

  The last feature in our whistle-stop tour of web component features is HTML Templates.

  What makes this HTML element different from other elements, is that the browser doesn’t render its content to the page. If you were to write the following HTML you wouldn’t see the text “I’m a header” displayed on the page:

  ```xml
  <body>
  	<template>
  		<h1>I'm a header</h1>
  	</template>
  </body>

  ```

  Instead of being used to render the content directly, the content of the template is designed to be copied. The copied template can then be used to render content to the page. 

  You can think of the template element much like the template for a 3D print. The template isn’t a physical entity, but it’s used to create real-life clones.

  You would then reference the template element in your web component, clone it, and render the clone as the markup for your component.

  I won’t spend any more time on these web component features, but you’ve probably already noticed that to write vanilla web components, there are a lot of new browser features that you need to know and understand. 

  You’ll see in the next section that the mental model for building web components doesn’t feel as streamlined as it does for other component frameworks.

  ## How to Build a Basic Web Component

  Now that we’ve briefly covered the fundamental technologies powering a web component, here’s how to build a _hello world_ component:

  ```scala
  const template = document.createElement('template');
  template.innerHTML = `<p>Hello World</p>`;

  class HelloWorld extends HTMLElement {
  	constructor() {
  		super();
  		this.attachShadow({ mode: 'open' });
  		this.shadowRoot.append(template.content.cloneNode(true));
  	}
  }

  customElements.define('hello-world', HelloWorld);

  ```

  This is the most simple component you can write, but there’s already so much going on. For someone completely new to web components, and without the background knowledge I provided above, they’re going to be left with a lot of questions, and a lot of confusion.

  For me, there are at least two key reasons why web components can be challenging to write, at least within the context of the hello world examples.

  ### The markup is decoupled from the component logic

  In many frameworks, the markup of the component is often treated as a first-class citizen. It’s often the content that gets returned from the component function, or has direct access to the component’s state, or has built-in utilities to help manipulate markup (like loops, conditionals, and so on).

  This isn’t the case for web components. In fact, the markup is often defined outside of the component’s class. There’s also no built-in way for the template to reference the current state of the component. This becomes a cumbersome limitation as the complexity of a component grows.

  In the world of frontend, components are designed to help developers reuse markup in several pages. As a result, the markup and the component logic are inextricably linked, and so they should be colocated with one another.

  ### ==Writing a web component requires understanding all of its underlying technologies==

  ==As we saw above, web components are made up of three technologies. You can also see in the hello world code snippet, that we explicitly need to know and understand these three technologies.==

  1. ==We’re creating a== **==template element==** ==and setting its inner HTML==
  2. ==We’re creating a== **==shadow root==**==, and explicitly setting its mode to ‘open’.==
  3. ==We’re cloning our== **==template==** ==and appending it to our== **==shadow root==**
  4. ==We’re registering a new== **==custom element==** ==to the document==

  There’s nothing inherently wrong with this, since web components are supposed to be a “lower-level” browser API, making them prime for building abstractions on top of. But for a developer coming from a React or a Svelte background, having to understand these new browser features, and then having to write components with them can feel like too much friction.

  ## More Advanced Web Components

  Let’s take a look at a more advanced web component, a counter button.

  ![A simple counter button. There's a clickable button, and some text showing how many times the button has been clicked](https://proxy-prod.omnivore-image-cache.app/388x228,sHWCz4gELDISUuDwuoPIHQHGqCm0zEx5YHunEIzF9BE0/https://www.freecodecamp.org/news/content/images/2023/11/counter-button.png)

  You click the button, and the counter increments.

  The following example contains a few extra web component concepts, like lifecycle functions and observable attributes. You don’t need to understand everything going on in the code snippet. This example is really only used to illustrate how much boilerplate is required for the most basic of interactive interfaces, a counter button:

  ```kotlin
  const templateEl = document.createElement("template");

  templateEl.innerHTML = `
  <button>Press me!</button>
  <p>You pressed me 0 times.</p>
  `;

  export class OdysseyButton extends HTMLElement {
    constructor() {
      super();
      this.attachShadow({ mode: "open" });
      this.shadowRoot.appendChild(templateEl.content.cloneNode(true));
      this.button = this.shadowRoot.querySelector("button");
      this.p = this.shadowRoot.querySelector("p");
      this.setAttribute("count", "0");
    }

  	// Note: Web components have lifecycle methods,
    // If we're setting event listeners when the component is added to the DOM, it's our job to clean
    // them up when it gets removed from the DOM
    connectedCallback() {
      this.button.addEventListener("click", this.handleClick);
    }

    disconnectedCallback() {
      this.button.removeEventListener("click", this.handleClick);
    }

    // Unlike frameworks like React, Web Components don't automatically rerender when a prop (or attribute)
    // changes. Instead, we need to explicitly define which attributes we want to observe.
    static get observedAttributes() {
      return ["disabled", "count"];
    }

    // When one of the above attributes changes, this lifecycle method runs, and we can
    // react to the new attribute's value accordingly.
    attributeChangedCallback(name, _, newVal) {
      if (name === "count") {
        this.p.innerHTML = `You pressed me ${newVal} times.`;
      }
      if (name === "disabled") {
        this.button.disabled = true;
      }
    }

    // In HTML, attribute values are always strings. This means that it's our job to
    // convert types. You can see below that we're converting a string -> number, and then back to a string
    handleClick = () => {
      const counter = Number(this.getAttribute("count"));
      this.setAttribute("count", `${counter + 1}`);
    };

  ```

  ==As web component authors, we need to consider a lot of things:==

  * ==Setting up the shadow DOM==
  * ==Setting up the HTML templates==
  * ==Cleaning up event listeners==
  * ==Defining properties that we want to observe==
  * ==Reacting to properties when they change==
  * ==Handling type conversions for attributes==

  And there are still so many other things to consider that I haven’t touched on in this article.

  That isn’t to say that web components are bad and that you shouldn’t write them. In fact, I’d argue that you learn so much about the browser platform by building with them. 

  But I feel that there are better ways to write components if your priority is to write interoperable components in a much more streamlined and ergonomic way.

  ## How to Write Web Components with Less Boilerplate

  As I mentioned earlier, there are a lot of tools out there to help make writing web components much easier. 

  ==One such tool is called Lit, which is developed by a team at Google.== ==[Lit](https://lit.dev/)== ==is a lightweight library designed to make writing web components simple, by removing the need for the boilerplate we’ve already seen above.==

  As we’ll see, Lit does a lot of heavy lifting under-the-hood to help cut down the total lines of code by nearly half! And because Lit is a wrapper around web components and other native browser features, all your existing knowledge about web components is transferable.

  To start seeing how Lit simplifies your web components. Here’s the **hello world** example from earlier, but refactored to use Lit instead of a vanilla web component:

  ```scala
  import { LitElement, html } from "lit";

  export class HelloWorld extends LitElement {
    render() {
      return html`<p>Hello World!</p>`;
    }
  }`

  customElements.define('hello-world', HelloWorld);

  ```

  There’s a lot less boilerplate with the Lit component, and Lit handles the two problems I mentioned earlier, a little bit differently. Let’s see how:

  1. The markup is directly defined from within the component class. While you can define your templates outside of the class, it’s common practice to return the template from the `render` function. This is more in line with the mental model presented in other UI frameworks, where the UI is a function of the state.
  2. Lit also doesn’t require developers to attach the shadow DOM, or create templates and clone template elements. While having an understanding of the underlying web component features will help when developing Lit components, they’re not required for getting started, so the barrier for entry is much lower.

  So now for the big finale, what does the counter component look like once we’ve migrated it over to Lit?

  ```typescript
  import { LitElement, html } from "lit";

  export class OdysseyCounter extends LitElement {
    static properties = {
  		// We define the component's properties as well as their type.
  		// These properties will trigger the component to re-render when their values change.
  		// While they're not the same, you can think of these "properties" as being
  		// Lit's alternatives to "observed attributes"
  		// If the value is passed down as an attribute, Lit converts the value
  		// to the correct type
      count: { type: Number },
      disabled: { type: Boolean },
    };

    constructor() {
      super();
  		// There's no need to create a shadow DOM, clone the template,
  		// or store references to our DOM nodes.
      this.count = 0;
    }

    onCount() {
      this.count = this.count + 1;
    }

    render() {
  		// Instead of using the attributeChangedCallback lifecycle, the
  		// render function has access to all of the component's properties,
  		// which simplifies the process of manipulating our templates.
      return html`
        <button ?disabled=${this.disabled} @click=${this.onCount}>
          Press me!
        </button>
        <p>You pressed me ${this.count} times.</p>
      `;
    }
  }`

  ```

  The amount of code we’re writing is cut down by almost half! And this difference becomes more noticeable when creating more complex user interfaces.

  ## Why am I going on about Lit?

  I’m a big believer in web components, but I recognise that the barrier to entry is high for many developers. Writing complex web components requires understanding heaps of browser features and the education around web components isn’t as comprehensive as other technologies, like React or Vue.

  This is why I think it’s important to use tools like Lit can make writing performant and interoperable web components much easier. This is great if you want your components to work within any frontend framework.

  If you’d like to learn even more, this is the approach I teach in my upcoming course [Component Odyssey](https://component-odyssey.com/). This course is excellent for anyone who wants to understand how to write components that work in any framework. 

  I do this by covering the absolute basics of web components, before moving on to tools like Lit that simplify the process of writing web components without complicating your development environment. By the end, you’ll learn how to build and publish a component library that works across any frontend framework.

  If you want early-bird discount codes for Component Odyssey, then head on [over to the site to get notified](https://component-odyssey.com/subscribe).

  ---

  ---

   Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. [Get started](https://www.freecodecamp.org/learn/) 

metadata:
  {"date_added":"2023-11-06 17:25:12","id":"616d5d08-7d04-11ee-8eaa-9f56108b78ec","status":"ARCHIVED","tags":["read-later","RSS"],"title":"How to Write Components that Work in Any Framework\n","url_omnivore":"https://omnivore.app/me/how-to-write-components-that-work-in-any-framework-18ba72d0079\n","url_original":"https://www.freecodecamp.org/news/write-components-that-work-in-any-framework/\n"}


path: Omnivore/2023-11-07 - How to Avoid Prop Drilling in React.md
sortable_path: Omnivore2023-11-07 - How to Avoid Prop Drilling in React.md
title: How to Avoid Prop Drilling in React
lead: # How to Avoid Prop Drilling in React
checksum: 08f578c16dc290eac60916a9c7eb57f8a3b4ecd60de7115cf74482d42c1c7680
created: 2024-09-15 00:40:57.319785835+00:00
modified: 2024-09-22 22:40:13.393511027+00:00
body:
  # How to Avoid Prop Drilling in React

  ## Highlights

  Prop drilling occurs when a parent component generates its state and passes it down as `props` to its children components that do not consume the props – instead, they only pass it down to another component that finally consumes it. 

  [source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#05db3def-4e59-4cfe-b8dd-1044ce91a9d5) 

  ---

  First of all, **grouping static elements and dependent components** together to achieve an appealing UI design is the major cause of prop drilling. You can't avoid prop drilling when your UI groups static elements and dependent components together in a parent. The parent component clearly won't use the `prop`, as everything within it is a static element – except the component that needs a prop. 

  [source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#fa2c28c0-1b7e-4416-8553-c1b5c7a59637) 

  ---

  Second of all, when a **component accepts `props` that it doesn't use but merely passes it down to its children**, this is a sign that you have prop drilling in your component: 

  [source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#6749a89e-a38c-4f4f-aa3f-c6455e6daf85) 

  ---

  Third, when a component that represents an independent section of a page is **forced to take props from its parent**, prop drilling is inevitable. It should ideally be self-contained with its state and operations. 

  [source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#751d81de-62b7-444b-a2f0-a0b374f6ce45) 

  ---

  And finally, **the presence of elongated `props`** is a sure sign of prop drilling. Since an elongated prop is a fundamental element that's consistently present in every case of prop drilling, grasping this concept allows you to instinctively avoid prop drilling. 

  [source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#90f807ca-03a3-4804-bcf1-c5df4e53a997) 

  ---

  Component composition is a good approach to fix prop drilling. If you ever find yourself in a situation where a component passes down a prop it neither creates nor consumes, you can use component composition to fix it. 

  [source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#0112181f-34b7-4ca3-b941-f1c16303c6c0) 

  ---

  To avoid prop drilling in this case, any grandchildren components that require access to the same `props`, especially when their parent don't consume the data, should be passed as children ensuring that the data remains within the `App` context. 

  [source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#c17f1d4e-8f5c-45d1-9078-fe8ab740e11e) 

  ---

  Prop drilling can also be fixed by moving state to where it is consumed. The example of prop drilling in this article has a component named `Content`. But the component is forced to receive a `prop` from its parent instead of having a state and be an independent component – and so we have prop drilling. 

  [source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#9f94fd13-9558-4bd3-a60c-60074b3495d2) 

  ---

  It's essential to highlight what to avoid when dealing with prop drilling to prevent unnecessary challenges.

  * **Avoid React Context, if possible, to fix prop drilling.** This approach ties your component to a specific context, restricting its usability outside of that context and hindering composition and reusability.
  * **Steer clear of redundant components by employing a children-parent replacement approach.** This approach naturally incorporates [component composition](https://www.codementor.io/@dinerismail/the-power-of-component-composition-in-react-21goassg4m) without introducing redundant components or states when resolving prop drilling. 

  [source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#8ff7b79b-5503-4e1a-b7fe-1a07a46c578c) 

  ---

  ## Original

  ![How to Avoid Prop Drilling in React](https://proxy-prod.omnivore-image-cache.app/1280x720,sKh6f6Y_QlOrf22lUoux3sSuSVezHNMNwL0zz9QlJgdQ/https://www.freecodecamp.org/news/content/images/size/w2000/2023/11/Purple-Creative-Livestream-YouTube-Thumbnail.png) 

  In order to write scalable, reusable, and maintainable applications with React, you'll need to go beyond the surface of using React components, useEffect, useContext, useState, and the like. It involves learning in detail how React works in more depth. 

  And if you don't properly understand these key React concepts, you can run into various issues, like [prop drilling](https://www.quora.com/What-is-prop-drilling-in-ReactJS).

  In this tutorial, you'll learn what prop drilling is. I'll also teach you how to intuitively avoid it without relying on React context. In the end, you'll understand how to identify prop drilling without thinking and fix it with precision.

  If you prefer a visual guide, here's a video version of this tutorial on my [YouTube channel](https://youtu.be/KZnQ5R8Kd4I) (approximately 15 minutes).

  [![Watch the video](https://proxy-prod.omnivore-image-cache.app/480x360,sEF1bGD-Lf4T-Vw-XRelb5_QXFIgGpiBvkoeFBwT8sbs/https://img.youtube.com/vi/ELZZnqHJhlw/hqdefault.jpg)](https://www.youtube.com/embed/ELZZnqHJhlw)

  ## What is Prop Drilling?

  ==Prop drilling occurs when a parent component generates its state and passes it down as== `==props==` ==to its children components that do not consume the props – instead, they only pass it down to another component that finally consumes it.== 

  Below is an example of prop drilling in React:

  ```xquery
  function App() {
    const [profile, setProfile] = useState({ame: 'John'}); 
    return ( 
      <div> <Header profile={profile} /> 
      </div> 
    ); 
  } 
    
  function Header({ profile }) { 
    return ( 
      <header> 
        <h1>This is the header</h1> 
        <Content profile={profile} /> 
      </header> 
    ); 
  } 

  function Content({ profile }) { 
    return ( 
      <main> 
        <h2>Content Component</h2> 
        <p>{profile.name}</p> 
      </main> 
    ); 
  } 

  export default App;
  ```

  If you check out the example above, you'll notice that `profile` is passed from the `App` component through the `Header` to the `Content` component, which eventually makes use of the `props`. This is commonly referred to as prop drilling as the `Header` component doesn't consume the `prop` but only passes it down to the `Content` component that finally consumes it.

  Now that you understand what prop drilling is, the next challenge is to figure out how to avoid it because it's not always an intuitive process. 

  You'll need to start exploring methods to address it. While you can use component composition and React context to resolve it, the challenge lies in not always recognizing the issue until later. 

  To truly master the art of handling prop drilling intuitively, you must learn how to identify elongated props and contexts.

  ## What is an Elongated Prop?

  ![Where is the love sung by The Black Eye Peas recreated in a tunnel underpass.](https://proxy-prod.omnivore-image-cache.app/2000x1333,s26q4lqLPqkZI3s4R-g30Fqa9bmslwGSLqHbqRqvKgwc/https://images.unsplash.com/photo-1484069560501-87d72b0c3669?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDV8fHF1ZXN0aW9uaW5nfGVufDB8fHx8MTY5OTMyMzQ0MXww&ixlib=rb-4.0.3&q=80&w=2000)

  Photo by [Emily Morter](https://unsplash.com/@emilymorter?utm%5Fsource=ghost&utm%5Fmedium=referral&utm%5Fcampaign=api-credit) / [Unsplash](https://unsplash.com/?utm%5Fsource=ghost&utm%5Fmedium=referral&utm%5Fcampaign=api-credit)

  An elongated prop is a `prop` that is not consumed but it is only passed down to another component. When a component receives a `prop` from its parent and doesn't consume the `prop`, it passes the prop down to another component. This prop is called elongated prop because it has been extended.

  Whenever you see a `prop` being passed down by components that neither creates nor consumes the `prop`, you have an an elongated prop (as well as prop drilling) in your code. The code snippet below is an example:

  ```javascript
  function Profile({ user }) { 
    return ( 
      <header> 
        <h1>This is the header</h1> 
        <Content user={user} /> 
      </header> 
    ); 
  }
  ```

  `user`, in this example, is an elongated `prop` as it is neither created nor consumed by the `Profile` component. Instead, it is only passed down to the `Content` component. And that means we have extended `user` through a component that doesn't need it so that it can get to the one that does.

  Now, let's revisit the example we used to illustrate prop drilling. Wait, are you thinking what I'm thinking? The `prop` that's being passed down in the prop drilling example is indeed an elongated prop, right? Yes, you've got it.

  ```xquery
  function App() {
    const [profile, setProfile] = useState({ame: 'John'}); 
    return ( 
      <div> 
        <Header profile={profile} /> 
      </div> 
    ); 
  } 
    
  function Header({ profile }) { 
    return ( 
      <header> 
        <h1>This is the header</h1> 
        <Content profile={profile} /> 
      </header> 
    ); 
  } 

  function Content({ profile }) { 
    return ( 
      <main> 
        <h2>Content Component</h2> 
        <p>{profile.name}</p> 
      </main> 
    ); 
  } 

  export default App;
  ```

  In the code above, you can observe that the `prop` passed to `Header` is created in the `App` component. Then, `Header` passes it down to its child component named `Content`. As a result, the `profile` being passed down can be considered elongated because it is passed through a component (`Header`) that neither creates nor consumes it down to the one that does.

  The `Header` component passing down the `prop` it doesn't create or need is unnecessarily stretching the context of the `prop`. 

  Now, the question is, how do elongated props help to intuitively avoid prop drilling in React? They make it easy for you to spot `props` being used where they're are neither created nor consumed.

  Rather than focusing on how to solve prop drilling, elongated props enable you to avoid it. This is because it's intuitive to recognize when a component neither creates nor consumes `props`, and that helps you to know the component is irrelevant.

  But before you learn how to quickly avoid prop drilling with your understanding of elongated props, it is important that you know the main causes of prop drilling. Then you'll truly know how to avoid it without thinking about it.

  ## What Causes Prop Drilling?

  ![»What is your story?«](https://proxy-prod.omnivore-image-cache.app/2000x1500,sA8o6QjJC2cc6DWaXvdQrHJrsY7uC26GCnLTYhFTKN7E/https://images.unsplash.com/photo-1617575521317-d2974f3b56d2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fHRyaWdnZXJ8ZW58MHx8fHwxNjk5MzIzNTU2fDA&ixlib=rb-4.0.3&q=80&w=2000)

  Photo by [Etienne Girardet](https://unsplash.com/@etiennegirardet?utm%5Fsource=ghost&utm%5Fmedium=referral&utm%5Fcampaign=api-credit) / [Unsplash](https://unsplash.com/?utm%5Fsource=ghost&utm%5Fmedium=referral&utm%5Fcampaign=api-credit)

  Prop drilling doesn't occur out of thin air. It's a consequence of inadequate component organization, and it is not a React problem. It is a thinking or design problem. 

  You won't encounter an instance of prop drilling without observing one of the following layout mistakes:

  ==First of all,== **==grouping static elements and dependent components==** ==together to achieve an appealing UI design is the major cause of prop drilling. You can't avoid prop drilling when your UI groups static elements and dependent components together in a parent. The parent component clearly won't use the== `==prop==`==, as everything within it is a static element – except the component that needs a prop.==

  Here's an example:

  ```javascript
  function Header({ profile }) { 
    return ( 
      <header> 
        <h1>This is the header</h1> 
        <Content profile={profile} /> 
      </header> 
    ); 
  }
  ```

  In this case, static elements `<header> and <h1>` are grouped with a dependent component `Content` – and that's why we have prop drilling therein. 

  Provided that the `Content` component is independent or takes no `props`, it won't need `profile` and there won't be prop drilling in the first place. This is why forcing a component that should be independent to take `props` from its parent is a recipe for prop drilling in React.

  ==Second of all, when a== **==component accepts== `==props==` ==that it doesn't use but merely passes it down to its children==**==, this is a sign that you have prop drilling in your component:== 

  ```php
  function App () { 
    const [profile, setProfile] = useState({name: "Ayobami"})
    return ( 
      <>
        <Parent profile={profile} /> 
      </>
   ); 
  }; 

  function Parent({ profile }) { 
    return ( 
      <div>
        <Hero profile={profile} /> 
        <Features profile={profile} /> 
      </div>
   ); 
  }; 
  ```

  In this case there is prop drilling because the `Parent` component takes `profile` and it doesn't use it though it passes it down to its children. 

  ==Third, when a component that represents an independent section of a page is== **==forced to take props from its parent==**==, prop drilling is inevitable. It should ideally be self-contained with its state and operations.== 

  The exception would be if it's intentionally tied to its parent for specific reasons. In such cases, prop drilling becomes a necessary trade-off. 

  If you revisit the example of prop drilling cited in this article, you will realize it has a prop drilling issue because the `Content` component which could have been an independent component by having a state is forced to receive props from its parent.

  ==And finally,== **==the presence of elongated== `==props==`** ==is a sure sign of prop drilling. Since an elongated prop is a fundamental element that's consistently present in every case of prop drilling, grasping this concept allows you to instinctively avoid prop drilling.== 

  When you spot an elongated prop, you can be certain that one of the other three mistakes is also in play. In short, an elongated prop is a prop that is not consumed and is also passed down to another component.

  So grouping static elements with dependent components, forcing components to take props, elongated props, and receiving a prop without consuming it are the signs to recognize prop drilling in React.

  ## How to Fix Prop Drilling with Component Composition

  ==Component composition is a good approach to fix prop drilling. If you ever find yourself in a situation where a component passes down a prop it neither creates nor consumes, you can use component composition to fix it.== 

  But to use component composition, you need to understand a component context.

  ### What is a component context? ‌

  The context of a component encompasses everything that is visible within it, including state, props, and children. The following code further illustrates this concept:

  ```javascript
  function App() { 
    const [profile, setProfile] = useState({name: 'Ayobami'}); 
    return ( 
      <div> 
        <Header profile={profile} /> 
      </div> 
    ); 
  } 

  export default App;
  ```

  In this scenario, the context of `App` refers to everything we can see within the `App` component – including the `profile` prop, the `Header`, and other `App` content. Therefore, any data created in the `App` component should ideally be utilized within the `App` component itself, either as its own data or as `props` to its children.

  Prop drilling always emerges when the children receiving the `props` doesn't consume it but only passes it down to its children. 

  ==To avoid prop drilling in this case, any grandchildren components that require access to the same== `==props==`==, especially when their parent don't consume the data, should be passed as children ensuring that the data remains within the== `==App==` ==context.==

  ```javascript
  export function App() { 
    const [profile, setProfile] = useState({name: 'Ayobami'}); 
    return ( 
      <div> 
        <Header> 
          <Content profile={profile} /> 
        </Header> 
      </div> 
    ); 
  }
  ```

  **`Or`**

  ```javascript
  export function App() { 
    const [profile, setProfile] = useState({name: 'Ayobami'}); 
    return ( 
      <div> 
        <Header children={<Content profile={profile} />} > 
      </div> 
    ); 
  }
  ```

  As you can see, we have resolved the prop drilling issue in the previous example, even though we still have a redundant component, `<Header>`, right? We've successfully addressed prop drilling through component composition. 

  This process is quite straightforward because we concentrate on recognizing elongated props and repositioning them within appropriate contexts.

  The concept of prop drilling is problem-focused, but prop elongation is solution-driven. When dealing with elongated props, our primary goal is to identify props that are not consumed but only passed down to another components.

  ## How to Fix Prop Drilling by Moving State to the Consumer

  ==Prop drilling can also be fixed by moving state to where it is consumed. The example of prop drilling in this article has a component named== `==Content==`==. But the component is forced to receive a== `==prop==` ==from its parent instead of having a state and be an independent component – and so we have prop drilling.== 

  We can fix the prop drilling in this case by moving the profile state to where it is consumed.

  Let's revisit the example:

  ```xquery
  function App() {
    const [profile, setProfile] = useState({ame: 'John'}); 
    return ( 
      <div> 
        <Header profile={profile} />
        <Footer profile={profile />
      </div> 
    ); 
  } 
    
  function Header({ profile }) { 
    return ( 
      <header> 
        <h1>This is the header</h1> 
        <Content profile={profile} /> 
      </header> 
    ); 
  } 

  function Content({ profile }) { 
    return ( 
      <main> 
        <h2>Content Component</h2> 
        <p>{profile.name}</p> 
      </main> 
    ); 
  } 

  export default App;
  ```

  We can fix prop drilling in this case by moving `profile` to where it is consumed:

  ```javascript
  function App() { 
    return ( 
      <div> 
        <Header />
        <Footer profile={profile />
      </div> 
    ); 
  } 
    
  function Header() { 
    return ( 
      <header> 
        <h1>This is the header</h1> 
        <Content /> 
      </header> 
    ); 
  } 

  function Content({ profile }) { 
    const [profile, setProfile] = useState({ame: 'John'});
    return ( 
      <main> 
        <h2>Content Component</h2> 
        <p>{profile.name}</p> 
      </main> 
    ); 
  }
  ```

  Now that we have lifted the profile to the `Content` component where it is consumed, the `App` component doesn't have a state, while the `Header` component doesn't receive a prop again as the `Content` component has its state.

  But wait! There is a problem. The `Footer` component needs the state we moved away from `App`. There you are! That is the problem with lifting or moving state to where we think it is needed. In this case, if the `Footer` component doesn't need it, we won't have any issue – but `Footer` also needs the prop. 

  Now that `Footer` needs `profile` as a prop, we need to solve prop drilling with another method.

  ## How to Fix Prop Drilling with a Children-Replacing-Parent Strategy

  Earlier in this article, we talked about how to use component composition and moving state to its consumer to solve prop drilling. But as you saw, they have some issues – duplicated components or states.

  But using this children-replacing-parent approach fixes the problem effectively:

  ****Working but could be better:**

  ```xquery
  export function App() { 
    const [profile, setProfile] = useState({name: 'Ayobami'}); 
    return ( 
      <div> 
        <Header> 
          <Content profile={profile} /> 
        </Header> 
      </div> 
    ); 
  }

  function Header({ profile }) { 
    return ( 
      <header> 
        <h1>This is the header</h1> 
        <Content profile={profile} /> 
      </header> 
    ); 
  }
  ```

  The example above shows a solution to the prop drilling example in this article. But as you can see, it has a redundant component, as `Header` does nothing.

  **Here's a better version:**

  ```javascript
  export function App() { 
    const [profile, setProfile] = useState({name: 'Ayobami'}); 
    return ( 
      <header> 
        <h1>This is the header</h1> 
        <Content profile={profile} /> 
      </header> 
    ); 
  }
  ```

  In the above code, we enhance the component composition solution we previously implemented for the prop drilling example by replacing the redundant `Header` component with its content in its parent (`App`).

  ## What to Avoid

  ![photo-1587065915399-8f8c714ab540?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDEwfHxkYW5nZXJ8ZW58MHx8fHwxNjk5MzIzMDgxfDA&ixlib=rb-4.0](https://proxy-prod.omnivore-image-cache.app/2000x1333,svvd90JJPHx2cRZ_A6-9SXg8LuqQJ_kGlJbtNXwk4tTc/https://images.unsplash.com/photo-1587065915399-8f8c714ab540?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDEwfHxkYW5nZXJ8ZW58MHx8fHwxNjk5MzIzMDgxfDA&ixlib=rb-4.0.3&q=80&w=2000)

  Photo by [Edwin Hooper](https://unsplash.com/@edwinhooper?utm%5Fsource=ghost&utm%5Fmedium=referral&utm%5Fcampaign=api-credit) / [Unsplash](https://unsplash.com/?utm%5Fsource=ghost&utm%5Fmedium=referral&utm%5Fcampaign=api-credit)

  ==It's essential to highlight what to avoid when dealing with prop drilling to prevent unnecessary challenges.==

  * **==Avoid React Context, if possible, to fix prop drilling.==** ==This approach ties your component to a specific context, restricting its usability outside of that context and hindering composition and reusability.==
  * **==Steer clear of redundant components by employing a children-parent replacement approach.==** ==This approach naturally incorporates== ==[component composition](https://www.codementor.io/@dinerismail/the-power-of-component-composition-in-react-21goassg4m)== ==without introducing redundant components or states when resolving prop drilling.==

  By avoiding elongated props, you pave the way for crafting maintainable, high-performing, reusable, and scalable React components. It simplifies the process of lifting states and components by removing the struggle of deciding where to place them. 

  With your understanding of elongated props, you can confidently position props and components within the right context without undue stress.

  In short, you can now discover prop drilling intuitively by paying attention to any component that takes `props` it doesn't consume and only passes it down to another component. 

  Thanks for reading – cheers!

  Hey wait! I am [Ayobami Ogundiran](https://twitter.com/codingnninja) and I am about to start showing how to build your own React, Redux, TypeScript, Zod or Ecommerce websites on my YouTube channel. [Click to subscribe](https://youtube.com/youtoocancode) to stay connected. 

  ---

  ---

   Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. [Get started](https://www.freecodecamp.org/learn/)

raw_content:
  ---
  id: aceac380-7e10-11ee-992a-432064e77190
  title: |
    How to Avoid Prop Drilling in React
  status: ARCHIVED
  tags:
    - read-later
    - RSS
    - react
  date_added: 2023-11-07 19:58:39
  url_omnivore: |
    https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2
  url_original: |
    https://www.freecodecamp.org/news/avoid-prop-drilling-in-react/
  ---

  # How to Avoid Prop Drilling in React

  ## Highlights

  Prop drilling occurs when a parent component generates its state and passes it down as `props` to its children components that do not consume the props – instead, they only pass it down to another component that finally consumes it. 

  [source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#05db3def-4e59-4cfe-b8dd-1044ce91a9d5) 

  ---

  First of all, **grouping static elements and dependent components** together to achieve an appealing UI design is the major cause of prop drilling. You can't avoid prop drilling when your UI groups static elements and dependent components together in a parent. The parent component clearly won't use the `prop`, as everything within it is a static element – except the component that needs a prop. 

  [source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#fa2c28c0-1b7e-4416-8553-c1b5c7a59637) 

  ---

  Second of all, when a **component accepts `props` that it doesn't use but merely passes it down to its children**, this is a sign that you have prop drilling in your component: 

  [source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#6749a89e-a38c-4f4f-aa3f-c6455e6daf85) 

  ---

  Third, when a component that represents an independent section of a page is **forced to take props from its parent**, prop drilling is inevitable. It should ideally be self-contained with its state and operations. 

  [source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#751d81de-62b7-444b-a2f0-a0b374f6ce45) 

  ---

  And finally, **the presence of elongated `props`** is a sure sign of prop drilling. Since an elongated prop is a fundamental element that's consistently present in every case of prop drilling, grasping this concept allows you to instinctively avoid prop drilling. 

  [source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#90f807ca-03a3-4804-bcf1-c5df4e53a997) 

  ---

  Component composition is a good approach to fix prop drilling. If you ever find yourself in a situation where a component passes down a prop it neither creates nor consumes, you can use component composition to fix it. 

  [source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#0112181f-34b7-4ca3-b941-f1c16303c6c0) 

  ---

  To avoid prop drilling in this case, any grandchildren components that require access to the same `props`, especially when their parent don't consume the data, should be passed as children ensuring that the data remains within the `App` context. 

  [source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#c17f1d4e-8f5c-45d1-9078-fe8ab740e11e) 

  ---

  Prop drilling can also be fixed by moving state to where it is consumed. The example of prop drilling in this article has a component named `Content`. But the component is forced to receive a `prop` from its parent instead of having a state and be an independent component – and so we have prop drilling. 

  [source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#9f94fd13-9558-4bd3-a60c-60074b3495d2) 

  ---

  It's essential to highlight what to avoid when dealing with prop drilling to prevent unnecessary challenges.

  * **Avoid React Context, if possible, to fix prop drilling.** This approach ties your component to a specific context, restricting its usability outside of that context and hindering composition and reusability.
  * **Steer clear of redundant components by employing a children-parent replacement approach.** This approach naturally incorporates [component composition](https://www.codementor.io/@dinerismail/the-power-of-component-composition-in-react-21goassg4m) without introducing redundant components or states when resolving prop drilling. 

  [source](https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2#8ff7b79b-5503-4e1a-b7fe-1a07a46c578c) 

  ---

  ## Original

  ![How to Avoid Prop Drilling in React](https://proxy-prod.omnivore-image-cache.app/1280x720,sKh6f6Y_QlOrf22lUoux3sSuSVezHNMNwL0zz9QlJgdQ/https://www.freecodecamp.org/news/content/images/size/w2000/2023/11/Purple-Creative-Livestream-YouTube-Thumbnail.png) 

  In order to write scalable, reusable, and maintainable applications with React, you'll need to go beyond the surface of using React components, useEffect, useContext, useState, and the like. It involves learning in detail how React works in more depth. 

  And if you don't properly understand these key React concepts, you can run into various issues, like [prop drilling](https://www.quora.com/What-is-prop-drilling-in-ReactJS).

  In this tutorial, you'll learn what prop drilling is. I'll also teach you how to intuitively avoid it without relying on React context. In the end, you'll understand how to identify prop drilling without thinking and fix it with precision.

  If you prefer a visual guide, here's a video version of this tutorial on my [YouTube channel](https://youtu.be/KZnQ5R8Kd4I) (approximately 15 minutes).

  [![Watch the video](https://proxy-prod.omnivore-image-cache.app/480x360,sEF1bGD-Lf4T-Vw-XRelb5_QXFIgGpiBvkoeFBwT8sbs/https://img.youtube.com/vi/ELZZnqHJhlw/hqdefault.jpg)](https://www.youtube.com/embed/ELZZnqHJhlw)

  ## What is Prop Drilling?

  ==Prop drilling occurs when a parent component generates its state and passes it down as== `==props==` ==to its children components that do not consume the props – instead, they only pass it down to another component that finally consumes it.== 

  Below is an example of prop drilling in React:

  ```xquery
  function App() {
    const [profile, setProfile] = useState({ame: 'John'}); 
    return ( 
      <div> <Header profile={profile} /> 
      </div> 
    ); 
  } 
    
  function Header({ profile }) { 
    return ( 
      <header> 
        <h1>This is the header</h1> 
        <Content profile={profile} /> 
      </header> 
    ); 
  } 

  function Content({ profile }) { 
    return ( 
      <main> 
        <h2>Content Component</h2> 
        <p>{profile.name}</p> 
      </main> 
    ); 
  } 

  export default App;
  ```

  If you check out the example above, you'll notice that `profile` is passed from the `App` component through the `Header` to the `Content` component, which eventually makes use of the `props`. This is commonly referred to as prop drilling as the `Header` component doesn't consume the `prop` but only passes it down to the `Content` component that finally consumes it.

  Now that you understand what prop drilling is, the next challenge is to figure out how to avoid it because it's not always an intuitive process. 

  You'll need to start exploring methods to address it. While you can use component composition and React context to resolve it, the challenge lies in not always recognizing the issue until later. 

  To truly master the art of handling prop drilling intuitively, you must learn how to identify elongated props and contexts.

  ## What is an Elongated Prop?

  ![Where is the love sung by The Black Eye Peas recreated in a tunnel underpass.](https://proxy-prod.omnivore-image-cache.app/2000x1333,s26q4lqLPqkZI3s4R-g30Fqa9bmslwGSLqHbqRqvKgwc/https://images.unsplash.com/photo-1484069560501-87d72b0c3669?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDV8fHF1ZXN0aW9uaW5nfGVufDB8fHx8MTY5OTMyMzQ0MXww&ixlib=rb-4.0.3&q=80&w=2000)

  Photo by [Emily Morter](https://unsplash.com/@emilymorter?utm%5Fsource=ghost&utm%5Fmedium=referral&utm%5Fcampaign=api-credit) / [Unsplash](https://unsplash.com/?utm%5Fsource=ghost&utm%5Fmedium=referral&utm%5Fcampaign=api-credit)

  An elongated prop is a `prop` that is not consumed but it is only passed down to another component. When a component receives a `prop` from its parent and doesn't consume the `prop`, it passes the prop down to another component. This prop is called elongated prop because it has been extended.

  Whenever you see a `prop` being passed down by components that neither creates nor consumes the `prop`, you have an an elongated prop (as well as prop drilling) in your code. The code snippet below is an example:

  ```javascript
  function Profile({ user }) { 
    return ( 
      <header> 
        <h1>This is the header</h1> 
        <Content user={user} /> 
      </header> 
    ); 
  }
  ```

  `user`, in this example, is an elongated `prop` as it is neither created nor consumed by the `Profile` component. Instead, it is only passed down to the `Content` component. And that means we have extended `user` through a component that doesn't need it so that it can get to the one that does.

  Now, let's revisit the example we used to illustrate prop drilling. Wait, are you thinking what I'm thinking? The `prop` that's being passed down in the prop drilling example is indeed an elongated prop, right? Yes, you've got it.

  ```xquery
  function App() {
    const [profile, setProfile] = useState({ame: 'John'}); 
    return ( 
      <div> 
        <Header profile={profile} /> 
      </div> 
    ); 
  } 
    
  function Header({ profile }) { 
    return ( 
      <header> 
        <h1>This is the header</h1> 
        <Content profile={profile} /> 
      </header> 
    ); 
  } 

  function Content({ profile }) { 
    return ( 
      <main> 
        <h2>Content Component</h2> 
        <p>{profile.name}</p> 
      </main> 
    ); 
  } 

  export default App;
  ```

  In the code above, you can observe that the `prop` passed to `Header` is created in the `App` component. Then, `Header` passes it down to its child component named `Content`. As a result, the `profile` being passed down can be considered elongated because it is passed through a component (`Header`) that neither creates nor consumes it down to the one that does.

  The `Header` component passing down the `prop` it doesn't create or need is unnecessarily stretching the context of the `prop`. 

  Now, the question is, how do elongated props help to intuitively avoid prop drilling in React? They make it easy for you to spot `props` being used where they're are neither created nor consumed.

  Rather than focusing on how to solve prop drilling, elongated props enable you to avoid it. This is because it's intuitive to recognize when a component neither creates nor consumes `props`, and that helps you to know the component is irrelevant.

  But before you learn how to quickly avoid prop drilling with your understanding of elongated props, it is important that you know the main causes of prop drilling. Then you'll truly know how to avoid it without thinking about it.

  ## What Causes Prop Drilling?

  ![»What is your story?«](https://proxy-prod.omnivore-image-cache.app/2000x1500,sA8o6QjJC2cc6DWaXvdQrHJrsY7uC26GCnLTYhFTKN7E/https://images.unsplash.com/photo-1617575521317-d2974f3b56d2?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDF8fHRyaWdnZXJ8ZW58MHx8fHwxNjk5MzIzNTU2fDA&ixlib=rb-4.0.3&q=80&w=2000)

  Photo by [Etienne Girardet](https://unsplash.com/@etiennegirardet?utm%5Fsource=ghost&utm%5Fmedium=referral&utm%5Fcampaign=api-credit) / [Unsplash](https://unsplash.com/?utm%5Fsource=ghost&utm%5Fmedium=referral&utm%5Fcampaign=api-credit)

  Prop drilling doesn't occur out of thin air. It's a consequence of inadequate component organization, and it is not a React problem. It is a thinking or design problem. 

  You won't encounter an instance of prop drilling without observing one of the following layout mistakes:

  ==First of all,== **==grouping static elements and dependent components==** ==together to achieve an appealing UI design is the major cause of prop drilling. You can't avoid prop drilling when your UI groups static elements and dependent components together in a parent. The parent component clearly won't use the== `==prop==`==, as everything within it is a static element – except the component that needs a prop.==

  Here's an example:

  ```javascript
  function Header({ profile }) { 
    return ( 
      <header> 
        <h1>This is the header</h1> 
        <Content profile={profile} /> 
      </header> 
    ); 
  }
  ```

  In this case, static elements `<header> and <h1>` are grouped with a dependent component `Content` – and that's why we have prop drilling therein. 

  Provided that the `Content` component is independent or takes no `props`, it won't need `profile` and there won't be prop drilling in the first place. This is why forcing a component that should be independent to take `props` from its parent is a recipe for prop drilling in React.

  ==Second of all, when a== **==component accepts== `==props==` ==that it doesn't use but merely passes it down to its children==**==, this is a sign that you have prop drilling in your component:== 

  ```php
  function App () { 
    const [profile, setProfile] = useState({name: "Ayobami"})
    return ( 
      <>
        <Parent profile={profile} /> 
      </>
   ); 
  }; 

  function Parent({ profile }) { 
    return ( 
      <div>
        <Hero profile={profile} /> 
        <Features profile={profile} /> 
      </div>
   ); 
  }; 
  ```

  In this case there is prop drilling because the `Parent` component takes `profile` and it doesn't use it though it passes it down to its children. 

  ==Third, when a component that represents an independent section of a page is== **==forced to take props from its parent==**==, prop drilling is inevitable. It should ideally be self-contained with its state and operations.== 

  The exception would be if it's intentionally tied to its parent for specific reasons. In such cases, prop drilling becomes a necessary trade-off. 

  If you revisit the example of prop drilling cited in this article, you will realize it has a prop drilling issue because the `Content` component which could have been an independent component by having a state is forced to receive props from its parent.

  ==And finally,== **==the presence of elongated== `==props==`** ==is a sure sign of prop drilling. Since an elongated prop is a fundamental element that's consistently present in every case of prop drilling, grasping this concept allows you to instinctively avoid prop drilling.== 

  When you spot an elongated prop, you can be certain that one of the other three mistakes is also in play. In short, an elongated prop is a prop that is not consumed and is also passed down to another component.

  So grouping static elements with dependent components, forcing components to take props, elongated props, and receiving a prop without consuming it are the signs to recognize prop drilling in React.

  ## How to Fix Prop Drilling with Component Composition

  ==Component composition is a good approach to fix prop drilling. If you ever find yourself in a situation where a component passes down a prop it neither creates nor consumes, you can use component composition to fix it.== 

  But to use component composition, you need to understand a component context.

  ### What is a component context? ‌

  The context of a component encompasses everything that is visible within it, including state, props, and children. The following code further illustrates this concept:

  ```javascript
  function App() { 
    const [profile, setProfile] = useState({name: 'Ayobami'}); 
    return ( 
      <div> 
        <Header profile={profile} /> 
      </div> 
    ); 
  } 

  export default App;
  ```

  In this scenario, the context of `App` refers to everything we can see within the `App` component – including the `profile` prop, the `Header`, and other `App` content. Therefore, any data created in the `App` component should ideally be utilized within the `App` component itself, either as its own data or as `props` to its children.

  Prop drilling always emerges when the children receiving the `props` doesn't consume it but only passes it down to its children. 

  ==To avoid prop drilling in this case, any grandchildren components that require access to the same== `==props==`==, especially when their parent don't consume the data, should be passed as children ensuring that the data remains within the== `==App==` ==context.==

  ```javascript
  export function App() { 
    const [profile, setProfile] = useState({name: 'Ayobami'}); 
    return ( 
      <div> 
        <Header> 
          <Content profile={profile} /> 
        </Header> 
      </div> 
    ); 
  }
  ```

  **`Or`**

  ```javascript
  export function App() { 
    const [profile, setProfile] = useState({name: 'Ayobami'}); 
    return ( 
      <div> 
        <Header children={<Content profile={profile} />} > 
      </div> 
    ); 
  }
  ```

  As you can see, we have resolved the prop drilling issue in the previous example, even though we still have a redundant component, `<Header>`, right? We've successfully addressed prop drilling through component composition. 

  This process is quite straightforward because we concentrate on recognizing elongated props and repositioning them within appropriate contexts.

  The concept of prop drilling is problem-focused, but prop elongation is solution-driven. When dealing with elongated props, our primary goal is to identify props that are not consumed but only passed down to another components.

  ## How to Fix Prop Drilling by Moving State to the Consumer

  ==Prop drilling can also be fixed by moving state to where it is consumed. The example of prop drilling in this article has a component named== `==Content==`==. But the component is forced to receive a== `==prop==` ==from its parent instead of having a state and be an independent component – and so we have prop drilling.== 

  We can fix the prop drilling in this case by moving the profile state to where it is consumed.

  Let's revisit the example:

  ```xquery
  function App() {
    const [profile, setProfile] = useState({ame: 'John'}); 
    return ( 
      <div> 
        <Header profile={profile} />
        <Footer profile={profile />
      </div> 
    ); 
  } 
    
  function Header({ profile }) { 
    return ( 
      <header> 
        <h1>This is the header</h1> 
        <Content profile={profile} /> 
      </header> 
    ); 
  } 

  function Content({ profile }) { 
    return ( 
      <main> 
        <h2>Content Component</h2> 
        <p>{profile.name}</p> 
      </main> 
    ); 
  } 

  export default App;
  ```

  We can fix prop drilling in this case by moving `profile` to where it is consumed:

  ```javascript
  function App() { 
    return ( 
      <div> 
        <Header />
        <Footer profile={profile />
      </div> 
    ); 
  } 
    
  function Header() { 
    return ( 
      <header> 
        <h1>This is the header</h1> 
        <Content /> 
      </header> 
    ); 
  } 

  function Content({ profile }) { 
    const [profile, setProfile] = useState({ame: 'John'});
    return ( 
      <main> 
        <h2>Content Component</h2> 
        <p>{profile.name}</p> 
      </main> 
    ); 
  }
  ```

  Now that we have lifted the profile to the `Content` component where it is consumed, the `App` component doesn't have a state, while the `Header` component doesn't receive a prop again as the `Content` component has its state.

  But wait! There is a problem. The `Footer` component needs the state we moved away from `App`. There you are! That is the problem with lifting or moving state to where we think it is needed. In this case, if the `Footer` component doesn't need it, we won't have any issue – but `Footer` also needs the prop. 

  Now that `Footer` needs `profile` as a prop, we need to solve prop drilling with another method.

  ## How to Fix Prop Drilling with a Children-Replacing-Parent Strategy

  Earlier in this article, we talked about how to use component composition and moving state to its consumer to solve prop drilling. But as you saw, they have some issues – duplicated components or states.

  But using this children-replacing-parent approach fixes the problem effectively:

  ****Working but could be better:**

  ```xquery
  export function App() { 
    const [profile, setProfile] = useState({name: 'Ayobami'}); 
    return ( 
      <div> 
        <Header> 
          <Content profile={profile} /> 
        </Header> 
      </div> 
    ); 
  }

  function Header({ profile }) { 
    return ( 
      <header> 
        <h1>This is the header</h1> 
        <Content profile={profile} /> 
      </header> 
    ); 
  }
  ```

  The example above shows a solution to the prop drilling example in this article. But as you can see, it has a redundant component, as `Header` does nothing.

  **Here's a better version:**

  ```javascript
  export function App() { 
    const [profile, setProfile] = useState({name: 'Ayobami'}); 
    return ( 
      <header> 
        <h1>This is the header</h1> 
        <Content profile={profile} /> 
      </header> 
    ); 
  }
  ```

  In the above code, we enhance the component composition solution we previously implemented for the prop drilling example by replacing the redundant `Header` component with its content in its parent (`App`).

  ## What to Avoid

  ![photo-1587065915399-8f8c714ab540?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDEwfHxkYW5nZXJ8ZW58MHx8fHwxNjk5MzIzMDgxfDA&ixlib=rb-4.0](https://proxy-prod.omnivore-image-cache.app/2000x1333,svvd90JJPHx2cRZ_A6-9SXg8LuqQJ_kGlJbtNXwk4tTc/https://images.unsplash.com/photo-1587065915399-8f8c714ab540?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=M3wxMTc3M3wwfDF8c2VhcmNofDEwfHxkYW5nZXJ8ZW58MHx8fHwxNjk5MzIzMDgxfDA&ixlib=rb-4.0.3&q=80&w=2000)

  Photo by [Edwin Hooper](https://unsplash.com/@edwinhooper?utm%5Fsource=ghost&utm%5Fmedium=referral&utm%5Fcampaign=api-credit) / [Unsplash](https://unsplash.com/?utm%5Fsource=ghost&utm%5Fmedium=referral&utm%5Fcampaign=api-credit)

  ==It's essential to highlight what to avoid when dealing with prop drilling to prevent unnecessary challenges.==

  * **==Avoid React Context, if possible, to fix prop drilling.==** ==This approach ties your component to a specific context, restricting its usability outside of that context and hindering composition and reusability.==
  * **==Steer clear of redundant components by employing a children-parent replacement approach.==** ==This approach naturally incorporates== ==[component composition](https://www.codementor.io/@dinerismail/the-power-of-component-composition-in-react-21goassg4m)== ==without introducing redundant components or states when resolving prop drilling.==

  By avoiding elongated props, you pave the way for crafting maintainable, high-performing, reusable, and scalable React components. It simplifies the process of lifting states and components by removing the struggle of deciding where to place them. 

  With your understanding of elongated props, you can confidently position props and components within the right context without undue stress.

  In short, you can now discover prop drilling intuitively by paying attention to any component that takes `props` it doesn't consume and only passes it down to another component. 

  Thanks for reading – cheers!

  Hey wait! I am [Ayobami Ogundiran](https://twitter.com/codingnninja) and I am about to start showing how to build your own React, Redux, TypeScript, Zod or Ecommerce websites on my YouTube channel. [Click to subscribe](https://youtube.com/youtoocancode) to stay connected. 

  ---

  ---

   Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. [Get started](https://www.freecodecamp.org/learn/) 

metadata:
  {"date_added":"2023-11-07 19:58:39","id":"aceac380-7e10-11ee-992a-432064e77190","status":"ARCHIVED","tags":["read-later","RSS","react"],"title":"How to Avoid Prop Drilling in React\n","url_omnivore":"https://omnivore.app/me/how-to-avoid-prop-drilling-in-react-18bae0b4ca2\n","url_original":"https://www.freecodecamp.org/news/avoid-prop-drilling-in-react/\n"}


path: Omnivore/2023-11-14 - The one thing you need to finish your game.md
sortable_path: Omnivore2023-11-14 - The one thing you need to finish your game.md
title: The one thing you need to finish your game
lead: # The one thing you need to finish your game
checksum: b8c4d34ec02fc71eae2c4c0113f166bdb96b15bf64aa3aa11510d8890f0978ee
created: 2024-09-15 00:40:57.358457639+00:00
modified: 2024-09-22 22:40:13.393511027+00:00
body:
  # The one thing you need to finish your game

  ## Notes

  What you need... is a **plan**...

  Because it makes the game feasible, realizable and gives it a scope, to see how "big" it's going to be. Also prevents burn out by all the stuff you _"need to do"_.

  A plan is not a immovable wall, you can tweak it if you need to adjust to new discoveries or new inputs, this is better than wandering without a goal. But try to not increment the scope so you don't end up with an interminable project.

  > The code is more of a guide than law...
  > Jack Sparrow
  ## Original

  [The one thing you need to finish your game](https://youtu.be/B6auN-GIUeM?si=ixuDsNhT2k5b3JfS)

  By [Game Maker's Toolkit](https://www.youtube.com/@GMTK)

raw_content:
  ---
  id: b453f3fe-d74e-4a3a-b778-8e4f6450da30
  title: |
    The one thing you need to finish your game
  status: ARCHIVED
  tags:
    - read-later
  date_added: 2023-11-14 22:58:47
  url_omnivore: |
    https://omnivore.app/me/https-youtu-be-b-6-au-n-gi-ue-m-si-ixu-ds-nh-t-2-k-5-b-3-jf-s-18bd0b3d045
  url_original: |
    https://youtu.be/B6auN-GIUeM?si=ixuDsNhT2k5b3JfS
  ---

  # The one thing you need to finish your game

  ## Notes

  What you need... is a **plan**...

  Because it makes the game feasible, realizable and gives it a scope, to see how "big" it's going to be. Also prevents burn out by all the stuff you _"need to do"_.

  A plan is not a immovable wall, you can tweak it if you need to adjust to new discoveries or new inputs, this is better than wandering without a goal. But try to not increment the scope so you don't end up with an interminable project.

  > The code is more of a guide than law...
  > Jack Sparrow
  ## Original

  [The one thing you need to finish your game](https://youtu.be/B6auN-GIUeM?si=ixuDsNhT2k5b3JfS)

  By [Game Maker's Toolkit](https://www.youtube.com/@GMTK)

metadata:
  {"date_added":"2023-11-14 22:58:47","id":"b453f3fe-d74e-4a3a-b778-8e4f6450da30","status":"ARCHIVED","tags":["read-later"],"title":"The one thing you need to finish your game\n","url_omnivore":"https://omnivore.app/me/https-youtu-be-b-6-au-n-gi-ue-m-si-ixu-ds-nh-t-2-k-5-b-3-jf-s-18bd0b3d045\n","url_original":"https://youtu.be/B6auN-GIUeM?si=ixuDsNhT2k5b3JfS\n"}


path: Omnivore/2023-11-21 - Career Mistakes to Avoid as a Developer.md
sortable_path: Omnivore2023-11-21 - Career Mistakes to Avoid as a Developer.md
title: Career Mistakes to Avoid as a Developer
lead: # Career Mistakes to Avoid as a Developer
checksum: 48436292db06ddfdc5f3dd5b049d56e8a70a21d86ed5777d421ae1adf25afb9d
created: 2024-09-15 00:40:57.396089921+00:00
modified: 2024-09-22 22:40:13.393511027+00:00
body:
  # Career Mistakes to Avoid as a Developer

  ## Highlights

  Build authentic connections to get the best out of it. Then once you're connected, here are a few things you can do:

  * Show interest in their posts.
  * Engage with discussions by commenting or sharing posts.
  * Repost with your thoughts
  * Exchange ideas, or even build things together!

  A strong social connection may help you in getting information faster. You may learn about a new release of a library/framework/product, how an industry is moving, how certain technologies might impact your work, and so on. 

  [source](https://omnivore.app/me/career-mistakes-to-avoid-as-a-developer-18bf626412f#3d561a03-61e0-4ca6-8e70-81651abe90c1) 

  ---

  ## Original

  ![Career Mistakes to Avoid as a Developer](https://proxy-prod.omnivore-image-cache.app/900x500,sGVypdu65MfEK6xblt6wD3fjcwv0W_bp2owQhQLbB3nU/https://www.freecodecamp.org/news/content/images/size/w2000/2023/11/Career-Mistakes-2.png) 

  What does the word `career` mean to you? To me, it is a roller coaster journey during which we find opportunities, progress, and growth in life. The journey involves learning objectives, work, and other personal and professional aspects.

  A promising career is one where you enjoy most (if not all) of your daily work. You see your personal, professional, and financial growth and gradually define what success means to you. 

  A lousy career is just the opposite. It may pay your bills, but you need more work satisfaction, and measuring your progress and growth becomes hard.

  Several factors define a career: promising versus lousy, good versus bad, and successful versus failed. A few of them we can not control – but, we can avoid some career mistakes to build a better career path.

  I have spent more than 18 years in Software Engineering and have seen a lot of ups and downs, including in my own career and those of my colleagues. In this article, I will discuss ten career mistakes you should avoid. 

  Usually, I [share knowledge](https://www.freecodecamp.org/news/author/tapas/) on technical topics like JavaScript, web development, React, Node, Next.js, and so on. But this time, let's connect on essential tips for our Career Development.

  If you like to learn from video content as well, this article is also available as a video tutorial here: 🙂

  ## A Few Things Before We Start

  You may or may not agree with all the points. That's fine with me, because what I'm planning to share here is based on my own experiences. 

  You may strongly agree or disagree with my conclusions, but if there are any additional points that you think I still need to include, please let me know. You can contact me on the social handles I mention at the end of this article.

  Also, this article is not only meant for working professionals. All these mistakes we will discuss are relevant for everyone, including students, people seeking jobs, or anyone getting ready for tomorrow in the software industry or any industry.

  All set? Let's get started.

  ## 1\. You Don't Set Realistic Goals

  ![Goal](https://proxy-prod.omnivore-image-cache.app/500x300,sZlEz5U8f4r-gcUKirTKEqCpwGIhdqyjt3j17G-PPBq0/https://www.freecodecamp.org/news/content/images/2023/11/Goal.png)

  One of the biggest mistakes most of us make in our careers is not having a goal. What exactly is a goal? It is something like a target. 

  Let's take an example. Let's say you're going shopping to buy something. You usually have a list of items that you want to get. You don't randomly pick things and come home and feel like, "Oh, it was a complete waste of time and money". So, if that list is your shopping goal, why not have something like this for your career?

  Usually, we have a lot of short-term goals, for example,

  * I have to fix this bug today.
  * I have to build this project this week.
  * I have to get a promotion this year.

  These are great goals to have. But we need to have long-term goals as well. Like, what do you want to be in the long-term in your career. How do you plan every steps to achieve that goal?

  Say you are in mechanical engineering, but your heart is in software engineering (mechanical engineering is excellent – I'm just taking this as an example). In that case, you should have a goal for the next few years to translate yourself into a software developer and try to seek more roles more opportunities in the software industry.

  I can tell you my story, as I think it'll help give you some perspective. I set myself a long term career goal to transition from my regular multi-national corporation job and start my career full time as an independent teacher and content creator. It took me four years to realize it, but without that goal it would have been impossible for me to chase my passion.

  You may ask, will I be able to fulfill all the goals in my life? Well, maybe not. Still, it's important to have some and prioritize the most important ones. That way, even if you can't achieve some, you may identify a few more new goals along the way. 

  You may have a different way of going about it. But, if you don't have a starting point, you do not have anything to work toward and chase. Your career may become stagnant.

  If you don't have any career goals for yourself right now, take some time to come up with a couple realistic goals. Here's some advice on [how to set SMART goals you can actually achieve](https://www.freecodecamp.org/news/how-to-set-smart-goals-you-can-achieve/).

  ## 2\. You Fail to Recognize Your Potential 

  ![Potential](https://proxy-prod.omnivore-image-cache.app/500x300,sISkbO2BdaLyGJk0rTtjr_TO8Ss9Lsq_VlPbxRtwf2Nw/https://www.freecodecamp.org/news/content/images/2023/11/Potential.png)

  > **Human potential** is the capacity for humans to **improve** themselves through **studying**, **training**, and **practice**, to reach the limit of their ability to develop **aptitudes** and **skills**. – Definition of Human Potential from Wikipedia.

  For us, the software developers, is about improving ourselves through practice, training, and study to reach the heights of our ability. But many of us do not know our potential at the start our careers. We figure it out gradually, and when we become aware of it, this helps us improve our careers. 

  When you know your potential, someone else will not dictate how to shape your career. Instead, you will be able to identify what would be good for you based on your strengths and where you need to bridge the gaps. 

  But you may ask, "How do I know my potential?". That's where having a goal and working towards it helps. Say you have a goal of mastering machine learning and data science to have a career as a data scientist. As you work towards this goal, you will find the areas where you excel, and other areas where you need to work especially hard. You figure out your potential as you work towards this goal.

  Also, try not to settle for unimportant things. Constantly challenge yourself to produce better and more significant outcomes. When you do so, you discover your true potential in a much better way.

  ## 3\. You Don't Take the Time to Network

  ![Networking](https://proxy-prod.omnivore-image-cache.app/500x300,sF4FuUqxCuuR77gk4MFD3BzctuTT31Q1js5nFk5ad3wI/https://www.freecodecamp.org/news/content/images/2023/11/Networking.png)

  Hey, we're gonna talk about something other than computer networking here. We will focus on human-to-human networking. We are going to talk about socializing. But why?

  Networking or socializing with like-minded people, talking to them, and getting inspired by their work are as important as learning to code in programming. You might be a great programmer and fantastic coder. But suppose you do it in a silo. In that case, no one knows you or what you're capable of, so you will most likely lose out on more significant opportunities in your career.

  When you socialize and network with others in the tech space, you may find a meaningful community to join. You'll be able to discuss important topics with like-minded people who have interests similar to yours – and this can help you multiply your growth by many times.

  This is one mistake I made in my career for several years, as I was unaware of its vast potential. Be active on platforms like LinkedIn, follow people you'd like to connect with on tech Twitter (now X), and make authentic connections with them. Spending mindful time on these platforms, and at in-person events as you're able, can really help boost your career.

  Check out the `You Miss Out on Learning Opportunities` section below for some real-life tips on how to reach out and connect with people. 

  ## 4\. You Waste Your Precious Time

  ![Wasting-Time](https://proxy-prod.omnivore-image-cache.app/500x300,sbrWtGEjNeLoAcrJT43fE9RiNXisYDS_W0CJ3Vjif07s/https://www.freecodecamp.org/news/content/images/2023/11/Wasting-Time.png)

  "Wasting time" means not effectively utilizing your time. Would you agree that time is precious? Using and managing your time properly will help your career and life in general.

  To clarify, watching a movie, going out with your friends and family, participating in festive activities, and so are not wasting time. You need these to balance out the time you spend working. 

  Rather, I'm more concerned about the tasks you may have to perform that take away from your "focus time" at work.

  Let me walk you through a few situations:

  You are working on a task, and here comes some notifications on your phone. You pause whatever you are doing and jump on your phone to see what's happening on that side of the world. The notification may take you 10-15 seconds to read, but you then spend 10 minutes browsing the phone. 

  This is a habit many of us have built in recent times. And then when you get back to your work, your brain has to recalculate and bring you back to the topic at hand – where you were, and what you were doing – and get you started with the task gain. This context switching is costly, and the same amount of focus may not be possible.

  The best way of tackle a situation like this is,

  * Switch off the phone's internet while you're working if you do not need it. You can switch it on when you take breaks, maybe at lunch time.
  * You can also set your phone in "Do Not Disturb" mode while your work needs your utmost attention. Just make sure you add some of your family and friend's contacts as emergency contacts so that only a limited set of people can reach out to you during those times in case of any emergencies.

  Let's talk about another situation. Suppose you need to prepare and send a design doc to a senior dev for review. But instead, you spend time on something low priority or some little luxury that delayed preparing the doc. You keep postponing until it's become an urgent thing that you'll have to do within a limited time. 

  This act of delaying something knowingly is called `procrastination`, an ultimate way to kill time. There are some well-known and proven methods to tackle procrastination.

  * The first step is to realize and admit to yourself that you procrastinate.
  * Then list out your distractors. This list may vary from person to person. Remove these distractors. It could be your phone, TV, novels, anything.
  * Break down your deliverables into smaller tasks. Achieve them one by one and give yourself a pat on your back once you've finished each small task.
  * Take small breaks and come back to the point where you left off on your task to continue with a fresh brain.

  Instead of finding yourself in these types of situations, use your time wisely. If you have to get something done, get it done. When you're procrastinating, something that depends on one task may also get delayed, creating a cycle of time waste, frustrations, and complicated situations.

  ## 5\. You Neglect Upskilling

  ![Upskill](https://proxy-prod.omnivore-image-cache.app/500x300,s8u5vP0_rMNrQ-LfgTF0nQtckWlBvz5IEAaeyOSQTz7Q/https://www.freecodecamp.org/news/content/images/2023/11/Upskill.png)

  `Upskilling` means getting better at your current skill or acquiring relevant new skills. It is essential to upskill at any and all stages of your career. 

  One of the common mistakes we make is that we stop upskilling after a few years in our professional life. We get used to the projects, domains, technologies, and environments that create a comfort zone around us. Upskilling is always about coming out of that comfort zone.

  Here are a few common excuses we give to ourselves when it comes to upskilling:

  * I already have a lot of work at the office or assignments in university.
  * I need to have a personal life.
  * I am happy with whatever I know now, and my work only demands so much.
  * There is so much to learn and it is never ending (sigh!).

  But you really don't need that much time in a week to up-skill. You just need to have a plan and to stay consistent in executing it. Set just 1 hour aside in your day. Fork it out from any non-urgent activities and plan your learning schedule in that one hour.

  In this one hour, here are some things you can do:

  * Assess the gaps, weaknesses, and strengths in your technical and non technical abilities.
  * List them out in a place where you can easily get back to them and make modifications.
  * Prioritize them based on your current needs and near future goals.
  * Time-box each of the items so that you can get something tangible within a specified duration. For example, you want to do a certification on cloud computing within a month, or the Responsive Web Design course from freeCodeCamp over the next few weeks, and so on.
  * Start working on these defined tasks. You may find many resources on internet. Glance over them to create an index of resources that you can understand easily and relate to well.
  * Read and watch tutorials, but also practice hard.
  * Finally, recognize your progress.

  You may ask, is that one hour really enough? And I will tell you – it works like magic if you keep it up. Upskilling is not a race or sprint. It needs time, consistency, and perseverance to get from the one end to other.

  Have you heard about the power of tiny gains?

  ![image-21](https://proxy-prod.omnivore-image-cache.app/659x675,s6nxgcNX-v7bKwCnG4qrq4gj6H3-MyQgJ2A4TXvhJd_k/https://www.freecodecamp.org/news/content/images/2023/11/image-21.png)

  Credit: James Clear

  It is a strategy of being just 1% better every day. If you continue to do that for a year, you get almost 38% better at the end of the year. Being 1% worse does the opposite. The strategy was represented in mathematical graphs by James Clear in explanation of [Continuous improvements and how it works](https://jamesclear.com/continuous-improvement).

  Upskilling can also help you out a lot if you're preparing for the job search. The way the tech industry is moving, we may not be able to avoid layoffs – but we can be better prepared to get our next job faster. And that becomes much more attainable when you stay relevant and continue learning new things. 

  ## 6\. You Don't Ask for What You Want

  ![Don-t-ask-Don-t-Get](https://proxy-prod.omnivore-image-cache.app/500x300,sX_fVxbzhUPPh33KyrDzm0tr5vYezZqdzTekYPBlkhUc/https://www.freecodecamp.org/news/content/images/2023/11/Don-t-ask-Don-t-Get.png)

  Let me start by sharing an experience of mine. Back in the early 2000s when I was a fresher, I had to attend a meeting with some of the project leads and the manager. We were discussing how to modernize our product with HTML5 features. 

  I was aware of HTML5, and every time a discussion point was raised, I thought of adding to it, but I didn't. I thought of asking some valuable questions, but I didn't. I felt that in order to ask something in a meeting, I needed a lot of guts! I was wrong. 

  Oftentimes in your career journey, if you do not ask, you simply won't get what you want or deserve. If someone has some knowledge and you lack it, ask about it. If you have a questiona bout something, ask before you commit to the work. Ask about your promotion, a salary hike, career growth, and anything that is related to your career. There is no such thing as a silly question when it comes to your career growth.

  ## 7\. You Only Focus on the Money

  ![Money-honey](https://proxy-prod.omnivore-image-cache.app/500x300,sA_mQAKK-nW0_lpZxvJr_wiH5WuNcHXVUsErXQtrA-3g/https://www.freecodecamp.org/news/content/images/2023/11/Money-honey.png)

  Come on, money is important. But is it the only important thing, especially in the context of switching jobs or working towards your career goals? No, certainly not. 

  When you plan to switch jobs, you also need to look into other factors like work culture, the amount of time you need to spend at the office working, whether it's going to be more stressful compared to the compensation you'll be getting, and so on.

  I would certainly look into the following factors along with the compensation (the money part) to make an informed decision about my job switching:

  * What will be my technical growth and learning opportunities?
  * What will the work environment be like? Remote/Work From Office/Hybrid? How will that impact me?
  * What skills (both tech and soft) will I be able to learn in the new position?
  * What kind of employee benefits will I get compared to my current organization?
  * Will my work-life balance be impacted positively?
  * What are the company's vision, culture, and values?

  Then when you're considering the salary, be careful and make sure you understand the breakdown. What percentage of the CTC comes from any bonus? Is it inclusive or exclusive of CTC? How does the bonus payout happen? If the company doesn't do well in a fiscal year, will you get paid less? Are there stock options or other benefits they pay out instead of cash? All this matters.

  The mistake people often make is that they see only the `money` figure as the most important part of a job offer. Make sure you talk to someone from the company, do your research, and learn about what else they're offering as we mentioned above. 

  ## 8\. You Neglect Work-Life Balance

  ![Work-Life](https://proxy-prod.omnivore-image-cache.app/500x300,sN3pJRnCgrOdMDPZNVr7Os7gYEWeVs4rhIK60IqUvbfQ/https://www.freecodecamp.org/news/content/images/2023/11/Work-Life.png)

  Another mistake you might make is not balancing your work and life. The last thing you want is to `burn out` at the cost of things you love the most, like your friends, family, and long-term career.

  We must learn to prioritize things, and this includes both work and personal life. Your priority list for the day should not have only work related items. While it's important to ship a bug fix, it is also essential to accompany your kids to their soccer games or school plays, or make time to go on a date with your partner, or do something nice for yourself.

  Do not be afraid to say "No". At the same time, don't be arrogant when you accept or decline tasks. This is important to keep a healthy work-life balance. When you already have plenty on your plate, trying to accommodate more or do more will only spill over and negatively affect your work-life balance. 

  So say no when you need to, communicate your intentions ahead of time when possible, and proactively ask for what tasks you'd like to work on when your plate has room for more.

  For a long time in my career, I attended meetings late at night to match the timezones of my customers and other colleagues. Then, slowly, it started affecting my health and productivity. 

  When I thought about it more carefully, I discovered a couple of things. First, I realized that I didn't have to attend all the meetings, and that I could request that they take place in my clients' evenings sometimes. That way we'd both be taking turns compromising. And it worked. 

  At times, our habits drive us towards the work-life imbalance. For example, staying late at office while the same work can wait till the next morning is a classic example of a habit that may lead to health issues and frustrations in a long run. 

  We all need to find a way to sustain both work and life. So plan ahead, and stick to your schedule as much as possible. There might be exceptions where you have to give one thing priority above another – but do not allow the exception to become the norm.

  ## 9\. You Miss Out on Learning Opportunities 

  ![GOAT](https://proxy-prod.omnivore-image-cache.app/500x300,sABSdR2gJMwi_HJ_GLBI-Ri7W6pCZbA6UJNku96Ij7aM/https://www.freecodecamp.org/news/content/images/2023/11/GOAT.png)

  If you have the opportunity to learn from a person who specializes in a particular field, grab it. If you use social media platforms like LinkedIn and X/Twitter wisely, it can lead you to the people who share great insights about subjects you're interested in.

  A quick tip for you:

  When you send someone a connection request on LinkedIn/X, take some time to introduce yourself. Things that you can mention briefly:

  * What did you find unique about the person you want to connect to?
  * A bit about yourself, introducing some of your uniqueness, too.
  * Why do you want to connect?

  ==Build authentic connections to get the best out of it. Then once you're connected, here are a few things you can do:==

  * ==Show interest in their posts.==
  * ==Engage with discussions by commenting or sharing posts.==
  * ==Repost with your thoughts==
  * ==Exchange ideas, or even build things together!==

  ==A strong social connection may help you in getting information faster. You may learn about a new release of a library/framework/product, how an industry is moving, how certain technologies might impact your work, and so on.==

  Apart from learning a lot, you may also get to know about job openings, hirings, and references. After all, companies have also started recruiting talent from social media pages.

  Also, being part of a forum like the [freeCodeCamp forum](https://forum.freecodecamp.org/) can be helpful for networking and learning as well. It is also a place for you to share solutions to a problem, talk about what you've learned, and make yourself visible gradually.

  When we learn from someone, we not only come to understand what they've achieved or how they did it, but we also learn about the struggles, failures, and how they made the turnaround. Learning from someone else's experience can help accelerate your career journey. Don't make the mistake of living in a silo and missing out on these opportunities.

  ## 10\. You Can't See the Bigger Picture

  ![Big-Picture](https://proxy-prod.omnivore-image-cache.app/500x300,sr2JlkGqO_uQHX5rsG4F0iDS4Pk9HCvqL8kRgkiiUUG4/https://www.freecodecamp.org/news/content/images/2023/11/Big-Picture.png)

  By `Big Picture`(or Bigger Picture), I mean understanding and developing a wider perspective on your career as a whole. It is about your ability to consider and assess many different aspects of a situation, rather than focusing on just the minute details.

  As developers, we're supposed to implement features, do bug fixes, maintain code, and deliver quality software to our end-users. That's great! 

  But, we need to think beyond the individual tasks assigned to us. Our understanding of the overall project goals, the user acceptance criteria, delivery mechanisms, and perspectives of other engineers is key. And so is judging the impact of our work, as it will help us get the big picture of a project.

  Suppose your product manager wants your team to build user interfaces that also cater to the needs of specially-abled and visually challenged users. In this case, you and your team members must see the bigger picture around `Accessibility`. 

  If your designer doesn't define the site's colors accordingly, or the developers do not implement keyboard accessibility along with ARIA roles and attributes, then they're missing the bigger picture. 

  Another example could be over-optimizing performance while your users do not care about it. Your users may be waiting to get a feature ASAP so it can help them achieve their business goals. But by addressing unnecessary optimizations, you may be delaying that release and missing crucial deadlines.

  Missing the bigger picture may lead to a lack of synergy in your organization. It can also result in software products that need multiple iterations to meet customer needs because those needs weren't understood at the beginning. This can cause you to miss deadlines and do more work, and can greatly increase the cost to your client.

  Along with understanding "what" tasks you need to perform, also ask "why" your tasks are important and how they will impact the rest of the project or other people's work. 

  Irrespective of what you build, how big or small it is, how glorified or dull is the outcome, you need to know the impact of it on end users and your internal customers (like product/project managers, quality assurance team, documentation team, whoever). 

  Once you look at the bigger picture and act accordingly, your margin of error reduces automatically.

  ## Some More Advice and Wrapping Up

  I wanted to share all this career advice with you because I have been on the other side and learned the hard way. Before I move on to write my next article or record my next video, one more quick tip for you: make sure you work to build up your finances.

  Financial independence brings peace and the mental stability to think wildly about things you want to pursue in your career. But getting to the point of financial stability is not an overnight thing. You need to plan, save, and invest wisely such that your money grows faster than your age.

  I am not a finance expert, but I relied on some good ones and took their suggestions early on. If you have the opportunity and mindset to build your finances for the future, the time is now. 

  That's all for now. I hope you found this article informative and insightful. I regularly publish meaningful posts on my [GreenRoots Blog](https://blog.greenroots.info/), you may find them helpful, too.

  Let's connect.

  * I am an educator on my YouTube channel, `tapaScript`. Please [SUBSCRIBE](https://www.youtube.com/tapasadhikary?sub%5Fconfirmation=1) to the channel if you want to learn JavaScript, ReactJS, Next.js, Node.js, Git, and all about Web Development in the fundamental way.
  * [Follow me on X (Twitter](https://twitter.com/tapasadhikary)) or [LinkedIn](https://www.linkedin.com/in/tapasadhikary/) if you don't want to miss the daily dose of Web Development and Programming Tips.
  * Find all my public speaking talks [here](https://www.tapasadhikary.com/talks).
  * Check out and follow my Open Source work on [GitHub](https://github.com/atapas).

  See you soon with my next article. Until then, please take care of yourself, and stay happy.

  ---

  ---

   Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. [Get started](https://www.freecodecamp.org/learn/)

raw_content:
  ---
  id: 49d7bfb2-8911-11ee-9b49-a315c7dbc2d7
  title: |
    Career Mistakes to Avoid as a Developer
  status: ARCHIVED
  tags:
    - read-later
    - RSS
  date_added: 2023-11-21 21:04:22
  url_omnivore: |
    https://omnivore.app/me/career-mistakes-to-avoid-as-a-developer-18bf626412f
  url_original: |
    https://www.freecodecamp.org/news/career-mistakes-to-avoid-as-a-dev/
  ---

  # Career Mistakes to Avoid as a Developer

  ## Highlights

  Build authentic connections to get the best out of it. Then once you're connected, here are a few things you can do:

  * Show interest in their posts.
  * Engage with discussions by commenting or sharing posts.
  * Repost with your thoughts
  * Exchange ideas, or even build things together!

  A strong social connection may help you in getting information faster. You may learn about a new release of a library/framework/product, how an industry is moving, how certain technologies might impact your work, and so on. 

  [source](https://omnivore.app/me/career-mistakes-to-avoid-as-a-developer-18bf626412f#3d561a03-61e0-4ca6-8e70-81651abe90c1) 

  ---

  ## Original

  ![Career Mistakes to Avoid as a Developer](https://proxy-prod.omnivore-image-cache.app/900x500,sGVypdu65MfEK6xblt6wD3fjcwv0W_bp2owQhQLbB3nU/https://www.freecodecamp.org/news/content/images/size/w2000/2023/11/Career-Mistakes-2.png) 

  What does the word `career` mean to you? To me, it is a roller coaster journey during which we find opportunities, progress, and growth in life. The journey involves learning objectives, work, and other personal and professional aspects.

  A promising career is one where you enjoy most (if not all) of your daily work. You see your personal, professional, and financial growth and gradually define what success means to you. 

  A lousy career is just the opposite. It may pay your bills, but you need more work satisfaction, and measuring your progress and growth becomes hard.

  Several factors define a career: promising versus lousy, good versus bad, and successful versus failed. A few of them we can not control – but, we can avoid some career mistakes to build a better career path.

  I have spent more than 18 years in Software Engineering and have seen a lot of ups and downs, including in my own career and those of my colleagues. In this article, I will discuss ten career mistakes you should avoid. 

  Usually, I [share knowledge](https://www.freecodecamp.org/news/author/tapas/) on technical topics like JavaScript, web development, React, Node, Next.js, and so on. But this time, let's connect on essential tips for our Career Development.

  If you like to learn from video content as well, this article is also available as a video tutorial here: 🙂

  ## A Few Things Before We Start

  You may or may not agree with all the points. That's fine with me, because what I'm planning to share here is based on my own experiences. 

  You may strongly agree or disagree with my conclusions, but if there are any additional points that you think I still need to include, please let me know. You can contact me on the social handles I mention at the end of this article.

  Also, this article is not only meant for working professionals. All these mistakes we will discuss are relevant for everyone, including students, people seeking jobs, or anyone getting ready for tomorrow in the software industry or any industry.

  All set? Let's get started.

  ## 1\. You Don't Set Realistic Goals

  ![Goal](https://proxy-prod.omnivore-image-cache.app/500x300,sZlEz5U8f4r-gcUKirTKEqCpwGIhdqyjt3j17G-PPBq0/https://www.freecodecamp.org/news/content/images/2023/11/Goal.png)

  One of the biggest mistakes most of us make in our careers is not having a goal. What exactly is a goal? It is something like a target. 

  Let's take an example. Let's say you're going shopping to buy something. You usually have a list of items that you want to get. You don't randomly pick things and come home and feel like, "Oh, it was a complete waste of time and money". So, if that list is your shopping goal, why not have something like this for your career?

  Usually, we have a lot of short-term goals, for example,

  * I have to fix this bug today.
  * I have to build this project this week.
  * I have to get a promotion this year.

  These are great goals to have. But we need to have long-term goals as well. Like, what do you want to be in the long-term in your career. How do you plan every steps to achieve that goal?

  Say you are in mechanical engineering, but your heart is in software engineering (mechanical engineering is excellent – I'm just taking this as an example). In that case, you should have a goal for the next few years to translate yourself into a software developer and try to seek more roles more opportunities in the software industry.

  I can tell you my story, as I think it'll help give you some perspective. I set myself a long term career goal to transition from my regular multi-national corporation job and start my career full time as an independent teacher and content creator. It took me four years to realize it, but without that goal it would have been impossible for me to chase my passion.

  You may ask, will I be able to fulfill all the goals in my life? Well, maybe not. Still, it's important to have some and prioritize the most important ones. That way, even if you can't achieve some, you may identify a few more new goals along the way. 

  You may have a different way of going about it. But, if you don't have a starting point, you do not have anything to work toward and chase. Your career may become stagnant.

  If you don't have any career goals for yourself right now, take some time to come up with a couple realistic goals. Here's some advice on [how to set SMART goals you can actually achieve](https://www.freecodecamp.org/news/how-to-set-smart-goals-you-can-achieve/).

  ## 2\. You Fail to Recognize Your Potential 

  ![Potential](https://proxy-prod.omnivore-image-cache.app/500x300,sISkbO2BdaLyGJk0rTtjr_TO8Ss9Lsq_VlPbxRtwf2Nw/https://www.freecodecamp.org/news/content/images/2023/11/Potential.png)

  > **Human potential** is the capacity for humans to **improve** themselves through **studying**, **training**, and **practice**, to reach the limit of their ability to develop **aptitudes** and **skills**. – Definition of Human Potential from Wikipedia.

  For us, the software developers, is about improving ourselves through practice, training, and study to reach the heights of our ability. But many of us do not know our potential at the start our careers. We figure it out gradually, and when we become aware of it, this helps us improve our careers. 

  When you know your potential, someone else will not dictate how to shape your career. Instead, you will be able to identify what would be good for you based on your strengths and where you need to bridge the gaps. 

  But you may ask, "How do I know my potential?". That's where having a goal and working towards it helps. Say you have a goal of mastering machine learning and data science to have a career as a data scientist. As you work towards this goal, you will find the areas where you excel, and other areas where you need to work especially hard. You figure out your potential as you work towards this goal.

  Also, try not to settle for unimportant things. Constantly challenge yourself to produce better and more significant outcomes. When you do so, you discover your true potential in a much better way.

  ## 3\. You Don't Take the Time to Network

  ![Networking](https://proxy-prod.omnivore-image-cache.app/500x300,sF4FuUqxCuuR77gk4MFD3BzctuTT31Q1js5nFk5ad3wI/https://www.freecodecamp.org/news/content/images/2023/11/Networking.png)

  Hey, we're gonna talk about something other than computer networking here. We will focus on human-to-human networking. We are going to talk about socializing. But why?

  Networking or socializing with like-minded people, talking to them, and getting inspired by their work are as important as learning to code in programming. You might be a great programmer and fantastic coder. But suppose you do it in a silo. In that case, no one knows you or what you're capable of, so you will most likely lose out on more significant opportunities in your career.

  When you socialize and network with others in the tech space, you may find a meaningful community to join. You'll be able to discuss important topics with like-minded people who have interests similar to yours – and this can help you multiply your growth by many times.

  This is one mistake I made in my career for several years, as I was unaware of its vast potential. Be active on platforms like LinkedIn, follow people you'd like to connect with on tech Twitter (now X), and make authentic connections with them. Spending mindful time on these platforms, and at in-person events as you're able, can really help boost your career.

  Check out the `You Miss Out on Learning Opportunities` section below for some real-life tips on how to reach out and connect with people. 

  ## 4\. You Waste Your Precious Time

  ![Wasting-Time](https://proxy-prod.omnivore-image-cache.app/500x300,sbrWtGEjNeLoAcrJT43fE9RiNXisYDS_W0CJ3Vjif07s/https://www.freecodecamp.org/news/content/images/2023/11/Wasting-Time.png)

  "Wasting time" means not effectively utilizing your time. Would you agree that time is precious? Using and managing your time properly will help your career and life in general.

  To clarify, watching a movie, going out with your friends and family, participating in festive activities, and so are not wasting time. You need these to balance out the time you spend working. 

  Rather, I'm more concerned about the tasks you may have to perform that take away from your "focus time" at work.

  Let me walk you through a few situations:

  You are working on a task, and here comes some notifications on your phone. You pause whatever you are doing and jump on your phone to see what's happening on that side of the world. The notification may take you 10-15 seconds to read, but you then spend 10 minutes browsing the phone. 

  This is a habit many of us have built in recent times. And then when you get back to your work, your brain has to recalculate and bring you back to the topic at hand – where you were, and what you were doing – and get you started with the task gain. This context switching is costly, and the same amount of focus may not be possible.

  The best way of tackle a situation like this is,

  * Switch off the phone's internet while you're working if you do not need it. You can switch it on when you take breaks, maybe at lunch time.
  * You can also set your phone in "Do Not Disturb" mode while your work needs your utmost attention. Just make sure you add some of your family and friend's contacts as emergency contacts so that only a limited set of people can reach out to you during those times in case of any emergencies.

  Let's talk about another situation. Suppose you need to prepare and send a design doc to a senior dev for review. But instead, you spend time on something low priority or some little luxury that delayed preparing the doc. You keep postponing until it's become an urgent thing that you'll have to do within a limited time. 

  This act of delaying something knowingly is called `procrastination`, an ultimate way to kill time. There are some well-known and proven methods to tackle procrastination.

  * The first step is to realize and admit to yourself that you procrastinate.
  * Then list out your distractors. This list may vary from person to person. Remove these distractors. It could be your phone, TV, novels, anything.
  * Break down your deliverables into smaller tasks. Achieve them one by one and give yourself a pat on your back once you've finished each small task.
  * Take small breaks and come back to the point where you left off on your task to continue with a fresh brain.

  Instead of finding yourself in these types of situations, use your time wisely. If you have to get something done, get it done. When you're procrastinating, something that depends on one task may also get delayed, creating a cycle of time waste, frustrations, and complicated situations.

  ## 5\. You Neglect Upskilling

  ![Upskill](https://proxy-prod.omnivore-image-cache.app/500x300,s8u5vP0_rMNrQ-LfgTF0nQtckWlBvz5IEAaeyOSQTz7Q/https://www.freecodecamp.org/news/content/images/2023/11/Upskill.png)

  `Upskilling` means getting better at your current skill or acquiring relevant new skills. It is essential to upskill at any and all stages of your career. 

  One of the common mistakes we make is that we stop upskilling after a few years in our professional life. We get used to the projects, domains, technologies, and environments that create a comfort zone around us. Upskilling is always about coming out of that comfort zone.

  Here are a few common excuses we give to ourselves when it comes to upskilling:

  * I already have a lot of work at the office or assignments in university.
  * I need to have a personal life.
  * I am happy with whatever I know now, and my work only demands so much.
  * There is so much to learn and it is never ending (sigh!).

  But you really don't need that much time in a week to up-skill. You just need to have a plan and to stay consistent in executing it. Set just 1 hour aside in your day. Fork it out from any non-urgent activities and plan your learning schedule in that one hour.

  In this one hour, here are some things you can do:

  * Assess the gaps, weaknesses, and strengths in your technical and non technical abilities.
  * List them out in a place where you can easily get back to them and make modifications.
  * Prioritize them based on your current needs and near future goals.
  * Time-box each of the items so that you can get something tangible within a specified duration. For example, you want to do a certification on cloud computing within a month, or the Responsive Web Design course from freeCodeCamp over the next few weeks, and so on.
  * Start working on these defined tasks. You may find many resources on internet. Glance over them to create an index of resources that you can understand easily and relate to well.
  * Read and watch tutorials, but also practice hard.
  * Finally, recognize your progress.

  You may ask, is that one hour really enough? And I will tell you – it works like magic if you keep it up. Upskilling is not a race or sprint. It needs time, consistency, and perseverance to get from the one end to other.

  Have you heard about the power of tiny gains?

  ![image-21](https://proxy-prod.omnivore-image-cache.app/659x675,s6nxgcNX-v7bKwCnG4qrq4gj6H3-MyQgJ2A4TXvhJd_k/https://www.freecodecamp.org/news/content/images/2023/11/image-21.png)

  Credit: James Clear

  It is a strategy of being just 1% better every day. If you continue to do that for a year, you get almost 38% better at the end of the year. Being 1% worse does the opposite. The strategy was represented in mathematical graphs by James Clear in explanation of [Continuous improvements and how it works](https://jamesclear.com/continuous-improvement).

  Upskilling can also help you out a lot if you're preparing for the job search. The way the tech industry is moving, we may not be able to avoid layoffs – but we can be better prepared to get our next job faster. And that becomes much more attainable when you stay relevant and continue learning new things. 

  ## 6\. You Don't Ask for What You Want

  ![Don-t-ask-Don-t-Get](https://proxy-prod.omnivore-image-cache.app/500x300,sX_fVxbzhUPPh33KyrDzm0tr5vYezZqdzTekYPBlkhUc/https://www.freecodecamp.org/news/content/images/2023/11/Don-t-ask-Don-t-Get.png)

  Let me start by sharing an experience of mine. Back in the early 2000s when I was a fresher, I had to attend a meeting with some of the project leads and the manager. We were discussing how to modernize our product with HTML5 features. 

  I was aware of HTML5, and every time a discussion point was raised, I thought of adding to it, but I didn't. I thought of asking some valuable questions, but I didn't. I felt that in order to ask something in a meeting, I needed a lot of guts! I was wrong. 

  Oftentimes in your career journey, if you do not ask, you simply won't get what you want or deserve. If someone has some knowledge and you lack it, ask about it. If you have a questiona bout something, ask before you commit to the work. Ask about your promotion, a salary hike, career growth, and anything that is related to your career. There is no such thing as a silly question when it comes to your career growth.

  ## 7\. You Only Focus on the Money

  ![Money-honey](https://proxy-prod.omnivore-image-cache.app/500x300,sA_mQAKK-nW0_lpZxvJr_wiH5WuNcHXVUsErXQtrA-3g/https://www.freecodecamp.org/news/content/images/2023/11/Money-honey.png)

  Come on, money is important. But is it the only important thing, especially in the context of switching jobs or working towards your career goals? No, certainly not. 

  When you plan to switch jobs, you also need to look into other factors like work culture, the amount of time you need to spend at the office working, whether it's going to be more stressful compared to the compensation you'll be getting, and so on.

  I would certainly look into the following factors along with the compensation (the money part) to make an informed decision about my job switching:

  * What will be my technical growth and learning opportunities?
  * What will the work environment be like? Remote/Work From Office/Hybrid? How will that impact me?
  * What skills (both tech and soft) will I be able to learn in the new position?
  * What kind of employee benefits will I get compared to my current organization?
  * Will my work-life balance be impacted positively?
  * What are the company's vision, culture, and values?

  Then when you're considering the salary, be careful and make sure you understand the breakdown. What percentage of the CTC comes from any bonus? Is it inclusive or exclusive of CTC? How does the bonus payout happen? If the company doesn't do well in a fiscal year, will you get paid less? Are there stock options or other benefits they pay out instead of cash? All this matters.

  The mistake people often make is that they see only the `money` figure as the most important part of a job offer. Make sure you talk to someone from the company, do your research, and learn about what else they're offering as we mentioned above. 

  ## 8\. You Neglect Work-Life Balance

  ![Work-Life](https://proxy-prod.omnivore-image-cache.app/500x300,sN3pJRnCgrOdMDPZNVr7Os7gYEWeVs4rhIK60IqUvbfQ/https://www.freecodecamp.org/news/content/images/2023/11/Work-Life.png)

  Another mistake you might make is not balancing your work and life. The last thing you want is to `burn out` at the cost of things you love the most, like your friends, family, and long-term career.

  We must learn to prioritize things, and this includes both work and personal life. Your priority list for the day should not have only work related items. While it's important to ship a bug fix, it is also essential to accompany your kids to their soccer games or school plays, or make time to go on a date with your partner, or do something nice for yourself.

  Do not be afraid to say "No". At the same time, don't be arrogant when you accept or decline tasks. This is important to keep a healthy work-life balance. When you already have plenty on your plate, trying to accommodate more or do more will only spill over and negatively affect your work-life balance. 

  So say no when you need to, communicate your intentions ahead of time when possible, and proactively ask for what tasks you'd like to work on when your plate has room for more.

  For a long time in my career, I attended meetings late at night to match the timezones of my customers and other colleagues. Then, slowly, it started affecting my health and productivity. 

  When I thought about it more carefully, I discovered a couple of things. First, I realized that I didn't have to attend all the meetings, and that I could request that they take place in my clients' evenings sometimes. That way we'd both be taking turns compromising. And it worked. 

  At times, our habits drive us towards the work-life imbalance. For example, staying late at office while the same work can wait till the next morning is a classic example of a habit that may lead to health issues and frustrations in a long run. 

  We all need to find a way to sustain both work and life. So plan ahead, and stick to your schedule as much as possible. There might be exceptions where you have to give one thing priority above another – but do not allow the exception to become the norm.

  ## 9\. You Miss Out on Learning Opportunities 

  ![GOAT](https://proxy-prod.omnivore-image-cache.app/500x300,sABSdR2gJMwi_HJ_GLBI-Ri7W6pCZbA6UJNku96Ij7aM/https://www.freecodecamp.org/news/content/images/2023/11/GOAT.png)

  If you have the opportunity to learn from a person who specializes in a particular field, grab it. If you use social media platforms like LinkedIn and X/Twitter wisely, it can lead you to the people who share great insights about subjects you're interested in.

  A quick tip for you:

  When you send someone a connection request on LinkedIn/X, take some time to introduce yourself. Things that you can mention briefly:

  * What did you find unique about the person you want to connect to?
  * A bit about yourself, introducing some of your uniqueness, too.
  * Why do you want to connect?

  ==Build authentic connections to get the best out of it. Then once you're connected, here are a few things you can do:==

  * ==Show interest in their posts.==
  * ==Engage with discussions by commenting or sharing posts.==
  * ==Repost with your thoughts==
  * ==Exchange ideas, or even build things together!==

  ==A strong social connection may help you in getting information faster. You may learn about a new release of a library/framework/product, how an industry is moving, how certain technologies might impact your work, and so on.==

  Apart from learning a lot, you may also get to know about job openings, hirings, and references. After all, companies have also started recruiting talent from social media pages.

  Also, being part of a forum like the [freeCodeCamp forum](https://forum.freecodecamp.org/) can be helpful for networking and learning as well. It is also a place for you to share solutions to a problem, talk about what you've learned, and make yourself visible gradually.

  When we learn from someone, we not only come to understand what they've achieved or how they did it, but we also learn about the struggles, failures, and how they made the turnaround. Learning from someone else's experience can help accelerate your career journey. Don't make the mistake of living in a silo and missing out on these opportunities.

  ## 10\. You Can't See the Bigger Picture

  ![Big-Picture](https://proxy-prod.omnivore-image-cache.app/500x300,sr2JlkGqO_uQHX5rsG4F0iDS4Pk9HCvqL8kRgkiiUUG4/https://www.freecodecamp.org/news/content/images/2023/11/Big-Picture.png)

  By `Big Picture`(or Bigger Picture), I mean understanding and developing a wider perspective on your career as a whole. It is about your ability to consider and assess many different aspects of a situation, rather than focusing on just the minute details.

  As developers, we're supposed to implement features, do bug fixes, maintain code, and deliver quality software to our end-users. That's great! 

  But, we need to think beyond the individual tasks assigned to us. Our understanding of the overall project goals, the user acceptance criteria, delivery mechanisms, and perspectives of other engineers is key. And so is judging the impact of our work, as it will help us get the big picture of a project.

  Suppose your product manager wants your team to build user interfaces that also cater to the needs of specially-abled and visually challenged users. In this case, you and your team members must see the bigger picture around `Accessibility`. 

  If your designer doesn't define the site's colors accordingly, or the developers do not implement keyboard accessibility along with ARIA roles and attributes, then they're missing the bigger picture. 

  Another example could be over-optimizing performance while your users do not care about it. Your users may be waiting to get a feature ASAP so it can help them achieve their business goals. But by addressing unnecessary optimizations, you may be delaying that release and missing crucial deadlines.

  Missing the bigger picture may lead to a lack of synergy in your organization. It can also result in software products that need multiple iterations to meet customer needs because those needs weren't understood at the beginning. This can cause you to miss deadlines and do more work, and can greatly increase the cost to your client.

  Along with understanding "what" tasks you need to perform, also ask "why" your tasks are important and how they will impact the rest of the project or other people's work. 

  Irrespective of what you build, how big or small it is, how glorified or dull is the outcome, you need to know the impact of it on end users and your internal customers (like product/project managers, quality assurance team, documentation team, whoever). 

  Once you look at the bigger picture and act accordingly, your margin of error reduces automatically.

  ## Some More Advice and Wrapping Up

  I wanted to share all this career advice with you because I have been on the other side and learned the hard way. Before I move on to write my next article or record my next video, one more quick tip for you: make sure you work to build up your finances.

  Financial independence brings peace and the mental stability to think wildly about things you want to pursue in your career. But getting to the point of financial stability is not an overnight thing. You need to plan, save, and invest wisely such that your money grows faster than your age.

  I am not a finance expert, but I relied on some good ones and took their suggestions early on. If you have the opportunity and mindset to build your finances for the future, the time is now. 

  That's all for now. I hope you found this article informative and insightful. I regularly publish meaningful posts on my [GreenRoots Blog](https://blog.greenroots.info/), you may find them helpful, too.

  Let's connect.

  * I am an educator on my YouTube channel, `tapaScript`. Please [SUBSCRIBE](https://www.youtube.com/tapasadhikary?sub%5Fconfirmation=1) to the channel if you want to learn JavaScript, ReactJS, Next.js, Node.js, Git, and all about Web Development in the fundamental way.
  * [Follow me on X (Twitter](https://twitter.com/tapasadhikary)) or [LinkedIn](https://www.linkedin.com/in/tapasadhikary/) if you don't want to miss the daily dose of Web Development and Programming Tips.
  * Find all my public speaking talks [here](https://www.tapasadhikary.com/talks).
  * Check out and follow my Open Source work on [GitHub](https://github.com/atapas).

  See you soon with my next article. Until then, please take care of yourself, and stay happy.

  ---

  ---

   Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. [Get started](https://www.freecodecamp.org/learn/) 

metadata:
  {"date_added":"2023-11-21 21:04:22","id":"49d7bfb2-8911-11ee-9b49-a315c7dbc2d7","status":"ARCHIVED","tags":["read-later","RSS"],"title":"Career Mistakes to Avoid as a Developer\n","url_omnivore":"https://omnivore.app/me/career-mistakes-to-avoid-as-a-developer-18bf626412f\n","url_original":"https://www.freecodecamp.org/news/career-mistakes-to-avoid-as-a-dev/\n"}


path: Omnivore/2023-11-21 - Conventional Commits.md
sortable_path: Omnivore2023-11-21 - Conventional Commits.md
title: Conventional Commits
lead: # Conventional Commits
checksum: 1ee62c88ca376189db1026f160778117ea3a90c7ac7bac76329958e851f3bc95
created: 2024-09-15 00:40:57.431688746+00:00
modified: 2024-09-22 22:40:13.39451104+00:00
body:
  # Conventional Commits

  ## Highlights

  The commit message should be structured as follows:

  ---

  ```fortran
  [optional scope]: 

  [optional body]

  [optional footer(s)]
  ``` 

  [source](https://omnivore.app/me/https-www-conventionalcommits-org-en-v-1-0-0-18bf36268eb#0a71a3f4-0b81-4ccf-849b-f45c65951d5b) 

  ---

  ## Specification

  The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in [RFC 2119](https://www.ietf.org/rfc/rfc2119.txt).

  1. Commits MUST be prefixed with a type, which consists of a noun, `feat`, `fix`, etc., followed by the OPTIONAL scope, OPTIONAL `!`, and REQUIRED terminal colon and space.
  2. The type `feat` MUST be used when a commit adds a new feature to your application or library.
  3. The type `fix` MUST be used when a commit represents a bug fix for your application.
  4. A scope MAY be provided after a type. A scope MUST consist of a noun describing a section of the codebase surrounded by parenthesis, e.g., `fix(parser):`
  5. A description MUST immediately follow the colon and space after the type/scope prefix. The description is a short summary of the code changes, e.g., _fix: array parsing issue when multiple spaces were contained in string_.
  6. A longer commit body MAY be provided after the short description, providing additional contextual information about the code changes. The body MUST begin one blank line after the description.
  7. A commit body is free-form and MAY consist of any number of newline separated paragraphs.
  8. One or more footers MAY be provided one blank line after the body. Each footer MUST consist of a word token, followed by either a `:` or `#` separator, followed by a string value (this is inspired by the[git trailer convention](https://git-scm.com/docs/git-interpret-trailers)).
  9. A footer’s token MUST use `-` in place of whitespace characters, e.g., `Acked-by` (this helps differentiate the footer section from a multi-paragraph body). An exception is made for `BREAKING CHANGE`, which MAY also be used as a token.
  10. A footer’s value MAY contain spaces and newlines, and parsing MUST terminate when the next valid footer token/separator pair is observed.
  11. Breaking changes MUST be indicated in the type/scope prefix of a commit, or as an entry in the footer.
  12. If included as a footer, a breaking change MUST consist of the uppercase text BREAKING CHANGE, followed by a colon, space, and description, e.g.,_BREAKING CHANGE: environment variables now take precedence over config files_.
  13. If included in the type/scope prefix, breaking changes MUST be indicated by a`!` immediately before the `:`. If `!` is used, `BREAKING CHANGE:` MAY be omitted from the footer section, and the commit description SHALL be used to describe the breaking change.
  14. Types other than `feat` and `fix` MAY be used in your commit messages, e.g., _docs: update ref docs._
  15. The units of information that make up Conventional Commits MUST NOT be treated as case sensitive by implementors, with the exception of BREAKING CHANGE which MUST be uppercase.
  16. BREAKING-CHANGE MUST be synonymous with BREAKING CHANGE, when used as a token in a footer. 

  [source](https://omnivore.app/me/https-www-conventionalcommits-org-en-v-1-0-0-18bf36268eb#5670099d-60fe-4b9c-82b9-814e423c0e61) 

  ---

  ### What do I do if the commit conforms to more than one of the commit types?

  Go back and make multiple commits whenever possible. Part of the benefit of Conventional Commits is its ability to drive us to make more organized commits and PRs. 

  [source](https://omnivore.app/me/https-www-conventionalcommits-org-en-v-1-0-0-18bf36268eb#6ae81ced-efe6-464a-8026-c2f286faf4b7) 

  ---

  ### How does this relate to SemVer?

  `fix` type commits should be translated to `PATCH` releases. `feat` type commits should be translated to `MINOR` releases. Commits with `BREAKING CHANGE` in the commits, regardless of type, should be translated to `MAJOR` releases. 

  [source](https://omnivore.app/me/https-www-conventionalcommits-org-en-v-1-0-0-18bf36268eb#6876934a-5761-49f8-8905-3153e5d667b7) 

  ---

  ## Original

  ## [](#summary)Summary

  The Conventional Commits specification is a lightweight convention on top of commit messages. It provides an easy set of rules for creating an explicit commit history; which makes it easier to write automated tools on top of. This convention dovetails with [SemVer](http://semver.org/), by describing the features, fixes, and breaking changes made in commit messages.

  ==The commit message should be structured as follows:==

  ---

  ```fortran
  <type>[optional scope]: <description>

  [optional body]

  [optional footer(s)]

  ```

  ---

  The commit contains the following structural elements, to communicate intent to the consumers of your library:

  1. **fix:** a commit of the _type_ `fix` patches a bug in your codebase (this correlates with [PATCH](http://semver.org/#summary) in Semantic Versioning).
  2. **feat:** a commit of the _type_ `feat` introduces a new feature to the codebase (this correlates with [MINOR](http://semver.org/#summary) in Semantic Versioning).
  3. **BREAKING CHANGE:** a commit that has a footer `BREAKING CHANGE:`, or appends a `!` after the type/scope, introduces a breaking API change (correlating with [MAJOR](http://semver.org/#summary) in Semantic Versioning). A BREAKING CHANGE can be part of commits of any _type_.
  4. _types_ other than `fix:` and `feat:` are allowed, for example [@commitlint/config-conventional](https://github.com/conventional-changelog/commitlint/tree/master/%40commitlint/config-conventional) (based on the [Angular convention](https://github.com/angular/angular/blob/22b96b9/CONTRIBUTING.md#-commit-message-guidelines)) recommends `build:`, `chore:`,`ci:`, `docs:`, `style:`, `refactor:`, `perf:`, `test:`, and others.
  5. _footers_ other than `BREAKING CHANGE: <description>` may be provided and follow a convention similar to[git trailer format](https://git-scm.com/docs/git-interpret-trailers).

  Additional types are not mandated by the Conventional Commits specification, and have no implicit effect in Semantic Versioning (unless they include a BREAKING CHANGE).A scope may be provided to a commit’s type, to provide additional contextual information and is contained within parenthesis, e.g., `feat(parser): add ability to parse arrays`.

  ## [](#examples)Examples

  ### [](#commit-message-with-description-and-breaking-change-footer)Commit message with description and breaking change footer

  ```routeros
  feat: allow provided config object to extend other configs

  BREAKING CHANGE: `extends` key in config file is now used for extending other config files

  ```

  ### [](#commit-message-with--to-draw-attention-to-breaking-change)Commit message with `!` to draw attention to breaking change

  ```routeros
  feat!: send an email to the customer when a product is shipped

  ```

  ### [](#commit-message-with-scope-and--to-draw-attention-to-breaking-change)Commit message with scope and `!` to draw attention to breaking change

  ```routeros
  feat(api)!: send an email to the customer when a product is shipped

  ```

  ### [](#commit-message-with-both--and-breaking-change-footer)Commit message with both `!` and BREAKING CHANGE footer

  ```crmsh
  chore!: drop support for Node 6

  BREAKING CHANGE: use JavaScript features not available in Node 6.

  ```

  ### [](#commit-message-with-no-body)Commit message with no body

  ```avrasm
  docs: correct spelling of CHANGELOG

  ```

  ### [](#commit-message-with-scope)Commit message with scope

  ```stylus
  feat(lang): add Polish language

  ```

  ### [](#commit-message-with-multi-paragraph-body-and-multiple-footers)Commit message with multi-paragraph body and multiple footers

  ```http
  fix: prevent racing of requests

  Introduce a request id and a reference to latest request. Dismiss
  incoming responses other than from latest request.

  Remove timeouts which were used to mitigate the racing issue but are
  obsolete now.

  Reviewed-by: Z
  Refs: #123

  ```

  ## [](#specification)==Specification==

  ==The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in== ==[RFC 2119](https://www.ietf.org/rfc/rfc2119.txt)====.==

  1. ==Commits MUST be prefixed with a type, which consists of a noun,== `==feat==`==,== `==fix==`==, etc., followed  
  by the OPTIONAL scope, OPTIONAL== `==!==`==, and REQUIRED terminal colon and space.==
  2. ==The type== `==feat==` ==MUST be used when a commit adds a new feature to your application or library.==
  3. ==The type== `==fix==` ==MUST be used when a commit represents a bug fix for your application.==
  4. ==A scope MAY be provided after a type. A scope MUST consist of a noun describing a  
  section of the codebase surrounded by parenthesis, e.g.,== `==fix====(parser)====:==`
  5. ==A description MUST immediately follow the colon and space after the type/scope prefix.  
  The description is a short summary of the code changes, e.g.,== _==fix: array parsing issue when multiple spaces were contained in string==_==.==
  6. ==A longer commit body MAY be provided after the short description, providing additional contextual information about the code changes. The body MUST begin one blank line after the description.==
  7. ==A commit body is free-form and MAY consist of any number of newline separated paragraphs.==
  8. ==One or more footers MAY be provided one blank line after the body. Each footer MUST consist of  
  a word token, followed by either a== `==:====&lt;====space====&gt;==` ==or== `==&lt;====space====&gt;====#==` ==separator, followed by a string value (this is inspired by the====[git trailer convention](https://git-scm.com/docs/git-interpret-trailers)====).==
  9. ==A footer’s token MUST use== `==-==` ==in place of whitespace characters, e.g.,== `==Acked-====by==` ==(this helps differentiate  
  the footer section from a multi-paragraph body). An exception is made for== `==BREAKING== ==CHANGE==`==, which MAY also be used as a token.==
  10. ==A footer’s value MAY contain spaces and newlines, and parsing MUST terminate when the next valid footer  
  token/separator pair is observed.==
  11. ==Breaking changes MUST be indicated in the type/scope prefix of a commit, or as an entry in the  
  footer.==
  12. ==If included as a footer, a breaking change MUST consist of the uppercase text BREAKING CHANGE, followed by a colon, space, and description, e.g.,==_==BREAKING CHANGE: environment variables now take precedence over config files==_==.==
  13. ==If included in the type/scope prefix, breaking changes MUST be indicated by a==`==!==` ==immediately before the== `==:==`==. If== `==!==` ==is used,== `==BREAKING== ==CHANGE:==` ==MAY be omitted from the footer section,  
  and the commit description SHALL be used to describe the breaking change.==
  14. ==Types other than== `==feat==` ==and== `==fix==` ==MAY be used in your commit messages, e.g.,== _==docs: update ref docs.==_
  15. ==The units of information that make up Conventional Commits MUST NOT be treated as case sensitive by implementors, with the exception of BREAKING CHANGE which MUST be uppercase.==
  16. ==BREAKING-CHANGE MUST be synonymous with BREAKING CHANGE, when used as a token in a footer.==

  ## [](#why-use-conventional-commits)Why Use Conventional Commits

  * Automatically generating CHANGELOGs.
  * Automatically determining a semantic version bump (based on the types of commits landed).
  * Communicating the nature of changes to teammates, the public, and other stakeholders.
  * Triggering build and publish processes.
  * Making it easier for people to contribute to your projects, by allowing them to explore a more structured commit history.

  ## [](#faq)FAQ

  ### [](#how-should-i-deal-with-commit-messages-in-the-initial-development-phase)How should I deal with commit messages in the initial development phase?

  We recommend that you proceed as if you’ve already released the product. Typically _somebody_, even if it’s your fellow software developers, is using your software. They’ll want to know what’s fixed, what breaks etc.

  ### [](#are-the-types-in-the-commit-title-uppercase-or-lowercase)Are the types in the commit title uppercase or lowercase?

  Any casing may be used, but it’s best to be consistent.

  ### [](#what-do-i-do-if-the-commit-conforms-to-more-than-one-of-the-commit-types)==What do I do if the commit conforms to more than one of the commit types?==

  ==Go back and make multiple commits whenever possible. Part of the benefit of Conventional Commits is its ability to drive us to make more organized commits and PRs.==

  ### [](#doesnt-this-discourage-rapid-development-and-fast-iteration)Doesn’t this discourage rapid development and fast iteration?

  It discourages moving fast in a disorganized way. It helps you be able to move fast long term across multiple projects with varied contributors.

  ### [](#might-conventional-commits-lead-developers-to-limit-the-type-of-commits-they-make-because-theyll-be-thinking-in-the-types-provided)Might Conventional Commits lead developers to limit the type of commits they make because they’ll be thinking in the types provided?

  Conventional Commits encourages us to make more of certain types of commits such as fixes. Other than that, the flexibility of Conventional Commits allows your team to come up with their own types and change those types over time.

  ### [](#how-does-this-relate-to-semver)==How does this relate to SemVer?==

  `==fix==` ==type commits should be translated to== `==PATCH==` ==releases.== `==feat==` ==type commits should be translated to== `==MINOR==` ==releases. Commits with== `==BREAKING== ==CHANGE==` ==in the commits, regardless of type, should be translated to== `==MAJOR==` ==releases.==

  ### [](#how-should-i-version-my-extensions-to-the-conventional-commits-specification-eg-jameswomackconventional-commit-spec)How should I version my extensions to the Conventional Commits Specification, e.g. `@jameswomack/conventional-commit-spec`?

  We recommend using SemVer to release your own extensions to this specification (and encourage you to make these extensions!)

  ### [](#what-do-i-do-if-i-accidentally-use-the-wrong-commit-type)What do I do if I accidentally use the wrong commit type?

  #### [](#when-you-used-a-type-thats-of-the-spec-but-not-the-correct-type-eg-fix-instead-of-feat)When you used a type that’s of the spec but not the correct type, e.g. `fix` instead of `feat`

  Prior to merging or releasing the mistake, we recommend using `git rebase -i` to edit the commit history. After release, the cleanup will be different according to what tools and processes you use.

  #### [](#when-you-used-a-type-not-of-the-spec-eg-feet-instead-of-feat)When you used a type _not_ of the spec, e.g. `feet` instead of `feat`

  In a worst case scenario, it’s not the end of the world if a commit lands that does not meet the Conventional Commits specification. It simply means that commit will be missed by tools that are based on the spec.

  ### [](#do-all-my-contributors-need-to-use-the-conventional-commits-specification)Do all my contributors need to use the Conventional Commits specification?

  No! If you use a squash based workflow on Git lead maintainers can clean up the commit messages as they’re merged—adding no workload to casual committers. A common workflow for this is to have your git system automatically squash commits from a pull request and present a form for the lead maintainer to enter the proper git commit message for the merge.

  ### [](#how-does-conventional-commits-handle-revert-commits)How does Conventional Commits handle revert commits?

  Reverting code can be complicated: are you reverting multiple commits? if you revert a feature, should the next release instead be a patch?

  Conventional Commits does not make an explicit effort to define revert behavior. Instead we leave it to tooling authors to use the flexibility of _types_ and _footers_ to develop their logic for handling reverts.

  One recommendation is to use the `revert` type, and a footer that references the commit SHAs that are being reverted:

  ```http
  revert: let us never again speak of the noodle incident

  Refs: 676104e, a215868

  ```

raw_content:
  ---
  id: 2a685647-d920-4ba6-b837-3ee29a2f7f10
  title: |
    Conventional Commits
  status: ARCHIVED
  tags:
    - read-later
  date_added: 2023-11-21 16:36:37
  url_omnivore: |
    https://omnivore.app/me/https-www-conventionalcommits-org-en-v-1-0-0-18bf36268eb
  url_original: |
    https://www.conventionalcommits.org/en/v1.0.0/
  ---

  # Conventional Commits

  ## Highlights

  The commit message should be structured as follows:

  ---

  ```fortran
  [optional scope]: 

  [optional body]

  [optional footer(s)]
  ``` 

  [source](https://omnivore.app/me/https-www-conventionalcommits-org-en-v-1-0-0-18bf36268eb#0a71a3f4-0b81-4ccf-849b-f45c65951d5b) 

  ---

  ## Specification

  The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in [RFC 2119](https://www.ietf.org/rfc/rfc2119.txt).

  1. Commits MUST be prefixed with a type, which consists of a noun, `feat`, `fix`, etc., followed by the OPTIONAL scope, OPTIONAL `!`, and REQUIRED terminal colon and space.
  2. The type `feat` MUST be used when a commit adds a new feature to your application or library.
  3. The type `fix` MUST be used when a commit represents a bug fix for your application.
  4. A scope MAY be provided after a type. A scope MUST consist of a noun describing a section of the codebase surrounded by parenthesis, e.g., `fix(parser):`
  5. A description MUST immediately follow the colon and space after the type/scope prefix. The description is a short summary of the code changes, e.g., _fix: array parsing issue when multiple spaces were contained in string_.
  6. A longer commit body MAY be provided after the short description, providing additional contextual information about the code changes. The body MUST begin one blank line after the description.
  7. A commit body is free-form and MAY consist of any number of newline separated paragraphs.
  8. One or more footers MAY be provided one blank line after the body. Each footer MUST consist of a word token, followed by either a `:` or `#` separator, followed by a string value (this is inspired by the[git trailer convention](https://git-scm.com/docs/git-interpret-trailers)).
  9. A footer’s token MUST use `-` in place of whitespace characters, e.g., `Acked-by` (this helps differentiate the footer section from a multi-paragraph body). An exception is made for `BREAKING CHANGE`, which MAY also be used as a token.
  10. A footer’s value MAY contain spaces and newlines, and parsing MUST terminate when the next valid footer token/separator pair is observed.
  11. Breaking changes MUST be indicated in the type/scope prefix of a commit, or as an entry in the footer.
  12. If included as a footer, a breaking change MUST consist of the uppercase text BREAKING CHANGE, followed by a colon, space, and description, e.g.,_BREAKING CHANGE: environment variables now take precedence over config files_.
  13. If included in the type/scope prefix, breaking changes MUST be indicated by a`!` immediately before the `:`. If `!` is used, `BREAKING CHANGE:` MAY be omitted from the footer section, and the commit description SHALL be used to describe the breaking change.
  14. Types other than `feat` and `fix` MAY be used in your commit messages, e.g., _docs: update ref docs._
  15. The units of information that make up Conventional Commits MUST NOT be treated as case sensitive by implementors, with the exception of BREAKING CHANGE which MUST be uppercase.
  16. BREAKING-CHANGE MUST be synonymous with BREAKING CHANGE, when used as a token in a footer. 

  [source](https://omnivore.app/me/https-www-conventionalcommits-org-en-v-1-0-0-18bf36268eb#5670099d-60fe-4b9c-82b9-814e423c0e61) 

  ---

  ### What do I do if the commit conforms to more than one of the commit types?

  Go back and make multiple commits whenever possible. Part of the benefit of Conventional Commits is its ability to drive us to make more organized commits and PRs. 

  [source](https://omnivore.app/me/https-www-conventionalcommits-org-en-v-1-0-0-18bf36268eb#6ae81ced-efe6-464a-8026-c2f286faf4b7) 

  ---

  ### How does this relate to SemVer?

  `fix` type commits should be translated to `PATCH` releases. `feat` type commits should be translated to `MINOR` releases. Commits with `BREAKING CHANGE` in the commits, regardless of type, should be translated to `MAJOR` releases. 

  [source](https://omnivore.app/me/https-www-conventionalcommits-org-en-v-1-0-0-18bf36268eb#6876934a-5761-49f8-8905-3153e5d667b7) 

  ---

  ## Original

  ## [](#summary)Summary

  The Conventional Commits specification is a lightweight convention on top of commit messages. It provides an easy set of rules for creating an explicit commit history; which makes it easier to write automated tools on top of. This convention dovetails with [SemVer](http://semver.org/), by describing the features, fixes, and breaking changes made in commit messages.

  ==The commit message should be structured as follows:==

  ---

  ```fortran
  <type>[optional scope]: <description>

  [optional body]

  [optional footer(s)]

  ```

  ---

  The commit contains the following structural elements, to communicate intent to the consumers of your library:

  1. **fix:** a commit of the _type_ `fix` patches a bug in your codebase (this correlates with [PATCH](http://semver.org/#summary) in Semantic Versioning).
  2. **feat:** a commit of the _type_ `feat` introduces a new feature to the codebase (this correlates with [MINOR](http://semver.org/#summary) in Semantic Versioning).
  3. **BREAKING CHANGE:** a commit that has a footer `BREAKING CHANGE:`, or appends a `!` after the type/scope, introduces a breaking API change (correlating with [MAJOR](http://semver.org/#summary) in Semantic Versioning). A BREAKING CHANGE can be part of commits of any _type_.
  4. _types_ other than `fix:` and `feat:` are allowed, for example [@commitlint/config-conventional](https://github.com/conventional-changelog/commitlint/tree/master/%40commitlint/config-conventional) (based on the [Angular convention](https://github.com/angular/angular/blob/22b96b9/CONTRIBUTING.md#-commit-message-guidelines)) recommends `build:`, `chore:`,`ci:`, `docs:`, `style:`, `refactor:`, `perf:`, `test:`, and others.
  5. _footers_ other than `BREAKING CHANGE: <description>` may be provided and follow a convention similar to[git trailer format](https://git-scm.com/docs/git-interpret-trailers).

  Additional types are not mandated by the Conventional Commits specification, and have no implicit effect in Semantic Versioning (unless they include a BREAKING CHANGE).A scope may be provided to a commit’s type, to provide additional contextual information and is contained within parenthesis, e.g., `feat(parser): add ability to parse arrays`.

  ## [](#examples)Examples

  ### [](#commit-message-with-description-and-breaking-change-footer)Commit message with description and breaking change footer

  ```routeros
  feat: allow provided config object to extend other configs

  BREAKING CHANGE: `extends` key in config file is now used for extending other config files

  ```

  ### [](#commit-message-with--to-draw-attention-to-breaking-change)Commit message with `!` to draw attention to breaking change

  ```routeros
  feat!: send an email to the customer when a product is shipped

  ```

  ### [](#commit-message-with-scope-and--to-draw-attention-to-breaking-change)Commit message with scope and `!` to draw attention to breaking change

  ```routeros
  feat(api)!: send an email to the customer when a product is shipped

  ```

  ### [](#commit-message-with-both--and-breaking-change-footer)Commit message with both `!` and BREAKING CHANGE footer

  ```crmsh
  chore!: drop support for Node 6

  BREAKING CHANGE: use JavaScript features not available in Node 6.

  ```

  ### [](#commit-message-with-no-body)Commit message with no body

  ```avrasm
  docs: correct spelling of CHANGELOG

  ```

  ### [](#commit-message-with-scope)Commit message with scope

  ```stylus
  feat(lang): add Polish language

  ```

  ### [](#commit-message-with-multi-paragraph-body-and-multiple-footers)Commit message with multi-paragraph body and multiple footers

  ```http
  fix: prevent racing of requests

  Introduce a request id and a reference to latest request. Dismiss
  incoming responses other than from latest request.

  Remove timeouts which were used to mitigate the racing issue but are
  obsolete now.

  Reviewed-by: Z
  Refs: #123

  ```

  ## [](#specification)==Specification==

  ==The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, and “OPTIONAL” in this document are to be interpreted as described in== ==[RFC 2119](https://www.ietf.org/rfc/rfc2119.txt)====.==

  1. ==Commits MUST be prefixed with a type, which consists of a noun,== `==feat==`==,== `==fix==`==, etc., followed  
  by the OPTIONAL scope, OPTIONAL== `==!==`==, and REQUIRED terminal colon and space.==
  2. ==The type== `==feat==` ==MUST be used when a commit adds a new feature to your application or library.==
  3. ==The type== `==fix==` ==MUST be used when a commit represents a bug fix for your application.==
  4. ==A scope MAY be provided after a type. A scope MUST consist of a noun describing a  
  section of the codebase surrounded by parenthesis, e.g.,== `==fix====(parser)====:==`
  5. ==A description MUST immediately follow the colon and space after the type/scope prefix.  
  The description is a short summary of the code changes, e.g.,== _==fix: array parsing issue when multiple spaces were contained in string==_==.==
  6. ==A longer commit body MAY be provided after the short description, providing additional contextual information about the code changes. The body MUST begin one blank line after the description.==
  7. ==A commit body is free-form and MAY consist of any number of newline separated paragraphs.==
  8. ==One or more footers MAY be provided one blank line after the body. Each footer MUST consist of  
  a word token, followed by either a== `==:====&lt;====space====&gt;==` ==or== `==&lt;====space====&gt;====#==` ==separator, followed by a string value (this is inspired by the====[git trailer convention](https://git-scm.com/docs/git-interpret-trailers)====).==
  9. ==A footer’s token MUST use== `==-==` ==in place of whitespace characters, e.g.,== `==Acked-====by==` ==(this helps differentiate  
  the footer section from a multi-paragraph body). An exception is made for== `==BREAKING== ==CHANGE==`==, which MAY also be used as a token.==
  10. ==A footer’s value MAY contain spaces and newlines, and parsing MUST terminate when the next valid footer  
  token/separator pair is observed.==
  11. ==Breaking changes MUST be indicated in the type/scope prefix of a commit, or as an entry in the  
  footer.==
  12. ==If included as a footer, a breaking change MUST consist of the uppercase text BREAKING CHANGE, followed by a colon, space, and description, e.g.,==_==BREAKING CHANGE: environment variables now take precedence over config files==_==.==
  13. ==If included in the type/scope prefix, breaking changes MUST be indicated by a==`==!==` ==immediately before the== `==:==`==. If== `==!==` ==is used,== `==BREAKING== ==CHANGE:==` ==MAY be omitted from the footer section,  
  and the commit description SHALL be used to describe the breaking change.==
  14. ==Types other than== `==feat==` ==and== `==fix==` ==MAY be used in your commit messages, e.g.,== _==docs: update ref docs.==_
  15. ==The units of information that make up Conventional Commits MUST NOT be treated as case sensitive by implementors, with the exception of BREAKING CHANGE which MUST be uppercase.==
  16. ==BREAKING-CHANGE MUST be synonymous with BREAKING CHANGE, when used as a token in a footer.==

  ## [](#why-use-conventional-commits)Why Use Conventional Commits

  * Automatically generating CHANGELOGs.
  * Automatically determining a semantic version bump (based on the types of commits landed).
  * Communicating the nature of changes to teammates, the public, and other stakeholders.
  * Triggering build and publish processes.
  * Making it easier for people to contribute to your projects, by allowing them to explore a more structured commit history.

  ## [](#faq)FAQ

  ### [](#how-should-i-deal-with-commit-messages-in-the-initial-development-phase)How should I deal with commit messages in the initial development phase?

  We recommend that you proceed as if you’ve already released the product. Typically _somebody_, even if it’s your fellow software developers, is using your software. They’ll want to know what’s fixed, what breaks etc.

  ### [](#are-the-types-in-the-commit-title-uppercase-or-lowercase)Are the types in the commit title uppercase or lowercase?

  Any casing may be used, but it’s best to be consistent.

  ### [](#what-do-i-do-if-the-commit-conforms-to-more-than-one-of-the-commit-types)==What do I do if the commit conforms to more than one of the commit types?==

  ==Go back and make multiple commits whenever possible. Part of the benefit of Conventional Commits is its ability to drive us to make more organized commits and PRs.==

  ### [](#doesnt-this-discourage-rapid-development-and-fast-iteration)Doesn’t this discourage rapid development and fast iteration?

  It discourages moving fast in a disorganized way. It helps you be able to move fast long term across multiple projects with varied contributors.

  ### [](#might-conventional-commits-lead-developers-to-limit-the-type-of-commits-they-make-because-theyll-be-thinking-in-the-types-provided)Might Conventional Commits lead developers to limit the type of commits they make because they’ll be thinking in the types provided?

  Conventional Commits encourages us to make more of certain types of commits such as fixes. Other than that, the flexibility of Conventional Commits allows your team to come up with their own types and change those types over time.

  ### [](#how-does-this-relate-to-semver)==How does this relate to SemVer?==

  `==fix==` ==type commits should be translated to== `==PATCH==` ==releases.== `==feat==` ==type commits should be translated to== `==MINOR==` ==releases. Commits with== `==BREAKING== ==CHANGE==` ==in the commits, regardless of type, should be translated to== `==MAJOR==` ==releases.==

  ### [](#how-should-i-version-my-extensions-to-the-conventional-commits-specification-eg-jameswomackconventional-commit-spec)How should I version my extensions to the Conventional Commits Specification, e.g. `@jameswomack/conventional-commit-spec`?

  We recommend using SemVer to release your own extensions to this specification (and encourage you to make these extensions!)

  ### [](#what-do-i-do-if-i-accidentally-use-the-wrong-commit-type)What do I do if I accidentally use the wrong commit type?

  #### [](#when-you-used-a-type-thats-of-the-spec-but-not-the-correct-type-eg-fix-instead-of-feat)When you used a type that’s of the spec but not the correct type, e.g. `fix` instead of `feat`

  Prior to merging or releasing the mistake, we recommend using `git rebase -i` to edit the commit history. After release, the cleanup will be different according to what tools and processes you use.

  #### [](#when-you-used-a-type-not-of-the-spec-eg-feet-instead-of-feat)When you used a type _not_ of the spec, e.g. `feet` instead of `feat`

  In a worst case scenario, it’s not the end of the world if a commit lands that does not meet the Conventional Commits specification. It simply means that commit will be missed by tools that are based on the spec.

  ### [](#do-all-my-contributors-need-to-use-the-conventional-commits-specification)Do all my contributors need to use the Conventional Commits specification?

  No! If you use a squash based workflow on Git lead maintainers can clean up the commit messages as they’re merged—adding no workload to casual committers. A common workflow for this is to have your git system automatically squash commits from a pull request and present a form for the lead maintainer to enter the proper git commit message for the merge.

  ### [](#how-does-conventional-commits-handle-revert-commits)How does Conventional Commits handle revert commits?

  Reverting code can be complicated: are you reverting multiple commits? if you revert a feature, should the next release instead be a patch?

  Conventional Commits does not make an explicit effort to define revert behavior. Instead we leave it to tooling authors to use the flexibility of _types_ and _footers_ to develop their logic for handling reverts.

  One recommendation is to use the `revert` type, and a footer that references the commit SHAs that are being reverted:

  ```http
  revert: let us never again speak of the noodle incident

  Refs: 676104e, a215868

  ```

metadata:
  {"date_added":"2023-11-21 16:36:37","id":"2a685647-d920-4ba6-b837-3ee29a2f7f10","status":"ARCHIVED","tags":["read-later"],"title":"Conventional Commits\n","url_omnivore":"https://omnivore.app/me/https-www-conventionalcommits-org-en-v-1-0-0-18bf36268eb\n","url_original":"https://www.conventionalcommits.org/en/v1.0.0/\n"}


path: Omnivore/2023-11-21 - How to Write Better Git Commit Messages – A Step-By-Step Guide.md
sortable_path: Omnivore2023-11-21 - How to Write Better Git Commit Messages – A Step-By-Step Guide.md
title: How to Write Better Git Commit Messages – A Step-By-Step Guide
lead: # How to Write Better Git Commit Messages – A Step-By-Step Guide
checksum: c9963b3cca4bd6f077f2b227bc3a4cdd65a09020e32e0e5af60cb12eac8d712e
created: 2024-09-15 00:40:57.589041191+00:00
modified: 2024-09-22 22:40:13.39451104+00:00
body:
  # How to Write Better Git Commit Messages – A Step-By-Step Guide

  ## Highlights

  To come up with thoughtful commits, consider the following: 

  * Why have I made these changes?
  * What effect have my changes made?
  * Why was the change needed?
  * What are the changes in reference to? 

  [source](https://omnivore.app/me/https-www-freecodecamp-org-news-how-to-write-better-git-commit-m-18bf26ec55f#b1693951-0a92-44f4-804d-7c5008bf3113) 

  ---

  See the differences below:

  1. `git commit -m 'Add margin'`
  2. `git commit -m 'Add margin to nav items to prevent them from overlapping the logo'` 

  [source](https://omnivore.app/me/https-www-freecodecamp-org-news-how-to-write-better-git-commit-m-18bf26ec55f#a3c842a2-18b0-46b9-8131-c37ecd867c19) 

  ---

  Conventional Commit is a formatting convention that provides a set of rules to formulate a consistent commit message structure like so:

  ```fortran
  [optional scope]: 

  [optional body]

  [optional footer(s)]
  ```

  The commit type can include the following:

  * `feat` – a new feature is introduced with the changes
  * `fix` – a bug fix has occurred
  * `chore` – changes that do not relate to a fix or feature and don't modify src or test files (for example updating dependencies)
  * `refactor` – refactored code that neither fixes a bug nor adds a feature
  * `docs` – updates to documentation such as a the README or other markdown files
  * `style` – changes that do not affect the meaning of the code, likely related to code formatting such as white-space, missing semi-colons, and so on.
  * `test` – including new or correcting previous tests
  * `perf` – performance improvements
  * `ci` – continuous integration related
  * `build` – changes that affect the build system or external dependencies
  * `revert` – reverts a previous commit 

  [source](https://omnivore.app/me/https-www-freecodecamp-org-news-how-to-write-better-git-commit-m-18bf26ec55f#f3ea8f19-6480-43ac-a72f-2856ee003fb6) 

  ---

  ## Original

  ![How to Write Better Git Commit Messages – A Step-By-Step Guide](https://proxy-prod.omnivore-image-cache.app/1200x600,s0l1fwKZBNqL0bSd2aeEioVceLJjdlKhWsHRkZlRIk7A/https://www.freecodecamp.org/news/content/images/size/w2000/2022/01/gitcommitmessage.png) 

  When first introduced to Git, it's typical for developers to feel uncomfortable with the process. 

  You might feel uncertainty when encountering the Git commit message, unsure how to properly summarize the changes you've made and why you've made them. But the earlier in your career you can develop good committing habits, the better.

  Have you ever wondered how you can improve your Git commit messages? This guide outlines steps to elevate your commit messages that you can start implementing today.

  This article assumes you already understand basic Git workflow. If not, I suggest reading through the [Git Handbook](https://guides.github.com/introduction/git-handbook/).

  It is also important to note that you should follow your team's conventions first and foremost. These tips are based on suggestions based upon research and general consensus from the community. But by the end of this article you may have some implementations to suggest that may help your team's workflow.

  > I think git enters a whole other realm the moment you start working in teams -- there are so many cool different flows and ways that people can commit code, share code, and add code to your repo open-source or closed-source-wise. — [Scott Tolinski, Syntax.fm](https://syntax.fm/).

  ## Why should you write better commit messages?

  I challenge you to open up a personal project or any repository for that matter and run `git log` to view a list of old commit messages. The vast majority of us who have run through tutorials or made quick fixes will say "Yep... I have absolutely no idea what I meant by 'Fix style' 6 months ago." 

  Perhaps you have encountered code in a professional environment where you had no idea what it was doing or meant for. You've been left in the dark without code comments or a traceable history, and even wondering "what are the odds this will break everything if I remove this line?"

  ### Back to the Future

  By writing good commits, you are simply future-proofing yourself. You could save yourself and/or coworkers hours of digging around while troubleshooting by providing that helpful description. 

  The extra time it takes to write a thoughtful commit message as a letter to your potential future self is extremely worthwhile. On large scale projects, documentation is imperative for maintenance. 

  Collaboration and communication are of utmost importance within engineering teams. The Git commit message is a prime example of this. I highly suggest setting up a convention for commit messages on your team if you do not already have one in place.

  ## The Anatomy of a Commit Message

  #### Basic:

  `git commit -m <message>`

  #### Detailed:

  `git commit -m <title> -m <description>`

  ![Screen-Shot-2022-01-03-at-10.31.49-AM](https://proxy-prod.omnivore-image-cache.app/1192x122,sHp5nlkupArC1L0Wk1l4Qjg9Wx_fb7YOHA-sE4vCD1Do/https://www.freecodecamp.org/news/content/images/2022/01/Screen-Shot-2022-01-03-at-10.31.49-AM.png)

  ## 5 Steps to Write Better Commit Messages

   Let's summarize the suggested guidelines:

  1. Capitalization and Punctuation: Capitalize the first word and do not end in punctuation. If using Conventional Commits, remember to use all lowercase.
  2. Mood: Use imperative mood in the subject line. Example – `Add fix for dark mode toggle state`. Imperative mood gives the tone you are giving an order or request.
  3. Type of Commit: Specify the type of commit. It is recommended and can be even more beneficial to have a consistent set of words to describe your changes. Example: Bugfix, Update, Refactor, Bump, and so on. See the section on Conventional Commits below for additional information.
  4. Length: The first line should ideally be no longer than 50 characters, and the body should be restricted to 72 characters.
  5. Content: Be direct, try to eliminate filler words and phrases in these sentences (examples: though, maybe, I think, kind of). Think like a journalist.

  ### How to Find Your Inner Journalist

  I never quite thought my Journalism minor would benefit my future career as a Software Engineer, but here we are! 

  Journalists and writers ask themselves questions to ensure their article is detailed, straightforward, and answers all of the reader's questions. 

  When writing an article they look to answer _who_, _what_, _where_, _when_, _why_ and _how._ For committing purposes, it is most important to answer the what and why for our commit messages. 

  ==To come up with thoughtful commits, consider the following:== 

  * ==Why have I made these changes?==
  * ==What effect have my changes made?==
  * ==Why was the change needed?==
  * ==What are the changes in reference to?==

  Assume the reader does not understand what the commit is addressing. They may not have access to the story addressing the detailed background of the change.

  Don't expect the code to be self-explanatory. This is similar to the point above. 

  It might seem obvious to you, the programmer, if you're updating something like CSS styles since it is visual. You may have intimate knowledge on why these changes were needed at the time, but it's unlikely you will recall why you did that hundreds of pull requests later. 

  Make it clear _why_ that change was made, and note if it may be crucial for the functionality or not.

  ==See the differences below:==

  1. `==git== ==commit -m== =='Add margin'==`
  2. `==git commit -m 'Add margin== ==to== ==nav items== ==to== ==prevent them== ==from== ==overlapping== ==the== ==logo'==`

  It is clear which of these would be more useful to future readers. 

  Pretend you're writing an important newsworthy article. Give the headline that will sum up what happened and what is important. Then, provide further details in the body in an organized fashion. 

  In filmmaking, it is often quoted "show, don't tell" using visuals as the communication medium compared to a verbal explanation of what is happening.

  In our case, "**tell**, don't \[just\] show" – though we have some visuals at our disposal such as the browser, most of the specifics come from reading the physical code.

  If you're a VSCode user, download the [Git Blame](https://marketplace.visualstudio.com/items?itemName=waderyan.gitblame) extension. This is a prime example of when useful commit messages are helpful to future developers. 

  This plugin will list the person who made the change, the date of the changes, as well as the commit message commented inline. 

  Imagine how useful this could be in troubleshooting a bug or back-tracing changes made. Other honorable mentions to see Git historical information are [Git History](https://marketplace.visualstudio.com/items?itemName=donjayamanne.githistory) and [GitLens](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens). 

  ![Screen-Shot-2022-01-03-at-10.45.49-AM](https://proxy-prod.omnivore-image-cache.app/2068x418,szGePuf8TNML7r1MA_vhSRoULcLczTSddFDMSz6X_nck/https://www.freecodecamp.org/news/content/images/2022/01/Screen-Shot-2022-01-03-at-10.45.49-AM.png)

  ## Conventional Commits

  Now that we've covered basic commit structure of a good commit message, I'd like to introduce Conventional Commits to help provide some detail on creating solid commit messages. 

  At D2iQ, we use Conventional Commit which is a great practice among engineering teams. ==Conventional Commit is a formatting convention that provides a set of rules to formulate a consistent commit message structure like so:==

  ```fortran
  <type>[optional scope]: <description>

  [optional body]

  [optional footer(s)]
  ```

  ==The commit type can include the following:==

  * `==feat==` ==– a new feature is introduced with the changes==
  * `==fix==` ==– a bug fix has occurred==
  * `==chore==` ==– changes that do not relate to a fix or feature and don't modify src or test files (for example updating dependencies)==
  * `==ref====actor==` ==– refactored code that neither fixes a bug nor adds a feature==
  * `==docs==` ==– updates to documentation such as a the README or other markdown files==
  * `==style==` ==– changes that do not affect the meaning of the code, likely related to code formatting such as white-space, missing semi-colons, and so on.==
  * `==test==` ==– including new or correcting previous tests==
  * `==perf==` ==– performance improvements==
  * `==ci==` ==– continuous integration related==
  * `==build==` ==– changes that affect the build system or external dependencies==
  * `==revert==` ==– reverts a previous commit==

  The commit type subject line should be all lowercase with a character limit to encourage succinct descriptions. 

  The optional commit body should be used to provide further detail that cannot fit within the character limitations of the subject line description. 

  It is also a good location to utilize `BREAKING CHANGE: <description>` to note the reason for a breaking change within the commit. 

  The footer is also optional. We use the footer to link the JIRA story that would be closed with these changes for example: `Closes D2IQ-<JIRA #>` .

  #### Full Conventional Commit Example 

  ```http
  fix: fix foo to enable bar

  This fixes the broken behavior of the component by doing xyz. 

  BREAKING CHANGE
  Before this fix foo wasn't enabled at all, behavior changes from <old> to <new>

  Closes D2IQ-12345
  ```

  To ensure that these committing conventions remain consistent across developers, commit message linting can be configured before changes are able to be pushed up. [Commitizen](https://commitizen-tools.github.io/commitizen/) is a great tool to enforce standards, sync up semantic versioning, along with other helpful features.

  To aid in adoption of these conventions, it's helpful to include guidelines for commits in a contributing or README markdown file within your projects.

  Conventional Commit works particularly well with semantic versioning (learn more at [SemVer.org](https://semver.org/)) where commit types can update the appropriate version to release. You can also [read more about Conventional Commits here](https://www.conventionalcommits.org/en/v1.0.0/).

  ## Commit Message Comparisons

  Review the following messages and see how many of the suggested guidelines they check off in each category.

  #### Good

  * `feat: improve performance with lazy load implementation for images`
  * `chore: update npm dependency to latest version`
  * `Fix bug preventing users from submitting the subscribe form`
  * `Update incorrect client phone number within footer body per client request`

  #### Bad

  * `fixed bug on landing page`
  * `Changed style`
  * `oops`
  * `I think I fixed it this time?`
  * empty commit messages

  ## Conclusion

  Writing good commit messages is an extremely beneficial skill to develop, and it helps you communicate and collaborate with your team. Commits serve as an archive of changes. They can become an ancient manuscript to help us decipher the past, and make reasoned decisions in the future.

  There is an existing set of agreed-upon standards we can follow, but as long as your team agrees upon a convention that is descriptive with future readers in mind, there will undoubtedly be long-term benefits.

  In this article, we've learned some tactics to level up our commit messages. How do you think these techniques can improve your commits?

  I hope you've learned something new, thanks for reading! 

  Connect with me on Twitter [@ui\_natalie](https://twitter.com/ui%5Fnatalie).

  ---

  ---

   Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. [Get started](https://www.freecodecamp.org/learn/)

raw_content:
  ---
  id: 1996b6ce-9449-415d-8c18-609ddb9cd580
  title: |
    How to Write Better Git Commit Messages – A Step-By-Step Guide
  status: ARCHIVED
  tags:
    - read-later
  date_added: 2023-11-21 12:10:32
  url_omnivore: |
    https://omnivore.app/me/https-www-freecodecamp-org-news-how-to-write-better-git-commit-m-18bf26ec55f
  url_original: |
    https://www.freecodecamp.org/news/how-to-write-better-git-commit-messages/
  ---

  # How to Write Better Git Commit Messages – A Step-By-Step Guide

  ## Highlights

  To come up with thoughtful commits, consider the following: 

  * Why have I made these changes?
  * What effect have my changes made?
  * Why was the change needed?
  * What are the changes in reference to? 

  [source](https://omnivore.app/me/https-www-freecodecamp-org-news-how-to-write-better-git-commit-m-18bf26ec55f#b1693951-0a92-44f4-804d-7c5008bf3113) 

  ---

  See the differences below:

  1. `git commit -m 'Add margin'`
  2. `git commit -m 'Add margin to nav items to prevent them from overlapping the logo'` 

  [source](https://omnivore.app/me/https-www-freecodecamp-org-news-how-to-write-better-git-commit-m-18bf26ec55f#a3c842a2-18b0-46b9-8131-c37ecd867c19) 

  ---

  Conventional Commit is a formatting convention that provides a set of rules to formulate a consistent commit message structure like so:

  ```fortran
  [optional scope]: 

  [optional body]

  [optional footer(s)]
  ```

  The commit type can include the following:

  * `feat` – a new feature is introduced with the changes
  * `fix` – a bug fix has occurred
  * `chore` – changes that do not relate to a fix or feature and don't modify src or test files (for example updating dependencies)
  * `refactor` – refactored code that neither fixes a bug nor adds a feature
  * `docs` – updates to documentation such as a the README or other markdown files
  * `style` – changes that do not affect the meaning of the code, likely related to code formatting such as white-space, missing semi-colons, and so on.
  * `test` – including new or correcting previous tests
  * `perf` – performance improvements
  * `ci` – continuous integration related
  * `build` – changes that affect the build system or external dependencies
  * `revert` – reverts a previous commit 

  [source](https://omnivore.app/me/https-www-freecodecamp-org-news-how-to-write-better-git-commit-m-18bf26ec55f#f3ea8f19-6480-43ac-a72f-2856ee003fb6) 

  ---

  ## Original

  ![How to Write Better Git Commit Messages – A Step-By-Step Guide](https://proxy-prod.omnivore-image-cache.app/1200x600,s0l1fwKZBNqL0bSd2aeEioVceLJjdlKhWsHRkZlRIk7A/https://www.freecodecamp.org/news/content/images/size/w2000/2022/01/gitcommitmessage.png) 

  When first introduced to Git, it's typical for developers to feel uncomfortable with the process. 

  You might feel uncertainty when encountering the Git commit message, unsure how to properly summarize the changes you've made and why you've made them. But the earlier in your career you can develop good committing habits, the better.

  Have you ever wondered how you can improve your Git commit messages? This guide outlines steps to elevate your commit messages that you can start implementing today.

  This article assumes you already understand basic Git workflow. If not, I suggest reading through the [Git Handbook](https://guides.github.com/introduction/git-handbook/).

  It is also important to note that you should follow your team's conventions first and foremost. These tips are based on suggestions based upon research and general consensus from the community. But by the end of this article you may have some implementations to suggest that may help your team's workflow.

  > I think git enters a whole other realm the moment you start working in teams -- there are so many cool different flows and ways that people can commit code, share code, and add code to your repo open-source or closed-source-wise. — [Scott Tolinski, Syntax.fm](https://syntax.fm/).

  ## Why should you write better commit messages?

  I challenge you to open up a personal project or any repository for that matter and run `git log` to view a list of old commit messages. The vast majority of us who have run through tutorials or made quick fixes will say "Yep... I have absolutely no idea what I meant by 'Fix style' 6 months ago." 

  Perhaps you have encountered code in a professional environment where you had no idea what it was doing or meant for. You've been left in the dark without code comments or a traceable history, and even wondering "what are the odds this will break everything if I remove this line?"

  ### Back to the Future

  By writing good commits, you are simply future-proofing yourself. You could save yourself and/or coworkers hours of digging around while troubleshooting by providing that helpful description. 

  The extra time it takes to write a thoughtful commit message as a letter to your potential future self is extremely worthwhile. On large scale projects, documentation is imperative for maintenance. 

  Collaboration and communication are of utmost importance within engineering teams. The Git commit message is a prime example of this. I highly suggest setting up a convention for commit messages on your team if you do not already have one in place.

  ## The Anatomy of a Commit Message

  #### Basic:

  `git commit -m <message>`

  #### Detailed:

  `git commit -m <title> -m <description>`

  ![Screen-Shot-2022-01-03-at-10.31.49-AM](https://proxy-prod.omnivore-image-cache.app/1192x122,sHp5nlkupArC1L0Wk1l4Qjg9Wx_fb7YOHA-sE4vCD1Do/https://www.freecodecamp.org/news/content/images/2022/01/Screen-Shot-2022-01-03-at-10.31.49-AM.png)

  ## 5 Steps to Write Better Commit Messages

   Let's summarize the suggested guidelines:

  1. Capitalization and Punctuation: Capitalize the first word and do not end in punctuation. If using Conventional Commits, remember to use all lowercase.
  2. Mood: Use imperative mood in the subject line. Example – `Add fix for dark mode toggle state`. Imperative mood gives the tone you are giving an order or request.
  3. Type of Commit: Specify the type of commit. It is recommended and can be even more beneficial to have a consistent set of words to describe your changes. Example: Bugfix, Update, Refactor, Bump, and so on. See the section on Conventional Commits below for additional information.
  4. Length: The first line should ideally be no longer than 50 characters, and the body should be restricted to 72 characters.
  5. Content: Be direct, try to eliminate filler words and phrases in these sentences (examples: though, maybe, I think, kind of). Think like a journalist.

  ### How to Find Your Inner Journalist

  I never quite thought my Journalism minor would benefit my future career as a Software Engineer, but here we are! 

  Journalists and writers ask themselves questions to ensure their article is detailed, straightforward, and answers all of the reader's questions. 

  When writing an article they look to answer _who_, _what_, _where_, _when_, _why_ and _how._ For committing purposes, it is most important to answer the what and why for our commit messages. 

  ==To come up with thoughtful commits, consider the following:== 

  * ==Why have I made these changes?==
  * ==What effect have my changes made?==
  * ==Why was the change needed?==
  * ==What are the changes in reference to?==

  Assume the reader does not understand what the commit is addressing. They may not have access to the story addressing the detailed background of the change.

  Don't expect the code to be self-explanatory. This is similar to the point above. 

  It might seem obvious to you, the programmer, if you're updating something like CSS styles since it is visual. You may have intimate knowledge on why these changes were needed at the time, but it's unlikely you will recall why you did that hundreds of pull requests later. 

  Make it clear _why_ that change was made, and note if it may be crucial for the functionality or not.

  ==See the differences below:==

  1. `==git== ==commit -m== =='Add margin'==`
  2. `==git commit -m 'Add margin== ==to== ==nav items== ==to== ==prevent them== ==from== ==overlapping== ==the== ==logo'==`

  It is clear which of these would be more useful to future readers. 

  Pretend you're writing an important newsworthy article. Give the headline that will sum up what happened and what is important. Then, provide further details in the body in an organized fashion. 

  In filmmaking, it is often quoted "show, don't tell" using visuals as the communication medium compared to a verbal explanation of what is happening.

  In our case, "**tell**, don't \[just\] show" – though we have some visuals at our disposal such as the browser, most of the specifics come from reading the physical code.

  If you're a VSCode user, download the [Git Blame](https://marketplace.visualstudio.com/items?itemName=waderyan.gitblame) extension. This is a prime example of when useful commit messages are helpful to future developers. 

  This plugin will list the person who made the change, the date of the changes, as well as the commit message commented inline. 

  Imagine how useful this could be in troubleshooting a bug or back-tracing changes made. Other honorable mentions to see Git historical information are [Git History](https://marketplace.visualstudio.com/items?itemName=donjayamanne.githistory) and [GitLens](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens). 

  ![Screen-Shot-2022-01-03-at-10.45.49-AM](https://proxy-prod.omnivore-image-cache.app/2068x418,szGePuf8TNML7r1MA_vhSRoULcLczTSddFDMSz6X_nck/https://www.freecodecamp.org/news/content/images/2022/01/Screen-Shot-2022-01-03-at-10.45.49-AM.png)

  ## Conventional Commits

  Now that we've covered basic commit structure of a good commit message, I'd like to introduce Conventional Commits to help provide some detail on creating solid commit messages. 

  At D2iQ, we use Conventional Commit which is a great practice among engineering teams. ==Conventional Commit is a formatting convention that provides a set of rules to formulate a consistent commit message structure like so:==

  ```fortran
  <type>[optional scope]: <description>

  [optional body]

  [optional footer(s)]
  ```

  ==The commit type can include the following:==

  * `==feat==` ==– a new feature is introduced with the changes==
  * `==fix==` ==– a bug fix has occurred==
  * `==chore==` ==– changes that do not relate to a fix or feature and don't modify src or test files (for example updating dependencies)==
  * `==ref====actor==` ==– refactored code that neither fixes a bug nor adds a feature==
  * `==docs==` ==– updates to documentation such as a the README or other markdown files==
  * `==style==` ==– changes that do not affect the meaning of the code, likely related to code formatting such as white-space, missing semi-colons, and so on.==
  * `==test==` ==– including new or correcting previous tests==
  * `==perf==` ==– performance improvements==
  * `==ci==` ==– continuous integration related==
  * `==build==` ==– changes that affect the build system or external dependencies==
  * `==revert==` ==– reverts a previous commit==

  The commit type subject line should be all lowercase with a character limit to encourage succinct descriptions. 

  The optional commit body should be used to provide further detail that cannot fit within the character limitations of the subject line description. 

  It is also a good location to utilize `BREAKING CHANGE: <description>` to note the reason for a breaking change within the commit. 

  The footer is also optional. We use the footer to link the JIRA story that would be closed with these changes for example: `Closes D2IQ-<JIRA #>` .

  #### Full Conventional Commit Example 

  ```http
  fix: fix foo to enable bar

  This fixes the broken behavior of the component by doing xyz. 

  BREAKING CHANGE
  Before this fix foo wasn't enabled at all, behavior changes from <old> to <new>

  Closes D2IQ-12345
  ```

  To ensure that these committing conventions remain consistent across developers, commit message linting can be configured before changes are able to be pushed up. [Commitizen](https://commitizen-tools.github.io/commitizen/) is a great tool to enforce standards, sync up semantic versioning, along with other helpful features.

  To aid in adoption of these conventions, it's helpful to include guidelines for commits in a contributing or README markdown file within your projects.

  Conventional Commit works particularly well with semantic versioning (learn more at [SemVer.org](https://semver.org/)) where commit types can update the appropriate version to release. You can also [read more about Conventional Commits here](https://www.conventionalcommits.org/en/v1.0.0/).

  ## Commit Message Comparisons

  Review the following messages and see how many of the suggested guidelines they check off in each category.

  #### Good

  * `feat: improve performance with lazy load implementation for images`
  * `chore: update npm dependency to latest version`
  * `Fix bug preventing users from submitting the subscribe form`
  * `Update incorrect client phone number within footer body per client request`

  #### Bad

  * `fixed bug on landing page`
  * `Changed style`
  * `oops`
  * `I think I fixed it this time?`
  * empty commit messages

  ## Conclusion

  Writing good commit messages is an extremely beneficial skill to develop, and it helps you communicate and collaborate with your team. Commits serve as an archive of changes. They can become an ancient manuscript to help us decipher the past, and make reasoned decisions in the future.

  There is an existing set of agreed-upon standards we can follow, but as long as your team agrees upon a convention that is descriptive with future readers in mind, there will undoubtedly be long-term benefits.

  In this article, we've learned some tactics to level up our commit messages. How do you think these techniques can improve your commits?

  I hope you've learned something new, thanks for reading! 

  Connect with me on Twitter [@ui\_natalie](https://twitter.com/ui%5Fnatalie).

  ---

  ---

   Learn to code for free. freeCodeCamp's open source curriculum has helped more than 40,000 people get jobs as developers. [Get started](https://www.freecodecamp.org/learn/) 

metadata:
  {"date_added":"2023-11-21 12:10:32","id":"1996b6ce-9449-415d-8c18-609ddb9cd580","status":"ARCHIVED","tags":["read-later"],"title":"How to Write Better Git Commit Messages – A Step-By-Step Guide\n","url_omnivore":"https://omnivore.app/me/https-www-freecodecamp-org-news-how-to-write-better-git-commit-m-18bf26ec55f\n","url_original":"https://www.freecodecamp.org/news/how-to-write-better-git-commit-messages/\n"}


