<?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>Google I/O 2026 — What I Hoped to See Beyond the Model Announcements</title>
      <dc:creator>Zoe Lin</dc:creator>
      <pubDate>Thu, 21 May 2026 10:17:49 +0000</pubDate>
      <link>https://forem.com/zoe_lin_0653/google-io-2026-what-i-hoped-to-see-beyond-the-model-announcements-4fga</link>
      <guid>https://forem.com/zoe_lin_0653/google-io-2026-what-i-hoped-to-see-beyond-the-model-announcements-4fga</guid>
      <description>&lt;h2&gt;
  
  
  Why I was looking for more than model updates
&lt;/h2&gt;

&lt;p&gt;When I watched Google I/O 2026, I was not only paying attention to the new model announcements. What I cared about more was whether Google was making its AI ecosystem feel easier to build with in a practical way.&lt;/p&gt;

&lt;p&gt;That probably comes from my own experience using Google AI Studio, Gemini models, and local Gemma workflows in small projects. After spending time with those tools, it becomes harder to look at a keynote as a list of separate upgrades. What stands out more is whether the path from idea to usable product is becoming clearer.&lt;/p&gt;

&lt;p&gt;That was the part I hoped to see this year.&lt;/p&gt;

&lt;h2&gt;
  
  
  What stayed with me from this year’s I/O
&lt;/h2&gt;

&lt;p&gt;The main thing I noticed was that Google seemed to be telling a more connected story.&lt;/p&gt;

&lt;p&gt;AI Studio no longer felt like it was only about testing prompts. Antigravity did not feel like a side experiment. The announcements around models, agents, app building, and deployment all seemed to move in the same direction.&lt;/p&gt;

&lt;p&gt;That mattered to me because the difficult part of building with AI is rarely just getting one good output. More often, the real friction comes later: choosing the right tool, turning the result into something usable, connecting it to the rest of the app, and dealing with everything that happens after the prototype stage.&lt;/p&gt;

&lt;p&gt;That is why the workflow stayed with me more than the model list itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why lightweight models still matter to me
&lt;/h2&gt;

&lt;p&gt;One reason I see it this way is because of my own experience with Gemma.&lt;/p&gt;

&lt;p&gt;What I appreciated about local Gemma workflows was not that they tried to do everything, but that they felt light enough to experiment with and practical enough for focused tasks. For developers who are still learning how to bring AI into real projects, that kind of accessibility matters a lot.&lt;/p&gt;

&lt;p&gt;A model does not always need to be the most advanced option to be useful. Sometimes what matters more is whether it is affordable, lightweight, and easy enough to try without turning the whole project into a heavy setup problem.&lt;/p&gt;

&lt;p&gt;That is why lightweight models still matter to me, even in a keynote full of bigger announcements.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I was hoping to feel more clearly from Gemini
&lt;/h2&gt;

&lt;p&gt;With Gemini, my expectation was a little different.&lt;/p&gt;

&lt;p&gt;I have already found Gemini useful for prototyping and for turning ideas into something testable more quickly. What I hoped to feel more clearly this year was not only stronger capability, but clearer model roles.&lt;/p&gt;

&lt;p&gt;Once you start building actual features, it matters whether a model feels better suited for fast iteration, structured reasoning, creative generation, or more agent-style tasks. When those differences feel clearer, the ecosystem also starts to feel more mature.&lt;/p&gt;

&lt;p&gt;That is one of the things I still look for beyond the announcements themselves: not only more capability, but more clarity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I still notice the gap between speed and polish
&lt;/h2&gt;

&lt;p&gt;I felt something similar when using Google AI Studio for visual generation.&lt;/p&gt;

&lt;p&gt;What I liked was the speed. It was genuinely helpful for turning an idea into something visible, especially in the early stage of a project. At the same time, the results often felt closer to a strong draft than to something fully refined. They were useful for ideation, but not always polished enough to stand on their own.&lt;/p&gt;

&lt;p&gt;That did not make the experience less useful. It just made me care more about refinement.&lt;/p&gt;

