<?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: Zoe Lin</title>
    <description>The latest articles on DEV Community by Zoe Lin (@zoe_lin_0653).</description>
    <link>https://dev.to/zoe_lin_0653</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%2F3833825%2Fa4700839-7bff-479c-923d-5d4f54a99353.jpg</url>
      <title>DEV Community: Zoe Lin</title>
      <link>https://dev.to/zoe_lin_0653</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zoe_lin_0653"/>
    <language>en</language>
    <item>
      <title>Email Drafter — Multi-Agent Email Writing with Google ADK and Cloud Run</title>
      <dc:creator>Zoe Lin</dc:creator>
      <pubDate>Fri, 17 Apr 2026 06:51:30 +0000</pubDate>
      <link>https://dev.to/zoe_lin_0653/email-drafter-multi-agent-email-writing-with-google-adk-and-cloud-run-4p99</link>
      <guid>https://dev.to/zoe_lin_0653/email-drafter-multi-agent-email-writing-with-google-adk-and-cloud-run-4p99</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built Email Drafter, a small web app that turns structured user input into a polished email draft using a multi-agent workflow.&lt;/p&gt;

&lt;p&gt;The app takes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;recipient type&lt;/li&gt;
&lt;li&gt;purpose&lt;/li&gt;
&lt;li&gt;tone&lt;/li&gt;
&lt;li&gt;language&lt;/li&gt;
&lt;li&gt;key points&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of using one giant prompt, I split the workflow into multiple specialized roles.&lt;/p&gt;

&lt;p&gt;The system works like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one agent plans the email&lt;/li&gt;
&lt;li&gt;one agent reviews the plan&lt;/li&gt;
&lt;li&gt;one agent writes the final draft&lt;/li&gt;
&lt;li&gt;one orchestrator coordinates the workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also deployed the system as separate services on Cloud Run, so the app feels much closer to a real distributed AI workflow instead of just a local prototype.&lt;/p&gt;

&lt;p&gt;I picked email drafting because it is a practical use case where planning, reviewing, and writing feel like naturally separate tasks. That made it a good fit for experimenting with multi-agent orchestration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cloud Run Embed
&lt;/h2&gt;


&lt;div class="ltag__cloud-run"&gt;
  &lt;iframe height="600px" src="https://email-drafter-app-ournsvibyq-uw.a.run.app/"&gt;
  &lt;/iframe&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Your Agents
&lt;/h2&gt;

&lt;p&gt;This project uses three specialized agents plus one orchestrator.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Researcher Agent&lt;br&gt;&lt;br&gt;
Creates a structured email plan from the user input.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Judge Agent&lt;br&gt;&lt;br&gt;
Reviews the plan and checks whether it is complete enough before moving on.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Content Builder Agent&lt;br&gt;&lt;br&gt;
Writes the final email draft from the approved plan.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Orchestrator Agent&lt;br&gt;&lt;br&gt;
Coordinates the workflow between the other agents and returns the final result to the frontend.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The overall flow is:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Frontend -&amp;gt; Orchestrator -&amp;gt; Researcher -&amp;gt; Judge -&amp;gt; Content Builder -&amp;gt; Final Email Draft&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Learnings
&lt;/h2&gt;

&lt;p&gt;This project helped me understand why multi-agent systems can be useful even for a relatively small app.&lt;/p&gt;

