<?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: Filipe Lima</title>
    <description>The latest articles on Forem by Filipe Lima (@datsfilipe).</description>
    <link>https://forem.com/datsfilipe</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%2F630907%2F17bd2024-6f53-4665-8930-a4f33fc47758.jpeg</url>
      <title>Forem: Filipe Lima</title>
      <link>https://forem.com/datsfilipe</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/datsfilipe"/>
    <language>en</language>
    <item>
      <title>My Development Environment</title>
      <dc:creator>Filipe Lima</dc:creator>
      <pubDate>Mon, 27 Nov 2023 00:00:00 +0000</pubDate>
      <link>https://forem.com/datsfilipe/my-development-environment-b63</link>
      <guid>https://forem.com/datsfilipe/my-development-environment-b63</guid>
      <description>&lt;p&gt;This is meant to be a brief blog post where I'm only going to show off some tools that I'm using daily to get work done. Most if not all of them are terminal centric. The last section is going to be about Neovim and the plugins I'm using there too.&lt;/p&gt;

&lt;p&gt;Of course, any workflow is acceptable, doesn't matter if you use GUI tools for everything. Peace.&lt;/p&gt;

&lt;h2&gt;
  
  
  Git
&lt;/h2&gt;

&lt;p&gt;My preference is to write my commits from Neovim, using a plugin. But I still do other operations like: merge, rebase, branch creation, checkout, etc, from the &lt;strong&gt;git cli&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;My &lt;code&gt;.gitconfig&lt;/code&gt; file contains all my alias for git cli, so even if I change my shell to something else, they would still work. Here are they:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[alias]&lt;/span&gt;
  &lt;span class="py"&gt;d&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;diff&lt;/span&gt;
  &lt;span class="py"&gt;st&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;status&lt;/span&gt; &lt;span class="err"&gt;-sb&lt;/span&gt;
  &lt;span class="py"&gt;sf&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;show&lt;/span&gt; &lt;span class="err"&gt;--name-only&lt;/span&gt;
  &lt;span class="py"&gt;cm&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;commit&lt;/span&gt; &lt;span class="err"&gt;-m&lt;/span&gt;
  &lt;span class="py"&gt;ca&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;commit&lt;/span&gt; &lt;span class="err"&gt;--amend&lt;/span&gt;
  &lt;span class="py"&gt;co&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;checkout&lt;/span&gt;
  &lt;span class="py"&gt;ps&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;push&lt;/span&gt;
  &lt;span class="py"&gt;psu&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;push&lt;/span&gt; &lt;span class="err"&gt;-u&lt;/span&gt;
  &lt;span class="py"&gt;psm&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"!git push origin $(git rev-parse --abbrev-ref HEAD)"&lt;/span&gt;
  &lt;span class="py"&gt;pl&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;pull&lt;/span&gt;
  &lt;span class="py"&gt;plm&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"!git pull origin $(git rev-parse --abbrev-ref HEAD)"&lt;/span&gt;
  &lt;span class="py"&gt;br&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;branch&lt;/span&gt;
  &lt;span class="py"&gt;ba&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;branch&lt;/span&gt; &lt;span class="err"&gt;-a&lt;/span&gt;
  &lt;span class="py"&gt;bm&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;branch&lt;/span&gt; &lt;span class="err"&gt;--merged&lt;/span&gt;
  &lt;span class="py"&gt;bn&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;branch&lt;/span&gt; &lt;span class="err"&gt;--no-merged&lt;/span&gt;
  &lt;span class="py"&gt;df&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"!git hist | peco | awk '{print $2}' | xargs -I {} git diff {}^ {}"&lt;/span&gt;
  &lt;span class="py"&gt;lg&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;log&lt;/span&gt; &lt;span class="err"&gt;--graph&lt;/span&gt; &lt;span class="err"&gt;--name-status&lt;/span&gt; &lt;span class="py"&gt;--pretty&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="err"&gt;format:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="err"&gt;%C(red)%h&lt;/span&gt; &lt;span class="err"&gt;%C(reset)(%cd)&lt;/span&gt; &lt;span class="err"&gt;%C(green)%an&lt;/span&gt; &lt;span class="err"&gt;%Creset%s&lt;/span&gt; &lt;span class="err"&gt;%C(yellow)%d%Creset&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt; &lt;span class="py"&gt;--date&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="err"&gt;relative&lt;/span&gt;
  &lt;span class="py"&gt;find&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"!f() { git log --pretty=format:&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;%h %cd [%cn] %s%d&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt; --date=relative -S'pretty' -S&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt;$@&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s"&gt; | peco | awk '{print $1}' | xargs -I {} git diff {}^ {}; }; f"&lt;/span&gt;
  &lt;span class="py"&gt;edit-unmerged&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"!f() { git ls-files --unmerged | cut -f2 | sort -u ; }; vim `f`"&lt;/span&gt;
  &lt;span class="py"&gt;add-unmerged&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"!f() { git ls-files --unmerged | cut -f2 | sort -u ; }; git add `f`"&lt;/span&gt;
  &lt;span class="c"&gt;# some helpers&lt;/span&gt;
  &lt;span class="py"&gt;incoming&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;!(git&lt;/span&gt; &lt;span class="err"&gt;fetch&lt;/span&gt; &lt;span class="err"&gt;--quiet&lt;/span&gt; &lt;span class="err"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="err"&gt;git&lt;/span&gt; &lt;span class="err"&gt;log&lt;/span&gt; &lt;span class="py"&gt;--pretty&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="err"&gt;format:&lt;/span&gt;&lt;span class="s"&gt;'%C(yellow)%h %C(white)- %C(red)%an %C(white)- %C(cyan)%d%Creset %s %C(white)- %ar%Creset'&lt;/span&gt; &lt;span class="err"&gt;..@{u})&lt;/span&gt;
  &lt;span class="py"&gt;outgoing&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;!(git&lt;/span&gt; &lt;span class="err"&gt;fetch&lt;/span&gt; &lt;span class="err"&gt;--quiet&lt;/span&gt; &lt;span class="err"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="err"&gt;git&lt;/span&gt; &lt;span class="err"&gt;log&lt;/span&gt; &lt;span class="py"&gt;--pretty&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="err"&gt;format:&lt;/span&gt;&lt;span class="s"&gt;'%C(yellow)%h %C(white)- %C(red)%an %C(white)- %C(cyan)%d%Creset %s %C(white)- %ar%Creset'&lt;/span&gt; &lt;span class="err"&gt;@{u}..)&lt;/span&gt;
  &lt;span class="py"&gt;unstage&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;reset&lt;/span&gt; &lt;span class="err"&gt;HEAD&lt;/span&gt; &lt;span class="err"&gt;--&lt;/span&gt;
  &lt;span class="py"&gt;undo&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;checkout&lt;/span&gt; &lt;span class="err"&gt;--&lt;/span&gt;
  &lt;span class="py"&gt;rollback&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;reset&lt;/span&gt; &lt;span class="err"&gt;--soft&lt;/span&gt; &lt;span class="err"&gt;HEAD~&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="py"&gt;whoami&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="err"&gt;config&lt;/span&gt; &lt;span class="err"&gt;user.name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also, I'm trying to use more the &lt;a href="https://cli.github.com/" rel="noopener noreferrer"&gt;github cli&lt;/a&gt;, &lt;code&gt;gh&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Terminal
