<?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>DEV Community: Filipe Pinheiro</title>
    <description>The latest articles on DEV Community by Filipe Pinheiro (@fampinheiro).</description>
    <link>https://dev.to/fampinheiro</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%2F199039%2F81fcafab-3be0-4293-9464-a3bbbe6d2ac8.jpeg</url>
      <title>DEV Community: Filipe Pinheiro</title>
      <link>https://dev.to/fampinheiro</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fampinheiro"/>
    <language>en</language>
    <item>
      <title>Low-code remote-friendly “Codenames”</title>
      <dc:creator>Filipe Pinheiro</dc:creator>
      <pubDate>Mon, 28 Dec 2020 21:32:08 +0000</pubDate>
      <link>https://dev.to/fampinheiro/remote-friendly-codenames-1939</link>
      <guid>https://dev.to/fampinheiro/remote-friendly-codenames-1939</guid>
      <description>&lt;p&gt;Board games are a perfect activity to do among friends. And one of the games I played with friends before being forced into lockdown was &lt;a href="https://en.wikipedia.org/wiki/Codenames_(board_game)"&gt;Codenames&lt;/a&gt;. There are some online options, but I find that manual actions help keep people engaged.&lt;/p&gt;

&lt;p&gt;Codenames is a game of guessing which words in a set are related to a hint-word given by another player (the spymaster). There are two teams, the red and the blue, one player in each group is the spymaster, and the others are field agents.&lt;/p&gt;

&lt;p&gt;To play a remote-friendly version of the game, we need to have a map card accessible to the spymasters and a 5x5 word grid accessible to everyone. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How can I use online services to enable and facilitate my friends to play codenames, even in lockdown?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For the map card I took a picture of the physical cards and at the start of each round the spymasters pick a card and decide its orientation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--02GP1k8n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/tv0jss9oobwba20u64kc.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--02GP1k8n--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/tv0jss9oobwba20u64kc.jpeg" alt="Map cards picture"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Since everyone can see the 5x5 word grid we decided to use &lt;a href="https://miro.com/"&gt;Miro&lt;/a&gt;. When field agents try to guess a word we use the shape background color to represent an innocent bystander (yellow), an opposing agent, or the assassin (black).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--h2n6_AvC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/33v7w94z9ds6y5wyn0x1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--h2n6_AvC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/33v7w94z9ds6y5wyn0x1.png" alt="5x5 grid with portuguese words"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We spend 3 hours on a video call playing codenames, and with this setup, we reduced our distance and had a lot of fun.&lt;/p&gt;




&lt;h1&gt;
  
  
  Enhancements
&lt;/h1&gt;

&lt;p&gt;The setup works, but we can improve the manual actions when setting up a new round:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;create a random map card&lt;/li&gt;
&lt;li&gt;create a 5x5 grid with random words&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Create a Map Card
&lt;/h2&gt;

&lt;p&gt;The map card has seven innocent bystanders (yellow), one assassin (black), nine items for the starting team and eight for the other team. A map card is also a 5x5 grid that matches the grid of words.&lt;/p&gt;

&lt;p&gt;To create map cards, I created a web application using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://svelte.dev/"&gt;svelte&lt;/a&gt;, a framework to build web apps I wanted to try for a long time;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://tailwindcss.com/"&gt;tailwindcss&lt;/a&gt;, a utility-first CSS framework, so the outcome is pleasant to look at;&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://vercel.app/"&gt;vercel&lt;/a&gt; to deploy and serve the static files of the web app.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p5Lc4ees--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/10htko2ue2yr0nvt0hyn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p5Lc4ees--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/10htko2ue2yr0nvt0hyn.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see a deployed version of the application at &lt;a href="https://codenames.fampinheiro.vercel.app/"&gt;https://codenames.fampinheiro.vercel.app/&lt;/a&gt; and check the code on &lt;a href="https://github.com/fampinheiro/codenames"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a 5x5 Word Grid
&lt;/h2&gt;

&lt;p&gt;Miro fits the purpose of showing the 5x5 word grid. However, the manual process of creating the grid with random words is tiresome. Can we automate the creation of the grid?&lt;/p&gt;

&lt;p&gt;Looking through Miro documentation, we can use web-plugins to "modify objects on the board". We could create a web-plugin that on-demand would create a random 5x5 word grid at the start of each round.&lt;/p&gt;

&lt;p&gt;To create a new application on Miro you need to get &lt;a href="https://miro.com/app/dashboard/?createDevTeam=1"&gt;a developer team&lt;/a&gt; and then on &lt;a href="https://miro.com/app/settings/user-profile/apps"&gt;user settings apps&lt;/a&gt; agree to the terms and conditions and create a new app.&lt;/p&gt;

