<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Heysho</title>
    <description>The latest articles on DEV Community by Heysho (@heysho).</description>
    <link>https://dev.to/heysho</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4096995%2F570b8802-eb0a-43fd-affb-473241bcfbb4.png</url>
      <title>DEV Community: Heysho</title>
      <link>https://dev.to/heysho</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/heysho"/>
    <language>en</language>
    <item>
      <title>Building AI Rap Generation Tool with Gemini API / LangChain / Cloud Run</title>
      <dc:creator>Heysho</dc:creator>
      <pubDate>Thu, 27 Aug 2026 08:34:43 +0000</pubDate>
      <link>https://dev.to/heysho/building-and-launching-an-ai-rap-generation-service-with-gemini-api-langchain-cloud-run-1pc</link>
      <guid>https://dev.to/heysho/building-and-launching-an-ai-rap-generation-service-with-gemini-api-langchain-cloud-run-1pc</guid>
      <description>&lt;p&gt;I recently developed &lt;strong&gt;Rap Dojo&lt;/strong&gt;, a web service that uses AI to generate rap lyrics. In this article, I’ll share how the project came about, how I built it, and what I learned from launching and running it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://rapdojo.com/" rel="noopener noreferrer"&gt;https://rapdojo.com/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Why I Built Rap Dojo
&lt;/h2&gt;

&lt;p&gt;My original motivation was simple: I wanted to build a working product using an LLM API.&lt;/p&gt;

&lt;p&gt;Around that time, Google and Zenn were hosting a Gemini-related hackathon, and I thought, “If I’m going to build something, why not make something interesting with Gemini?”&lt;/p&gt;

&lt;p&gt;That idea led me to start developing Rap Dojo.&lt;/p&gt;

&lt;p&gt;The concept was an AI rap generator that would make it easy for anyone to create a rap.&lt;/p&gt;

&lt;p&gt;Of course, you can already ask a conversational AI such as ChatGPT or Gemini to “write me a rap,” and it will generate one for you.&lt;/p&gt;

&lt;p&gt;But when you actually use a chat interface, that freedom can sometimes be overwhelming. People may wonder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“What should I type?”&lt;/li&gt;
&lt;li&gt;“How should I prompt it to create an interesting rap?”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Rap Dojo, I wanted to create an experience simple enough that users could generate a rap by entering just a few words, without having to think about complicated prompts.&lt;/p&gt;

&lt;p&gt;For example, you might enter your name, something you like, or something that happened recently, and the AI will turn those ideas into a rap.&lt;/p&gt;

&lt;p&gt;I thought that if the experience were simple enough, even people who rarely use generative AI might feel comfortable playing around with it. It could make AI-generated content feel a little more accessible and integrated into everyday life.&lt;/p&gt;

&lt;p&gt;That became the starting point for Rap Dojo.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. System Architecture
&lt;/h2&gt;

&lt;p&gt;I intentionally kept Rap Dojo’s architecture as simple as possible.&lt;/p&gt;

&lt;p&gt;At a high level, it consists of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend:&lt;/strong&gt; HTML / CSS / JavaScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backend:&lt;/strong&gt; Python / LangChain&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LLM:&lt;/strong&gt; Gemini API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Infrastructure:&lt;/strong&gt; Google Cloud Run&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The frontend calls the backend API through JavaScript. The backend then uses Gemini to generate a rap based on the user’s input and returns the result to the frontend.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Frontend Uses HTML / CSS / JavaScript
&lt;/h3&gt;

&lt;p&gt;For the frontend, I decided not to use a framework such as React or a CMS. It is built primarily with HTML and CSS, with some JavaScript.&lt;/p&gt;

&lt;p&gt;One reason I chose this approach is the rapid progress of AI coding tools.&lt;/p&gt;

&lt;p&gt;Today, tools such as Claude Code and Antigravity make it possible to build and modify websites efficiently using natural-language instructions.&lt;/p&gt;

&lt;p&gt;For a relatively small web service like this, I therefore felt that introducing a CMS or a large JavaScript framework was unnecessary.&lt;/p&gt;

&lt;p&gt;I’m also comfortable working directly with HTML and CSS, so editing the code myself does not create much overhead.&lt;/p&gt;

