<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Conti</title>
    <description>The latest articles on Forem by Conti (@conti).</description>
    <link>https://forem.com/conti</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F26911%2Fd77c1deb-30d8-45ff-bb3f-a14ed63395ee.jpeg</url>
      <title>Forem: Conti</title>
      <link>https://forem.com/conti</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/conti"/>
    <language>en</language>
    <item>
      <title>Do not reinvent the wheel</title>
      <dc:creator>Conti</dc:creator>
      <pubDate>Mon, 22 Aug 2022 09:01:43 +0000</pubDate>
      <link>https://forem.com/producthackers/do-not-reinvent-the-wheel-400g</link>
      <guid>https://forem.com/producthackers/do-not-reinvent-the-wheel-400g</guid>
      <description>&lt;p&gt;There are times when you feel like a &lt;strong&gt;god&lt;/strong&gt; because you think you can build anything, technically speaking, and sometimes you feel &lt;strong&gt;useless&lt;/strong&gt; because the product owner needs you to find a solution for a specific problem and, instead of using an already mature and developed third-party product, you find yourself in your own development roadmap for a similar tool, built from zero. So your &lt;strong&gt;frustration grows&lt;/strong&gt; because you think you have the skills to build that solution, but delivery timing would be out of question since the value needs to be delivered the following week.&lt;/p&gt;

&lt;p&gt;As a developer your lines of code value is &lt;em&gt;null&lt;/em&gt;, &lt;strong&gt;the real value is in the mental process&lt;/strong&gt; where you imagine and chain those lines of code to approach and solve that problem.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;does the approach need new lines of code in your project? Good, have you estimated the hours needed and the cost of them? also good? Do it or not.&lt;/p&gt;

&lt;p&gt;is it possible to integrate a third-party tool to solve? Good, is it too expensive and it's better to develop it in-house? also good? Do it or not.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I just want you to be able to view out of the box and try to avoid thinking in the lines of code you are going to type while the Product Owner is talking about the issue itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Need examples? Let's go.
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Controlling the DOM
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F05rydyhr7zwt0zp486um.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F05rydyhr7zwt0zp486um.jpg" alt="Control your DOM"&gt;&lt;/a&gt;&lt;br&gt;
Your product team needs a way to manage (adding/removing) third-party scripts on the site to avoid adding issues to JIRA and going through the whole CI/CD process. Give them &lt;a href="https://tagmanager.google.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Google Tag Manager&lt;/strong&gt;&lt;/a&gt;, train the people who are going to manage it, setup a solid permission scheme, and not also you gave them power and a solution, but you positioned yourself as a reliable problem solver that is able to look above the keyboard.&lt;/p&gt;

&lt;p&gt;Growth teams use experimentation as a tool to validate hypothesis to a problem they need to solve, and most of the the experiments needs to be deployed within the apps/site. You would lose almost you whole productivity if every experiment had to go through the whole CI/CD process. You can show them &lt;a href="https://optimize.google.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;Google Optimize&lt;/strong&gt;&lt;/a&gt; or &lt;a href="https://www.optimizely.com/" rel="noopener noreferrer"&gt;Optimizely&lt;/a&gt; to allow them to experiment without interrupting the development workflow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Delivering
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa4c6zmuz02x2veowsgbd.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa4c6zmuz02x2veowsgbd.jpg" alt="CI/CD Deliver"&gt;&lt;/a&gt;&lt;br&gt;
I can build you a CI/CD Pipeline using AWS Code Deploy and Pipeline, linked to a cluster of machines behind an ELB, with auto rotation for them, highly monitored in Cloudwatch, bla bla bla... I really can do that, but is it necessary to overkill every approach with that? &lt;/p&gt;

&lt;p&gt;We already have teams of developers around the world that belong to product teams such as &lt;a href="https://vercel.com/" rel="noopener noreferrer"&gt;Vercel&lt;/a&gt;, which is very curated and mature. Give those colleagues some slack, investigate those kind of products before onboarding into an endeavour you do not know you would come back safe and sound.&lt;/p&gt;

&lt;h3&gt;
  
  
  Building
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpv6jxicqqjy3hsfx5vrp.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpv6jxicqqjy3hsfx5vrp.jpg" alt="Building"&gt;&lt;/a&gt;&lt;br&gt;
Do you have the resources to build a Magento or Prestashop from the ground? Think it twice please, perhaps you should try services such &lt;a href="https://www.shopify.com/" rel="noopener noreferrer"&gt;Shopify&lt;/a&gt; in the first attempt. I am not saying that &lt;em&gt;M&amp;amp;P&lt;/em&gt; are bad solutions, I am saying that you need people behind those platforms to maintain and develop them properly.&lt;/p&gt;

&lt;p&gt;Need a landing page for your product that is going to last one month? Try tools such as &lt;a href="https://webflow.com/" rel="noopener noreferrer"&gt;Webflow&lt;/a&gt;. Time and resources to build a very good HTML and CSS are not free, &lt;br&gt;
your front-end expert would be the one reviewing the job done by other person with that tool instead of being the person building the landing page from zero.&lt;/p&gt;

&lt;p&gt;Do you want to validate an idea using a mobile app? Right now there are several services to build them without coding, such as &lt;a href="https://www.glideapps.com/" rel="noopener noreferrer"&gt;Glide&lt;/a&gt;. I know, I know, a native app is going to be perfect every time from here to Mars, but I am testing with that &lt;em&gt;MVP&lt;/em&gt; if I need to hire, or not, a true expert.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automations
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6a5c2zrzirmvcq47xy6a.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6a5c2zrzirmvcq47xy6a.jpg" alt="Automations"&gt;&lt;/a&gt;&lt;br&gt;
Tired of build lambdas, api gateway endpoints, webhooks, listeners... to allow users enjoy your automations? Show them and let them play with automations in &lt;a href="https://zapier.com/" rel="noopener noreferrer"&gt;Zapier&lt;/a&gt;, &lt;a href="https://www.make.com/en" rel="noopener noreferrer"&gt;Make&lt;/a&gt; and &lt;a href="https://www.twilio.com/" rel="noopener noreferrer"&gt;Twilio&lt;/a&gt;. Your job here is to apply a reliable security policy when using credentials/oauth to avoid misuse within the automations.&lt;/p&gt;

&lt;p&gt;This has been a small batch of posible third parties that could lead to you reach your goal or validate ideas faster, without using nor interrupting your main work force.&lt;/p&gt;