&lt;/h2&gt;

&lt;p&gt;Currently, my terminal emulator is &lt;a href="https://wezfurlong.org/wezterm/index.html" rel="noopener noreferrer"&gt;WezTerm&lt;/a&gt;, but I also recommend &lt;a href="https://alacritty.org/" rel="noopener noreferrer"&gt;Alacritty&lt;/a&gt;, both are made with Rust. For shell I'm using &lt;a href="https://www.zsh.org/" rel="noopener noreferrer"&gt;zsh&lt;/a&gt; with &lt;a href="https://ohmyz.sh/" rel="noopener noreferrer"&gt;ohmyzsh&lt;/a&gt;. I also use &lt;a href="https://github.com/agkozak/zsh-z" rel="noopener noreferrer"&gt;zsh-z&lt;/a&gt; plugin. And for prompt theme, &lt;a href="https://github.com/spaceship-prompt/spaceship-prompt" rel="noopener noreferrer"&gt;spaceship&lt;/a&gt; is what I'm using.&lt;/p&gt;

&lt;p&gt;I have a lot of terminal tools too, those enhance some commands that already exists or add different things that I like. Take a look at the list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/x-motemen/ghq" rel="noopener noreferrer"&gt;ghq&lt;/a&gt; - For managing git repository clones.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/sharkdp/bat" rel="noopener noreferrer"&gt;bat&lt;/a&gt; - Replacement for &lt;code&gt;cat&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/eza-community/eza" rel="noopener noreferrer"&gt;eza&lt;/a&gt; - Replacement for &lt;code&gt;ls&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://htop.dev/" rel="noopener noreferrer"&gt;htop&lt;/a&gt; - An interactive process viewer.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://curl.se/docs/manpage.html" rel="noopener noreferrer"&gt;curl&lt;/a&gt; - A tool for transferring data from or to a server using URLs.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/sharkdp/fd" rel="noopener noreferrer"&gt;fd&lt;/a&gt; - Replacement for &lt;code&gt;find&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/junegunn/fzf" rel="noopener noreferrer"&gt;fzf&lt;/a&gt; - A command-line fuzzy finder. Allow us to make scripts like this: &lt;a href="https://github.com/datsfilipe/unix-scripts/blob/main/tmux-sessionizer" rel="noopener noreferrer"&gt;tmux-sessionizer&lt;/a&gt; (if I'm not mistaken, I took that script from &lt;a href="https://twitter.com/ThePrimeagen" rel="noopener noreferrer"&gt;@ThePrimeagen&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://direnv.net/" rel="noopener noreferrer"&gt;direnv&lt;/a&gt; - An extension for your shell. It augments existing shells with a new feature that can load and unload environment variables depending on the current directory. This is a powerful tool to use alongside &lt;a href="https://nixos.org/manual/nix/stable/command-ref/nix-shell.html" rel="noopener noreferrer"&gt;nix-shell&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/tmux/tmux" rel="noopener noreferrer"&gt;tmux&lt;/a&gt; - A terminal multiplexer. Even with a &lt;a href="https://wiki.archlinux.org/title/Window_manager" rel="noopener noreferrer"&gt;WM&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Desktop
&lt;/h2&gt;

