<?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: Zoe Lin</title>
    <description>The latest articles on Forem by Zoe Lin (@zoe_lin_0653).</description>
    <link>https://forem.com/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>Forem: Zoe Lin</title>
      <link>https://forem.com/zoe_lin_0653</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/zoe_lin_0653"/>
    <language>en</language>
    <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://forem.com/zoe_lin_0653/hack-desk-minimal-coding-setup-for-global-hack-week-2pk7</link>
      <guid>https://forem.com/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://forem.com/zoe_lin_0653/from-prompt-to-svg-logoforge-with-google-ai-studio-3i8h</link>
      <guid>https://forem.com/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://forem.com/zoe_lin_0653/dark-dish-lab-a-cursed-recipe-generator-4lj1</link>
      <guid>https://forem.com/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://forem.com/zoe_lin_0653/ops-hub-notion-mcp-dashboard-for-assets-subscriptions-daily-digest-2l9j</link>
      <guid>https://forem.com/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>
