<?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: Luca Faggianelli</title>
    <description>The latest articles on DEV Community by Luca Faggianelli (@lucafaggianelli).</description>
    <link>https://dev.to/lucafaggianelli</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%2F465636%2Fe6bd266b-0822-4c05-982f-4f6c0396df5f.jpg</url>
      <title>DEV Community: Luca Faggianelli</title>
      <link>https://dev.to/lucafaggianelli</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lucafaggianelli"/>
    <language>en</language>
    <item>
      <title>I built the task manager I actually wanted, and it talks to itself over MCP</title>
      <dc:creator>Luca Faggianelli</dc:creator>
      <pubDate>Mon, 31 Aug 2026 18:51:35 +0000</pubDate>
      <link>https://dev.to/lucafaggianelli/i-built-the-task-manager-i-actually-wanted-and-it-talks-to-itself-over-mcp-2eie</link>
      <guid>https://dev.to/lucafaggianelli/i-built-the-task-manager-i-actually-wanted-and-it-talks-to-itself-over-mcp-2eie</guid>
      <description>&lt;p&gt;&lt;em&gt;Built for the &lt;a href="https://alltingsagentichackathon.devpost.com/" rel="noopener noreferrer"&gt;All Things Agentic Hackathon&lt;/a&gt; (Google Cloud x Devpost, August 2026)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I run two companies, I have a family I actually want to spend time with, and I keep starting more side projects than any reasonable person should. Every morning, the same thing happened: I'd open my task list and burn twenty minutes just deciding what to do — and a chunk of what was on there didn't need a human at all. It just needed doing.&lt;/p&gt;

&lt;p&gt;I wanted to build this for a while, then &lt;em&gt;All Things Agentic Hackathon&lt;/em&gt; arrived in my mailbox and I decided to do it, I built Today Do. Here's what it does and how it's put together.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;Every morning it plans my day out of a backlog of everything I could be doing - using deadlines, the priorities I've said out loud (like "this month I'm head down on project X," "today I just want to take it easy"), and whatever mood I'm in. Tell it in the chat, and it replans around that.&lt;/p&gt;

&lt;p&gt;You can also define recurring, multi-step pipelines — send the invoices to my clients every month, for instance — where each step is either for you or for the agent. A human step waits for you, just like a normal to-do. An AI step runs on its own, and depending on how dangerous it is, either goes fully autonomous or stops and waits for your approval before doing anything out of the system.&lt;/p&gt;

&lt;p&gt;The AI isn't only there to execute. It helps shape the work too: composing the day from a sentence, cutting a task down when it's too big, looking into why you keep putting something off instead of just nagging you about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I built it
&lt;/h2&gt;

&lt;p&gt;Full-stack TypeScript. &lt;strong&gt;Hono&lt;/strong&gt; API on &lt;strong&gt;Bun&lt;/strong&gt;, &lt;strong&gt;React&lt;/strong&gt; frontend with &lt;strong&gt;HeroUI&lt;/strong&gt; components, &lt;strong&gt;Better Auth&lt;/strong&gt; for sign-in. &lt;strong&gt;Genkit&lt;/strong&gt; orchestrates everything AI-related, including the MCP connections, with &lt;strong&gt;Gemini 3.5 Flash&lt;/strong&gt; as the default model — deliberately a light model: most of what the model does here is small, bounded work, and a bigger model doesn't help much.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4jhsbhwnlhmpm40qzt8k.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%2F4jhsbhwnlhmpm40qzt8k.png" alt="Today Do Architecture" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It all runs on &lt;strong&gt;Google Cloud&lt;/strong&gt;: Cloud Build turns a push into an image and deploys it to &lt;strong&gt;Cloud Run&lt;/strong&gt; through the GitHub integration, and app secrets live in &lt;strong&gt;Secret Manager&lt;/strong&gt;, exposed to the container as env vars. Data is stored in a &lt;strong&gt;libSQL&lt;/strong&gt; (SQLite) database hosted on the very generous free plan of &lt;strong&gt;Turso&lt;/strong&gt;. MCP connection tokens, API keys, and anything else sensitive are encrypted before they ever touch the database.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part I'm actually proud of
&lt;/h2&gt;

&lt;p&gt;Today Do talks MCP in both directions.&lt;/p&gt;

&lt;p&gt;It connects &lt;em&gt;out&lt;/em&gt; to external MCP servers — right now, Gmail — so a pipeline step can draft an email as part of an automated workflow. And it exposes &lt;em&gt;itself&lt;/em&gt; as an MCP server, so any agent you already use can control it directly. I've been having long, genuinely useful conversations with Claude Code about redoing my bathroom — materials, sequencing, what blocks what — and at the end of it, one sentence: &lt;em&gt;put this in Today Do.&lt;/em&gt; It called the same tools my own in-app chat uses, and the whole plan landed as a real, ordered task list.&lt;/p&gt;

&lt;p&gt;That's the task manager I actually wanted. Not one more place to type things into — a place that whatever agent I'm already talking to can hand things off to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges I ran into
&lt;/h2&gt;

&lt;p&gt;Wiring up the Gmail MCP server took longer than I expected, and not for a technical reason — I had to register for Google's developer program first, which wasn't obvious going in, and cost me a chunk of a day I hadn't budgeted for it.&lt;/p&gt;