&lt;p&gt;If Google is moving toward a workflow where ideas can move more quickly from prompt to product, then polish starts to matter alongside speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Antigravity stood out to me
&lt;/h2&gt;

&lt;p&gt;This is also why Antigravity felt important in this year’s I/O story.&lt;/p&gt;

&lt;p&gt;What interested me was not simply that agent-based tooling can do more, but that Google seems to be pushing it toward a more realistic place in the development workflow. Earlier tools already showed convenience, but they also left behind a familiar amount of cleanup: fixing structure, checking code quality, and adjusting the details that still needed human judgment.&lt;/p&gt;

&lt;p&gt;Because of that, I found myself looking at Antigravity less as a flashy feature and more as a sign of where Google wants the developer experience to go.&lt;/p&gt;

&lt;p&gt;The version of agent-based development that feels meaningful to me is not “AI does everything.” It is the idea that better tooling reduces low-value friction and leaves developers with more time for architecture, design decisions, and quality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the story felt broader this year
&lt;/h2&gt;

&lt;p&gt;One thing I liked about this year’s I/O was that this shift did not stay only inside developer tools.&lt;/p&gt;

&lt;p&gt;Gemini Spark made the agent story feel more complete to me, because it suggested a more persistent kind of assistant experience. It felt less like asking for a single reply and more like giving a system a goal and letting it continue the work.&lt;/p&gt;

&lt;p&gt;The same thing appeared in the search and commerce direction. Once agents start moving into search, shopping, and more action-oriented tasks, the conversation changes. At that point, it is not only about capability anymore. It becomes about trust, clarity, and whether the workflow feels understandable enough for people to actually rely on it.&lt;/p&gt;

&lt;p&gt;Even Flutter made the picture feel a little broader to me, because it suggested that this shift is not staying limited to AI-native tools. It is starting to touch more mainstream development workflows too.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I was really hoping to see
&lt;/h2&gt;

&lt;p&gt;When I step back from all of this, I think what I was really hoping to see at Google I/O 2026 was a clearer sign that Google’s ecosystem is becoming easier to build with in practice.&lt;/p&gt;

&lt;p&gt;For me, that means things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;clearer model roles&lt;/li&gt;
&lt;li&gt;smoother movement from prototype to product&lt;/li&gt;
&lt;li&gt;less cleanup after generation&lt;/li&gt;
&lt;li&gt;more usable agent workflows&lt;/li&gt;
&lt;li&gt;and tools that feel more helpful for developers at different stages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are not always the flashiest parts of a keynote, but they are often the parts that decide whether people keep building after the excitement fades.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final takeaway
&lt;/h2&gt;

&lt;p&gt;What I took away from Google I/O 2026 was not that the model announcements were unimportant. They were clearly a big part of the event.&lt;/p&gt;

&lt;p&gt;What stayed with me more, though, was the sense that Google is trying to make the space around those models feel more complete. After already using tools like Google AI Studio, Gemini, and Gemma in small projects, that was the part I found easiest to connect with.&lt;/p&gt;

&lt;p&gt;This year’s announcements made me think less about how many new model options there are, and more about whether the overall workflow is becoming easier to build on.&lt;/p&gt;

&lt;p&gt;That was what I hoped to see beyond the model announcements, and it was the part of Google I/O 2026 that felt most meaningful to me.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>googleiochallenge</category>
    </item>
    <item>
      <title>Solana Account Data — How I Started Making Sense of Owners, Programs, and Raw Bytes</title>
      <dc:creator>Zoe Lin</dc:creator>
      <pubDate>Fri, 15 May 2026 21:05:25 +0000</pubDate>
      <link>https://forem.com/zoe_lin_0653/solana-account-data-how-i-started-making-sense-of-owners-programs-and-raw-bytes-1fmj</link>
      <guid>https://forem.com/zoe_lin_0653/solana-account-data-how-i-started-making-sense-of-owners-programs-and-raw-bytes-1fmj</guid>
      <description>&lt;h2&gt;
  
  
  Where the confusion started
&lt;/h2&gt;