&lt;p&gt;Images attributions:&lt;br&gt;
&lt;a href="https://www.freepik.com/photos/business-graph" rel="noopener noreferrer"&gt;Business graph photo created by jannoon028 - &lt;/a&gt;&lt;a href="http://www.freepik.com" rel="noopener noreferrer"&gt;www.freepik.com&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.freepik.com/vectors/volume-button" rel="noopener noreferrer"&gt;Volume button vector created by upklyak - &lt;/a&gt;&lt;a href="http://www.freepik.com" rel="noopener noreferrer"&gt;www.freepik.com&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.freepik.com/photos/covid-delivery" rel="noopener noreferrer"&gt;Covid delivery photo created by freepik - &lt;/a&gt;&lt;a href="http://www.freepik.com" rel="noopener noreferrer"&gt;www.freepik.com&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.freepik.com/photos/joiner" rel="noopener noreferrer"&gt;Joiner photo created by jcomp - &lt;/a&gt;&lt;a href="http://www.freepik.com" rel="noopener noreferrer"&gt;www.freepik.com&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.freepik.com/photos/ai-brain" rel="noopener noreferrer"&gt;Ai brain photo created by rawpixel.com - &lt;/a&gt;&lt;a href="http://www.freepik.com" rel="noopener noreferrer"&gt;www.freepik.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>nocode</category>
      <category>tools</category>
      <category>gtm</category>
      <category>aws</category>
    </item>
    <item>
      <title>Being creative as a developer</title>
      <dc:creator>Conti</dc:creator>
      <pubDate>Wed, 25 May 2022 14:37:53 +0000</pubDate>
      <link>https://forem.com/producthackers/being-creative-as-a-developer-54de</link>
      <guid>https://forem.com/producthackers/being-creative-as-a-developer-54de</guid>
      <description>&lt;h2&gt;
  
  
  Assumptions
&lt;/h2&gt;

&lt;p&gt;Many times I have heard the word "creativity" associated to environments where the final output is:&lt;br&gt;
a) A Design&lt;br&gt;
b) An advertisement&lt;br&gt;
c) A mockup&lt;br&gt;
d) ... fill it with anything that comes to your mind regarding your experience with this word.&lt;/p&gt;

&lt;p&gt;In spite of the examples I put above, "Creativity" has nothing to do with them, it is a &lt;strong&gt;human core attribute&lt;/strong&gt; that anyone can train and improve. It is true that some environments are better than others to develop the skill itself, but believe me, it lives in you too.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is is
&lt;/h2&gt;

&lt;p&gt;Being creative is highly related with &lt;strong&gt;solving problems&lt;/strong&gt; in unique and efficient ways, and how luck you are!, as a developer you are constantly solving problems, so let's see whether or not you are being creative:&lt;/p&gt;

&lt;h3&gt;
  
  
  Refactoring
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ojYYLoXP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4fubcxd21lg5fr4bvvas.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ojYYLoXP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4fubcxd21lg5fr4bvvas.jpg" alt="Refactoring" width="880" height="587"&gt;&lt;/a&gt;&lt;br&gt;
Whenever you refactor a piece of code and the result is cleaner, more efficient and readability has been improved, that is creativity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Practical with minimum overhead
&lt;/h3&gt;

&lt;p&gt;When you decide that the same feature can run flawless using an endpoint to an external service, instead of developing an in-house  new-edge-super-meta-algorithm, that has been already developed and optimised by other third party, that is creativity. &lt;/p&gt;

&lt;h3&gt;
  
  
  Make decisiones with libraries
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--y9DfRqzM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ttuzt48i0dp6j03obe4r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--y9DfRqzM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ttuzt48i0dp6j03obe4r.png" alt="Librearies" width="833" height="560"&gt;&lt;/a&gt;&lt;br&gt;
They way you achieve solutions using native features instead of using 2,000 libraries from NPM to reduce your web app from 5MB to 500KB, that is creativity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Open to learn
&lt;/h3&gt;

&lt;p&gt;Being open to learn other languages and techniques allow you to expand you knowledge limits, and because of that knowledge, you will be able to choose from possible solutions and discard others faster. That is creativity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Look for inspiration
&lt;/h3&gt;

&lt;p&gt;Creativity is fed by your own experience and knowledge, but can also be triggered from other sources, such as other colleagues/professionals who share their experiences. Being able to filter and pick external content to boost your inspiration is also creativity.&lt;/p&gt;

&lt;h3&gt;
  
  
  Experimentation
&lt;/h3&gt;

&lt;p&gt;Do not fear a failure, every time something goes wrong it is automatically added to your experiences luggage, which will feed your potential to be more creative. &lt;/p&gt;

&lt;h3&gt;
  
  
  Out of the box
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4h5WGIqN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t8nkunyjqbruglnd7mpm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4h5WGIqN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t8nkunyjqbruglnd7mpm.jpg" alt="think outside of the box" width="880" height="587"&gt;&lt;/a&gt;&lt;br&gt;
Being able to take a step aside and view the problem out of the box is also creativity. Multiple times you have been hitting a wall when trying to solve a problem, you leave it as it is for a while, and when you come back and think of it again, suddenly some magic appears and you solve it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Optimising your tools and environment
&lt;/h3&gt;

&lt;p&gt;Investigate, try and optimise your dev tools, such as your IDE, your browser extension and tab organisation, or buying your &lt;em&gt;swiss army knife&lt;/em&gt; of dev tools, that is is also creativity.&lt;/p&gt;

&lt;p&gt;Remember to not look in other direction when people around you talk about "creativity", &lt;strong&gt;everyone has something to say about it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Images attribution&lt;/em&gt;&lt;br&gt;
&lt;a href="https://www.freepik.com/photos/creativity-innovation"&gt;Creativity and innovation photo created by freepik - www.freepik.com&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.freepik.com/photos/think-different"&gt;Think different photo created by Waewkidja - www.freepik.com&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.freepik.com/photos/puzzle-shape"&gt;Puzzle shape photo created by jcomp - www.freepik.com&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.freepik.com/photos/book"&gt;Book photo created by ikaika - www.freepik.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>developer</category>
      <category>creative</category>
      <category>refactoring</category>
      <category>tools</category>
    </item>
    <item>
      <title>Thoughts on DynamoDB, 10 years later.</title>
      <dc:creator>Conti</dc:creator>
      <pubDate>Wed, 23 Feb 2022 14:27:15 +0000</pubDate>
      <link>https://forem.com/producthackers/thoughts-on-dynamodb-10-years-later-77l</link>
      <guid>https://forem.com/producthackers/thoughts-on-dynamodb-10-years-later-77l</guid>
      <description>&lt;p&gt;Happy birthday DynamoDB!&lt;/p&gt;

&lt;p&gt;This month we celebrate the birthday of one of the most important &lt;strong&gt;NoSQL fully managed database&lt;/strong&gt; service available in the market.&lt;/p&gt;

&lt;h2&gt;
  
  
  Production ready
&lt;/h2&gt;

&lt;p&gt;I have been using AWS services for production loads since 2010, I can consider myself a pioneer of the services they were offering at that time, but I could never have imagined that AWS was cooking such a &lt;strong&gt;disruptive database service&lt;/strong&gt; that will be launched two years later, on January 2012. &lt;/p&gt;

