<?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: Germán Aliprandi</title>
    <description>The latest articles on DEV Community by Germán Aliprandi (@galiprandi).</description>
    <link>https://dev.to/galiprandi</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%2F1481584%2F2c1decca-b979-499f-b00d-a2905d446d69.png</url>
      <title>DEV Community: Germán Aliprandi</title>
      <link>https://dev.to/galiprandi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/galiprandi"/>
    <language>en</language>
    <item>
      <title>I Open Sourced a Tool That Lets Your AI Coding Agent Apply to Jobs for You</title>
      <dc:creator>Germán Aliprandi</dc:creator>
      <pubDate>Sun, 09 Aug 2026 02:29:49 +0000</pubDate>
      <link>https://dev.to/galiprandi/i-open-sourced-a-tool-that-lets-your-ai-coding-agent-apply-to-jobs-for-you-14n</link>
      <guid>https://dev.to/galiprandi/i-open-sourced-a-tool-that-lets-your-ai-coding-agent-apply-to-jobs-for-you-14n</guid>
      <description>&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwo487bau2gicjo05o4ak.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwo487bau2gicjo05o4ak.png" alt="Job Seeker Dashboard" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After months of manually scrolling job boards and filling the same Easy Apply form 200 times, I decided to automate it. But not with a SaaS or a Chrome extension. With the coding agent I already use every day.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;The average tech job seeker spends 5-8 hours per week on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Searching LinkedIn with the same filters&lt;/li&gt;
&lt;li&gt;Filling Easy Apply forms that ask the same 15 questions&lt;/li&gt;
&lt;li&gt;Tracking applications in a spreadsheet that's always out of date&lt;/li&gt;
&lt;li&gt;Drafting replies to recruiters while trying not to sound like a robot&lt;/li&gt;
&lt;li&gt;Forgetting which companies they already applied to&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The solution: skills, not code
&lt;/h2&gt;

&lt;p&gt;I built Job Seeker, an open source set of markdown skills that any coding agent (Devin, Claude, Cursor, opencode) can consume. Your agent reads the skills, uses a playwright-cli wrapper for browser automation, and stores everything in a Postgres database.&lt;/p&gt;

&lt;p&gt;It's not an agent. It's the instructions and scripts that make your agent a job search assistant.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You: "apply to 5 jobs"
  -&amp;gt; Agent loads your profile from DB
  -&amp;gt; Searches LinkedIn with your Must-have filters
  -&amp;gt; Applies via Easy Apply (form data from DB)
  -&amp;gt; Registers every application
  -&amp;gt; Shows you a summary
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  9 flows
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Flow&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;onboarding&lt;/td&gt;
&lt;td&gt;Browser setup, Gmail + LinkedIn login, DB creation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;profile&lt;/td&gt;
&lt;td&gt;CV extraction + 30-preference questionnaire with Must/Strong/Nice weights&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;strategy&lt;/td&gt;
&lt;td&gt;passive/selective/active/aggressive levels&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;apply&lt;/td&gt;
&lt;td&gt;LinkedIn search + Easy Apply&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;news&lt;/td&gt;
&lt;td&gt;Gmail + LinkedIn inbox review, draft replies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;daily&lt;/td&gt;
&lt;td&gt;Runs news + apply automatically&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;radar&lt;/td&gt;
&lt;td&gt;Register on job boards, set up alerts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;targets&lt;/td&gt;
&lt;td&gt;Apply directly to 40 target companies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;memory&lt;/td&gt;
&lt;td&gt;Autonomous preference detection and storage&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Key design decisions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Skills as markdown.&lt;/strong&gt; Any agent that reads markdown can use them. No vendor lock-in, no API keys, no SaaS dependency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Candidate-agnostic repo.&lt;/strong&gt; No personal data in any tracked file. Everything lives in your own Neon Postgres DB. Clone, run onboarding, done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Browser isolation.&lt;/strong&gt; Dedicated Chrome profile via playwright-cli wrapper. Headless by default, headed only for manual login and 2FA. The agent never handles credentials.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Strategy levels.&lt;/strong&gt; passive, selective, active, aggressive. Each controls batch sizes, frequency, match thresholds, and which Must-haves to relax. Pick a level and all flows respect it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Anti-LLM messages.&lt;/strong&gt; Recruiter replies pass a checklist: no em-dashes, no bullet points in DMs, conversational tone, max 2 short paragraphs, mimic the user's style profile from DB.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Form data from DB only.&lt;/strong&gt; The agent never invents values. If a field is missing, it stops, asks the user, saves the answer, and continues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/galiprandi/job-seeker.git
&lt;span class="nb"&gt;cd &lt;/span&gt;job-seeker
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a &lt;code&gt;.env&lt;/code&gt; with your Neon Postgres connection string, then tell your coding agent: "run the onboarding skill."&lt;/p&gt;