&lt;p&gt;What made Solana feel unfamiliar at first was that it really means it when people say “everything is an account.” Wallets, programs, token accounts, and other kinds of on-chain state all use the same general account model. What changes is not the existence of a completely different object type, but how each account’s fields are set and which program owns it.&lt;/p&gt;

&lt;p&gt;I understood that idea early on, but I still did not feel like I could actually read what I was looking at.&lt;/p&gt;

&lt;p&gt;A wallet page in Explorer looked manageable, and a transaction page was still readable enough. But once I started using the CLI and looking at RPC responses, fields like &lt;code&gt;owner&lt;/code&gt;, &lt;code&gt;executable&lt;/code&gt;, and &lt;code&gt;data&lt;/code&gt; still felt disconnected. The raw account data itself was even harder to read. It was just bytes, base64, or a hex dump that did not seem to mean anything on its own.&lt;/p&gt;

&lt;p&gt;What finally helped me was realizing that Solana account data is not supposed to feel readable by default. It is not a JSON object waiting to be expanded. It is just a byte array, and it only becomes meaningful once you know which program owns the account and how that program defines its layout.&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting with the simplest comparison
&lt;/h2&gt;

&lt;p&gt;The first useful comparison for me was between a normal wallet account and a program account.&lt;/p&gt;

&lt;p&gt;When I inspected my own devnet wallet and compared it with the Token Program using &lt;code&gt;solana account &amp;lt;address&amp;gt;&lt;/code&gt;, the pattern changed immediately. It looked something like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Account Type&lt;/th&gt;
&lt;th&gt;Owner&lt;/th&gt;
&lt;th&gt;Executable&lt;/th&gt;
&lt;th&gt;Data Length&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;My Devnet Wallet&lt;/td&gt;
&lt;td&gt;System Program&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;0 bytes&lt;/td&gt;
&lt;td&gt;Holds SOL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Token Program&lt;/td&gt;
&lt;td&gt;Loader-related program&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;&amp;gt; 0 bytes&lt;/td&gt;
&lt;td&gt;Contains executable code&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Seeing this contrast made one important idea click for me: on Solana, a program is also just an account, but one that contains executable code.&lt;/p&gt;

&lt;p&gt;That also helped me understand another important part of Solana’s model: programs do not usually store their own state inside the program account itself. The executable account holds code, while the state the program works with lives in separate data accounts.&lt;/p&gt;

&lt;p&gt;Even before decoding anything, just comparing the owner, executable flag, and data length already made the account model much easier to reason about.&lt;/p&gt;

&lt;h2&gt;
  
  
  The questions that helped me read accounts more clearly
&lt;/h2&gt;

&lt;p&gt;After that, the way I read accounts changed. Instead of asking why the output looked so cryptic, I started asking a different set of questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who owns this account?&lt;/li&gt;
&lt;li&gt;Is it executable?&lt;/li&gt;
&lt;li&gt;How much data does it store?&lt;/li&gt;
&lt;li&gt;Which program defines what those bytes mean?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those questions turned out to be much more useful than staring at the raw output and hoping it would start making sense on its own. They also made the broader account model easier to understand, because the same fields kept showing up whether I was looking at a wallet, a program, or a data account.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Web2 analogy that helped a little
&lt;/h2&gt;

&lt;p&gt;The closest mental model for me was this: a Solana account is less like a nicely structured database row and more like a binary record whose schema lives somewhere else.&lt;/p&gt;

&lt;p&gt;The account stores the bytes, but the owning program tells you how to interpret them. That helped me stop expecting account data to explain itself and made the relationship between accounts and programs feel much more natural.&lt;/p&gt;

&lt;p&gt;It also made Solana’s model feel less strange from a Web2 point of view. Programs are like executables, while the accounts they work with are more like the files or records those executables read and write.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rent exemption is part of the storage model too
&lt;/h2&gt;

&lt;p&gt;Another idea that helped me see Solana accounts more clearly was rent exemption. On Solana, keeping data on-chain is not treated as free. Accounts need to hold a minimum lamport balance based on their data size in order to remain rent-exempt.&lt;/p&gt;