&lt;p&gt;But DynamoDB was not a recent trend in that moment, though it was born in the edge of a few malfunctioning &lt;strong&gt;situations occurred&lt;/strong&gt; in 2004 in the Amazon core e-commerce platform. From there, engineers &lt;strong&gt;investigated&lt;/strong&gt; and built what we know today as DynamoDB. It was first announced &lt;a href="https://www.amazon.science/publications/dynamo-amazons-highly-available-key-value-store"&gt;as a paper in 2007&lt;/a&gt; and it was &lt;strong&gt;adopted&lt;/strong&gt; by several core services teams at Amazon over the following months after that.&lt;/p&gt;

&lt;p&gt;This service was (and is) &lt;strong&gt;very easy&lt;/strong&gt; to setup and work with, and avoided us to built MySQL databases when they were not really necessary, so it boosted our speed to build &lt;strong&gt;concept proofs&lt;/strong&gt;, that later became a reality within the same service because its reliability and &lt;strong&gt;scalability&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use cases
&lt;/h2&gt;

&lt;p&gt;Below I am going to mention a few use cases I have use DynamoDB for:&lt;/p&gt;

&lt;h3&gt;
  
  
  Dynamic HTML widgets
&lt;/h3&gt;

&lt;p&gt;I few years ago I worked for a &lt;em&gt;SaaS&lt;/em&gt; that built custom experiences for users based on their &lt;strong&gt;behaviour&lt;/strong&gt; in the website. One of the products was based on product recommendations, and the client was able to build custom widgets (html) within their dashboard. Later, when website was loaded in the browser by the user, the widget was &lt;strong&gt;filled with real products&lt;/strong&gt; directly within the front-end. That HTML, with custom variables, was saved in DynamoDB, along with different properties related to the widget itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tracking user actions
&lt;/h3&gt;

&lt;p&gt;I have been using DynamoDB since the beginning as a database to &lt;strong&gt;ingest&lt;/strong&gt; all kind of user &lt;strong&gt;actions&lt;/strong&gt;. Those actions are later processed in batch to obtain useful information, and DynamoDB's &lt;strong&gt;search&lt;/strong&gt; capability has been very useful to locate and &lt;strong&gt;filter&lt;/strong&gt; data. this use of DynamoDB served us well when building products such as: cart abandonment emails, analytics dashboards for clients or simple data tables.&lt;br&gt;
Also the ability to set up a timeout for entries, makes DynamoDB a friendly tool in terms of &lt;strong&gt;data protection compliance&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Used as an Identity pool management
&lt;/h3&gt;

&lt;p&gt;When you are starting to know DynamoDB, the very first advice you are going to receive is: &lt;em&gt;"Design your tables thinking in how you are going to search for in them later"&lt;/em&gt;, so &lt;em&gt;the sky's the limit&lt;/em&gt; , as Jason Derulo said in his song. Taking this advice into account, I was able to build a &lt;em&gt;User Identity&lt;/em&gt; pool system from scratch, which also included dynamic profile attributes, without relying in a MySQL server.&lt;/p&gt;

&lt;p&gt;I know that nowadays we are lucky to be able to use different technologies much more focused and optimised for some of these use cases, but in the past we had &lt;strong&gt;fun trying to "hack"&lt;/strong&gt; DynamoDB to served us for almost everything. Anyways, DynamoDB will not leave us for a (long)while, so we will enjoy it until then.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://aws.amazon.com/blogs/aws/happy-birthday-dynamodb/"&gt;Happy 10th Birthday, DynamoDB! Official announcement&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dynamodb</category>
      <category>nosql</category>
      <category>aws</category>
      <category>database</category>
    </item>
    <item>
      <title>10 Tools to measure Core Web Vitals</title>
      <dc:creator>Conti</dc:creator>
      <pubDate>Thu, 14 Oct 2021 07:23:28 +0000</pubDate>
      <link>https://forem.com/producthackers/10-tools-to-measure-core-web-vitals-2829</link>
      <guid>https://forem.com/producthackers/10-tools-to-measure-core-web-vitals-2829</guid>
      <description>&lt;p&gt;In May 2020 Google announced &lt;strong&gt;Core Web Vitals&lt;/strong&gt; as the center of how a web has to behave in front of a user, a lot has been written since then, a lot. The &lt;em&gt;3 vitals&lt;/em&gt; has been explained deeply all over the Internet, so I will not talk about them. Nowadays, the most important part of these metrics is how to measure and evaluate them in the most effective way, so which tools do we have at our hand to do that?&lt;/p&gt;

&lt;p&gt;Before that I want to make sure that you really understand the difference between two concepts, &lt;strong&gt;Field data&lt;/strong&gt; vs &lt;strong&gt;Lab data&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I am going to paste a very good explanation took from &lt;a href="https://developers.google.com/speed/docs/insights/v5/about"&gt;Page Speed Insights doc page&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The field data is a historical report about how a particular URL has performed, and represents anonymized performance data from users in the real-world on a variety of devices and network conditions. The lab data is based on a simulated load of a page on a single device and fixed set of network conditions. As a result, the values may differ.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So, &lt;strong&gt;Field data&lt;/strong&gt; is data tracked whenever a user visits our page, could it be from a super fast PC/Mac or a slow 2G/3G connection, which will offer very different metrics. It is very good to analyze real-world user experience issues&lt;/p&gt;

