<?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: Alex Oliveira</title>
    <description>The latest articles on DEV Community by Alex Oliveira (@alekswheeler).</description>
    <link>https://dev.to/alekswheeler</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3038445%2F30b9ff5c-1158-44ae-87f1-ebab1a4cc056.jpg</url>
      <title>DEV Community: Alex Oliveira</title>
      <link>https://dev.to/alekswheeler</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/alekswheeler"/>
    <language>en</language>
    <item>
      <title>Como Transformei o Armazenamento do Meu Site sem Mudar uma Linha do Frontend (e ainda deixei tudo mais seguro)</title>
      <dc:creator>Alex Oliveira</dc:creator>
      <pubDate>Wed, 09 Sep 2026 20:38:24 +0000</pubDate>
      <link>https://dev.to/alekswheeler/como-transformei-o-armazenamento-do-meu-site-sem-mudar-uma-linha-do-frontend-e-ainda-deixei-tudo-hh4</link>
      <guid>https://dev.to/alekswheeler/como-transformei-o-armazenamento-do-meu-site-sem-mudar-uma-linha-do-frontend-e-ainda-deixei-tudo-hh4</guid>
      <description>&lt;p&gt;👋 Olá! Meu nome é Alex, sou Engenheiro de Software e entusiasta de arquitetura de sistemas. Atualmente focado em resolver problemas reais com código limpo e infraestrutura inteligente. Acompanhe meus artigos para ver como transformo desafios complexos em soluções pragmáticas.&lt;/p&gt;




&lt;p&gt;Se tem uma coisa que incomoda qualquer desenvolvedor web é ver o repositório do projeto crescendo descontroladamente por causa de imagens e documentos. Foi exatamente esse o ponto de partida da minha jornada técnica mais recente.&lt;/p&gt;

&lt;h3&gt;
  
  
  O Cenário (ou o "Caos Controlado" inicial)
&lt;/h3&gt;

&lt;p&gt;Até ontem, o site funcionava de um jeito clássico: &lt;strong&gt;tudo na &lt;code&gt;wwwroot&lt;/code&gt;&lt;/strong&gt;. &lt;br&gt;
Quando precisávamos adicionar uma foto nova ao catálogo, ela ia direto para a pasta do projeto. Isso parecia prático no início, mas rapidamente se tornou um pesadelo: o repositório do Git ficou pesado, o deploy demorava uma eternidade e clonar o repositório também.&lt;/p&gt;

&lt;p&gt;O estopim foi quando decidimos migrar para um &lt;strong&gt;serviço de armazenamento open-source externo&lt;/strong&gt;. Ele era ótimo, barato e escalável, mas tinha um detalhe: &lt;strong&gt;exigia autenticação até para os GETs&lt;/strong&gt;. Ou seja, para exibir uma simples imagem pública, eu precisava de um token de autorização.&lt;/p&gt;

&lt;p&gt;E aqui vinha o grande dilema: se eu colocasse o link direto do storage no HTML, o navegador bateria de frente com um &lt;code&gt;401 Unauthorized&lt;/code&gt;. Se eu deixasse na &lt;code&gt;wwwroot&lt;/code&gt;, eu não usaria o storage. Como resolver isso sem reescrever o frontend inteiro?&lt;/p&gt;

&lt;h3&gt;
  
  
  A Solução (Primeira Fase): O "Proxy de Mídia" com Interceptação Inteligente
&lt;/h3&gt;