&lt;p&gt;Keeping the architecture simple provides several benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It is easier to understand how everything works.&lt;/li&gt;
&lt;li&gt;It is easier to modify with AI coding tools.&lt;/li&gt;
&lt;li&gt;There are fewer dependencies.&lt;/li&gt;
&lt;li&gt;Maintenance is simpler.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For small websites and indie projects, I’ve come to believe that avoiding unnecessary technical complexity can be just as important as choosing the right technology.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Backend Runs on Google Cloud Run
&lt;/h3&gt;

&lt;p&gt;I use Google Cloud Run for the backend.&lt;/p&gt;

&lt;p&gt;Rap Dojo does not receive a large volume of traffic continuously, so I did not want to run a server 24/7.&lt;/p&gt;

&lt;p&gt;Instead, I chose Cloud Run because its serverless model allows the backend to run only when needed.&lt;/p&gt;

&lt;p&gt;Conceptually, the flow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User input
↓
Frontend (JavaScript)
↓
Cloud Run API
↓
Python / LangChain
↓
Gemini API
↓
Rap generation
↓
Result returned to frontend
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once the user input is received, the backend performs the generation process and returns the output to the frontend through the API.&lt;/p&gt;

&lt;h3&gt;
  
  
  Almost No Infrastructure Cost for an Indie Project
&lt;/h3&gt;

&lt;p&gt;One of the biggest benefits of this architecture is its low operating cost.&lt;/p&gt;

&lt;p&gt;Gemini API usage naturally incurs costs depending on usage, but at Rap Dojo’s current traffic level, the Google Cloud infrastructure costs are extremely low.&lt;/p&gt;

&lt;p&gt;The exact amount varies by month, but infrastructure costs generally stay below a few hundred yen per month.&lt;/p&gt;

&lt;p&gt;In the past, launching a web service with a backend meant thinking about servers, hosting, maintenance, and other infrastructure concerns.&lt;/p&gt;

&lt;p&gt;Today, by combining a serverless environment such as Cloud Run with a generative AI API, even an individual developer can launch a web application that accepts user input and processes it dynamically at very low cost.&lt;/p&gt;

&lt;p&gt;Building Rap Dojo reminded me just how much the barrier to launching this kind of product has fallen.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Why I Chose Gemini
&lt;/h2&gt;

&lt;p&gt;I use Gemini as the LLM behind Rap Dojo.&lt;/p&gt;

&lt;p&gt;The biggest reason is its strong balance between cost and quality.&lt;/p&gt;

&lt;p&gt;In particular, Gemini’s Flash models offer relatively low API costs while still providing more than enough quality for text-generation use cases like this one.&lt;/p&gt;

&lt;p&gt;Every time a user generates a rap, the application makes an LLM API call. As usage grows, those costs accumulate.&lt;/p&gt;

&lt;p&gt;That means indie developers need to think not only about model performance, but also about the cost of each generation.&lt;/p&gt;

&lt;p&gt;From that perspective, I’ve found the Gemini Flash family very practical for personal projects.&lt;/p&gt;

&lt;p&gt;Another reason I often use Gemini is that Google Cloud credits are relatively accessible through developer programs and events.&lt;/p&gt;

&lt;p&gt;Google regularly organizes developer events and hackathons, and participation sometimes comes with Google Cloud credits.&lt;/p&gt;

&lt;p&gt;Although these credits typically expire, some events provide credits worth around ¥10,000–¥20,000, which can be very useful for indie development.&lt;/p&gt;

&lt;p&gt;Making good use of those credits is another reason the Gemini API has become my main choice for personal projects involving LLMs.&lt;/p&gt;

&lt;p&gt;Rap Dojo currently uses different models depending on the task:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gemini 3.7 Flash&lt;/li&gt;
&lt;li&gt;Gemini 3.5 Flash-Lite&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rather than using the most powerful model for every task, I use lighter models where appropriate. This helps keep costs down while maintaining the generation quality I need.&lt;/p&gt;

&lt;p&gt;For indie development, I’ve learned that model selection should not simply be about choosing the “best-performing” model. It is equally important to consider how cheaply you can operate while still meeting the required quality level.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Why I Use LangChain
&lt;/h2&gt;

&lt;p&gt;In Rap Dojo, the rap-generation process is implemented as a two-stage pipeline.&lt;/p&gt;

&lt;p&gt;At a high level, it works like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User input
↓
1. Generate the rap
↓
2. Format the output
↓
Display to user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The main reason I use LangChain is that I wanted a convenient way to connect multiple LLM operations sequentially.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 1: Generate the Rap as Freely as Possible
&lt;/h3&gt;

&lt;p&gt;The first step is to generate the rap itself.&lt;/p&gt;