&lt;p&gt;And &lt;strong&gt;Lab data&lt;/strong&gt; is basically about having some computers at google datacenter executing Lighthouse on every page. It is good for debugging performance issues and capturing tips which need deeper study.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tools
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;In browser Lighthouse&lt;/li&gt;
&lt;li&gt;Lighthouse cli&lt;/li&gt;
&lt;li&gt;LHCI&lt;/li&gt;
&lt;li&gt;Core Web Vitals Chrome built it extension&lt;/li&gt;
&lt;li&gt;Web Vitals Chrome extension&lt;/li&gt;
&lt;li&gt;Chrome dev tools performance&lt;/li&gt;
&lt;li&gt;Page Speed Insights&lt;/li&gt;
&lt;li&gt;Google Search console&lt;/li&gt;
&lt;li&gt;CrUX Dashboard&lt;/li&gt;
&lt;li&gt;Webpagetest&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  In browser Lighthouse
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NMC-iY3J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ir2zujxqueos2cfe6h7l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NMC-iY3J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ir2zujxqueos2cfe6h7l.png" alt="In browser Lighthouse" width="880" height="731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local Lab data&lt;/strong&gt; on demand, but it is not really recommended since browser extensions have great negative impact on the report results.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lighthouse cli
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IRTDRmc2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/enu51cop8bk6o50fc995.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IRTDRmc2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/enu51cop8bk6o50fc995.png" alt="Lighthouse cli" width="344" height="27"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local Lab data&lt;/strong&gt; on demand, and the only way I would recommend to execute &lt;strong&gt;Lighthouse&lt;/strong&gt;, since it uses a clean Chromium window to execute the test. Check it out &lt;a href="https://github.com/GoogleChrome/lighthouse"&gt;here&lt;/a&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  LHCI
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uL0T56c0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/betvgo2b2x25jwodrf0x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uL0T56c0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/betvgo2b2x25jwodrf0x.png" alt="LHCI" width="880" height="854"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lab data&lt;/strong&gt; on demand and unattended. This version of &lt;strong&gt;Lighthouse&lt;/strong&gt; is oriented to be integrated in a &lt;strong&gt;continuous integration&lt;/strong&gt; workflow to check your metrics before deploying to production. However, you could also use it as command executed in a &lt;strong&gt;cron&lt;/strong&gt; to check an environment performance over the time. I use the latter to check production performance each 12 hours, since there are third parties adding and removing dynamic content that could affect UX. Check its repo &lt;a href="https://github.com/GoogleChrome/lighthouse-ci"&gt;here&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Core Web Vitals Chrome built it extension
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z62HfDEy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fv6qd6gfc2f8703p085t.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z62HfDEy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fv6qd6gfc2f8703p085t.gif" alt="Core Web Vitals Chrome built it extension" width="880" height="567"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local Field data&lt;/strong&gt; on demand, as a native extension of Chrome browser. Very useful to detect issues in real-time. Doing a Lighthouse report after viewing this, could give you insights to solve those issues. In order to show the overlay we have two options:&lt;br&gt;
a) &lt;code&gt;Open Dev tools -&amp;gt; use Run Command option -&amp;gt; type "Core web vitals"&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;b) Keyboard shortcuts: &lt;code&gt;CMD + Option + I -&amp;gt; CMD + SHIFT + P -&amp;gt; type "Core web vitals"&lt;/code&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Web Vitals Chrome extension
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--d8pPhVUv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1qrcr97q6rpor188mkvo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--d8pPhVUv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1qrcr97q6rpor188mkvo.png" alt="Web Vitals Chrome extension" width="880" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local Field data&lt;/strong&gt; vs &lt;strong&gt;Field data&lt;/strong&gt; comparison in realtime. Very useful extension since it is showing data from that moment and retrieve &lt;strong&gt;Field data&lt;/strong&gt; from &lt;a href="https://developers.google.com/web/tools/chrome-user-experience-report"&gt;Chrome UX Report&lt;/a&gt;. You may download it from &lt;a href="https://chrome.google.com/webstore/detail/web-vitals/ahfhijdlegdabablpippeagghigmibma?hl=en"&gt;Chrome web store&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Chrome dev tools performance
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U8yQVYxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zlanm53tx3c2hdzc412y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U8yQVYxk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zlanm53tx3c2hdzc412y.png" alt="Chrome dev tools performance" width="880" height="335"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WFIpAXaW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ias9mvnac2yzcngc74bi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WFIpAXaW--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ias9mvnac2yzcngc74bi.png" alt="Chrome dev tools performance" width="880" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Very useful to &lt;strong&gt;debug&lt;/strong&gt; possible issues related to Web Vitals, since you can check at the very right moment an issue appeared.&lt;/p&gt;

&lt;h3&gt;
  
  
  Page Speed Insights
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iZAXnKC2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g64ujmvnju02fwp58uzo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iZAXnKC2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g64ujmvnju02fwp58uzo.png" alt="Page Speed Insights" width="880" height="818"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is &lt;a href="https://developers.google.com/speed/pagespeed/insights/"&gt;THE tool&lt;/a&gt; from google to compare &lt;strong&gt;Field data&lt;/strong&gt; and &lt;strong&gt;Lab data&lt;/strong&gt; regarding performance scoring. It is like an empowered Lighthouse. PSI’s data is updated daily with the trailing 28-day period.&lt;/p&gt;

&lt;h3&gt;
  
  
  Google Search console
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZhdhcYTF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8dlabg2tlhjzhzy6owjx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZhdhcYTF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8dlabg2tlhjzhzy6owjx.png" alt="Screenshot 2021-10-13 at 17.46.22" width="880" height="794"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3-PEYleb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3uxkwsap3y69a238rilo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3-PEYleb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3uxkwsap3y69a238rilo.png" alt="Screenshot 2021-10-13 at 17.46.29" width="880" height="734"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Google Search Console page experience data is fed with PSI's data, so you can easily monitor every day the trailing period and receive alerts related to Web Vitals issues. &lt;/p&gt;

&lt;h3&gt;
  
  
  CrUX Dashboard
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qrqH_FUi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/73fp7olc9ikg5pls1bth.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qrqH_FUi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/73fp7olc9ikg5pls1bth.png" alt="Screenshot 2021-10-13 at 17.54.28" width="880" height="694"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Building a &lt;a href="https://developers.google.com/web/tools/chrome-user-experience-report"&gt;Chrome UX Report&lt;/a&gt; should be one of your priorities to study Web Vitals deeply, since is going to give insights form the last month and detect trends.&lt;/p&gt;

&lt;h3&gt;
  
  
  Webpagetest
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3JqV2MKv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hb5mf81ns1wrbgslkrys.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3JqV2MKv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hb5mf81ns1wrbgslkrys.png" alt="Screenshot 2021-10-13 at 18.05.47" width="880" height="795"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.webpagetest.org/"&gt;Webpagetest&lt;/a&gt; is a long live citizen of the Internet and has been always very resourceful. It offers Web Vitals with very detailed reports with &lt;strong&gt;Field data&lt;/strong&gt; and &lt;strong&gt;Lab data&lt;/strong&gt; comparison, so give it a try. &lt;/p&gt;

&lt;p&gt;I hope you enjoyed this content ;)&lt;/p&gt;

</description>
      <category>webvitals</category>
      <category>pagespeedinsights</category>
      <category>lighthouse</category>
      <category>webpagetest</category>
    </item>
    <item>
      <title>From Individual Contributor to Manager</title>
      <dc:creator>Conti</dc:creator>
      <pubDate>Thu, 02 Sep 2021 05:51:47 +0000</pubDate>
      <link>https://forem.com/producthackers/from-individual-contributor-to-manager-i5g</link>
      <guid>https://forem.com/producthackers/from-individual-contributor-to-manager-i5g</guid>
      <description>&lt;h2&gt;
  
  
  Past
&lt;/h2&gt;