&lt;p&gt;After onboarding: "apply to 5 jobs" or "check for updates."&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Repo:&lt;/strong&gt; &lt;a href="https://github.com/galiprandi/job-seeker" rel="noopener noreferrer"&gt;https://github.com/galiprandi/job-seeker&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docs:&lt;/strong&gt; &lt;a href="https://galiprandi.github.io/job-seeker/" rel="noopener noreferrer"&gt;https://galiprandi.github.io/job-seeker/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Demo:&lt;/strong&gt; &lt;a href="https://github.com/galiprandi/job-seeker/releases/download/v0.1.0/demo-terminal.webm" rel="noopener noreferrer"&gt;https://github.com/galiprandi/job-seeker/releases/download/v0.1.0/demo-terminal.webm&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MIT licensed. If it helps you, give it a star.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>jobsearch</category>
      <category>career</category>
    </item>
    <item>
      <title>Introducing react-tools: A Toolbox for Streamlining React Development</title>
      <dc:creator>Germán Aliprandi</dc:creator>
      <pubDate>Fri, 24 May 2024 01:56:18 +0000</pubDate>
      <link>https://dev.to/galiprandi/introducing-react-tools-a-toolbox-for-streamlining-react-development-2f23</link>
      <guid>https://dev.to/galiprandi/introducing-react-tools-a-toolbox-for-streamlining-react-development-2f23</guid>
      <description>&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%2Fraw.githubusercontent.com%2Fgaliprandi%2Freact-tools%2Fc2f5fd07d40f5c66942dff453d91fd6bce17d97e%2Fsrc%2Fassets%2Freact-tools-slim.svg" 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%2Fraw.githubusercontent.com%2Fgaliprandi%2Freact-tools%2Fc2f5fd07d40f5c66942dff453d91fd6bce17d97e%2Fsrc%2Fassets%2Freact-tools-slim.svg" alt="react-tools"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Introducing &lt;code&gt;@galiprandi/react-tools&lt;/code&gt;: A Toolbox for Streamlining React Development
&lt;/h3&gt;

&lt;p&gt;Are you looking to simplify your React development process? Look no further than &lt;code&gt;@galiprandi/react-tools&lt;/code&gt;. This comprehensive package offers a range of intuitive utilities designed to enhance your React applications. Let's explore some of its key components and hooks:&lt;/p&gt;

&lt;h3&gt;
  
  
  Playground
&lt;/h3&gt;

&lt;p&gt;Before diving into the details, why not take a test drive? Visit the &lt;a href="https://stackblitz.com/edit/vitejs-vite-7c9m54?file=src%2FApp.tsx" rel="noopener noreferrer"&gt;@galiprandi/react-tools Playground&lt;/a&gt; to experiment with the components firsthand.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;p&gt;Getting started is a breeze. Simply install the package using your preferred package manager:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i @galiprandi/react-tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pnpm i @galiprandi/react-tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;yarn add @galiprandi/react-tools
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Components
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;&amp;lt;Form /&amp;gt;&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Simplify form creation with the &lt;code&gt;&amp;lt;Form /&amp;gt;&lt;/code&gt; component. This component wraps the &lt;code&gt;form&lt;/code&gt; HTML tag, offering a straightforward approach to building forms in your React application. Additional props like &lt;code&gt;onSubmitValues&lt;/code&gt; and &lt;code&gt;filterEmptyValues&lt;/code&gt; provide enhanced functionality.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;&amp;lt;Input /&amp;gt;&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Enhance user input experiences with the &lt;code&gt;&amp;lt;Input /&amp;gt;&lt;/code&gt; component. This reusable input wrapper adds consistency to your forms and accepts various props for customization, including &lt;code&gt;label&lt;/code&gt;, &lt;code&gt;onChangeValue&lt;/code&gt;, and &lt;code&gt;debounceDelay&lt;/code&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;&amp;lt;DateTime /&amp;gt;&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Need date and time input functionality? Look no further than the &lt;code&gt;&amp;lt;DateTime /&amp;gt;&lt;/code&gt; component. This wrapper around the native &lt;code&gt;input&lt;/code&gt; element with &lt;code&gt;type="datetime-local"&lt;/code&gt; offers convenient date selection with additional props for customization.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;&amp;lt;Dialog /&amp;gt;&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Create accessible dialogs and modals effortlessly with the &lt;code&gt;&amp;lt;Dialog /&amp;gt;&lt;/code&gt; component. This wrapper around the &lt;code&gt;dialog&lt;/code&gt; HTML tag simplifies dialog creation, with options for defining behavior, callbacks, and content.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;&amp;lt;Observer /&amp;gt;&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Track element visibility with the &lt;code&gt;&amp;lt;Observer /&amp;gt;&lt;/code&gt; component. Whether you're implementing lazy loading images or infinite scrolling, this component offers a straightforward solution for monitoring viewport interactions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hooks
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;useDebounce()&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Streamline asynchronous operations with the &lt;code&gt;useDebounce()&lt;/code&gt; hook. This simple yet powerful hook accepts a value and delay, returning a debounced value to optimize performance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Contribution
&lt;/h3&gt;