&lt;p&gt;A few things stood out while building it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Splitting the workflow made debugging easier. It was much easier to tell whether the issue came from planning, review, or writing than trying to fix one large prompt.&lt;/li&gt;
&lt;li&gt;Deployment was harder than the basic prompt logic. Getting multiple services running locally, wiring them together, and then deploying them to Cloud Run took more effort than writing the first version of the agents.&lt;/li&gt;
&lt;li&gt;Prompt wording had a big impact on output quality. Small instruction changes made a noticeable difference between getting a planning-style response and getting something that looked like a real email.&lt;/li&gt;
&lt;li&gt;Multi-agent design felt more modular and production-oriented. Even for a simple email drafting tool, separating responsibilities made the system easier to reason about and improve.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://youtu.be/b5oLkYx-YJ8" rel="noopener noreferrer"&gt;Video Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://email-drafter-app-ournsvibyq-uw.a.run.app/" rel="noopener noreferrer"&gt;Live App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/zoelinsg/email-drafter-multi-agent-system" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>agents</category>
      <category>buildmultiagents</category>
      <category>gemini</category>
      <category>adk</category>
    </item>
    <item>
      <title>Hack Desk — Minimal Coding Setup for Global Hack Week</title>
      <dc:creator>Zoe Lin</dc:creator>
      <pubDate>Tue, 14 Apr 2026 10:33:13 +0000</pubDate>
      <link>https://dev.to/zoe_lin_0653/hack-desk-minimal-coding-setup-for-global-hack-week-2pk7</link>
      <guid>https://dev.to/zoe_lin_0653/hack-desk-minimal-coding-setup-for-global-hack-week-2pk7</guid>
      <description>&lt;h1&gt;
  
  
  My Global Hack Week setup
&lt;/h1&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%2Fdyp9rcx8lqy4amr2b7mi.jpg" 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%2Fdyp9rcx8lqy4amr2b7mi.jpg" alt="My Global Hack Week setup" width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My laptop, mouse, and a clean desk setup for building, debugging, and shipping projects.&lt;/p&gt;

&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/mlhacks"&gt;@mlhacks&lt;/a&gt; &lt;/p&gt;

</description>
      <category>globalhackweek</category>
      <category>mlh</category>
    </item>
    <item>
      <title>LogoForge — AI SVG Logo Generator for Brand Concepts</title>
      <dc:creator>Zoe Lin</dc:creator>
      <pubDate>Mon, 13 Apr 2026 08:48:05 +0000</pubDate>
      <link>https://dev.to/zoe_lin_0653/from-prompt-to-svg-logoforge-with-google-ai-studio-3i8h</link>
      <guid>https://dev.to/zoe_lin_0653/from-prompt-to-svg-logoforge-with-google-ai-studio-3i8h</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built LogoForge, a small web app that generates SVG logo concepts from a brand name, industry, style, and keywords using the Gemini API.&lt;/p&gt;

&lt;p&gt;The app supports single and 3-variation generation, validates the model output as structured JSON, retries once if validation fails, and lets users preview the SVG, download it, and copy the JSON output.&lt;/p&gt;

&lt;p&gt;I also refactored the project into a frontend and backend proxy setup so the API key is not exposed in the browser. That made the app feel much closer to something I would actually deploy instead of just keeping as a local prototype.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://youtu.be/E4a_cHElang" rel="noopener noreferrer"&gt;Video Demo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gen-lang-client-0378020510.web.app" rel="noopener noreferrer"&gt;Live App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/zoelinsg/DEV-Projects/tree/main/Build_Apps_with_Google_AI_Studio/LogoForgeApp" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the demo, I show the input flow, SVG generation results, color palette and brand story output, and the difference between single and 3-variation generation.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Experience
&lt;/h2&gt;

&lt;p&gt;This project taught me that prompting works much better when I treat it like writing a product spec instead of giving a loose instruction. The clearer I was about the UI, output format, and SVG constraints, the better the generated app became.&lt;/p&gt;

&lt;p&gt;The biggest lesson was reliability. A raw model response can look correct but still fail in subtle ways, so adding validation and a retry step made the app much more stable.&lt;/p&gt;

&lt;p&gt;I also learned a lot from the deployment side. I started with a simpler client-side setup, then moved the Gemini call behind a backend proxy and deployed the frontend and backend separately. That part felt much more like real engineering work than just prompt experimentation.&lt;/p&gt;