&lt;p&gt;Since 2008 I have been playing my career mostly as a an &lt;em&gt;individual contributor&lt;/em&gt;, something I do not regret in any way, and that role belongs to a period focused on improving technical skills based on &lt;strong&gt;experimentation, deep study and failures&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;As an &lt;em&gt;IC&lt;/em&gt; I have had awesome mentors and team leads, who did all their efforts to build a &lt;strong&gt;safe environment&lt;/strong&gt; for failures, which I think it is the key for enhancing and boosting your self confidence when you are designing and developing solutions to given problems. We could speak out and deeply about other factors that allow such environment (CI/CD, automations, etc), but it is out of scope for this post.&lt;/p&gt;

&lt;p&gt;I was asked to change my role from &lt;em&gt;IC&lt;/em&gt; to &lt;strong&gt;Manager&lt;/strong&gt; two years ago for a different project, and all I could say in the following months was that &lt;em&gt;I had played in better places&lt;/em&gt;. A few keys I struggled with at the beginning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Huge Impostor syndrome&lt;/strong&gt;: I knew I could do the job better because I was before a reliable and resourceful professional, but something in my mind was telling me the opposite.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Very poor definition of &lt;strong&gt;responsibilities and accountability&lt;/strong&gt;: If doubts exist about &lt;em&gt;who&lt;/em&gt; is in charge of specific errands, then something is wrong.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Burned and overwhelmed&lt;/strong&gt; team which was eager to go on vacation instead of pulling issues from &lt;em&gt;TODO column&lt;/em&gt; because of the biggest toxic stakeholder I have ever known.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On top of that, I had to be in charge of management tasks I had never done...very interesting scenario, isn't it?&lt;/p&gt;

&lt;h2&gt;
  
  
  Present
&lt;/h2&gt;

&lt;p&gt;Two years later: &lt;em&gt;I have never played in a better place&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;My world is different right now, I love my colleagues, they are very committed to the project, and as a result we have a high mature and productive environment.&lt;/p&gt;

&lt;h3&gt;
  
  
  How did we solve the &lt;em&gt;hot parts&lt;/em&gt; ?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Impostor thing&lt;/strong&gt;: frequent personal retrospective, feedback loops with the team and being open to experimentation.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Responsibilities and accountability&lt;/strong&gt;: open loud and clear, respectfully, with different stakeholders of the project, and do  feedback loops (again).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Toxic stakeholder&lt;/strong&gt;: fire them, put away from the project. &lt;em&gt;Do you want to work with that guy anymore?&lt;/em&gt; No, then do the first move, I do not know where to, but do it. And ask for help, do not be ashamed, in my case the Product Owner and CEO were the key to remove toxicity from the environment, without their help I could not have done it.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Management
&lt;/h3&gt;

&lt;p&gt;Since I started this new role, I may claim right now that being IC means that there is &lt;strong&gt;another person&lt;/strong&gt; who:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;removes &lt;strong&gt;stones&lt;/strong&gt; for you when you can not lift them.&lt;/li&gt;
&lt;li&gt;shows a &lt;strong&gt;tiny light&lt;/strong&gt; at the end of a tunnel for a problem no one has a right clue of how to solve it.&lt;/li&gt;
&lt;li&gt;manages &lt;strong&gt;feedback&lt;/strong&gt; loops for the team.&lt;/li&gt;
&lt;li&gt;does &lt;strong&gt;interviews&lt;/strong&gt; for candidates.&lt;/li&gt;
&lt;li&gt;builds an invisible wall to allow the ICs be productive without &lt;strong&gt;noise&lt;/strong&gt; from Product Management.&lt;/li&gt;
&lt;li&gt;is &lt;strong&gt;accountable&lt;/strong&gt; for a whole development workflow.&lt;/li&gt;
&lt;li&gt;is able to play as an &lt;strong&gt;IC&lt;/strong&gt; for specific issues and push stuck situations.
...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a small list of things a Lead role must be in charge of and they can not be avoided, so there is always a need to have someone in charge of those errands. &lt;/p&gt;

&lt;p&gt;The question here is: &lt;em&gt;do you want to try?&lt;/em&gt; Give it a chance, do not worry if you think that you are not ready right now, because &lt;strong&gt;you will never be&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Future
&lt;/h2&gt;

&lt;p&gt;I am just a lucky guy who learned the pits and falls of a migration process from a non-desirable environment to a high productive and motivating one. &lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;good team&lt;/strong&gt; is built with &lt;strong&gt;good professionals&lt;/strong&gt;, not necessary ninjas, gurus or unicorns on specific topics, so whenever I interview someone I need to check if he or she fits our &lt;strong&gt;team values&lt;/strong&gt; first, instead of tech skills or certifications.&lt;/p&gt;

&lt;p&gt;Remember that technical skills are far easier to learn that people management, which can not ever be mastered.&lt;/p&gt;

&lt;p&gt;Header image attribution: &lt;a href="https://www.flickr.com/photos/solutionist/48227526067"&gt;https://www.flickr.com/photos/solutionist/48227526067&lt;/a&gt;&lt;/p&gt;

</description>
      <category>team</category>
      <category>lead</category>
      <category>tech</category>
      <category>management</category>
    </item>
    <item>
      <title>Growth hacking for developers</title>
      <dc:creator>Conti</dc:creator>
      <pubDate>Wed, 12 May 2021 11:46:58 +0000</pubDate>
      <link>https://forem.com/producthackers/growth-hacking-for-developers-9i0</link>
      <guid>https://forem.com/producthackers/growth-hacking-for-developers-9i0</guid>
      <description>&lt;p&gt;It is out of scope to dive deeper in some of the concepts you will read below, so I will stay on the basics, and I will try to break the ice in this topic from a technical perspective.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Growth Hacking?
&lt;/h2&gt;

&lt;p&gt;It is a set of methodologies, techniques and mindset that allow you to increase your digital product revenues. "Growth" starts from the need to validate an hypothesis to improve a specific area of your product, and in order to do so, a set of experiments must be developed and deployed in your production environment. When an experiment has been very successful, we call it "hack".&lt;/p&gt;

&lt;h2&gt;
  
  
  Differences between Digital Marketing and Growth
&lt;/h2&gt;

&lt;p&gt;First of all lets review a classic product funnel (also called "Pirate funnel") which let you analyse how your users go from "knowing" your digital product to "pay" for it:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1 Awareness&lt;/strong&gt;: users know about you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2 Acquisition&lt;/strong&gt;: users register in your product&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 Activation&lt;/strong&gt;: users use your product as you instructed them to use it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4 Revenue&lt;/strong&gt;: users pay for your product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5 Retention&lt;/strong&gt;: users are hooked onto your product, they have a habit of use it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6 Referral&lt;/strong&gt;: users tell their friends good things about your product.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmf542grsbc4gti4cmoig.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmf542grsbc4gti4cmoig.jpg" alt="Alt Text"&gt;&lt;/a&gt;&lt;br&gt;
So, Digital Marketing is intended to explore mostly step 1 and 2, while Growth goes from the beginning of the funnel until the end of it, and iterates to continuously improve the funnel efficiency.&lt;/p&gt;