&lt;p&gt;At this stage, rather than controlling the output format too strictly, I give the LLM more freedom and prioritize creativity and entertainment value.&lt;/p&gt;

&lt;p&gt;With rap lyrics, overly strict formatting requirements can make the output more consistent, but they can also make the writing feel repetitive or less expressive.&lt;/p&gt;

&lt;p&gt;So in the first stage, I prioritize the quality of the content itself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stage 2: Format the Output for Display
&lt;/h3&gt;

&lt;p&gt;The generated rap is then passed to a second process that adjusts it into a format that works well on the website.&lt;/p&gt;

&lt;p&gt;For example, this stage can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remove unnecessary symbols.&lt;/li&gt;
&lt;li&gt;Shorten the output if it is too long.&lt;/li&gt;
&lt;li&gt;Standardize formatting and notation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This step does not require particularly advanced creative ability, so I can use a lighter and cheaper model such as Gemini 3.5 Flash-Lite.&lt;/p&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rap generation:&lt;/strong&gt; prioritize quality and creativity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Formatting:&lt;/strong&gt; prioritize cost and processing efficiency.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each model has a different role.&lt;/p&gt;

&lt;h3&gt;
  
  
  Separating Generation from Formatting
&lt;/h3&gt;

&lt;p&gt;Initially, I considered handling everything within a single prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Write a rap and output it in this exact format.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But after experimenting with the application, I found that separating content generation from output formatting made the system easier to manage.&lt;/p&gt;

&lt;p&gt;Instead of asking a single model to do everything, I split the process into:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Generate
↓
Review / format
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This also allows me to choose a model that is appropriate for each task.&lt;/p&gt;

&lt;p&gt;Even though Rap Dojo has a relatively simple architecture, I still needed a convenient way to manage multiple LLM operations as a pipeline. That is the main reason I decided to use LangChain.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Deploying to Google Cloud
&lt;/h2&gt;

&lt;p&gt;I use Google Cloud Run to deploy the backend.&lt;/p&gt;

&lt;p&gt;There are several ways to deploy a Python-based web application, so during the early stages of development I considered a number of options, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Streamlit Cloud&lt;/li&gt;
&lt;li&gt;Hugging Face&lt;/li&gt;
&lt;li&gt;Building a Python environment on a traditional hosting server&lt;/li&gt;
&lt;li&gt;Creating a Python runtime environment on Google Cloud&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this particular use case, however, I found Cloud Run to be the easiest option while also keeping costs low.&lt;/p&gt;

&lt;h3&gt;
  
  
  Easy to Combine with a Custom-Domain Website
&lt;/h3&gt;

&lt;p&gt;With Rap Dojo, I did not want to publish only an AI demo. I wanted to integrate the rap-generation feature into a proper website running on the custom domain &lt;code&gt;rapdojo.com&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Services such as Streamlit Cloud and Hugging Face are extremely useful for publishing AI application prototypes.&lt;/p&gt;

&lt;p&gt;For the architecture I had in mind, however, it was easier to have an existing custom-domain website call a Python backend through an API.&lt;/p&gt;

&lt;p&gt;With Cloud Run, the architecture can be cleanly separated like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rapdojo.com
HTML / CSS / JavaScript
        ↓
   Cloud Run API
        ↓
      Python
        ↓
   Gemini API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The website itself remains a conventional HTML website, while Cloud Run handles only the parts that require AI processing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Run Python Only When Needed
&lt;/h3&gt;

&lt;p&gt;Another reason Cloud Run works particularly well for Rap Dojo is that a small indie service like this does not need a backend running continuously.&lt;/p&gt;

&lt;p&gt;Python only needs to execute when someone generates a rap.&lt;/p&gt;

&lt;p&gt;For that reason, a serverless service such as Cloud Run was a better fit than maintaining an always-on server.&lt;/p&gt;

&lt;p&gt;At relatively low traffic levels, infrastructure costs can remain very low as well.&lt;/p&gt;

&lt;p&gt;I think Cloud Run is a practical option when you want to add Python or generative AI functionality to specific parts of an otherwise conventional website.&lt;/p&gt;

&lt;p&gt;I used to associate AI apps with specialized application environments, but in practice, combining a standard HTML-based website with Cloud Run was enough to launch a fully functional service.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Challenges Unique to AI Web Applications
&lt;/h2&gt;

&lt;p&gt;One thing I noticed after operating Rap Dojo in production is the instability that comes with relying on an external LLM API.&lt;/p&gt;