&lt;p&gt;I'm a &lt;strong&gt;Linux&lt;/strong&gt; user and an &lt;a href="https://archlinux.org/" rel="noopener noreferrer"&gt;Arch&lt;/a&gt; linux fan, but for my OS nowadays I'm using &lt;a href="https://nixos.org/" rel="noopener noreferrer"&gt;Nixos&lt;/a&gt;. If you want to know why I made the switch, this simple &lt;a href="https://nixos.org/guides/how-nix-works.html" rel="noopener noreferrer"&gt;guide&lt;/a&gt; worths a read.&lt;/p&gt;

&lt;p&gt;Other than my operating system, I'm using &lt;a href="https://hyprland.org/" rel="noopener noreferrer"&gt;Hyprland&lt;/a&gt; - A highly customizable dynamic tiling &lt;a href="https://wayland.freedesktop.org/" rel="noopener noreferrer"&gt;Wayland&lt;/a&gt; compositor. It is the only one I've used with Wayland, but for &lt;strong&gt;xorg&lt;/strong&gt; I can recommend &lt;a href="https://i3wm.org/" rel="noopener noreferrer"&gt;i3WM&lt;/a&gt; (It is very simple to setup and start working) and &lt;a href="https://github.com/baskerville/bspwm" rel="noopener noreferrer"&gt;BSPWM&lt;/a&gt; (for those that want a more configurable approach, ideal for &lt;a href="https://jie-fang.github.io/blog/basics-of-ricing" rel="noopener noreferrer"&gt;ricing&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;If you want to use a proper &lt;a href="https://wiki.archlinux.org/title/Desktop_environment" rel="noopener noreferrer"&gt;DE&lt;/a&gt;, I recommend &lt;strong&gt;Arch&lt;/strong&gt; or &lt;a href="https://manjaro.org/" rel="noopener noreferrer"&gt;Manjaro&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Neovim
&lt;/h2&gt;

&lt;p&gt;My Neovim configuration is public (&lt;a href="https://github.com/datsfilipe/datsnvim" rel="noopener noreferrer"&gt;datsnvim&lt;/a&gt;), but I know some may not be there yet to read and understand these configurations. If it's your case, you should definitly go for &lt;a href="https://github.com/nvim-lua/kickstart.nvim" rel="noopener noreferrer"&gt;Kickstart&lt;/a&gt; and use it for a while until you feel confident enough to write you own config or use something different, like &lt;a href="https://www.lazyvim.org" rel="noopener noreferrer"&gt;LazyVim&lt;/a&gt; if you prefer.&lt;/p&gt;

&lt;p&gt;Here is a list of plugins I use and recommend:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/mfussenegger/nvim-dap" rel="noopener noreferrer"&gt;Dap&lt;/a&gt; - Debugger.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/rawnly/gist.nvim" rel="noopener noreferrer"&gt;Gist&lt;/a&gt; - Easily create gists.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/sindrets/diffview.nvim" rel="noopener noreferrer"&gt;Diffview&lt;/a&gt; - As the name says, a diff view.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ThePrimeagen/harpoon" rel="noopener noreferrer"&gt;Harpoon&lt;/a&gt; - Hop between marked files faster.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/iamcco/markdown-preview.nvim" rel="noopener noreferrer"&gt;Markdown Preview&lt;/a&gt; - A markdown previewer.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/williamboman/mason.nvim" rel="noopener noreferrer"&gt;Mason&lt;/a&gt; - Install LSP's, linters, formatters, etc.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/VonHeikemen/lsp-zero.nvim" rel="noopener noreferrer"&gt;LSP Zero&lt;/a&gt; - Easy LSP setup.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/L3MON4D3/LuaSnip" rel="noopener noreferrer"&gt;Luasnip&lt;/a&gt; - Code snippets.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/NeogitOrg/neogit" rel="noopener noreferrer"&gt;Neogit&lt;/a&gt; - Take git actions from Neovim.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/nvim-pack/nvim-spectre" rel="noopener noreferrer"&gt;Spectre&lt;/a&gt; - Project wide find and replace.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/folke/trouble.nvim" rel="noopener noreferrer"&gt;Trouble&lt;/a&gt; - Pretty display lists for diagnostics, quickfix, telescope results, etc.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/folke/zen-mode.nvim" rel="noopener noreferrer"&gt;Zenmode&lt;/a&gt; - Distraction-free coding (I use it most when I'm writing articles).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I've not included the most common ones like &lt;a href="https://github.com/nvim-treesitter/nvim-treesitter" rel="noopener noreferrer"&gt;Treesitter&lt;/a&gt; or &lt;a href="https://github.com/hrsh7th/nvim-cmp" rel="noopener noreferrer"&gt;Cmp&lt;/a&gt;, because everybody already uses those. If you want to see the other plugins either way, take a look at &lt;a href="https://github.com/datsfilipe/datsnvim/tree/main/lua/plugins" rel="noopener noreferrer"&gt;my repository&lt;/a&gt; and search for them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Considerations
&lt;/h2&gt;