&lt;h3&gt;
  
  
  So, are you telling us that we should give access to our CI/CD to a group of digital marketers/experts/innovators interested in doing spam to our users through some code snippets out of our QA process?
&lt;/h3&gt;

&lt;p&gt;No, they need a way to validate their hypothesis to improve the funnel, so what we do, as developers/tech experts, is to offer them a specific method to run experiments in production environment without interacting with us or our roadmap. How? Google Tag Manager, for example.&lt;/p&gt;

&lt;p&gt;You could use Google Tag Manager to allow them to add &lt;code&gt;scripts&lt;/code&gt; tags based on DOM triggers, users segments triggers, etc. They could also add tools such as Google Optimize or Optimizely to build UI tests A/B and use different variants to validate their hypothesis.&lt;/p&gt;

&lt;p&gt;I, as a developer, used to think that a feature such as a classic test a/b do not need to be outsourced to an external tool, but man, I was wrong. Both services mentioned above do an excellent job in their free tier, so we do not need to re-invent the wheel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which technical roles are needed in Growth? Why?
&lt;/h2&gt;

&lt;p&gt;Growth Hackers are experts in consumer psychology, innovation, creativity and be able to apply scientific methods to validate their hypothesis, so taking this into account it is difficult for them to build a decent technical knowledge to develop their custom own experiments based on code.&lt;/p&gt;

&lt;p&gt;There are tons of &lt;code&gt;no-code&lt;/code&gt; tools out there that help them to build experiments, but they often reach a point in the hypothesis validation process in which these tools are not enough, and a custom development need to be made. That is when we enter to the play field.&lt;/p&gt;

&lt;p&gt;Experiments vary from simple &lt;code&gt;modal windows&lt;/code&gt;, &lt;code&gt;popups&lt;/code&gt;, &lt;code&gt;CTA bars&lt;/code&gt;, etc, to more complex backend processes, such as building a custom GeoIP location service to trigger specifics experiments to different users segments.&lt;/p&gt;

&lt;p&gt;A few months ago I wrote a basic tutorial for the &lt;a href="https://dev.to/producthackers/your-own-geoip-service-1-2-maxmind-geoip-aws-sam-52go"&gt;GeoIP service&lt;/a&gt;, in case you are interested in it.&lt;/p&gt;

&lt;p&gt;If your "Growth A-Team" wants to be able to manoeuvre without limitations, both front-end and back-end developers are needed. Cloud platforms knowledge such as AWS, Azure, etc are also important skills to deploy securely and fast experiments based on CDN features, redirections, specific API's endpoints, etc. &lt;/p&gt;

&lt;h2&gt;
  
  
  Ok, so our Growth Hackers are testing experiments through GTM, what's next?
&lt;/h2&gt;

&lt;p&gt;When a hypothesis has been validated using experiments, the normal course of action is to integrate this development into the product roadmap, in order to apply that successful knowledge to the product itself. And from there, iterate again to find more ways to increase funnel performance and efficiency.&lt;/p&gt;

&lt;h2&gt;
  
  
  Advantages and disadvantages of this experimentation process
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;+&lt;/strong&gt; Fast hypothesis validations&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;+&lt;/strong&gt; Fast client side validation for the experiments that will occur on their site&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;+&lt;/strong&gt; No development resources usage in case the experiment could be completed with a "No-code" approach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-&lt;/strong&gt; Expect quality assurance concerns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-&lt;/strong&gt; Experiments may not comply at first with security and data protection policies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-&lt;/strong&gt; High chance to maintain legacy code if there is not a development process behind these experiments.&lt;/p&gt;

&lt;p&gt;I hope you enjoyed this content, a bit different what we are used to read here, but I think that our frequent isolation as developers is a barrier to obtain knowledge about other disciplines that interact directly with our world.&lt;/p&gt;

</description>
      <category>growth</category>
      <category>hacking</category>
      <category>gtm</category>
      <category>optimize</category>
    </item>
    <item>
      <title>4 myths about daily meetings</title>
      <dc:creator>Conti</dc:creator>
      <pubDate>Tue, 16 Mar 2021 09:20:19 +0000</pubDate>
      <link>https://forem.com/producthackers/4-myths-about-daily-meetings-3ima</link>
      <guid>https://forem.com/producthackers/4-myths-about-daily-meetings-3ima</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;If your daily meetings are not working properly, do not look for solutions in articles all over the internet, you may be able to find them in the members of your team.&lt;/p&gt;

&lt;p&gt;We are fortunate to work in such a heterogeneous environment that allows us to potentially work with people from all over the world, from the same country but with different culture, etc, and it is this environment the one that gives form to the routines in the team.&lt;/p&gt;

&lt;p&gt;Whenever you put effort to make things right in terms of managing daily meetings, it is imperative that you open your mind and pick up practices that fit your awesome team. Below I am going to tell you what is working in the team I belong to, breaking a few myths-established rules that were not really working (context: full remote team):&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Length
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;"Stand-ups meeting should be very short, people should not be losing more than 10-15 minutes in it"&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Look at the word "&lt;em&gt;losing&lt;/em&gt;", if you really think that people are losing time when they are in a daily meeting then look deeper in your organisation to find the solution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First:&lt;/strong&gt; daily meetings should give value to the team, spending quality time in them is equal to winning time for later.&lt;br&gt;
&lt;strong&gt;Second:&lt;/strong&gt; daily meetings length is dictated by the own conversation, as long as everyone in it is satisfied with the result and had enough time to sneak-peak their topics.&lt;br&gt;
&lt;strong&gt;Third:&lt;/strong&gt; I like to think in daily meetings as a "regroup to study the next strategy and attack".&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Who has completed more things?
&lt;/h2&gt;

&lt;p&gt;Sometimes it feels like daily meetings are a competition to enumerate tasks in progress or completed: "the more the better", but it is not. It is as simple as to visit JIRA project board to check the current status of the tasks. &lt;br&gt;
The big point of daily meetings resides in being able to share ideas/thoughts/approaches with your colleagues. If you need to dig deeper in a topic with someone of your team, continue after the meeting.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. No one leads
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;"The SCRUM master/PO leads the meetings"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Why? I understand that someone could want to highlight something at the beginning of the meeting, but it could be anyone. Neither everyone must be in the meeting to begin with, it does not matter. What it does matter is that the meeting occurs, we are talking here about team culture and education, the meeting itself is bigger that anyone in the team.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Excuse for isolation
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;"The daily meeting is enough to work the whole day without communicating with your colleagues"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Do not use a daily meeting to isolate yourself and avoid communication the whole day. As I said before, you could need to investigate further or do pair programming after a daily meeting, so you need to be able to coordinate with your colleagues in any or designate timetable, and also have the correct tools in hand to do such thing.&lt;/p&gt;