&lt;p&gt;That detail made the model feel less like abstract blockchain magic and more like a storage system with explicit rules and costs. It also helped explain why account size matters and why storage on-chain is treated as something developers need to plan for.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would suggest to another learner
&lt;/h2&gt;

&lt;p&gt;If account data still feels abstract, I would not start with custom programs right away. I would recommend comparing three things side by side:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;your own wallet account
&lt;/li&gt;
&lt;li&gt;a well-known program account
&lt;/li&gt;
&lt;li&gt;an account with structured data, like a token mint, that you can actually decode
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That progression moves from an account with no custom data, to an account that contains code, and finally to an account whose bytes clearly represent state. Once I saw those three cases clearly, Solana’s account model felt much less intimidating.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final takeaway
&lt;/h2&gt;

&lt;p&gt;For me, the turning point was realizing that the data was not random. I was just missing the schema.&lt;/p&gt;

&lt;p&gt;Once I started reading Solana accounts through the lens of &lt;code&gt;owner&lt;/code&gt;, &lt;code&gt;executable&lt;/code&gt;, and how the owning program defines the data layout, everything began to feel much more structured. That did not make every account immediately easy to understand, but it gave me a much better way to approach what I was seeing.&lt;/p&gt;

&lt;p&gt;If you are at the stage where those fields still feel disconnected, try inspecting a few accounts side by side and decoding one real account manually. For me, that was the point where Solana’s account model stopped feeling opaque and started to make sense.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>solana</category>
      <category>web3</category>
      <category>learning</category>
    </item>
    <item>
      <title>Transactions on Solana — What Sending and Breaking Them Taught Me</title>
      <dc:creator>Zoe Lin</dc:creator>
      <pubDate>Sat, 09 May 2026 20:07:12 +0000</pubDate>
      <link>https://forem.com/zoe_lin_0653/transactions-on-solana-what-sending-and-breaking-them-taught-me-1a5p</link>
      <guid>https://forem.com/zoe_lin_0653/transactions-on-solana-what-sending-and-breaking-them-taught-me-1a5p</guid>
      <description>&lt;p&gt;Before this week, Solana transactions felt familiar enough to recognize, but not familiar enough to really understand.&lt;/p&gt;

&lt;p&gt;I could open a transaction in Solana Explorer and identify the parts. I knew there was a signature, an instruction, a fee, and the accounts involved. But that was mostly recognition, not understanding. What changed that for me was actually working through the full flow myself: sending a transfer, tracking confirmation, and then forcing a transaction to fail on purpose.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;The API analogy that helped at first&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;At first, the easiest way for me to think about a Solana transaction was to compare it to an API request. That analogy helped because it gave me a place to start. A transaction has structure, it includes instructions, and it carries signatures that authorize the action. Looking at it that way made the data feel less mysterious.&lt;/p&gt;

&lt;p&gt;But after I started sending transactions myself, that comparison felt less complete.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What changed once I actually sent one&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The first shift came when I sent SOL and then looked at the result in Solana Explorer. On the surface, it was just a small transfer from one address to another. But the actual transaction had much more structure than that: a recent blockhash, a fee payer, account inputs, and a specific System Program instruction. That was the first time a transaction stopped feeling like a wallet action and started feeling more like a real on-chain operation.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What confirmation made clearer&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The next shift came when I added confirmation progress to my transfer tool. Instead of sending a transaction and waiting for a result, I could watch it move through processed, confirmed, and finalized. That made the lifecycle much easier to understand. It also made Solana feel less like a simple request-and-response system and more like a network where state changes settle in stages.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What failed transactions taught me&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;I deliberately forced a transfer to fail and then checked the result in Solana Explorer. That ended up teaching me more than I expected. The failed transaction still had a signature, still showed the instruction that failed, still produced logs, and still charged a fee. In my case, the logs clearly showed an insufficient lamports error, which made the failure much easier to reason about.&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%2F4553wqql5vvpqg236bdl.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%2F4553wqql5vvpqg236bdl.jpg" alt=" " width="800" height="606"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That was the point where my mental model changed the most. A Solana transaction no longer felt like just a request I was sending somewhere. It felt more like a signed, short-lived, atomic attempt to change on-chain state.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;What I am keeping from this week&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;That shift made several smaller details line up for me. The signature was not just an ID. The instruction was not just metadata. Confirmation was not just one final moment. And failure did not mean nothing happened.&lt;/p&gt;