&lt;p&gt;During testing, I also occasionally ran into temporary Gemini API availability issues under high demand. The overall app flow and deployment setup still worked as expected, but it reminded me that real-world AI apps need both prompt design and engineering safeguards.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Clear constraints produce better results&lt;/li&gt;
&lt;li&gt;Structured output still needs validation&lt;/li&gt;
&lt;li&gt;SVG is a great way to create visual output without image generation&lt;/li&gt;
&lt;li&gt;Small engineering steps like retries and safer secret handling make a big difference&lt;/li&gt;
&lt;li&gt;AI tools can speed up prototyping, but reliability still depends on developer judgment&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>deved</category>
      <category>learngoogleaistudio</category>
      <category>ai</category>
      <category>gemini</category>
    </item>
    <item>
      <title>Dark Dish Lab — Cursed Recipe Generator for Strange Culinary Ideas</title>
      <dc:creator>Zoe Lin</dc:creator>
      <pubDate>Sun, 05 Apr 2026 18:21:11 +0000</pubDate>
      <link>https://dev.to/zoe_lin_0653/dark-dish-lab-a-cursed-recipe-generator-4lj1</link>
      <guid>https://dev.to/zoe_lin_0653/dark-dish-lab-a-cursed-recipe-generator-4lj1</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Dark Dish Lab is a tiny, delightfully useless web app that generates cursed food or drink recipes.&lt;/p&gt;

&lt;p&gt;You pick:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hated ingredients&lt;/li&gt;
&lt;li&gt;Flavor chaos (salty / sweet / spicy / sour)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then it generates a short “recipe” with a horror score, a few steps, and a warning.&lt;br&gt;&lt;br&gt;
It solves no real-world problem. It only creates regret.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://youtu.be/UXBVWVfnXJc" rel="noopener noreferrer"&gt;YouTube demo&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://github.com/zoelinsg/DEV-Projects/tree/main/DEV_April_Fools_Challenge/dark-dish-lab" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Frontend: React (Vite)

&lt;ul&gt;
&lt;li&gt;Ingredient + flavor selection UI&lt;/li&gt;
&lt;li&gt;Calls backend API and renders the generated result&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Backend: Spring Boot (Java 17)

&lt;ul&gt;
&lt;li&gt;POST /api/generate endpoint&lt;/li&gt;
&lt;li&gt;Generates a short recipe text and returns JSON&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Optional AI: Google Gemini API

&lt;ul&gt;
&lt;li&gt;If AI is enabled and a key is provided, it asks Gemini for a very short recipe format&lt;/li&gt;
&lt;li&gt;If AI is disabled or fails, it falls back to a non-AI generator&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Notes

&lt;ul&gt;
&lt;li&gt;Only Unicode emojis are used (no emoji image assets)&lt;/li&gt;
&lt;li&gt;API keys are kept in local env files and not committed&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  How I Leveraged Google AI
&lt;/h2&gt;

&lt;p&gt;Gemini (via the Gemini API) is the text generator behind Dark Dish Lab’s “cursed recipe” output.&lt;/p&gt;

&lt;p&gt;Instead of using AI as a generic chatbot, I use it as a formatting engine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Input: selected ingredients + flavor axes (salty/sweet/spicy/sour)&lt;/li&gt;
&lt;li&gt;Output: a short, structured recipe (name, 3 steps, 1 warning)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To keep the experience stable and demo-friendly, I added a few guardrails:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Server-side API key only (kept in &lt;code&gt;backend/.env.local&lt;/code&gt;, not committed)&lt;/li&gt;
&lt;li&gt;Strict prompt constraints (no emojis, short length, fixed format)&lt;/li&gt;
&lt;li&gt;Fallback generator when Gemini is disabled/unavailable&lt;/li&gt;
&lt;li&gt;Output trimming to avoid unexpectedly long responses&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prize Category
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Best Use of Google AI — I integrated the Gemini API to generate short, structured cursed recipes from the user’s selected ingredients and flavor axes.&lt;/li&gt;
&lt;li&gt;Community Favorite angle — Try to generate the most cursed combo you can. Comment your ingredient + flavor picks and the horror score you got. Bonus points if your friends refuse to read it.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>418challenge</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Ops Hub — Notion MCP Dashboard for Assets, Subscriptions &amp; Daily Digest</title>
      <dc:creator>Zoe Lin</dc:creator>
      <pubDate>Thu, 26 Mar 2026 18:34:30 +0000</pubDate>
      <link>https://dev.to/zoe_lin_0653/ops-hub-notion-mcp-dashboard-for-assets-subscriptions-daily-digest-2l9j</link>
      <guid>https://dev.to/zoe_lin_0653/ops-hub-notion-mcp-dashboard-for-assets-subscriptions-daily-digest-2l9j</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;Ops Hub is a Notion-first dashboard for asset and subscription operations (built with Notion MCP + Python).&lt;/p&gt;