&lt;p&gt;Thanks for taking a look at a blog about my development environment, I hope you enjoyed it and also that you found something useful for you. This was supposed to be a short blog and at least my expectations were met. Feel free to give feedback on the blog content, linked resources, or language (I'm learning).&lt;/p&gt;

</description>
      <category>linux</category>
      <category>neovim</category>
      <category>git</category>
      <category>development</category>
    </item>
    <item>
      <title>Why aren't you using Astro?</title>
      <dc:creator>Filipe Lima</dc:creator>
      <pubDate>Thu, 17 Aug 2023 00:00:00 +0000</pubDate>
      <link>https://forem.com/datsfilipe/why-arent-you-using-astro-5a1k</link>
      <guid>https://forem.com/datsfilipe/why-arent-you-using-astro-5a1k</guid>
      <description>&lt;p&gt;First of all, if you don't know &lt;a href="https://astro.build" rel="noopener noreferrer"&gt;Astro&lt;/a&gt; yet, take a look at their website and repository, they're doing a great job. Of course I'm going to tell you what it is here anyways.&lt;/p&gt;

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

&lt;p&gt;Astro is a performant web framework for building content-focused websites. It is a server-first solution, which means that it generates static HTML at build time. Besides having a lot of features, Astro tries to keep being simple and flexible.&lt;/p&gt;

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

&lt;p&gt;You might want to use Astro for building blogs, documentation sites, portfolios, and more. It is a great solution for content-focused websites, but it can also be used for other types of websites.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Astro?
&lt;/h2&gt;

&lt;p&gt;So, let's say you want to build your own portfolio, why should you use Astro instead of other solutions? here are some valid points:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Astro was made with focus on performance.&lt;/li&gt;
&lt;li&gt;Astro integrations let you extend the framework with a lot of features.&lt;/li&gt;
&lt;li&gt;Astro is flexible and simple, most of the time you will be writing HTML, CSS and JavaScript.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's dive in a little bit more on each of these points.&lt;/p&gt;

&lt;h3&gt;
  
  
  Performance
&lt;/h3&gt;

&lt;p&gt;Astro being a server-first solution means it will ship by default less JavaScript to the client, which is great for performance.&lt;/p&gt;

&lt;p&gt;Since &lt;code&gt;v0.21&lt;/code&gt; Astro is built with &lt;a href="https://vitejs.dev" rel="noopener noreferrer"&gt;Vite&lt;/a&gt;, which has a lot of performance improvements for your development experience and build optimization.&lt;/p&gt;

&lt;h3&gt;
  
  
  Integrations
&lt;/h3&gt;

&lt;p&gt;Astro have a &lt;a href="https://astro.build/integrations" rel="noopener noreferrer"&gt;variety of integrations&lt;/a&gt; that you can use to extend the framework with features. For example, you can use the &lt;a href="https://docs.astro.build/en/guides/integrations-guide/tailwind" rel="noopener noreferrer"&gt;Tailwind integration&lt;/a&gt; to have it working on your website easily. &lt;/p&gt;

&lt;p&gt;You can also add &lt;a href="https://docs.astro.build/en/recipes/add-yaml-support" rel="noopener noreferrer"&gt;Vite/Rollup plugins&lt;/a&gt; to your Astro project!&lt;/p&gt;

&lt;p&gt;To add integrations, take a look at &lt;a href="https://docs.astro.build/en/guides/integrations-guide" rel="noopener noreferrer"&gt;their integrations guide&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Flexibility and simplicity
&lt;/h3&gt;

&lt;p&gt;Astro syntax is very similar to HTML, CSS and JavaScript, take a look at this example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;---
import { Foo } from './components/Foo.astro'
import { Bar } from './components/Bar' // React component
---
&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"en"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;My Astro Site&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;foo/&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;bar&lt;/span&gt; &lt;span class="na"&gt;client:load&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/bar&amp;gt;&lt;/span&gt; &lt;span class="c"&gt;&amp;lt;!-- it needs client:load specification to run on client side --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script&amp;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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello from Astro!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, it is very straightforward, the first part is executed on the server, so you can import modules and do other stuff.&lt;/p&gt;

&lt;p&gt;Also, the bottom part is &lt;strong&gt;&lt;em&gt;almost&lt;/em&gt;&lt;/strong&gt; just &lt;code&gt;html&lt;/code&gt;, so you can have have tags like &lt;code&gt;script&lt;/code&gt;. Which means you can have interactivity on your website without using any UI framework. &lt;/p&gt;

&lt;p&gt;And just like that you just have created a page, easy right?&lt;/p&gt;

&lt;h4&gt;
  
  
  Components
&lt;/h4&gt;

&lt;p&gt;You can have &lt;code&gt;.astro&lt;/code&gt; components that follows the same syntax as the pages. To use a component inside another component you can make use of the &lt;code&gt;&amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt;&lt;/code&gt; tag (for React folks, it's like &lt;code&gt;children&lt;/code&gt;). Let's see an example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;---
import { Foo } from './components/Foo.astro'
---
&lt;span class="nt"&gt;&amp;lt;foo&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Hello from Astro!&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/foo&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And in your &lt;code&gt;Foo.astro&lt;/code&gt; component:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;slot&amp;gt;&amp;lt;/slot&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Obs: you can omit the top part if you don't need to have anything being executed from the server.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Other Important Points
&lt;/h2&gt;

&lt;p&gt;Astro have some other amazing features that you might love, like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Besides being &lt;code&gt;SSG&lt;/code&gt; by default, you can also have &lt;code&gt;SSR&lt;/code&gt; or &lt;code&gt;SSG + SSR&lt;/code&gt; at the same time in your project, look at &lt;a href="https://docs.astro.build/en/guides/server-side-rendering" rel="noopener noreferrer"&gt;their documentation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;It has &lt;strong&gt;API endpoints&lt;/strong&gt;, so you can fetch data from your backend or third-party APIs, just like you would do with Next.js. It also support creating &lt;strong&gt;middlewares&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;It has &lt;strong&gt;Markdown support&lt;/strong&gt;, so you can write your content in Markdown and Astro will convert it to HTML. Yes, you can have Markdown and Mdx pages.&lt;/li&gt;
&lt;li&gt;Their &lt;strong&gt;content collections&lt;/strong&gt; feature allows you to deliver content from a folder in your project, so you can easily have a blog with Astro. It is an awesome approach that integrates well with the ecosystem.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;I've created this article with the intetion to present a great solution for creating websites. Hopefully I've made you interested in Astro and you will give it a try.&lt;/p&gt;

&lt;p&gt;I hope you liked this, have a great day!&lt;/p&gt;

</description>
      <category>astro</category>
      <category>framework</category>
      <category>webdev</category>
      <category>react</category>
    </item>
  </channel>
</rss>