&lt;p&gt;A ideia foi simples na teoria, mas deliciosa na prática: &lt;strong&gt;transformar o próprio Backend em um Proxy Autenticado&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Criei um Middleware/Controller que intercepta &lt;strong&gt;todas as requisições que antes iam para a &lt;code&gt;wwwroot&lt;/code&gt;&lt;/strong&gt; (como &lt;code&gt;/imagens/*&lt;/code&gt; e &lt;code&gt;/documentos/*&lt;/code&gt;). Em vez de o servidor procurar o arquivo no disco, ele "segura" a requisição e assume o controle total do processo.&lt;/p&gt;

&lt;p&gt;O fluxo ficou assim:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;O usuário acessa a URL que sempre acessou (ex: &lt;code&gt;www.meusite.com/imagens/carro.jpg&lt;/code&gt;). Transparência total.&lt;/li&gt;
&lt;li&gt;O Backend recebe a requisição, mas &lt;strong&gt;não&lt;/strong&gt; vai na &lt;code&gt;wwwroot&lt;/code&gt; em busca do arquivo.&lt;/li&gt;
&lt;li&gt;Ele pega o &lt;code&gt;access_token&lt;/code&gt; que está guardado em memória (em uma variável estática/Singleton) no servidor, gerenciado com renovação automática via credenciais do &lt;code&gt;.env&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Com esse token, ele abre uma requisição HTTP &lt;em&gt;interna&lt;/em&gt; (servidor-para-servidor) para o storage externo, baixa os bytes da imagem.&lt;/li&gt;
&lt;li&gt;Por fim, ele devolve esses bytes para o navegador com o &lt;code&gt;Content-Type&lt;/code&gt; correto, como se o arquivo estivesse ali fisicamente.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  A Jornada é Gradual (E tudo bem!)
&lt;/h3&gt;

&lt;p&gt;É importante destacar que essa foi a &lt;strong&gt;primeira etapa&lt;/strong&gt; da arquitetura. Resolvemos o problema da &lt;strong&gt;leitura e exibição&lt;/strong&gt; (GET) do catálogo de imagens. Portanto, neste exato momento, os uploads de imagens feitos pelos usuários no site ainda continuam sendo salvos localmente na &lt;code&gt;wwwroot&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;O próximo passo do projeto é justamente adaptar o endpoint de upload para que, em vez de escrever no disco, ele faça um POST autenticado diretamente para o storage externo. Quando essa fase estiver concluída, aí sim teremos o desacoplamento total e a &lt;code&gt;wwwroot&lt;/code&gt; finalmente ficará livre de arquivos gerados pelos usuários — restando apenas os arquivos estáticos essenciais (CSS, JS e fontes).&lt;/p&gt;

&lt;h3&gt;
  
  
  Os Ganhos (Mesmo na Fase Inicial)
&lt;/h3&gt;

&lt;p&gt;Mesmo sendo uma implementação parcial, os benefícios já são enormes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Repositório Levíssimo&lt;/strong&gt;: Os arquivos do catálogo (que não eram gerados por upload, mas sim estáticos do projeto) já saíram do repositório. O Git clona em segundos e os deploys ficaram muito mais rápidos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Armazenamento Escalável&lt;/strong&gt;: As imagens pesadas do catálogo agora estão em um storage dedicado. Podemos guardar gigabytes sem preocupação com o espaço finito do servidor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Segurança Total&lt;/strong&gt;: O token de autorização do storage nunca, em hipótese alguma, chega ao navegador. Ele fica restrito à memória do servidor. Mesmo que alguém inspecione o tráfego, só verá a requisição para o meu domínio, e não para o storage original.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transparência e Migração Zero&lt;/strong&gt;: Como a URL permaneceu idêntica (&lt;code&gt;/imagens/foto.jpg&lt;/code&gt;), o frontend não precisou ser reescrito. O usuário final nem percebeu a mudança nos bastidores — exatamente como deve ser.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Aprendizado Final
&lt;/h3&gt;

&lt;p&gt;Essa implementação me lembrou que, às vezes, a melhor solução não está em mudar a interface do usuário, mas sim em engenhar o fluxo de dados nos bastidores. E, mais do que isso, me ensinou a valorizar a &lt;strong&gt;entrega incremental&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Resolvemos a dor mais urgente (a &lt;code&gt;wwwroot&lt;/code&gt; gorda e o acesso autenticado para GETs) sem paralisar o projeto. O upload e outras boas práticas, como mecanismos de performance, virão nas próximas iterações. No fim das contas, engenharia de software é sobre fazer escolhas conscientes e resolver problemas na ordem certa — e hoje, o site está mais leve, mais seguro e pronto para o próximo passo.&lt;/p&gt;




&lt;p&gt;🤖 Transparência Tecnológica: Este artigo foi desenvolvido com o suporte de Inteligência Artificial generativa (Co-Authored By AI), que atuou como meu "pair programmer" para revisar conceitos e agilizar a escrita. A curadoria final, a validação técnica de cada linha de código e a responsabilidade sobre as decisões arquiteturais são 100% minhas.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>blazor</category>
      <category>dotnet</category>
    </item>
    <item>
      <title>Commit gerado por IA no CLI</title>
      <dc:creator>Alex Oliveira</dc:creator>
      <pubDate>Wed, 13 Aug 2025 13:23:47 +0000</pubDate>
      <link>https://dev.to/alekswheeler/commit-gerado-por-ia-no-cli-89i</link>
      <guid>https://dev.to/alekswheeler/commit-gerado-por-ia-no-cli-89i</guid>
      <description>&lt;h1&gt;
  
  
  Como Criar Mensagens de Commit Inteligentes com Gemini API no Linux
&lt;/h1&gt;

&lt;p&gt;Cansado de escrever mensagens de commit? Vamos automatizar isso usando a API gratuita do Google Gemini! 🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 O que vamos construir
&lt;/h2&gt;

&lt;p&gt;Um comando que analisa suas mudanças de código e gera mensagens de commit seguindo conventional commits, copiando diretamente para sua área de transferência para colar no VS Code.&lt;/p&gt;

&lt;h2&gt;
  
  
  📋 Pré-requisitos
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Node.js instalado&lt;/li&gt;
&lt;li&gt;Git configurado&lt;/li&gt;
&lt;li&gt;Conta Google (para API key)&lt;/li&gt;
&lt;li&gt;Linux (Ubuntu, Debian, Arch, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔧 Passo 1: Obter a API Key do Gemini
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Acesse &lt;a href="https://aistudio.google.com" rel="noopener noreferrer"&gt;Google AI Studio&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Faça login com sua conta Google&lt;/li&gt;
&lt;li&gt;Clique em &lt;strong&gt;"Get API Key"&lt;/strong&gt; no menu lateral&lt;/li&gt;
&lt;li&gt;Clique em &lt;strong&gt;"Create API Key"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Copie e guarde a chave (ela só aparece uma vez!)&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  📦 Passo 2: Instalar dependências
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Instalar CLI oficial do Gemini&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @google/gemini-cli

&lt;span class="c"&gt;# Instalar xclip para clipboard (Ubuntu/Debian)&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;xclip

&lt;span class="c"&gt;# Para Arch Linux&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;pacman &lt;span class="nt"&gt;-S&lt;/span&gt; xclip

&lt;span class="c"&gt;# Para Fedora/CentOS&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;dnf &lt;span class="nb"&gt;install &lt;/span&gt;xclip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ⚙️ Passo 3: Configurar o Gemini CLI
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Configurar sua API key&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export GOOGLE_CLOUD_PROJECT="YOUR_PROJECT_ID"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc

&lt;span class="c"&gt;# Atualizar o bashrc (~/.zshrc ou ~/.profile)&lt;/span&gt;
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc

&lt;span class="c"&gt;# Verificar se funcionou&lt;/span&gt;
gemini &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s2"&gt;"Olá, você está funcionando?"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📝 Passo 4: Criar o script
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Criar diretório para scripts pessoais&lt;/span&gt;
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/bin

&lt;span class="c"&gt;# Criar o arquivo do script&lt;/span&gt;
nano ~/bin/gemini-commit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cole este conteúdo no arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash
# ~/bin/gemini-commit

DIFF=$(git diff --cached)
if [ -z "$DIFF" ]; then
  echo "❌ Nenhuma mudança staged. Use 'git add' primeiro."
  exit 1
fi

echo "🤖 Gerando mensagem de commit..."

COMMIT_MSG=$(gemini -p "Analise este diff e crie uma mensagem de commit concisa usando conventional commits em português (feat:, fix:, docs:, refactor:, style:, test:, chore:). Máximo 50 caracteres no título. Gere uma mensagem detalhada das mudanças mas seja breve. IMPORTANTE: Responda APENAS com a mensagem de commit, sem formatação markdown, sem crases, sem explicações extras.

Diff:
$DIFF")

if [ -n "$COMMIT_MSG" ]; then
  # Remover caracteres markdown e limpar
  COMMIT_MSG=$(echo "$COMMIT_MSG" | sed 's/```

//g' | sed 's/^[[:space:]]*//' | sed 's/[[:space:]]*$//')

  echo ""
  echo "✅ Mensagem gerada:"
  echo "📋 Copie o texto abaixo:"
  echo ""
  echo -e "\033[1;32m$COMMIT_MSG\033[0m"
  echo ""
  echo "📝 Cole no VS Code e commit!"
else
  echo "❌ Erro ao gerar mensagem"
fi


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  🔐 Passo 5: Tornar executável e configurar PATH
&lt;/h2&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
# Tornar o script executável
chmod +x ~/bin/gemini-commit

# Adicionar ~/bin ao PATH (se ainda não estiver)
echo 'export PATH="$HOME/bin:$PATH"' &amp;gt;&amp;gt; ~/.bashrc

# Criar um alias conveniente
echo 'alias gcm="gemini-commit"' &amp;gt;&amp;gt; ~/.bashrc

# Recarregar configurações
source ~/.bashrc


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  🚀 Como usar
&lt;/h2&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
# 1. Fazer suas alterações no código
echo "nova funcionalidade" &amp;gt;&amp;gt; arquivo.js

# 2. Adicionar ao stage
git add .

# 3. Gerar mensagem de commit
gcm

# 4. Ir no VS Code e colar (Ctrl+V) na caixinha de commit
# 5. Revisar e commitar normalmente


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  🎨 Exemplo de uso
&lt;/h2&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
$ git add .
$ gcm

🤖 Gerando mensagem de commit...
✅ Mensagem copiada para clipboard!
💡 Mensagem: feat: adiciona validação de email no formulário de cadastro

📝 Agora é só colar (Ctrl+V) na caixinha do VS Code!


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  ⚡ Customização
&lt;/h2&gt;

&lt;p&gt;Você pode personalizar o prompt editando o script:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
nano ~/bin/gemini-commit


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Modifique a parte do prompt para suas necessidades:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Idioma (português/inglês)&lt;/li&gt;
&lt;li&gt;Estilo de mensagem&lt;/li&gt;
&lt;li&gt;Regras específicas&lt;/li&gt;
&lt;li&gt;Tamanho máximo&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🔍 Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Comando não encontrado
&lt;/h3&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
# Verificar se ~/bin está no PATH
echo $PATH | grep "$HOME/bin"

# Se não estiver, adicionar novamente
echo 'export PATH="$HOME/bin:$PATH"' &amp;gt;&amp;gt; ~/.bashrc
source ~/.bashrc


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Erro de API
&lt;/h3&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
# Verificar configuração
gemini config list

# Reconfigurar se necessário
echo 'export GOOGLE_CLOUD_PROJECT="YOUR_PROJECT_ID"' &amp;gt;&amp;gt; ~/.bashrc

# Atualizar o bashrc (~/.zshrc ou ~/.profile)
source ~/.bashrc


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  xclip não funciona
&lt;/h3&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
bash
# Instalar xclip
sudo apt install xclip

# Ou usar alternativa
sudo apt install xsel
# E no script trocar por: echo "$COMMIT_MSG" | xsel --clipboard


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  💡 Vantagens desta abordagem
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Gratuito&lt;/strong&gt;: API do Gemini tem tier gratuito generoso&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Rápido&lt;/strong&gt;: Resposta em segundos&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Flexível&lt;/strong&gt;: Prompt totalmente customizável&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Integrado&lt;/strong&gt;: Funciona perfeitamente com VS Code&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Conventional Commits&lt;/strong&gt;: Segue padrões da indústria&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Offline-friendly&lt;/strong&gt;: Só precisa de internet na hora da geração&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🤝 Contribuição
&lt;/h2&gt;

&lt;p&gt;Encontrou uma melhoria? Compartilhe nos comentários! Este setup pode ser expandido para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Suporte a múltiplas linguagens&lt;/li&gt;
&lt;li&gt;Templates de mensagem por tipo de projeto&lt;/li&gt;
&lt;li&gt;Integração com hooks do Git&lt;/li&gt;
&lt;li&gt;Análise de contexto do projeto&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Gostou?&lt;/strong&gt; Deixe um ❤️ e compartilhe com outros devs que também querem commits mais inteligentes!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI generated content&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>cli</category>
      <category>gemini</category>
      <category>git</category>
    </item>
    <item>
      <title>Tools and Techniques That Help Me Stay Productive as a Developer</title>
      <dc:creator>Alex Oliveira</dc:creator>
      <pubDate>Wed, 16 Apr 2025 22:45:34 +0000</pubDate>
      <link>https://dev.to/alekswheeler/tools-and-techniques-that-help-me-stay-productive-as-a-developer-382b</link>
      <guid>https://dev.to/alekswheeler/tools-and-techniques-that-help-me-stay-productive-as-a-developer-382b</guid>
      <description>&lt;p&gt;I'm someone who needs to organize and track tasks and habits to stay on course. Tracking helps me reflect on my actions throughout the day or week and adjust them if necessary.  &lt;/p&gt;

&lt;p&gt;Productivity is something I particularly enjoy—not because I'm naturally good at it, but because it's a continuous process. For me, it's mostly about learning more about myself. I think about this a lot because our days often feel rushed. We need to work, make time to study, and take care of ourselves.  &lt;/p&gt;

&lt;p&gt;It's easy to only do what we enjoy, but if we ignore the rest, things can quickly get out of balance. Tracking your habits and organizing your routine are great ways to identify what you're missing, recognize when you're most productive, and take steps to improve how you use your time.&lt;/p&gt;




&lt;h2&gt;
  
  
  Tools I Use
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;a href="https://github.com/iSoron/uhabits" rel="noopener noreferrer"&gt;Loop Habit Tracker&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fkozpgy4fajtuuhudclmg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fkozpgy4fajtuuhudclmg.png" alt="showing a screen in the habit app" width="800" height="1422"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.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%2Frjzouamqhhc65cr4zzss.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Frjzouamqhhc65cr4zzss.png" alt="screen that describes the statistics of a habit in a loop" width="800" height="1422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Want to start a new habit and make sure it sticks? This open-source app is available on Android. You can track habits like pages read per day, gym visits, and more.&lt;br&gt;&lt;br&gt;
Check out the &lt;a href="https://github.com/iSoron/uhabits" rel="noopener noreferrer"&gt;code&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. &lt;a href="https://toggl.com/" rel="noopener noreferrer"&gt;Toggl Track&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2F23l1xig1uixztgdyo9dm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2F23l1xig1uixztgdyo9dm.png" alt="Toggl track image" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Toggl Track is a time-tracking tool that helps you visualize how your time is spent—coding, working, studying, or whatever your focus may be. It generates reports in tables, bar charts, and even donut (pizza) charts 🍕.  &lt;/p&gt;

&lt;p&gt;You only need to set up a project and a description once, and after that, it's just one click to start tracking again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Favorite features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Time goals:&lt;/strong&gt; You can set weekly, monthly, or daily goals. I use it to keep a consistent number of hours dedicated to studying each week.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pomodoro timer:&lt;/strong&gt; Available on the desktop app, browser extension, and mobile app. You can customize how long your focus and break blocks last.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automatic tracking:&lt;/strong&gt; On the desktop version, you can set triggers (like a specific web page or app) to start tracking automatically.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Team features:&lt;/strong&gt; If you work with a team or clients, Toggl allows you to manage projects, set hourly rates, and generate reports and invoices.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. &lt;a href="https://www.notion.com/pt" rel="noopener noreferrer"&gt;Notion&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;I use Notion to take notes and track my goals (career, study, health, etc.).  &lt;/p&gt;

&lt;p&gt;Think of it as a powerful notebook for everything you can imagine. It supports databases, automations, and structures that you can customize to suit your needs. Create reading lists, set life goals, plan your week—you name it.  &lt;/p&gt;

&lt;p&gt;You can also start with a &lt;a href="https://www.notion.com/pt/templates" rel="noopener noreferrer"&gt;template&lt;/a&gt; to make setup easier.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Calendar
&lt;/h3&gt;

&lt;p&gt;Calendars are great for planning your week or month. Add your fixed appointments and you'll get a better picture of your available time.  &lt;/p&gt;

&lt;p&gt;Block time for studying, exercising, reading, and more. You can also connect your calendar to tools like Toggl through integrations.  &lt;/p&gt;

&lt;p&gt;This helps prevent overplanning and lets you realistically see how much you can do in a day.&lt;/p&gt;




&lt;h2&gt;
  
  
  Techniques I Use
&lt;/h2&gt;

&lt;p&gt;These are strategies I apply both with and without digital tools:&lt;/p&gt;

&lt;h3&gt;
  
  
  Eisenhower Matrix
&lt;/h3&gt;

&lt;p&gt;This technique helps you prioritize tasks by urgency and importance. It’s a great way to identify what needs your attention and what can be delegated, scheduled, or even eliminated.  &lt;/p&gt;

&lt;p&gt;It gives you clarity and helps reduce mental overload.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Ftz41rx25tc8bd2v2fwd5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Ftz41rx25tc8bd2v2fwd5.png" alt="Eisenhower description" width="800" height="398"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://media2.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%2Feom4412zjlzk5onxjrnc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Feom4412zjlzk5onxjrnc.png" alt="Eisenhower matrix" width="800" height="820"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Credits: &lt;a href="https://asana.com/resources/eisenhower-matrix" rel="noopener noreferrer"&gt;Asana&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Pomodoro Technique
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.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%2Fmwhryikyefgre7vn3p6s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.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%2Fmwhryikyefgre7vn3p6s.png" alt="pomodoro and pomodorito technique" width="800" height="551"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Credits: &lt;a href="https://alvaromontoro.com/blog/68016/the-pomodorito-technique" rel="noopener noreferrer"&gt;Alvaro Montoro&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pomodoro works for me in two main ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;To start tasks:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Starting can be tough if you're prone to procrastination, but telling yourself to just do 25 minutes makes it much easier to begin.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;To improve focus:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
You break work into focused sessions, which is more effective since most people struggle to stay concentrated for long stretches.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  To-do Lists
&lt;/h3&gt;

&lt;p&gt;To-do lists are powerful! Starting the day with small tasks already listed helps you avoid wasting time wondering "what should I do next?"  &lt;/p&gt;

&lt;p&gt;But be careful—don’t overload your list without considering how much time each task will actually take. That’s where combining your list with a calendar becomes super helpful.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;You don't need tons of tools to be more productive. Start small—pick one and see how it fits your workflow.  &lt;/p&gt;

&lt;p&gt;Productivity is about understanding how you work, your habits, and your preferences, then using that knowledge to move toward your goals.  &lt;/p&gt;

&lt;p&gt;Don't try to build too many habits at once. Creating just one new habit is already hard. Be realistic and start small again.  &lt;/p&gt;

&lt;p&gt;Best regards,&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Aleks&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>discuss</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