&lt;p&gt;The relevant settings for our web-plugin are the web-plugin link and the OAuth scopes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XsQl2D4g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/bfzpnmt5bqxuwsca5668.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XsQl2D4g--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/bfzpnmt5bqxuwsca5668.png" alt="Miro create app settings"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The OAuth scopes depend on the type of interaction you want to have with the Miro SDK, in our case we need &lt;code&gt;boards:read&lt;/code&gt; and &lt;code&gt;boards:write&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Miro Web-plugin Page
&lt;/h3&gt;

&lt;p&gt;"Web-plugins are JS scripts that run on boards in isolated iframes. The JS code of a web-plugin communicates with the Miro application via PostMessage using the Miro SDK." (&lt;a href="https://developers.miro.com/docs/sdk"&gt;source&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;In this case, the web-plugin page imports the SDK script and extends the bottom bar with a new icon. The new icon, when clicked, fetches new words and place them on the board in a 5x5 grid.&lt;/p&gt;

&lt;p&gt;You can check the source code for the web-plugin page on &lt;a href="https://github.com/fampinheiro/codenames/blob/master/public/miro.html"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The only thing missing to make our web-plugin functional is to create an API that returns 25 different words every time we make a request.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vercel Serverless Functions
&lt;/h3&gt;

&lt;p&gt;Since we are already using vercel the most straightforward way to create the api is using the &lt;a href="https://vercel.com/docs/serverless-functions/introduction"&gt;serverless functions&lt;/a&gt; service. The API gets the first 25 words on a randomized list of words and return them.&lt;/p&gt;

&lt;h1&gt;
  
  
  How to Play
&lt;/h1&gt;

&lt;ol&gt;
&lt;li&gt;A spymaster generate a new map card &lt;a href="https://codenames.fampinheiro.vercel.app/"&gt;here&lt;/a&gt; (the link is shareable)&lt;/li&gt;
&lt;li&gt;Use the web-plugin on Miro to generate a new 5x5 word grid&lt;/li&gt;
&lt;li&gt;Play the game use the shape background when field agents try to guess words&lt;/li&gt;
&lt;li&gt;Go to &lt;strong&gt;1&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h1&gt;
  
  
  Thoughts
&lt;/h1&gt;

&lt;p&gt;Although the solution described is not complicated, it shows you don't need to jump to a complex architecture, you can leverage several services to deliver value to your users. &lt;/p&gt;

&lt;p&gt;Product development combines systems thinking and software development, and you can try to get feedback from your users "glueing" services and tools together reducing the unknowns and uncertainties.&lt;/p&gt;

&lt;p&gt;You can take advantage of the no-code and low-code services and tools rising in popularity to fulfil the primary purpose of a product, solve its users' problem. Use your toolbox to deliver value to your users, iterate and improve the value your product provides.&lt;/p&gt;

</description>
      <category>svelte</category>
      <category>serverless</category>
      <category>programming</category>
    </item>
    <item>
      <title>Consider DynamoDB for your next project</title>
      <dc:creator>Filipe Pinheiro</dc:creator>
      <pubDate>Fri, 05 Jun 2020 11:16:16 +0000</pubDate>
      <link>https://dev.to/fampinheiro/consider-dynamodb-for-your-next-project-4h82</link>
      <guid>https://dev.to/fampinheiro/consider-dynamodb-for-your-next-project-4h82</guid>
      <description>&lt;p&gt;DynamoDB is a key-value store and document database managed by Amazon Web Services (AWS). Usually, we use it when implementing a caching layer or an application with a simple data-model that uses key-value lookups to fetch data. The next couple of paragraphs walk you through some strategies and patterns to use DynamoDB to store your relational data.&lt;br&gt;
Here is a quote that can be seen on the Amazon DynamoDB page.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Amazon DynamoDB is a key-value and document database that delivers single-digit millisecond performance at any scale. It’s a fully managed, multiregion, multimaster, durable database with built-in security, backup and restore, and in-memory caching for internet-scale applications. DynamoDB can handle more than 10 trillion requests per day and can support peaks of more than 20 million requests per second.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Since the pressure on data storage doesn’t increase overnight, the performance of DynamoDB at scale wasn’t the major selling point to use it.&lt;br&gt;
However, I started considering DynamoDB due to the benefits associated with serverless architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple provisioning;&lt;/li&gt;
&lt;li&gt;Pay-per-use pricing;&lt;/li&gt;
&lt;li&gt;and, a straightforward connections to a database (no connection pools).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rising curiosity led me to research more about DynamoDB and learn about the patterns and strategies you can use for a wide variety of use-cases. Overall, what contributed to a change of mind regarding this AWS service was the single-table design concept, a way to represent multiple entities and model a relational model.&lt;/p&gt;
&lt;h1&gt;
  
  
  Single-table design
&lt;/h1&gt;

&lt;p&gt;As an example, let’s model an application where a user can write content and others can like it. An essential part of the process is to understand the data access patterns and the entities of your application as they are the primary resources to decide how to shape our data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Access Patterns&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a post (organised by topic)&lt;/li&gt;
&lt;li&gt;User can like a post (one like per user)&lt;/li&gt;
&lt;li&gt;List the posts on a topic with the total number of likes&lt;/li&gt;
&lt;li&gt;View user and liked posts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Entities&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Our application has topics, posts, users and likes.&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%2Fmiro.medium.com%2Fmax%2F754%2F1%2A9Tpt_pv_gb7OYbS9gA_AvQ.jpeg" 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%2Fmiro.medium.com%2Fmax%2F754%2F1%2A9Tpt_pv_gb7OYbS9gA_AvQ.jpeg" alt="Entity relational model representing our data model"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before we start to model our data access patterns and entities to our table, we need to know how to access data on DynamoDB. In DynamoDB to retrieve items from a table:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can get an item;&lt;/li&gt;
&lt;li&gt;You can query items;&lt;/li&gt;
&lt;li&gt;Or, you can scan every item on a table.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let’s start by modelling the topic and their one-to-many relationship with posts. Unlike an SQL database, there is no way to join data from multiple tables. Still, there are multiple strategies to model one-to-many relationships being one of them, the one that we use, pre-joining your data into item collections.&lt;/p&gt;
&lt;h2&gt;
  
  
  Pre-join your data
&lt;/h2&gt;

&lt;p&gt;To pre-join our data we use a composite primary key in our table (a composite primary key combines a &lt;strong&gt;partition key&lt;/strong&gt; and a &lt;strong&gt;sort key&lt;/strong&gt;).&lt;br&gt;
In our case the partition key (PK) and sort key (SK) of topics and posts looks like this:&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; A ksuid creates a sortable unique identifier.&lt;/p&gt;

&lt;p&gt;We can use the topic PK and the query API to get a collection of items with the topic and the related posts.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;The previous query returns the item collection highlighted in the image.&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%2Fmiro.medium.com%2Fmax%2F1400%2F1%2AAVOuBgnHrnWOOhfM47xv8Q.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%2Fmiro.medium.com%2Fmax%2F1400%2F1%2AAVOuBgnHrnWOOhfM47xv8Q.png" alt="Item collection returned when querying the topic AWS"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Notice the existence of a type attribute on every item. The attribute makes our life easier when reading data or when we execute ETL tasks.&lt;/p&gt;

&lt;p&gt;We can model the relationship between users and likes the same way we did for topics and posts to cover the “users can like posts” and ”view user and liked posts” access pattern. We use the same PK and SK to model this relationship.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;There is, however, another access pattern related to likes, “list the posts on a topic with the total number of likes” that we need to model. We can’t use the item collection strategy because likes are in the users’ item collection, and posts are in the topics item collection (even if we could, scanning every item and count them isn’t optimal).&lt;/p&gt;

&lt;p&gt;In a relational database, you solve this joining multiple tables and counting the likes regarding a particular post, in DynamoDB doing a scan to get this information is a no-go due to the told on performance (as your application scales, it gets slower) and in your wallet. The solution is to optimize your reads and keep a counter on the posts using a DynamoDB transaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Transactions in DynamoDB
&lt;/h2&gt;

&lt;p&gt;DynamoDB provides an API to create transaction when reading and writing items to your table. In our case we use a transaction when writing a like to a post:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Put a like item ensuring it’s not a duplicate;&lt;/li&gt;
&lt;li&gt;Increment the number of likes in the post.&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;With the previous snippet, every post has a counter with the number of likes on an item attribute available with every post. By using a small number of strategies and patterns, we were able to model a relational database into DynamoDB.&lt;/p&gt;

&lt;p&gt;Let’s add one more access pattern so I can introduce you to another pattern and unlock new possibilities:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;View a post and list the users that liked it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We already overloaded our primary key, so we can’t use it to reflect this access pattern, although we can use a global secondary index.&lt;/p&gt;

&lt;h2&gt;
  
  
  Global Secondary Index
&lt;/h2&gt;

&lt;p&gt;Global secondary indexes allow us to define new access patterns using a completely different key structure. In our case, we use a secondary index to create an item collection around our post and likes. Remember, we can set the same partition key, ensuring we retrieve the related item when using the query API.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; We prefix our global secondary index (GSI) and give it a number to better identify them.&lt;/p&gt;

&lt;p&gt;To query the data we specify the index name and the partition key. The snippet below return an item collection related to the post we want to fetch.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&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%2Fmiro.medium.com%2Fmax%2F1400%2F1%2AbaaKs4P-YDWAStLy6p6Htw.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%2Fmiro.medium.com%2Fmax%2F1400%2F1%2AbaaKs4P-YDWAStLy6p6Htw.png" alt="Item collection of posts with likes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Recap
&lt;/h1&gt;

&lt;p&gt;Let’s recap our composite keys for our entities.&lt;/p&gt;

&lt;p&gt;Entity convention for primary key and global secondary index.&lt;br&gt;
Note: It’s an excellent practice to document how we map each entity into our indexes for future reference.&lt;br&gt;
To model a relational model into DynamoDB and take advantage of its performance at scale:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We used a single-table design with a composite primary key;&lt;/li&gt;
&lt;li&gt;We pre-joined our data into item collection so we could query related information;&lt;/li&gt;
&lt;li&gt;We used transaction to ensure our entities had relevant counters;&lt;/li&gt;
&lt;li&gt;We used global secondary indexes to query our data to fit different access patterns.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Our table can be created with the following snippet. Notice that we define every attribute we want to be part of the indexes but separate the key schema into different parts of the creation request.&lt;/p&gt;


&lt;div class="ltag_gist-liquid-tag"&gt;
  
&lt;/div&gt;


&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;In this post, we just scratched the tip of the iceberg about DynamoDB but in case you are using a serverless architecture, an event-driven architecture, a micro-service architecture, or a macro-service architecture consider DynamoDB in your next application. Consider using DynamoDB in one of the domains of your application, create defined boundaries and you can model one per table to keep them decoupled.&lt;/p&gt;

&lt;p&gt;Some people raise concerns about vendor lock-in, but, is it even a real problem? Most of us rely on what we know to overcome the problem we are facing. If we are already using and invested in Amazon Web Services, the fear of lock-in shouldn’t be the reason for not giving a try to DynamoDB. If DynamoDB is a tool that allows us to deliver value and have an application live, let’s use it.&lt;/p&gt;

&lt;p&gt;DynamoDB doesn’t clear you from knowing the entities of your application and the access patterns to fetch the data, but with the right patterns, you can have a fast and scalable database without the management burden and cost.&lt;/p&gt;

</description>
      <category>dynamodb</category>
      <category>serverless</category>
      <category>aws</category>
    </item>
    <item>
      <title>Website with Notion</title>
      <dc:creator>Filipe Pinheiro</dc:creator>
      <pubDate>Mon, 16 Mar 2020 11:57:08 +0000</pubDate>
      <link>https://dev.to/fampinheiro/website-with-notion-3n30</link>
      <guid>https://dev.to/fampinheiro/website-with-notion-3n30</guid>
      <description>&lt;p&gt;A personal website is an opportunity to share your thoughts with the world. It is your piece of the internet where others can learn a bit more about you. I consider myself an accomplished engineer with an eye for design. Still, I struggled for years to be comfortable with my website appearance. Last week one thought came to mind — Is it that important?.&lt;/p&gt;

&lt;h3&gt;
  
  
  Are the looks of a personal website that important for an engineer?
&lt;/h3&gt;

&lt;p&gt;In my case, I believe the content is more significant than aesthetics. &lt;a href="http://notion.so/"&gt;Notion&lt;/a&gt; has the basic building blocks so I can focus on the content without bothering about look 'n' feel.&lt;/p&gt;

&lt;p&gt;Notion comes with some &lt;strong&gt;cons&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I can't optimise SEO;&lt;/li&gt;
&lt;li&gt;The pages location is tied to the path Notion generates;&lt;/li&gt;
&lt;li&gt;It's not simple to get insights on user behaviour and behaviour;&lt;/li&gt;
&lt;li&gt;The line-height could be more spacious.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Are the cons a show stopper?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;No.&lt;/strong&gt; I was never the type of person to own a personal blog, not having a suitable site has been my excuse for the past years. Let's see where not having to worry about the looks takes me. Writing more is the minimum value proposition of this change.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Notion?
&lt;/h3&gt;

&lt;p&gt;They describe it better than I do.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The all-in-one workspace for your notes, tasks, wikis, and databases.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But don't be fooled. This simple mantra doesn't come close to explain the awesome things you can do with the building blocks the fantastic team behind notion brings to you.&lt;/p&gt;

&lt;p&gt;Checkout the result of a my website with &lt;a href="https://www.notion.so/fampinheiro/Hey-5c96b52345db451d83c84ace047769d3"&gt;Notion&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>career</category>
    </item>
    <item>
      <title>👋</title>
      <dc:creator>Filipe Pinheiro</dc:creator>
      <pubDate>Tue, 20 Aug 2019 09:33:37 +0000</pubDate>
      <link>https://dev.to/fampinheiro/-5al1</link>
      <guid>https://dev.to/fampinheiro/-5al1</guid>
      <description>

</description>
    </item>
  </channel>
</rss>