&lt;p&gt;I just wanted to leave my reflexion and experience, so if you are eager to share your thoughts about this or felt that this post &lt;em&gt;summoned&lt;/em&gt; you, feel free to comment.&lt;/p&gt;

&lt;p&gt;Enjoy your meetings ;-)&lt;/p&gt;

</description>
      <category>daily</category>
      <category>meeting</category>
      <category>standup</category>
      <category>management</category>
    </item>
    <item>
      <title>Your own GeoIP service 2/2: Lambda + API Gateway</title>
      <dc:creator>Conti</dc:creator>
      <pubDate>Mon, 22 Feb 2021 14:06:47 +0000</pubDate>
      <link>https://forem.com/producthackers/your-own-geoip-service-2-2-lambda-api-gateway-39m5</link>
      <guid>https://forem.com/producthackers/your-own-geoip-service-2-2-lambda-api-gateway-39m5</guid>
      <description>&lt;p&gt;Let's face the second part of our little project which started &lt;a href="https://dev.to/producthackers/your-own-geoip-service-1-2-maxmind-geoip-aws-sam-52go"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In the first part we achieved a solution to invoke the GeoIP lambda in local environment successfully, giving us insights about our location. But this is not completed if we can not execute that function in the cloud, so I am going to give you a fair solution which it not the most optimal one, but at least it could point us into the right direction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requisites
&lt;/h2&gt;

&lt;p&gt;Remember that you will need a few things installed and working on your machine before starting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker installed on your machine&lt;/li&gt;
&lt;li&gt;An AWS active account&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html" rel="noopener noreferrer"&gt;AWS SAM CLI working on your machine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/cli/" rel="noopener noreferrer"&gt;AWS CLI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Create our lambda function in AWS
&lt;/h2&gt;

&lt;p&gt;There is so much literature out there with high details to create a lambda function in AWS, so I am going to skip a few steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Visita &lt;a href="https://eu-west-1.console.aws.amazon.com/lambda/home" rel="noopener noreferrer"&gt;Lambda Dashboard&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a new NodeJS lambda &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3jhqdszohasjxje8tk6q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3jhqdszohasjxje8tk6q.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a test event to be able to test the new function. &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq2xb1ya45mm23dw5oayg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq2xb1ya45mm23dw5oayg.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Execute the function without any change in it. &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3gg7r3ehsjq6bnaljygf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3gg7r3ehsjq6bnaljygf.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So, now we are ready to upload our code to this lambda function.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manual upload
&lt;/h2&gt;

&lt;p&gt;Assuming we are at the root of the project we may execute a simple ZIP command to bundle the entire project &lt;code&gt;zip function.zip * -r&lt;/code&gt; &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F93g5gvb6nlhulumb9n2g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F93g5gvb6nlhulumb9n2g.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we return to the lambda function dashboard and upload this &lt;code&gt;zip&lt;/code&gt; as the code:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxso6tjn8ub170lwmno65.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxso6tjn8ub170lwmno65.png" alt="Screenshot 2021-02-22 at 12.06.20"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After uploading the &lt;code&gt;zip&lt;/code&gt; file an info banner will take your attention:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flqnsxlv74lxpp5cef9go.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flqnsxlv74lxpp5cef9go.png" alt="Screenshot 2021-02-22 at 12.07.22"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Do not worry about that right now, let's check that the functionality is correct. In order to do so, we run again the function using the &lt;em&gt;Test&lt;/em&gt; button in the upper right corner of the UI:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fntaj4comjric3jdyt9at.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fntaj4comjric3jdyt9at.png" alt="Screenshot 2021-02-22 at 12.20.48"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That error was coming whether we liked or not since we built the test event without taking into account the function logic itself. Now we create a new test event and paste our current event.json built for the local environment:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9idg0tq85gfujbmg5pvj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9idg0tq85gfujbmg5pvj.png" alt="Screenshot 2021-02-22 at 12.23.10"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxu0pxakjfylkih0nexjr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxu0pxakjfylkih0nexjr.png" alt="Screenshot 2021-02-22 at 12.23.32"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And now we execute the function again:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsbbxusqposptiqo0qvc0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsbbxusqposptiqo0qvc0.png" alt="Screenshot 2021-02-22 at 12.24.20"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It works, but this is not the best way to do it, it is far away from a continuous deployment pipeline. We are going to make one step further and build a command to deploy the code to the cloud without using the &lt;/p&gt;
&lt;h2&gt;
  
  
  AWS CLI ready for service!
&lt;/h2&gt;

&lt;p&gt;Add a new NPM script to your package.json:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"deploy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm prune --production &amp;amp;&amp;amp; zip function.zip * -r &amp;amp;&amp;amp; aws lambda update-function-code --function-name geoIPNode --zip-file fileb://function.zip --profile personal  &amp;amp;&amp;amp; rm function.zip &amp;amp;&amp;amp; npm install"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We are cleaning &lt;code&gt;node_modules&lt;/code&gt; folder to upload only production packages, building the &lt;code&gt;zip&lt;/code&gt; file, updating the lambda function and re-installing packages deleted in the &lt;em&gt;prune&lt;/em&gt; process.&lt;/p&gt;

&lt;p&gt;You can safely use &lt;code&gt;npm run deploy&lt;/code&gt; to update your lambda whenever you want.&lt;/p&gt;

&lt;p&gt;This is neither the best way to do this process, because we can and should improve this process much further, but it will not be in this post. I will leave you some ideas to improve memory and time usage for the function:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Upload GeoIP database (which is the biggest one) to S3 and load it within the code using AWS SDK for JS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Upload GeoIP database to a EFS (Amazon elastic file system) which can be share through any lambda function.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both ideas allow you to edit the code in the lambda editor, since the package uploaded will not be bigger than the limit specified.&lt;/p&gt;

&lt;h2&gt;
  
  
  API Gateway
&lt;/h2&gt;

&lt;p&gt;We just only need an endpoint to attack the lambda function from the Internet. Visit API Gateway &lt;a href="https://eu-west-1.console.aws.amazon.com/apigateway/main/apis?region=eu-west-1" rel="noopener noreferrer"&gt;dashboard&lt;/a&gt; and let's start:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Create a new HTTP API &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frd8pz7pphd0qic0pdykz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frd8pz7pphd0qic0pdykz.png" alt="Screenshot 2021-02-22 at 16.19.55"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fill in the form and click "Next" &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4gxvgc1belualj3ppkuh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4gxvgc1belualj3ppkuh.png" alt="Screenshot 2021-02-22 at 16.20.31 1"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose the &lt;em&gt;method&lt;/em&gt; and a name for the resource path. &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz1uuvs32e0679kiyuytg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz1uuvs32e0679kiyuytg.png" alt="Screenshot 2021-02-22 at 16.21.07"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Default stage by default with auto deploy on changes.  &lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzn8qhse2geb50k77bft8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzn8qhse2geb50k77bft8.png" alt="Screenshot 2021-02-22 at 16.22.06"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;With your API built, you may access the operational URL served by AWS with our parameter string, such as: &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedv5w23n04f4x1vqekss.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fedv5w23n04f4x1vqekss.png" alt="Screenshot 2021-02-22 at 16.25.39"&gt;&lt;/a&gt; &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqw9jfwh2v2twabpxiod7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqw9jfwh2v2twabpxiod7.png" alt="Screenshot 2021-02-22 at 16.24.20"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The end
&lt;/h2&gt;

