<?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>Reading Solana Data — What Started to Feel Real in My Second Week</title>
      <dc:creator>Zoe Lin</dc:creator>
      <pubDate>Sat, 02 May 2026 10:28:35 +0000</pubDate>
      <link>https://forem.com/zoe_lin_0653/reading-solana-data-what-started-to-feel-real-in-my-second-week-20jc</link>
      <guid>https://forem.com/zoe_lin_0653/reading-solana-data-what-started-to-feel-real-in-my-second-week-20jc</guid>
      <description>&lt;p&gt;Before this week, I still thought of blockchain data as something more abstract than it probably needed to be.&lt;/p&gt;

&lt;p&gt;I expected it to feel very different from the kinds of APIs and database reads I was already used to in Web2. But during the second week of 100 Days of Solana, that started to change. What made the difference was actually querying the data myself.&lt;/p&gt;

&lt;h3&gt;
  
  
  What started to feel familiar
&lt;/h3&gt;

&lt;p&gt;The first shift came when I read a wallet balance directly from devnet. That did not feel as unfamiliar as I expected. It felt more like making a read call and getting back public state.&lt;/p&gt;

&lt;p&gt;Fetching recent transactions made that idea clearer. Once I could see signatures, slots, timestamps, and statuses directly in the terminal, Solana started to feel less like a black box and more like a system I could inspect.&lt;/p&gt;

&lt;h3&gt;
  
  
  What surprised me most
&lt;/h3&gt;

&lt;p&gt;What surprised me most was how consistent the pattern felt across different tasks. I used RPC calls to read balances, fetch transaction history, compare the same address across devnet and mainnet, and then render that data in a browser dashboard.&lt;/p&gt;

&lt;p&gt;The tools changed, but the core flow stayed very similar: connect to an RPC endpoint, query public data, and display the result in a useful way.&lt;/p&gt;

&lt;p&gt;That was the point where the “public database” framing started to feel real to me.&lt;/p&gt;

&lt;h3&gt;
  
  
  What changed in my mental model
&lt;/h3&gt;

&lt;p&gt;The accounts-vs-databases comparison also helped a lot. My Web2 instincts still apply in some ways, but Solana accounts are not rows in private tables. They are public state objects on a shared ledger, with different rules around storage, ownership, and access.&lt;/p&gt;

&lt;p&gt;If the first week helped me understand wallets and keypairs, the second week helped me understand that blockchain data is something I can query directly.&lt;/p&gt;

&lt;p&gt;For me, that was the point where Solana started to feel less abstract and more like a real development environment.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>solana</category>
      <category>blockchain</category>
      <category>web3</category>
    </item>
    <item>
      <title>Wallet Experiments — What Clicked for Me in My First Week of Solana</title>
      <dc:creator>Zoe Lin</dc:creator>
      <pubDate>Mon, 27 Apr 2026 17:39:04 +0000</pubDate>
      <link>https://forem.com/zoe_lin_0653/wallet-experiments-what-clicked-for-me-in-my-first-week-of-solana-bio</link>
      <guid>https://forem.com/zoe_lin_0653/wallet-experiments-what-clicked-for-me-in-my-first-week-of-solana-bio</guid>
      <description>&lt;p&gt;One of my biggest highlights from Week 1 of 100 Days of Solana was realizing how the same keypair model appeared across very different wallet experiences.&lt;/p&gt;

&lt;p&gt;I generated a keypair, connected Phantom in a browser app, compared CLI, browser, and mobile wallets, and explored how they behaved on devnet. The screenshot below shows one of the moments that stood out most to me: connecting a browser wallet and seeing the address and balance appear inside the app.&lt;/p&gt;

&lt;p&gt;What surprised me most was how much the UX could change while the core identity model stayed the same. That was the point where wallets stopped feeling like “accounts” and started making more sense as tools for managing keys.&lt;/p&gt;

&lt;p&gt;Next, I’m looking forward to learning how to read more on-chain data and understand what is happening underneath the wallet interface.&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%2Fi3ygkxsqjs5hw1wuoim6.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%2Fi3ygkxsqjs5hw1wuoim6.jpg" alt=" " width="800" height="609"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>solana</category>
      <category>web3</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Identity on Solana — Think SSH Keys, Not Usernames</title>
      <dc:creator>Zoe Lin</dc:creator>
      <pubDate>Mon, 27 Apr 2026 11:48:49 +0000</pubDate>
      <link>https://forem.com/zoe_lin_0653/identity-on-solana-think-ssh-keys-not-usernames-10ll</link>
      <guid>https://forem.com/zoe_lin_0653/identity-on-solana-think-ssh-keys-not-usernames-10ll</guid>
      <description>&lt;p&gt;If you come from Web2, identity usually means something managed by a platform. It might be a username on GitHub, an email address tied to your company account, or a password stored in a product database. In all of those cases, identity exists because a service stores it, recognizes it, and decides how authentication works.&lt;/p&gt;

&lt;p&gt;This post is my attempt to explain how that changes on Solana in a way a Web2 developer would understand.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why this felt unfamiliar at first
&lt;/h3&gt;