&lt;p&gt;With a conventional website, as long as your own servers and code are functioning correctly, you can generally continue providing the service.&lt;/p&gt;

&lt;p&gt;A generative AI application introduces another dependency:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rap Dojo
↓
LLM API
↓
External AI service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As a result, even when there is nothing wrong with your own code, the application may temporarily become unavailable because of issues on the LLM provider’s side.&lt;/p&gt;

&lt;h3&gt;
  
  
  API Changes Can Suddenly Break Your Application
&lt;/h3&gt;

&lt;p&gt;During the early development of Rap Dojo, I used a GPT API.&lt;/p&gt;

&lt;p&gt;At one point, an API specification change caused a process that had previously been working to suddenly stop.&lt;/p&gt;

&lt;p&gt;I had not changed my own code, but a change to the external API still affected the service.&lt;/p&gt;

&lt;p&gt;That experience made me much more aware of this risk.&lt;/p&gt;

&lt;h3&gt;
  
  
  Errors Caused by Model-Side Load
&lt;/h3&gt;

&lt;p&gt;I had similar experiences after switching to Gemini.&lt;/p&gt;

&lt;p&gt;With one of the Gemini Flash models I was using at the time, high load on the model side occasionally resulted in API errors, temporarily preventing users from generating rap lyrics.&lt;/p&gt;

&lt;p&gt;The service is more stable now, but once you operate a real product, you quickly realize that you cannot assume an LLM API will succeed 100% of the time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Design LLM Applications with Failure in Mind
&lt;/h3&gt;

&lt;p&gt;The main lesson from this experience is that when building a generative AI service, implementing only the success path is not enough.&lt;/p&gt;

&lt;p&gt;You also need to consider scenarios such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The API temporarily does not respond.&lt;/li&gt;
&lt;li&gt;Responses take too long.&lt;/li&gt;
&lt;li&gt;The model returns an error.&lt;/li&gt;
&lt;li&gt;The API or model specifications change.&lt;/li&gt;
&lt;li&gt;The model you depend on is changed or discontinued.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a production service, it is important to think about what happens when the LLM fails, including error messages, retries, and potentially falling back to another model.&lt;/p&gt;

&lt;p&gt;In traditional web development, I mainly thought about my own code and infrastructure.&lt;/p&gt;

&lt;p&gt;AI web applications add another dependency: the external LLM service.&lt;/p&gt;

&lt;p&gt;Operating Rap Dojo taught me that designing around this dependency is an important part of building AI products.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. What I Learned After Launching It
&lt;/h2&gt;

&lt;p&gt;After launching Rap Dojo, I learned several things beyond the technical side of development.&lt;/p&gt;

&lt;p&gt;One of the most interesting lessons was that even a small web service on a brand-new domain can attract meaningful traffic if it combines a niche user need with effective SEO.&lt;/p&gt;

&lt;p&gt;For Rap Dojo, I registered the domain &lt;code&gt;rapdojo.com&lt;/code&gt; and built the site with SEO in mind from the beginning.&lt;/p&gt;

&lt;p&gt;SEO is also part of my professional background, so I researched search demand and optimized the site and its content accordingly.&lt;/p&gt;

&lt;p&gt;As a result, the site began ranking for relevant Japanese keywords such as &lt;strong&gt;“ラップ AI”&lt;/strong&gt; (“rap AI”) and &lt;strong&gt;“ラップ 作って”&lt;/strong&gt; (“make me a rap”).&lt;/p&gt;

&lt;p&gt;Today, around 3,000 people visit the site each month.&lt;/p&gt;

&lt;p&gt;Of course, this is not a large-scale service. But considering that I am not running any advertising and started from a completely new domain, I think it is an encouraging result for an indie web application.&lt;/p&gt;

&lt;p&gt;This experience made me think that the following combination can work particularly well for indie projects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Niche search demand
+
A genuinely useful tool
+
SEO
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Traffic Does Not Necessarily Mean Monetization
&lt;/h3&gt;

&lt;p&gt;There was, however, another important lesson.&lt;/p&gt;

&lt;p&gt;Getting users to visit a product and turning that product into a viable source of revenue are two completely different challenges.&lt;/p&gt;

&lt;p&gt;Rap Dojo is mainly something people use casually for fun, and I do not think it is the kind of service most users would pay for.&lt;/p&gt;

&lt;p&gt;For that reason, it remains essentially free to use.&lt;/p&gt;