&lt;p&gt;By the end of this week, transactions on Solana started to feel much less abstract and much more understandable.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>solana</category>
    </item>
    <item>
      <title>Gemma 4 Error Log Simplifier — AI-Powered Debugging Insights from Raw Logs</title>
      <dc:creator>Zoe Lin</dc:creator>
      <pubDate>Sat, 09 May 2026 18:19:30 +0000</pubDate>
      <link>https://forem.com/zoe_lin_0653/gemma-4-error-log-simplifier-ai-powered-debugging-insights-from-raw-logs-493n</link>
      <guid>https://forem.com/zoe_lin_0653/gemma-4-error-log-simplifier-ai-powered-debugging-insights-from-raw-logs-493n</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built a lightweight tool called Gemma 4 Error Log Simplifier, designed to turn raw and often confusing error logs into structured, easy-to-understand debugging insights.&lt;/p&gt;

&lt;p&gt;Error messages from different environments—such as Python, JavaScript, Java, SQL, or DevOps tools—are usually verbose and inconsistent in format. Instead of manually scanning through stack traces, users can paste an error log into the tool and quickly get a clearer explanation of what is happening and how to approach fixing it.&lt;/p&gt;

&lt;p&gt;The output is organized into a consistent structure that includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a concise summary of the error
&lt;/li&gt;
&lt;li&gt;possible root causes
&lt;/li&gt;
&lt;li&gt;practical debugging steps
&lt;/li&gt;
&lt;li&gt;suggested fixes
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is to reduce the cognitive load during debugging and make it easier to switch between different tech stacks without losing time interpreting error messages.&lt;/p&gt;

&lt;p&gt;This project is implemented as a simple local web application using FastAPI and Jinja2, with Gemma 4 integrated via the Gemini API as the core reasoning engine.&lt;/p&gt;

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

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

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/zoelinsg/DEV-Projects/tree/main/DEV_Gemma_4_Challenge" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How I Used Gemma 4
&lt;/h2&gt;

&lt;p&gt;The application uses &lt;code&gt;gemma-4-26b-a4b-it&lt;/code&gt; through the Gemini API to process and interpret error logs.&lt;/p&gt;

&lt;p&gt;Error logs are semi-structured but often noisy, with useful signals mixed together with irrelevant details. This makes them difficult to parse programmatically with traditional approaches. Gemma 4 is well-suited for this task because it can understand patterns across different programming languages and extract meaningful context from unstructured input.&lt;/p&gt;

&lt;p&gt;To make the output predictable and easy to render in the UI, I designed the prompt to enforce a consistent response format. Each response follows the same structure: summary, causes, debugging steps, and suggested fixes. This ensures both readability and usability in real debugging scenarios.&lt;/p&gt;

&lt;p&gt;On the backend side, I added a simple retry mechanism to handle occasional API instability and improve reliability during repeated requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This project focuses on a practical use case where large language models can directly support everyday developer workflows. Instead of generating content, the model is used to translate raw technical data into actionable insights, which can significantly reduce the time spent understanding and resolving errors.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>gemmachallenge</category>
      <category>gemma</category>
    </item>
    <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;p&gt;  &lt;iframe src="https://www.youtube.com/embed/2nJFeRnQHC4"&gt;
  &lt;/iframe&gt;
&lt;/p&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;
  
  
  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;p&gt;  &lt;iframe src="https://www.youtube.com/embed/b5oLkYx-YJ8"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

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

&lt;ul&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;p&gt;  &lt;iframe src="https://www.youtube.com/embed/E4a_cHElang"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

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

&lt;ul&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;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>
  </channel>
</rss>