&lt;p&gt;That is why Solana identity felt unfamiliar to me at first. I kept trying to understand wallets as if they were just another version of app accounts. That mental model was useful for getting started, but it was also misleading. After working through the first five days of 100 Days of Solana, the idea started to make much more sense.&lt;/p&gt;

&lt;p&gt;The biggest shift was realizing that a wallet is not really the identity itself. It is the interface for managing the identity. The underlying identity is the keypair.&lt;/p&gt;

&lt;h3&gt;
  
  
  The SSH analogy that made it click
&lt;/h3&gt;

&lt;p&gt;A Solana keypair feels a lot like an SSH keypair. You have a public key that can be shared, and a private key that stays with you. You prove control by signing with the private key. The basic mechanism is very similar. The difference is that SSH usually proves access to one server, while a Solana keypair works across a whole network.&lt;/p&gt;

&lt;p&gt;That distinction matters because it changes what identity actually means. In Web2, identity is usually granted by a platform. A company stores your account, your profile, and your login credentials. If needed, it can lock you out, reset your password, or suspend the account. On Solana, identity is not granted by a company. It is proven cryptographically. If you control the private key, you control the account.&lt;/p&gt;

&lt;p&gt;This also makes a public key very different from a username. A username is selected by a user, stored in a company database, and limited to a specific service. A public key is generated cryptographically, portable across applications, and not controlled by one company. The same keypair can be used to hold assets, sign transactions, interact with programs, and participate in governance without creating a separate identity for every app.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the first five days helped me understand
&lt;/h3&gt;

&lt;p&gt;That idea became much clearer to me because the first week of the challenge forced me to work with the same identity model through different tools.&lt;/p&gt;

&lt;p&gt;On Day 1, I generated a keypair and funded it on devnet. That was the first time I really saw a wallet address as something produced from cryptographic keys rather than from account registration. On Day 2, I created a persistent wallet and saved it locally, which made the relationship between the keypair and the wallet feel much more concrete. On Day 3, I looked at balances in both SOL and lamports, which reminded me that the user-friendly wallet experience is only one layer on top of lower-level data structures. On Day 4, I connected Phantom in the browser and saw that my app could read the public address and balance without ever touching the private key. On Day 5, I compared CLI, browser, and mobile wallets and realized that even though their user experience feels very different, they are all ultimately managing the same thing.&lt;/p&gt;

&lt;p&gt;The wallet types also made the tradeoffs easier to see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The CLI wallet felt the most direct and scriptable, which made it great for development and testing, but it also felt the least secure because the private key was just a file on disk.&lt;/li&gt;
&lt;li&gt;The browser wallet added a much better user experience, with password protection and approval popups, which made it feel more suitable for dApp interactions.&lt;/li&gt;
&lt;li&gt;The mobile wallet felt more natural for personal use because it could rely on device-level protections and a more familiar everyday interface.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  What changed in my mental model
&lt;/h3&gt;

&lt;p&gt;What changed across those experiences was the interface and security model. What stayed the same was the identity model.&lt;/p&gt;

&lt;p&gt;I think that is the part that makes Solana identity different from the Web2 model many developers are used to. In Web2, identity is usually defined inside a platform boundary. On Solana, identity starts from a cryptographic keypair and can move across applications without asking each one to create or approve a new account. That is why ownership feels different too. The network does not ask whether a company recognizes you. It only checks whether the signature is valid.&lt;/p&gt;

&lt;p&gt;If I had to summarize it simply for another Web2 developer, I would say this: on Solana, identity is not a username stored by a platform. It is a cryptographic keypair that you control. Once that idea clicked for me, wallets, ownership, and on-chain interaction all started to make much more sense.&lt;/p&gt;

&lt;p&gt;For me, that was the point where Solana identity stopped feeling abstract and started feeling practical.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>solana</category>
      <category>web3</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Agent Launchpad — Why Google Cloud Next ’26 Feels More Buildable for Developers</title>
      <dc:creator>Zoe Lin</dc:creator>
      <pubDate>Fri, 24 Apr 2026 10:11:40 +0000</pubDate>
      <link>https://forem.com/zoe_lin_0653/agent-launchpad-why-google-cloud-next-26-feels-more-buildable-for-developers-5a4n</link>
      <guid>https://forem.com/zoe_lin_0653/agent-launchpad-why-google-cloud-next-26-feels-more-buildable-for-developers-5a4n</guid>
      <description>&lt;p&gt;After watching the Google Cloud Next ’26 keynotes, the idea that stayed with me most was Google’s effort to make AI agents feel closer to real development work.&lt;/p&gt;

&lt;p&gt;What stood out this year was the push behind the agentic enterprise and the Gemini Enterprise Agent Platform. The message felt clear: building an agent is no longer only about model output. It also involves deployment, data, security, governance, and the ability to fit into real workflows. That is what made this announcement interesting to me. &lt;/p&gt;

&lt;p&gt;This point mattered to me because I have already used Google Cloud labs, deployed web projects on GCP, and experimented with Google AI Studio for testing chatbot and agent-style ideas. Through those experiences, I found Google’s ecosystem friendly in a practical way. I could move step by step from learning to testing, then to deployment, while still being able to check settings, usage, and limits. That gave me more confidence to try things without feeling lost too early.&lt;/p&gt;