&lt;p&gt;I wanted to give you a broader scope in terms of using a simple AWS service, such as Lambda, to build a solution around something useful. I hope you enjoy the content as much I enjoyed writing it for everyone. Here I &lt;a href="https://github.com/avcconti/geoIPNode" rel="noopener noreferrer"&gt;link the repository&lt;/a&gt; used.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>ip</category>
      <category>location</category>
      <category>maxmind</category>
    </item>
    <item>
      <title>Your own GeoIP service 1/2: Maxmind GeoIP + AWS SAM</title>
      <dc:creator>Conti</dc:creator>
      <pubDate>Mon, 07 Dec 2020 10:42:42 +0000</pubDate>
      <link>https://forem.com/producthackers/your-own-geoip-service-1-2-maxmind-geoip-aws-sam-52go</link>
      <guid>https://forem.com/producthackers/your-own-geoip-service-1-2-maxmind-geoip-aws-sam-52go</guid>
      <description>&lt;h2&gt;
  
  
  Requisites
&lt;/h2&gt;

&lt;p&gt;This is not a &lt;code&gt;start-from-subzero&lt;/code&gt;  tutorial, so you will need a few things installed and working on your machine before starting this first post:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Docker installed on your machine&lt;/li&gt;
&lt;li&gt;An AWS active account&lt;/li&gt;
&lt;li&gt;AWS SAM CLI working on your machine  &lt;a href="https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There so much literature about using GeoIP third party services, but if you really like to play and test a DIY GeoIP endpoint to use in your projects, follow me across two posts and let's check how  to do it.&lt;/p&gt;

&lt;p&gt;Let's be clear about the final goal: "My own endpoint which will receive an IP as query parameter and it will return location info such as country and city". To accomplish this goal we will make use of the following technologies/services:&lt;/p&gt;

&lt;h2&gt;
  
  
  Maxmind
&lt;/h2&gt;

&lt;p&gt;First of all, Maxmind ( &lt;a href="https://dev.maxmind.com/geoip/geoip2/geolite2/" rel="noopener noreferrer"&gt;https://dev.maxmind.com/geoip/geoip2/geolite2/&lt;/a&gt; ) offers us a group of free GeoIP (capped) databases to play with. Follow instructions in the URL above and download "GeoLite2 City":&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqnyp496x6uqmzi7bh2o4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fqnyp496x6uqmzi7bh2o4.png" alt="Maxmind download"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8qdkd72mp9kwqy6un55d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F8qdkd72mp9kwqy6un55d.png" alt="Maxmind file"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Locate the file "GeoLite2-City.mmdb" to be able to use it later.&lt;/p&gt;

&lt;p&gt;Now let's check the usage for NodeJS of their APIs at &lt;a href="https://github.com/maxmind/GeoIP2-node" rel="noopener noreferrer"&gt;https://github.com/maxmind/GeoIP2-node&lt;/a&gt;, do not worry, we will spare a few lines of code in few moments.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS Serverless ApplicationManager (SAM)
&lt;/h2&gt;

&lt;p&gt;SAM allows us to build and deploy serverless applications with little effort. Though SAM is oriented towards offering full REST capabilities in order to build a whole application, we will only use it to manage, invoke and deploy a Lambda function.&lt;/p&gt;

&lt;p&gt;Since installing SAM and getting started with it is out of scope for this post, you may follow the official doc to do that &lt;a href="https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Whenever you have SAM working in your machine, follow these steps.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Navigate to your dev playground folder and exec &lt;code&gt;sam init&lt;/code&gt; . Setup the project like in the folowing screenshot:&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fn1g134lb9wqd4kbhnudr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fn1g134lb9wqd4kbhnudr.png" alt="SAM-cli setup maxmind"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Exec &lt;code&gt;cd geoIPNode&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Exec &lt;code&gt;sam local invoke&lt;/code&gt; and this will execute the default from &lt;code&gt;template.yml&lt;/code&gt; so you should see the following output(Note: you need Docker in your machine):&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1w4f1jc3a756fd3do1s5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F1w4f1jc3a756fd3do1s5.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We already executed a Lambda function in our machine successfully, that is good, really good.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Maxmind again
&lt;/h2&gt;

&lt;p&gt;Let's go back to &lt;a href="https://github.com/maxmind/GeoIP2-node" rel="noopener noreferrer"&gt;https://github.com/maxmind/GeoIP2-node&lt;/a&gt; and check the NodeJS code from their page. We will use the &lt;code&gt;Buffer&lt;/code&gt; example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@maxmind/geoip2-node&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Reader&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// Typescript:&lt;/span&gt;
&lt;span class="c1"&gt;// import { Reader } from '@maxmind/geoip2-node';&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dbBuffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/usr/local/city-database.mmdb&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;openBuffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dbBuffer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;city&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.1.1.1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do you remember where the *.mmdb file is? It is time to put it inside the project folder in order to get a folder structure like this one:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4zyollv3o7wztxhk229x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2F4zyollv3o7wztxhk229x.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now add the replace the initial code for this (replace 1.1.1.1 for you IP):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;fs&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@maxmind/geoip2-node&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Reader&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
 &lt;span class="nx"&gt;exports&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;helloFromLambdaHandler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{};&lt;/span&gt;

    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dbBuffer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readFileSync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;GeoLite2-City.mmdb&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;Reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;openBuffer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dbBuffer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// const ret = await axios(url);&lt;/span&gt;
        &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;statusCode&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;body&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
                &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hello world&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="na"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;reader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;city&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.1.1.1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;city&lt;/span&gt;
            &lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note: do not forget to install &lt;code&gt;@maxmind/geoip2-node&lt;/code&gt; using Yarn or NPM, for example:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install @maxmind/geoip2-node&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;An exec again &lt;code&gt;sam local invoke&lt;/code&gt; :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffxshyqkr6z75crf68drz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Ffxshyqkr6z75crf68drz.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That was easy.&lt;/p&gt;

&lt;p&gt;The second part is already &lt;a href="https://dev.to/producthackers/your-own-geoip-service-2-2-lambda-api-gateway-39m5"&gt;published&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>lambda</category>
      <category>geoip</category>
      <category>maxmind</category>
    </item>
  </channel>
</rss>