&lt;p&gt;I also ran into a real bug in Genkit itself, around JSON Schema conversion, and ended up filing &lt;a href="https://github.com/genkit-ai/genkit/issues/6161" rel="noopener noreferrer"&gt;an issue&lt;/a&gt; and working around it in my own code in the meantime. Small thing, but it's the kind of thing you only find by actually building things.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned
&lt;/h2&gt;

&lt;p&gt;Good design comes before good code, every time — and that's true even, maybe especially, when you're racing a hackathon deadline and every hour spent not-coding feels like a mistake. It isn't.&lt;/p&gt;

&lt;p&gt;And: use your own project from day one. If I hadn't been planning my actual mornings with this thing while building it, I wouldn't have found half of what needed fixing — and I don't think anyone else should trust a tool the person building it doesn't trust with their own day.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Letting users choose which tools an MCP connection is allowed to expose, instead of a fixed list per server, and actually expanding the available servers&lt;/li&gt;
&lt;li&gt;Moving secret storage from an encrypted database column to Google Cloud's key management service properly&lt;/li&gt;
&lt;li&gt;A PWA with real mobile integration — share an email straight into Today Do, control it from Siri, get a push notification when something needs you&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So... is this a problem you also have? The app's live — go poke at it... be gentle :).&lt;br&gt;
Live app: &lt;a href="https://today-do-968387508977.europe-west1.run.app" rel="noopener noreferrer"&gt;https://today-do-968387508977.europe-west1.run.app&lt;/a&gt;&lt;/p&gt;

</description>
      <category>genkit</category>
      <category>allthingsagentichackathon</category>
      <category>gcp</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Interactive SVG + JS map</title>
      <dc:creator>Luca Faggianelli</dc:creator>
      <pubDate>Wed, 25 Nov 2020 18:15:15 +0000</pubDate>
      <link>https://dev.to/lucafaggianelli/interactive-svg-js-map-2ind</link>
      <guid>https://dev.to/lucafaggianelli/interactive-svg-js-map-2ind</guid>
      <description>&lt;p&gt;Now and then, on several web applications projects, I need to use maps to display data, sometimes it's a world map, sometimes a country map with regions and provinces, often I need a &lt;em&gt;click-on-region&lt;/em&gt; event handler and I always need to display some data on the map as colors or numbers. You know what I'm talking about right? Not a Google Maps map, but a simple and plain map with country borders.&lt;/p&gt;

&lt;p&gt;Of course there are libraries for this purpose, also free ones, but not so many and they're pretty heavy as they bring a lot of functionalities, whereas I just need a simple map, so I like to make my own map, also because it's fun 🙂. Let's make it!&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;

&lt;p&gt;The first step is to find a map in SVG format, I typically use &lt;a href="https://simplemaps.com/resources/svg-maps"&gt;simplemaps&lt;/a&gt; they have world and regional maps and they're free to use (check the license for details).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;When I speak of &lt;em&gt;regions&lt;/em&gt; I refer to geographical regions, that is any of country, region, province, state, area, etc.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now we're ready to go, these are the features we're going to implement at the end of the article:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Load the SVG map and render it into the HTML page&lt;/li&gt;
&lt;li&gt;Color the map regions based on supplied data&lt;/li&gt;
&lt;li&gt;Attach mouse events listeners (for click and hover) to regions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So let's start with step 1 and part of 2:&lt;br&gt;
&lt;iframe height="600" src="https://codepen.io/lucafaggianelli/embed/pobYPLq?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Yeah so easy! I only used a tiny library for SVG manipulation called &lt;a href="https://svgjs.com/docs/3.0/"&gt;Svg.js&lt;/a&gt;, even if it's not mandatory, it makes life a bit easier.&lt;br&gt;
In the codepen above we load the map SVG file content with the &lt;code&gt;fetch()&lt;/code&gt; method and we render it into the HTML, then we manipulate the map adding labels and changing the colors just for &lt;em&gt;demo&lt;/em&gt; purpose.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Please note&lt;/em&gt; that I'm selecting the map regions with &lt;code&gt;draw.find('path')&lt;/code&gt; but if you use another map, the regions may be represented by &lt;code&gt;&amp;lt;g&amp;gt;&lt;/code&gt; elements or may be inside nested into other elements.&lt;/p&gt;

&lt;p&gt;OK let's make this thing a bit more useful, I found Belgian population data (2019) on Wikipedia and we're going to plot it on our map, plus we'll make it interactive!&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/lucafaggianelli/embed/GRjKxjJ?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Better? Now we have real data and each region's color represent its population, the colors are shades between green and white, whereas the most populated region (Antwerp province) has a mix of 100% of green and 0% of white, while the least populated (Luxembourg province) has more white than green: this is called a heatmap. As for the interaction, if you hover a region, you get a popup and the region color changes. The color effect is done with CSS to demonstrate that you can style an SVG element (and its children) with plain CSS.&lt;/p&gt;

&lt;p&gt;This is pretty basic, but it's good starting point for creating a fully featured map.&lt;br&gt;
I'm going to extend this demo with more features and I'm going to package it into an NPM library, so stay tuned!&lt;/p&gt;

&lt;p&gt;Well now I'm curious, do you use maps and for what? Do you use them in apps you develop or in blog post or whatever? What library do you use?&lt;br&gt;
Questions and feedbacks are highly appreciated!&lt;/p&gt;

&lt;p&gt;Luca&lt;/p&gt;

</description>
      <category>svg</category>
      <category>map</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