&lt;p&gt;Because of that background, this year’s keynote felt more concrete than abstract. I was not only hearing a big vision about agents. I was hearing a platform story that connects more of the parts developers usually struggle with after the demo stage. Once a project needs tools, permissions, deployment, monitoring, and business context, the work changes. That is where many interesting prototypes slow down.&lt;/p&gt;

&lt;p&gt;What I liked most about Google Cloud Next ’26 was that it framed this problem clearly. The value was not only in making agents more capable. The value was in making the path around them more complete. For developers, especially newer builders, that matters a lot. The hardest part is often not getting the first result from a model. The harder part is turning that result into something stable, usable, and worth improving.&lt;/p&gt;

&lt;p&gt;I still think there is room to make this direction easier to learn. The vision is strong, but newer developers will need more simple examples and clearer paths from experimentation to deployment. Google already does a good job with labs and guided learning, so I hope that continues as these agent workflows become more advanced.&lt;/p&gt;

&lt;p&gt;What made Google Cloud Next ’26 memorable for me was how well it connected with my own experience. When the platform reduces friction, I get to spend more time thinking about the agent itself: what it should do, how it should help, and where its limits should be. That is why this year’s announcements stayed with me. They made the distance between learning and launching feel shorter.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>cloudnextchallenge</category>
      <category>googlecloud</category>
    </item>
    <item>
      <title>Green Habit Coach — AI-Powered Habit Analysis and Eco Coaching</title>
      <dc:creator>Zoe Lin</dc:creator>
      <pubDate>Sun, 19 Apr 2026 19:17:49 +0000</pubDate>
      <link>https://forem.com/zoe_lin_0653/green-habit-coach-ai-powered-habit-analysis-and-eco-coaching-5dco</link>
      <guid>https://forem.com/zoe_lin_0653/green-habit-coach-ai-powered-habit-analysis-and-eco-coaching-5dco</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built Green Habit Coach, a web app that helps users reflect on their daily habits and get practical eco-friendly suggestions.&lt;/p&gt;

&lt;p&gt;Users can log in, fill out a short habit form, and receive an analysis result based on their lifestyle inputs. The app looks at habits such as transportation, meat consumption, air conditioning usage, disposable item usage, recycling behavior, and bring-your-own habits.&lt;/p&gt;

&lt;p&gt;After the analysis, users get an eco score, a short summary, top issues, suggestions, and a simple 7-day challenge plan. They can also continue the experience by asking follow-up questions through an AI coach, such as what to improve first this week or which habit is the easiest to start tomorrow.&lt;/p&gt;

&lt;p&gt;I wanted to make sustainability feel more personal, more practical, and easier to act on in everyday life.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://youtu.be/2nJFeRnQHC4" 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;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/zoelinsg/green-habit-coach" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;I built the frontend with React + Vite and the backend with FastAPI.&lt;/p&gt;

&lt;p&gt;On the frontend, users can log in, submit their habit data, view their latest analysis, load history records, and ask follow-up questions in the coach section.&lt;/p&gt;

&lt;p&gt;On the backend, the app handles authenticated API requests, habit analysis, history storage, coach thread creation, and coach follow-up messaging.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Auth0 for login and protected API access&lt;/li&gt;
&lt;li&gt;Backboard for the follow-up AI coach experience&lt;/li&gt;
&lt;li&gt;SQLite + SQLAlchemy for storing analysis history&lt;/li&gt;
&lt;li&gt;Firebase Hosting for the frontend&lt;/li&gt;
&lt;li&gt;Google Cloud Run for the backend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;One of the biggest parts of this project was not just building the features, but also making the whole flow work in deployment. I spent a lot of time debugging Auth0 configuration, CORS between the frontend and backend, Cloud Run deployment issues, and async backend integration for the coach flow.&lt;/p&gt;

&lt;p&gt;That was actually one of the most valuable parts of the project, because it made the app feel like a real full-stack product instead of only a local demo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prize Categories
&lt;/h2&gt;

&lt;p&gt;I’m submitting this project for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Best Use of Backboard&lt;/li&gt;
&lt;li&gt;Best Use of Auth0 for Agents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Backboard powers the coach conversation flow and makes it possible to continue the user journey after the initial habit analysis.&lt;/p&gt;

&lt;p&gt;Auth0 helps connect the experience to real authenticated users, protect backend routes, and keep history data scoped to the correct user.&lt;/p&gt;

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

&lt;p&gt;This project helped me practice real full-stack development, especially:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;frontend/backend integration&lt;/li&gt;
&lt;li&gt;cloud deployment&lt;/li&gt;
&lt;li&gt;authentication&lt;/li&gt;
&lt;li&gt;production debugging&lt;/li&gt;
&lt;li&gt;building AI features that feel useful&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It also gave me more experience turning a simple idea into a deployed product with a complete user flow.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
    </item>
    <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://forem.com/zoe_lin_0653/email-drafter-multi-agent-email-writing-with-google-adk-and-cloud-run-4p99</link>
      <guid>https://forem.com/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://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>