&lt;p&gt;It helps centralize scattered operational info (devices, warranties, renewals) into one workspace and turns it into a daily workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assets Ops: track equipment (3C / appliances), maintenance schedule, warranty dates, and manuals.&lt;/li&gt;
&lt;li&gt;Subscription Ops: track renewals, pricing, and generate cancellation drafts.&lt;/li&gt;
&lt;li&gt;Daily Digest: one command generates a Daily Digest — YYYY-MM-DD page in Notion with:

&lt;ul&gt;
&lt;li&gt;KPI summary (counts + upcoming renewal cost)&lt;/li&gt;
&lt;li&gt;actionable lists with deep links to the exact items&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;All outputs stay inside Notion, so it’s easy to review and act (human-in-the-loop friendly).&lt;/p&gt;

&lt;h2&gt;
  
  
  Video Demo
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/uThZ885PJ1U"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Show us the code
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/zoelinsg/Notion-MCP-Projects/tree/main/homeops-hub-mcp" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Run locally (Poetry):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
poetry &lt;span class="nb"&gt;install
&lt;/span&gt;poetry run python &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"from homeops_mcp.server import create_daily_digest; print(create_daily_digest(14))"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How I Used Notion MCP
&lt;/h2&gt;

&lt;p&gt;Notion is the source of truth (databases, views, templates, and the dashboard). The MCP server turns Notion context into an automated ops workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Reads Notion databases to find:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;assets due for maintenance soon&lt;/li&gt;
&lt;li&gt;warranties expiring soon&lt;/li&gt;
&lt;li&gt;subscriptions renewing soon (within N days)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Writes back into Notion:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;status fields like &lt;code&gt;Next Action&lt;/code&gt; and &lt;code&gt;Lifecycle Stage&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;helpful notes like &lt;code&gt;Manual Notes&lt;/code&gt; (maintenance guidance) and &lt;code&gt;Cancel Instructions&lt;/code&gt; (cancellation draft)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;&lt;p&gt;Generates a Daily Digest page in Notion with KPIs + clickable action lists, so I can review everything in one place.&lt;/p&gt;&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;This makes the workflow feel like “superpowers”: I stay in Notion, run one command, and get an updated dashboard plus a daily report ready to act on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Model (Notion Databases)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Assets
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Maintenance: &lt;code&gt;Last Maintenance&lt;/code&gt; + &lt;code&gt;Maintenance Interval (days)&lt;/code&gt; → &lt;code&gt;Next Maintenance&lt;/code&gt; (formula) → &lt;code&gt;Next Maintenance Date&lt;/code&gt; (calendar)&lt;/li&gt;
&lt;li&gt;Ops fields: &lt;code&gt;Next Action&lt;/code&gt;, &lt;code&gt;Lifecycle Stage&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;code&gt;Manual Notes&lt;/code&gt;, &lt;code&gt;Manual URL&lt;/code&gt;, &lt;code&gt;Warranty End&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Subscriptions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Renewal tracking: &lt;code&gt;Renewal Date&lt;/code&gt;, &lt;code&gt;Billing Cycle&lt;/code&gt;, &lt;code&gt;Status&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Ops fields: &lt;code&gt;Next Action&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Output: &lt;code&gt;Cancel Instructions&lt;/code&gt; (draft)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Daily Digest (Auto Report)
&lt;/h2&gt;

&lt;p&gt;A single run creates a &lt;code&gt;Daily Digest — YYYY-MM-DD&lt;/code&gt; page in Notion with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;KPI Summary (maintenance / renewals / renewal cost / warranty)&lt;/li&gt;
&lt;li&gt;Clickable action lists linking to the exact items&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Generated by &lt;code&gt;create_daily_digest(14)&lt;/code&gt; and saved as a child page under the dashboard.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Python (MCP server)&lt;/li&gt;
&lt;li&gt;Notion MCP + Notion API&lt;/li&gt;
&lt;li&gt;Poetry (dependency &amp;amp; virtualenv)&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>notionchallenge</category>
      <category>mcp</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