&lt;p&gt;However, even a free service has operating costs.&lt;/p&gt;

&lt;p&gt;Gemini API, Google Cloud, and other services all cost a small amount of money each month.&lt;/p&gt;

&lt;p&gt;That creates a simple situation:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“There is no revenue, but the product still costs a little money every month.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At the same time, the site has gained search rankings and people are actively using it, so shutting it down feels like a waste.&lt;/p&gt;

&lt;p&gt;As a result, Rap Dojo has become a product that I continue to maintain while paying a small amount each month to keep it running.&lt;/p&gt;

&lt;h3&gt;
  
  
  Next Time, I’ll Think About What Happens After Launch
&lt;/h3&gt;

&lt;p&gt;For one project like Rap Dojo, this is not a major issue.&lt;/p&gt;

&lt;p&gt;But if I were to create five or ten similar personal projects, each one would come with API fees, cloud costs, domain fees, and ongoing maintenance work.&lt;/p&gt;

&lt;p&gt;That has made me realize that for my next web product, I should think not only about building and launching it, but also about how I plan to maintain it afterward.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How will it be monetized?&lt;/li&gt;
&lt;li&gt;How long will I test the idea?&lt;/li&gt;
&lt;li&gt;What metrics would justify continuing the product?&lt;/li&gt;
&lt;li&gt;If those goals are not achieved, should I shut it down?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Defining criteria like these in advance may be useful.&lt;/p&gt;

&lt;p&gt;With indie development, building and launching something is fun in itself, so it is easy to keep creating new products without thinking too much about what happens afterward.&lt;/p&gt;

&lt;p&gt;However, if you want to manage several products over the long term, deciding what to keep and what to shut down may be just as important as deciding what to build.&lt;/p&gt;

&lt;h3&gt;
  
  
  I Plan to Keep Rap Dojo Running
&lt;/h3&gt;

&lt;p&gt;That said, I currently have no plans to shut down Rap Dojo.&lt;/p&gt;

&lt;p&gt;I do not plan to make major feature additions or actively develop it on an ongoing basis, but I still use it from time to time to create rap lyrics for fun.&lt;/p&gt;

&lt;p&gt;Rather than trying to turn Rap Dojo into a large business, I plan to maintain it as a small AI product that I built and still use myself.&lt;/p&gt;

&lt;p&gt;From a monetization perspective, it has not been a successful product.&lt;/p&gt;

&lt;p&gt;But in terms of what I learned, the project has been extremely valuable:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I successfully launched a real service powered by an LLM API.&lt;/li&gt;
&lt;li&gt;I acquired users through SEO starting from a brand-new domain.&lt;/li&gt;
&lt;li&gt;The product continues to attract regular users.&lt;/li&gt;
&lt;li&gt;I learned about the operational challenges and costs that come after launch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Overall, it has been a very rewarding project.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Conclusion
&lt;/h2&gt;

&lt;p&gt;I’d like to finish with a short introduction about myself.&lt;/p&gt;

&lt;p&gt;As a hobby, I build AI-powered products and indie projects like Rap Dojo.&lt;/p&gt;

&lt;p&gt;Professionally, I primarily work in SEO, and more recently I have also been conducting research and analysis related to GEO and AI Search.&lt;/p&gt;

&lt;p&gt;My main areas of interest include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SEO&lt;/li&gt;
&lt;li&gt;GEO / AI Search&lt;/li&gt;
&lt;li&gt;Generative AI&lt;/li&gt;
&lt;li&gt;Data analysis and research&lt;/li&gt;
&lt;li&gt;AI-powered product development&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When it comes to indie development, I enjoy more than simply writing code.&lt;/p&gt;

&lt;p&gt;I like coming up with an idea, turning it into a real product, launching it, attracting users through SEO, and then operating and improving it over time.&lt;/p&gt;

&lt;p&gt;If you read this article and thought:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“I’m working on something similar.”&lt;/li&gt;
&lt;li&gt;“I’d be interested in researching GEO or AI Search together.”&lt;/li&gt;
&lt;li&gt;“There might be an opportunity to collaborate on an AI-powered product.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I’d be very happy to connect.&lt;/p&gt;

&lt;p&gt;You can find more information about the projects and research I’m working on here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Heysho&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="https://heysho.com/" rel="noopener noreferrer"&gt;https://heysho.com/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>langchain</category>
      <category>googlecloud</category>
    </item>
  </channel>
</rss>