&lt;p&gt;Your contributions are valuable! Whether it's bug fixes, feature enhancements, or documentation improvements, contributions are welcome. Simply fork the repository, make your changes, and open a pull request.&lt;/p&gt;

&lt;h3&gt;
  
  
  License
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;@galiprandi/react-tools&lt;/code&gt; is licensed under the MIT License, providing flexibility for both personal and commercial use.&lt;/p&gt;

&lt;p&gt;Ready to simplify your React development workflow? Install &lt;a href="https://www.npmjs.com/package/@galiprandi/react-tools" rel="noopener noreferrer"&gt;@galiprandi/react-tools&lt;/a&gt; today and experience the difference firsthand. Happy coding!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>💡 La clave del desarrollo frontend eficiente: Composición sobre Programación</title>
      <dc:creator>Germán Aliprandi</dc:creator>
      <pubDate>Wed, 22 May 2024 17:48:10 +0000</pubDate>
      <link>https://dev.to/galiprandi/la-clave-del-desarrollo-frontend-eficiente-composicion-sobre-programacion-30cj</link>
      <guid>https://dev.to/galiprandi/la-clave-del-desarrollo-frontend-eficiente-composicion-sobre-programacion-30cj</guid>
      <description>&lt;p&gt;Cuando iniciamos el desarrollo de aplicaciones frontend, &lt;strong&gt;el primer paso crucial es la programación&lt;/strong&gt;. Este es el momento en el que sentamos las bases, diseñamos los componentes y establecemos la lógica fundamental.&lt;/p&gt;

&lt;p&gt;Sin embargo, una vez que esta fase inicial está bien hecha, la verdadera magia comienza. En lugar de continuar programando desde cero cada nueva funcionalidad, &lt;strong&gt;el enfoque debe cambiar a componer&lt;/strong&gt;. ¿Qué significa esto?&lt;/p&gt;

&lt;p&gt;🔹 &lt;strong&gt;Componentes Reutilizables&lt;/strong&gt;: Si hemos creado nuestros componentes de manera modular y reutilizable, podemos ensamblar nuevas funcionalidades simplemente combinando estos bloques de construcción existentes.&lt;br&gt;
🔹 &lt;strong&gt;Escalabilidad y Mantenimiento&lt;/strong&gt;: Este enfoque no solo acelera el desarrollo sino que también facilita el mantenimiento y la escalabilidad de la aplicación. Cambios en la lógica o el diseño se pueden implementar más fácilmente sin romper todo el sistema.&lt;br&gt;
🔹 &lt;strong&gt;Eficiencia y Calidad&lt;/strong&gt;: La composición nos permite enfocarnos en mejorar y optimizar las piezas existentes, garantizando una mayor calidad y coherencia en toda la aplicación.&lt;/p&gt;

&lt;p&gt;Una forma de saber si hemos hecho bien nuestro trabajo es observar que, a medida que el proyecto madure y avance, &lt;strong&gt;cada vez programaremos menos y compondremos más&lt;/strong&gt;, reutilizando las piezas de software que decidimos crear al comienzo del proyecto.&lt;/p&gt;

&lt;p&gt;Así que, al diseñar tus aplicaciones frontend, &lt;strong&gt;dedica el tiempo necesario a la fase inicial de programación&lt;/strong&gt;. Un buen cimiento permitirá que en el futuro, tu desarrollo sea más sobre ensamblar y menos sobre programar desde cero. La eficiencia y la calidad de tu software te lo agradecerán.&lt;/p&gt;

&lt;p&gt;¿Qué opinas sobre este enfoque? ¿Cómo has manejado la composición y programación en tus proyectos? ¡Me encantaría leer tus experiencias!&lt;/p&gt;

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