<?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: tomokat</title>
    <description>The latest articles on Forem by tomokat (@tomokat).</description>
    <link>https://forem.com/tomokat</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%2F1415059%2Fc255f7c5-e3b8-43f1-a73f-471f0018f7c3.png</url>
      <title>Forem: tomokat</title>
      <link>https://forem.com/tomokat</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/tomokat"/>
    <language>en</language>
    <item>
      <title>My recent honest thoughts with Google Antigravity</title>
      <dc:creator>tomokat</dc:creator>
      <pubDate>Thu, 02 Apr 2026 06:41:14 +0000</pubDate>
      <link>https://forem.com/tomokat/my-recent-honest-thoughts-with-google-antigravity-ig1</link>
      <guid>https://forem.com/tomokat/my-recent-honest-thoughts-with-google-antigravity-ig1</guid>
      <description>&lt;p&gt;I know how (somewhat) recent quota change with Antigravity &lt;strong&gt;pissed off&lt;/strong&gt; so many people (based on seeing countless post on Reddit about it) I too first thought took a hit when I could barely use "Gemini High" model. But when I was forced to use "Gemini Flash", at least for what I'm doing, it actually started to work better.&lt;/p&gt;

&lt;p&gt;Once again I'm not saying this is true for everyone but for me (and maybe few others as well - I thought small number of Reddit post talk about similar experience), that is the case and I want to write a bit about how I'm getting the most out of Google Antigravity. I don't have a guts to put a post in Reddit (as I will be quickly seen as someone from Google lol) but hopefully here in dev.to, I can share some of my honest opinion and perspective about Google Antigravity (w/ Google AI Pro license)&lt;/p&gt;

&lt;p&gt;I think it is still one of the best value out there (though I have to admit, I didn't shop around too much, I have Chat GPT Plus and Google AI Pro and being pretty happy with this set up)&lt;/p&gt;

&lt;h2&gt;
  
  
  Ask Antigravity to generate documentation
&lt;/h2&gt;

&lt;p&gt;You might think - "here we go again - Mr. obvious" - and I know there are many posts and article talk about this, including having good agent md file, instructions files, skills etc. But my approach is slightly different. I'm not saying having these files are wrong and probably good in most cases but for me, what works well is that whenever I want to implement new features (mind you, what I'm doing is to create game using Phaser as game engine), I first start off asking it to document some pre-requisite knowledge I want AI to have. This has (at least) 2 benefits - first, such document is useful for me as I can't possibly remember all the detail and second, of course such document is great for AI to quickly understand what I wanted to do - this allow me to switch room when I feel context is getting filled up (more on this later)&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't afraid to create new chat
&lt;/h2&gt;

&lt;p&gt;Another popular topic on Reddit about Google Antigravity is the error&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The model's generation exceeded the maximum output token limit.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;which I got hit hard today as well. First I was trying to keep working with it - Antigravity also trying its best to break response to smaller chunks but it was brutal. Not sure what exactly trigger this but my hypothesis is that at some point it sucked in very large JSON data (enemies.json) which I don't touch directly (instead, I have smaller files and then use node script to combine it into 1 file) and that somehow stick with it.&lt;/p&gt;

&lt;p&gt;So what I've done? I asked Antigravity to generate me a summary of what I was trying to, where we are etc. and anything that new room can benefit knowing (but in compact manner) I then took that and start new conversation - experience is night and day difference! So if you get hit hard with that error message first make sure you are not giving entire context - even us human can't work like that (also I don't know about you but I don't want to review such large context changes later) and then try creating new chat - might save you some time :)&lt;/p&gt;

&lt;h2&gt;
  
  
  Conversation based approach works really well
&lt;/h2&gt;

&lt;p&gt;This is something took me while to realize but ... Google Antigravity can really understand your intent! First I was using Chat GPT to craft fairly lengthy prompt then feed it into Antigravity but when I realize how well Nano-Banana understand my intent, I thought maybe I can give that a shot with Antigravity and yep, it works. I usually start off asking it document how it works so that might help a bit but for most part it can understand our intent really well!&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't just say "do it" - review the implementation plan
&lt;/h2&gt;

&lt;p&gt;I've done this in the past as well so I know it is super easy to just say "looks good, go ahead and implement" but wait - if you read the implementation plan carefully, it might be asking some of your inputs (much like how Cursor ask few questions - difference is, Cursor does that in more of flow manner but Antigravity is having it in the plan document itself, could be easily missed unless you pay some real attention)&lt;/p&gt;

&lt;p&gt;Once I started to pay attention to implementation plan and especially question it was asking, I feel the quality of output improve in fairly noticeable way so you might want to try that, if you never done it before.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI can only get more expensive
&lt;/h2&gt;

&lt;p&gt;So to summarize, I'm getting quite bit of things done with Google Flash. My game is not rocket science but also not super trivial (I think) but so far Google Antigravity (Gemini Flash) been able to assist me to do what I want really well. I can only sense that AI price can go up, I really hope Google AI Pro license remains within the ballpark of where it is - considering it also give more prompt to Nano Banana Pro and even has 1000 credit for Google Flow, I think it is still one of the best value (again, my personal opinion)&lt;/p&gt;

&lt;h2&gt;
  
  
  Not most recent one but to give you idea of what I'm building
&lt;/h2&gt;


&lt;div&gt;
    &lt;iframe src="https://www.youtube.com/embed/DDq340T-ozs"&gt;
    &lt;/iframe&gt;
  &lt;/div&gt;


&lt;p&gt;(I made quite bit of progress since I made this video but for now this is the best English version demo (translation is not complete so you might still see Japanese character here and there) - if I made another English demo video, I will post it here)&lt;/p&gt;

</description>
      <category>antigravity</category>
      <category>ai</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>Power of "Data-Driven Architecture" applies to game development as well</title>
      <dc:creator>tomokat</dc:creator>
      <pubDate>Fri, 23 Jan 2026 11:28:19 +0000</pubDate>
      <link>https://forem.com/tomokat/power-of-data-driven-architecture-applies-to-game-development-as-well-6m0</link>
      <guid>https://forem.com/tomokat/power-of-data-driven-architecture-applies-to-game-development-as-well-6m0</guid>
      <description>&lt;p&gt;I thought I didn't write here for while but looks like I did write one article back in Jan 4th this year so maybe it's not that bad.&lt;/p&gt;

&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Bit of terminology&lt;/li&gt;
&lt;li&gt;Motivation&lt;/li&gt;
&lt;li&gt;The problem&lt;/li&gt;
&lt;li&gt;A Solution&lt;/li&gt;
&lt;li&gt;Conclusion&lt;/li&gt;
&lt;li&gt;Bit of info about my game&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I want to make sure I'm focusing on "development" topic when I write something here - as opposed to just give an update to my game development (honestly, who cares about that? lol) and since I started to establish my "development flow" which goes like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;start with Chat GPT to refine my ask, make sure I'm clear on what I want&lt;/li&gt;
&lt;li&gt;eventually Chat GPT generate "nice looking" (or "scary looking") super long, detailed prompt that I won't have patience to write&lt;/li&gt;
&lt;li&gt;I then pass it to Antigravity&lt;/li&gt;
&lt;li&gt;Check the work done, sometimes I need to chime in to fix few things here and there but for most part Chat GPT + Antigravity will make it happen in very few try&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So ... yeah, I'm no longer "developing" code and hence I feel I don't have much to add value to dev.to community. I feel here, most people are fairly hardcore developers.&lt;/p&gt;

&lt;p&gt;But today I feel I have a topic that I finally want to share and write bit about - and that is the power of "Data-Driven Architecture".&lt;/p&gt;

&lt;h2&gt;
  
  
  Bit of terminology &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;I need to look up if this is the real term (I think it was anyway) - yep, I was wrong (and glad I check it) Originally I thought it is "Data-Driven Development" but that term might be confusing with business term "Data-Driven" so Gemini suggested to change it to "Architecture" :) Anyway, just because I add a word "Architecture" won't all the sudden make me smart, so please bear with me if I said something bit off - goal of this post is to share my experiences and why I felt this approach make sense.&lt;/p&gt;

&lt;h2&gt;
  
  
  Motivation &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Fist of all, let's state the obvious - "game development is time consuming activity". While AI can greatly reduce effort, we all know it won't be just magic box that you can throw whatever you want and it generates (well, maybe for fairly simple thing it can) So you want to reduce effort on your end when it comes to perform the cycle of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;developing a feature&lt;/li&gt;
&lt;li&gt;testing a feature (manually)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The problem &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;This is especially true when you are solo developer - you have so many things you need to do and last thing you want to deal with, is bunch of hard-coded logic all over the place. Why? Because you can't quickly try slightly different thing - like what if I increase the HP of this boss monster, how does that impact the playability of my game? (I'm purposely trying to keep this to as generic as possible - so not talking too specific about what I'm building) If your logic is deeply hard-coded in the game itself you (or AI) will be&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;first locate the code/area where you need ot change value&lt;/li&gt;
&lt;li&gt;(this might trigger process like compilation - depends on your setting/language/framework/game engine)&lt;/li&gt;
&lt;li&gt;test your feature (manually)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This works, to some degree but eventually will drive you crazy. I can tell you this because when I built my old game with Android 0.6, I was doing this. I was using Static classes all over the place to trigger game logic and boy it was messy! Honestly I was young, inexperienced but had lots of time on my hand so I end up brute force this and (somehow) get to the point I release the app (really scary what passion can do - but in the end that's why I end up spending 3000+ hours on this)&lt;/p&gt;

&lt;h2&gt;
  
  
  A solution &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;I said "A solution" as I'm sure this is not the only way to solve this problem. I never used it myself but from what I see, this is exactly how "RPG (or Game) Maker" provide to its users. It provides ability to set various events (which is crucial for RPG game) and be able to trigger nicely. It also provide a way to quickly tweak monster parameters by changing values (stored in some form of DB?)&lt;/p&gt;

&lt;p&gt;I honestly didn't know how exactly I can do this but I know what is my ideal state so I started to ask how I can extract game logic (whether it is to handle ADV game like conversation, to manage hotspots data in the town) I already wrote about these so I won't repeat myself here but that was best decision I made. Why? Because it game me ability to extend my game rapidly. I can keep adding new FX (of which I can simply define in my txt file, converted to CSV format and then let my game read and react to it)&lt;/p&gt;

&lt;p&gt;I then keep applying this concept whenever I can - I need a logic to build "world" which I wanted to be super configurable but make many parameter random (yep, I want to build "rogue-light" game) and I just made a way to do this pretty much all things defined in JSON file and then be able to even add yet another hook from my txt file to call this with simple target id. I can't express the freedom this provide to me - I can now trigger this from pretty much any event scene (not that I have good reason to do that, but hey, you never know - I might want to do that at some later stage)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "id": "WT_CALM",
  "name": "Calm",
  "tags": [
    "intro",
    "stable"
  ],
  "bgPool": [
    "bg_world_0"
  ],
  "rules": {
    "gridMin": 11,
    "gridMax": 11,
    "distortionGainPerStep": 0,
    "distortionGainPerBattle": 5,
    "monsterRate": 0.08,
    "npcRate": 0.03,
    "worldDistortionLimit": 100,
    "encounters": {
      "monster": {
        "mode": "count",
        "min": 7,
        "max": 9,
        "respawn": {
          "checkSteps": 7,
          "spawnMin": 2,
          "spawnMax": 3,
          "constraints": {
            "minDistFromCity": 3,
            "minDistFromPlayer": 5,
            "preferFog": true
          }
        }
      },
      "npc": {
        "mode": "count",
        "initial": 2
      },
      "elite": {
        "mode": "count",
        "initial": 1,
        "visible": true
      }
    }
  },
  "overrides": {
    "cities": [
      {
        "id": "first_town",
          "pos": {
            "x": 2,
            "y": 2
          },
          "hubId": "hub_1"
        }
      ],
      "dungeonGates": [
        {
          "id": "gate_intro_1",
          "pos": {
            "x": 8,
            "y": 8
          },
          "dungeon": {
            "type": "earth"
          },
          "gate": {
            "bgKey": "bg_gate_01",
            "titleKey": "gate.intro.title",
            "descKey": "gate.intro.desc"
          }
        }
      ],
    "disableRandomCities": true
  }
},
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;please note: this game is under development and most likely this data format will change (also not everything described here are implemented - some are just placeholder still lol)&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;I feel "Data-Driven Architecture" is a way to go and anther benefit this approach provides in this AI era is that it seem to be easier for AI (both my brain partner Chat GPT and my amazing developer Antigravity) to understand what I want. I wonder why and then came to realize that you are essentially forced to bring potentially complex concepts if we were to explain all this through words but data format like this is lot easier for AI (or even for me) to make sense.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bit of info about my game &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Lastly, if you are interested, please check my itch.io site that I recently created - here, I plan to post more about my game progress (through development blog post feature) I plan to release Trial version of my game in sometime late February so please check it out!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://w-ai.itch.io/para-logos-w-ai" rel="noopener noreferrer"&gt;https://w-ai.itch.io/para-logos-w-ai&lt;/a&gt;&lt;/p&gt;

</description>
      <category>antigravity</category>
      <category>gamedev</category>
      <category>phaser</category>
      <category>chatgpt</category>
    </item>
    <item>
      <title>I solved one of my major pain point during my game development with AI (Chat GPT + Antigravity)</title>
      <dc:creator>tomokat</dc:creator>
      <pubDate>Mon, 05 Jan 2026 04:46:24 +0000</pubDate>
      <link>https://forem.com/tomokat/i-solved-one-of-my-major-pain-point-during-my-game-development-with-ai-chat-gpt-antigravity-kkd</link>
      <guid>https://forem.com/tomokat/i-solved-one-of-my-major-pain-point-during-my-game-development-with-ai-chat-gpt-antigravity-kkd</guid>
      <description>&lt;p&gt;Today I wake up thinking I will implement a feature that I really wanted but couldn't (this is way back when I was trying to build a game using Android 0.6 - yes, that's long time ago)&lt;/p&gt;

&lt;p&gt;Here is what I wanted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;there is a picture of town (preferably can scroll to accommodate bigger picture than screen)&lt;/li&gt;
&lt;li&gt;I can somehow map "clickable regions" (I'm not being that fancy here - just want simple rects) and when I hover, I want to highlight the object (I can live with entire clickable region light up but if I can, I want to show object being lit up, as opposed to entire region show up)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I started to chat with Chat GPT - it explained to me that it is called "Hotspots" and also walk me through how I can implement this with Phaser 3. It is important to get "pixel perfect" co-ordinate and image (of which remove background to the object that I want to hover, with transparent PNG)&lt;/p&gt;

&lt;p&gt;After understanding how it works, I said fine, let me get to work. First I chat with Gemini &amp;amp; Nano Banana to craft few pictures - this was (relatively) easy part. Next, I load up these images in Preview app (I'm using Mac) thinking I should be able to get &lt;code&gt;(x,y)&lt;/code&gt; co-ordinate of my mouse and using rectangular selection (which shows width and height), I can do this however it turns out I can't seem to get &lt;code&gt;(x,y)&lt;/code&gt; co-ordinate (relative to the loaded picture) that easily.&lt;/p&gt;

&lt;p&gt;I paused for a second ... I look up alternative - some old Stack Overflow post says we can do this using Gimp but I want something lightweight and prefer to stick with the tool I have.&lt;/p&gt;

&lt;p&gt;So what I end up doing? Go back to Chat GPT, shared my desire to build super simple tool to do this and ~3 min later it spit out the fairly long prompt for me to give to Antigravity. It claim Antigravity can probably one shot this prompt - and here is the best part - it is instruct to build this in single file! (HTML/CSS/JavaScript all in one file)&lt;/p&gt;

&lt;p&gt;After ~7 min later, Antigravity ask me to review and wola - it's done. Here is the screenshot of the tool it generated from one super long prompt. Sure, it's not real product quality, sure it's missing bunch of features (like I can't seem to resize the box for now - but I can delete or move so good enough for my purpose)&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%2F4feqmn5uurnvk14e0jqs.png" 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%2F4feqmn5uurnvk14e0jqs.png" alt="Hotspot Editor in action"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;End result - I got what I needed - quick way to implement "hotspots" over image file that I can scroll - something I couldn't do before so I'm super excited to what this journey to build game with AI will take me to!&lt;/p&gt;

&lt;p&gt;Here is a 12-second screencast showing how this works within my game - hover effect might not be that noticeable but that can be easily tweak (also these data are all behind JSON - so I can easily add/remove/modify hotspots data per city data)&lt;/p&gt;

&lt;p&gt;

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


&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>antigravity</category>
      <category>chatgpt</category>
      <category>gemini</category>
    </item>
    <item>
      <title>Keep extending ADV game engine with Antigravity</title>
      <dc:creator>tomokat</dc:creator>
      <pubDate>Mon, 29 Dec 2025 18:15:13 +0000</pubDate>
      <link>https://forem.com/tomokat/keep-extending-adv-game-engine-with-antigravity-2idn</link>
      <guid>https://forem.com/tomokat/keep-extending-adv-game-engine-with-antigravity-2idn</guid>
      <description>&lt;p&gt;I didn't expect this at all (I know that's the same line I started my &lt;a href="https://dev.to/tomokat/end-up-building-a-decent-adv-game-engine-with-antigravity-and-chat-gpt-5cle"&gt;previous post&lt;/a&gt;) - it keep exceeding my expectation (in a good way, of course!)&lt;/p&gt;

&lt;p&gt;I'm writing this article mainly for myself so that later on I can refer back what I was thinking but also hoping maybe this might help some other people who might want to do something similar.&lt;/p&gt;

&lt;p&gt;Anyway so what have I done recently? I'm asking Antigravity to keep expanding that CSV-based ADV game engine and it's going pretty strong! The way I'm working is that whenever I feel I want new capability, first I chat with Chat GPT (that I've been talking about my game since the beginning) and it help me craft a prompt that I can feed into Antigravity.&lt;/p&gt;

&lt;p&gt;Since the last post, here are some new capabilities I added (not all these new capabilities are exposed back to txt file format yet)&lt;/p&gt;

&lt;p&gt;1) I now have my message appear one character at a time, with ability to control the speed&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;go_with_else,10,SAY,エルス,あ、アクシスだ。おーい,,start_of_the_adventure,else@C:neutral,,,else:neutral,DIALOG,TYPE:120,
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;here, as you can see I can simply add &lt;code&gt;TYPE:120&lt;/code&gt; to slow down that message appearance (pretending a character speaking slowly)&lt;/p&gt;

&lt;p&gt;2) ability to add BLACKOUT effect&lt;/p&gt;

&lt;p&gt;This is super useful (I can also change the color and alpha value) effect, before dislaying a text that I want to put some emphasis&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;opening,12,FX,,,,black,,,,,NODIALOG,,BLACKOUT:fadeIn=400,alpha=1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3) ability to display text in the middle with bit of "ink" effect&lt;/p&gt;

&lt;p&gt;It's not exactly how I wanted so I might still tweak but be able to put emphasis on text by simply providing few parameter is golden!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;opening,15,FX,,,,black,,,,,NODIALOG,,CENTER_TEXT:fontSize=30,fadeIn=1400,hold=2000,y=-40,ink=1
opening,20,NARR,,それは、もう終わったはずの物語だった,,black,,,,,NODIALOG,,
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4) very specific need/want to perform "symbol storm"&lt;/p&gt;

&lt;p&gt;This is one of the effect I wanted for my game (but honestly I don't think I can implement this myself) - here is what it does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;specify map (object) that can map some symbols to images&lt;/li&gt;
&lt;li&gt;randomly place it on the screen, and grow in size as it rotates each images and fill the screen&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://youtube.com/shorts/aH5HxgCjcCE?feature=share" rel="noopener noreferrer"&gt;Link to screencast&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I know this make absolute no sense but that's what I wanted and it implemented perfectly (I do end up tweaking a bit)&lt;/p&gt;

&lt;p&gt;With this, game now looks like this: (please ignore the message - it's still non-sense, also "symbol storm" effect still need more refinement but be able to build this in "just few hours" is really something and that's what I want to share most today in this post)&lt;/p&gt;

&lt;p&gt;I know - I probably shouldn't build animation (nor title screen) and instead, I should focus on building more fundamental part of my game but ... sometimes you want to do things in bit of out of order to bring your motivation high and for me this feels like a right approach (and best part of building everything by yourself (+ AI) is that you can decide whatever you want! :)) &lt;/p&gt;

</description>
      <category>antigravity</category>
      <category>chatgpt</category>
      <category>gamedev</category>
      <category>phaser</category>
    </item>
    <item>
      <title>Build something vs. add new features and maintaining it</title>
      <dc:creator>tomokat</dc:creator>
      <pubDate>Tue, 23 Dec 2025 21:05:50 +0000</pubDate>
      <link>https://forem.com/tomokat/build-something-vs-add-new-features-and-maintaining-it-1app</link>
      <guid>https://forem.com/tomokat/build-something-vs-add-new-features-and-maintaining-it-1app</guid>
      <description>&lt;p&gt;In &lt;a href="https://dev.to/tomokat/end-up-building-a-decent-adv-game-engine-with-antigravity-and-chat-gpt-5cle"&gt;my last post&lt;/a&gt; I shared my experience with asking AI to help me build a utility that would speed up my game development (at least building scenario and story lines) but for those of you who have been writing code knows that generating something new is relatively easy compared to adding features and maintaining it for very long time.&lt;/p&gt;

&lt;p&gt;So I asked Chat GPT (who assisted me to generate a prompt that I feed into Antigravity - of course this can be done by Gemini as well) this question:&lt;/p&gt;

&lt;p&gt;Can I assume to keep working in "this manner" (here I mean to ask AI to generate a prompt and feed into Antigravity) or would I soon see the tipping point where I need to roll up my sleeve and expected to code?&lt;/p&gt;

&lt;p&gt;The answer I got was - as long as we are very clear on what we want and be able to explain it clearly, there is no reason why I have to go into deep end of a codebase (but it reminds me, I need to provide all the data, scenario etc.)&lt;/p&gt;

&lt;p&gt;Of course that's what it says so I asked Chat GPT my specific ask of extending that CSV file to simulate ability to add party (so that I can easily add or remove someone into the game party) Mind you, at this point my game didn't even have concept of party (though Chat GPT knows as I exchange LOTS of conversation about the scenario and how I want to expand) so I thought this is too much ask.&lt;/p&gt;

&lt;p&gt;The result? Chat GPT gave me super long prompt (really scary length - I can follow what is asking, even on my good day it would take me few days to implement this without any bug) and ask it to give to Antigravity (I ask to expand CSV to be able to add/remove party, be able to tell who can be added to party and also add reusable UI component to render as we add character to the party) Wait a bit and ... wola, it's working! (I wont' lie, I need to ask few times to tweak a bit so it wasn't all one shot but still pretty impressive!)&lt;/p&gt;

&lt;p&gt;Here is a screenshot - I trigger one event where I added 2 characters to my party (nothing is happening other than adding to party and add display but still started to look like a real game, isn't it? :))&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%2Fb6mp8dgd5imyuvrhxpcr.png" 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%2Fb6mp8dgd5imyuvrhxpcr.png" alt="Explorer scene with party display at the end" width="800" height="1410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I can't believe what I just experienced - this means not only I can ask it to build something but keep tweaking and maintaining it. It can sure understand what is the current implementation, be able to only add code that is needed (this, kudos to the Chat GPT giving me great prompt to instruct Antigravity to do that)&lt;/p&gt;

&lt;p&gt;With that success, I also told my desire to be able to specify source and destination of my source scenario (txt) file and where to generate scenario file (csv). What this allow me to do is to separate as many scenario files as I wanted - again huge plus to keep this project more maintainable!&lt;/p&gt;

&lt;p&gt;So my goal is to see what's the limit of this AI driven approach to develop a game - and I plan to keep making posts about it here so please stay tuned!&lt;/p&gt;

</description>
      <category>antigravity</category>
      <category>chatgpt</category>
      <category>gamedev</category>
      <category>phaser</category>
    </item>
    <item>
      <title>End up building a decent ADV game engine with Antigravity and Chat GPT</title>
      <dc:creator>tomokat</dc:creator>
      <pubDate>Mon, 22 Dec 2025 19:55:05 +0000</pubDate>
      <link>https://forem.com/tomokat/end-up-building-a-decent-adv-game-engine-with-antigravity-and-chat-gpt-5cle</link>
      <guid>https://forem.com/tomokat/end-up-building-a-decent-adv-game-engine-with-antigravity-and-chat-gpt-5cle</guid>
      <description>&lt;p&gt;I didn't expect this at all - at first I was just thinking "I can probably use Antigravity to help me set up Phaser 3 project and once I get the scaffolding done, I probably need to code manually"&lt;/p&gt;

&lt;p&gt;It turns out, so far I didn't write any code - only thing I'm doing is to provide scenario/image data and I'm continued to be amazed how much it can understand and how capable this beast is! I mean I need to have very specific need/want in my game design (I knew it is technically possible with Phaser 3 already have many capabilities) and based off of my past experience (though that time what I was doing is quite laughable), I have general idea of how I might want to put my scenario file data but AI just extended to the place where I didn't imagine.&lt;/p&gt;

&lt;p&gt;Let me explain this a bit - the format I came up with initially was CSV with headers like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;scene,idx,op,speaker,message,text_id,bg,char1,char2,char3,icon,ui,tags,goto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;if you ever made ADV game before you can probably guess what these are and I was quite happy how I can externalize scenario data from the main game codebase. This is where you want to be able to quickly iterate, fix, try etc. but CSV is not easiest for human to deal with so I started to ask question to Chat GPT - after exchanging few message, it then suggest to me the idea of asking Antigravity to write utility tool (in node) to read much simpler "scenario data" and then covert to CSV file format. That was brilliant idea and after explaining what I want, Antigravity one shot implement this (I do need to tweak a bit but still ...)&lt;/p&gt;

&lt;p&gt;Here is an example of how "raw scenario data" get converted - best part of this approach is that I no longer need to deal with "number of comma" and "manually keeping track of idx"!&lt;/p&gt;

&lt;p&gt;from (opening_jp.txt)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@bg destruction_of_world
@ui DIALOG
@chars alexis@C:neutral
@face alexis:neutral
アクシス：な、何が起きてるんだ？

@bg black
@ui NODIALOG
@chars clear
@face clear
[NARR] それは、もう終わったはずの物語だった
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to (scene_script.csv)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;opening,10,SAY,アクシス,な、何が起きてるんだ？,,destruction_of_world,alexis@C:neutral,,,alexis:neutral,DIALOG,,
opening,20,NARR,,それは、もう終わったはずの物語だった,,black,,,,,NODIALOG,,
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(sorry I'm building this game in Japanese but hopefully you get the gist of this)&lt;/p&gt;

&lt;p&gt;and this is how it appeared in the game:&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%2Fpo44hvdsu1x79i4254fr.png" 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%2Fpo44hvdsu1x79i4254fr.png" alt="Image of dialog scene generated by the script above" width="800" height="1401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(note: this is still very early days of the game and likely to change - I just want to see how I can display character(s), show face icon and then be able to display message)&lt;/p&gt;

&lt;p&gt;I feel with this (and very preliminary yet powerful event system via &lt;code&gt;events.json&lt;/code&gt;), I should be able to focus on writing a story for this game (again, I'm not trying to just build ADV game so there are tons of things I still need to work on but so far I probably spent ~1 day of effort and compared to how much time I spent in the past with my Android game, this feels like I'm flying all thanks to AI!)&lt;/p&gt;

</description>
      <category>antigravity</category>
      <category>chatgpt</category>
      <category>gamedev</category>
      <category>phaser</category>
    </item>
    <item>
      <title>My second day with Antigravity</title>
      <dc:creator>tomokat</dc:creator>
      <pubDate>Sat, 20 Dec 2025 13:39:52 +0000</pubDate>
      <link>https://forem.com/tomokat/my-second-day-with-antigravity-3hpd</link>
      <guid>https://forem.com/tomokat/my-second-day-with-antigravity-3hpd</guid>
      <description>&lt;p&gt;If you already saw my &lt;a href="https://dev.to/tomokat/my-first-day-with-antigravity-4jai"&gt;previous post&lt;/a&gt;, no, I don't think I can possibly create "every day" report of Antigravity but I feel I just can't stop sharing my excitement with this beast! Also I plan to put more focus on my experience with it for (very simple) game development here - while keeping my LinkedIn for more (potentially) work related.&lt;/p&gt;

&lt;p&gt;Once again due to its incredible power, I was done "(potentially) work related" study/research by noon, after lunch I quickly flipped to expand my game. Here is what Antigravity achieved for me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;expand &lt;code&gt;DialogScene&lt;/code&gt; from simple one character display and message window to up to 3 characters display, face icon, speaker and message window&lt;/li&gt;
&lt;li&gt;bring bit of scripting into my game. I can define each conversation with CSV file format, it even managed to load all words from another file (like language resource file)&lt;/li&gt;
&lt;li&gt;expand this CSV script with ability to perform basic animation (for now I implemented WAIT, SHAKE, FADE_OUT, FADE_IN)&lt;/li&gt;
&lt;li&gt;create very basic yet powerful event trigger system with JSON format data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My approach for working with any AI tool is, first talk with Chat GPT and/or Gemini to keep asking what I want to do and refine prompt. I have a theory that AI tool knows best how it want to be prompted (I use this back in days when I was working with my Lovable project) and that seem to work very well so far. For all these 4 points, most of them are done with single prompt with 2-3 small tweaks after that! (can you believe it? Some prompt sure look really long but somehow it always nailed it)&lt;/p&gt;

&lt;p&gt;Another thing worth noting is that code Antigravity generates, at least so far, being impressively clean! I feel this project is getting more complex as I keep asking it do more - to give you some idea about this, here is a JSON file I have (generated by Chat GPT) to test event trigger work:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "events": [
        {
            "id": "EV_GREETING",
            "kind": "dialogue",
            "script": "scene_script.csv",
            "startScene": "event_0",
            "once": true,
            "conditions": [
                {
                    "type": "flag_not_set",
                    "key": "EV_GREETING_DONE"
                }
            ],
            "effects": [
                {
                    "type": "set_flag",
                    "key": "EV_GREETING_DONE"
                }
            ]
        },
        {
            "id": "EV_LOWHP_HELP",
            "kind": "dialogue",
            "script": "scene_script.csv",
            "startScene": "join_yes",
            "once": true,
            "conditions": [
                {
                    "type": "hp_lte",
                    "value": 10
                }
            ],
            "effects": [
                {
                    "type": "set_flag",
                    "key": "EV_LOWHP_HELP_DONE"
                }
            ]
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I don't think all of these are properly implemented yet BUT I can already test/check that &lt;code&gt;EV_GREETING&lt;/code&gt; occurs as expected (but while writing this I realize I didn't specify WHERE and WHEN this event take place so I need to fix/expand that) When I go to (2,4), event should trigger only once - and it works as expected. With this set up (mind you, all I spent is total 7-8 hours!) I already have enough hook to build decent Adventure game.&lt;/p&gt;

&lt;p&gt;Another really cool (and even scary) thing is that, when I ask it to expand &lt;code&gt;DialogScene&lt;/code&gt; to have 3 characters, it actually started to generate images on its own! (So all the images you see in video, character images and background image is auto-generated) I thought that was really cool, as of course I will prepare my images later but the fact that it automatically generate something to give me a feel for how conversation takes place was beyond my expectation!&lt;/p&gt;

&lt;p&gt;I'm building this game in Japanese (mainly so that I can focus on scenario - that is one major difference I'm taking with my game development this time. I'm talking to Chat GPT insane amount (in fact, most of my time is used to do that, not to create game lol) as I got really interesting story line and Chat GPT help me refine it to the detail I would never imagined.&lt;/p&gt;

&lt;p&gt;Here is a quick screencast, show casing how that event EV_GREETING works (again, sorry dialog is in Japanese (and even if you understand it, what it is saying make no sense lol) but I think you get the gist of why I feel Antigravity is a beast - which is the main reason why I want to write this article!), as well as how CSV handles branching - hope you enjoy it! :)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://youtube.com/shorts/S943iwxZorw?feature=share" rel="noopener noreferrer"&gt;https://youtube.com/shorts/S943iwxZorw?feature=share&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devjournal</category>
      <category>gamedev</category>
      <category>showdev</category>
      <category>antigravity</category>
    </item>
    <item>
      <title>My first day with Antigravity</title>
      <dc:creator>tomokat</dc:creator>
      <pubDate>Sat, 20 Dec 2025 12:59:33 +0000</pubDate>
      <link>https://forem.com/tomokat/my-first-day-with-antigravity-1oaa</link>
      <guid>https://forem.com/tomokat/my-first-day-with-antigravity-1oaa</guid>
      <description>&lt;p&gt;I know I didn't write anything for while - mainly because I was really busy at work but starting from yesterday (Dec 17th), I'm in my holiday break so I have time/energy to look into interesting things.&lt;/p&gt;

&lt;p&gt;First I got study/research topic with Gemini (based on few topics that I was interested - I made &lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:7407157405060517889/" rel="noopener noreferrer"&gt;a LinkedIn post&lt;/a&gt; so please take a look if you are interested)&lt;/p&gt;

&lt;p&gt;I was planning to spend first 2 days looking into some (at least to me) fairly complex technology mashups but you know what? Antigravity actually one shot it and I was kind of done what I wanted to do by noon so I expand my research a bit into some "fun" stuff - which is to develop a very simple game.&lt;/p&gt;

&lt;p&gt;Again I had some chat with Chat GPT (to refine scenario) and Gemini (to come up with good starting prompt) and then feed into Agent Manager and see where it will take me. I was actually blown by the fact that it can get something up and running (although VERY simple)&lt;/p&gt;

&lt;p&gt;I maybe work with it for 3-4 hours top, but I already got basic wiring of various game scenes working together (I've worked on similar game development in the past so I kind of knew what to ask)&lt;/p&gt;

&lt;p&gt;But ... be able to get random generated world with n x m size randomized and be able to provide scroll capability is something I struggle a lot back in days when I work on my old game (that time I was working with Android 0.6 - so there is no good library for me to choose so I have to write everything and I remember the bug I created) So the fact that I already have&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;world scene where I can move around&lt;/li&gt;
&lt;li&gt;I can only see adjacent tiles (Civ style)&lt;/li&gt;
&lt;li&gt;I can pretend I'm talking to someone&lt;/li&gt;
&lt;li&gt;I can pretend I'm in the battle, where I got cards and fight with monsters&lt;/li&gt;
&lt;li&gt;***I have a trigger to force rebuild world &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last point is crucial for what I want to build so the fact that I got this much in first day is out of my expectation BY FAR and it's all thanks to Antigravity so if you want to try but haven't, I'll strongly recommend you to check it out!&lt;/p&gt;

&lt;p&gt;Lastly here is a link to screencast - I know it's laughable but for those of you who tried to do this manually in the past will know why I feel Antigravity is a real beast. Even doing this could take weeks, if not months!&lt;/p&gt;

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

</description>
      <category>antigravity</category>
      <category>ai</category>
      <category>gamedev</category>
      <category>phaser</category>
    </item>
    <item>
      <title>My first day with Antigravity</title>
      <dc:creator>tomokat</dc:creator>
      <pubDate>Fri, 19 Dec 2025 03:19:29 +0000</pubDate>
      <link>https://forem.com/tomokat/my-first-day-with-antigravity-4jai</link>
      <guid>https://forem.com/tomokat/my-first-day-with-antigravity-4jai</guid>
      <description>&lt;p&gt;I know I didn't write anything for while - mainly because I was really busy at work but starting from yesterday (Dec 17th), I'm in my holiday break so I have time/energy to look into interesting things.&lt;/p&gt;

&lt;p&gt;First I got study/research topic with Gemini (based on few topics that I was interested - I made a &lt;a href="https://www.linkedin.com/feed/update/urn:li:activity:7407157405060517889/" rel="noopener noreferrer"&gt;LinkedIn post&lt;/a&gt; so please take a look if you are interested)&lt;/p&gt;

&lt;p&gt;I was planning to spend first 2 days looking into some (at least to me) fairly complex technology mashups but you know what? Antigravity actually one shot it and I was kind of done what I wanted to do by noon so I expand my research a bit into some "fun" stuff - which is to develop a very simple game.&lt;/p&gt;

&lt;p&gt;Again I had some chat with Chat GPT (to refine scenario) and Gemini (to come up with good starting prompt) and then feed into Agent Manager and see where it will take me. I was actually blown by the fact that it can get something up and running (although VERY simple)&lt;/p&gt;

&lt;p&gt;I maybe work with it for ~3 hours top, but I already got basic wiring of various game scenes working together (I've worked on similar game development in the past so I kind of knew what to ask)&lt;/p&gt;

&lt;p&gt;But ... be able to get random generated world with n x m size randomized and be able to provide scroll capability is something I struggle a lot back in days when I work on my old game (that time I was working with Android 0.6 - so there is no good library for me to choose so I have to write everything and I remember the bug I created) So the fact that I already have&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;world scene where I can move around&lt;/li&gt;
&lt;li&gt;I can only see adjacent tiles (Civ style)&lt;/li&gt;
&lt;li&gt;I can pretend I'm talking to someone&lt;/li&gt;
&lt;li&gt;I can pretend I'm in the battle, where I got cards and fight with monsters&lt;/li&gt;
&lt;li&gt;***I have a trigger to force rebuild world &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The last point is crucial for what I want to build so the fact that I got this much in first day is out of my expectation BY FAR and it's all thanks to Antigravity so if you want to try but haven't, I'll strongly recommend you to check it out!&lt;/p&gt;

&lt;p&gt;Lastly here is a link to screencast - I know it's laughable but for those of you who tried to do this manually in the past will know why I feel Antigravity is a real beast. Even doing this could take weeks, if not months!&lt;/p&gt;

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

</description>
      <category>antigravity</category>
      <category>ai</category>
      <category>gamedev</category>
      <category>phaser</category>
    </item>
    <item>
      <title>Compare (OpenAI) LLM performance from Supabase Edge function directly</title>
      <dc:creator>tomokat</dc:creator>
      <pubDate>Mon, 01 Sep 2025 18:57:09 +0000</pubDate>
      <link>https://forem.com/tomokat/compare-openai-llm-performance-from-supabase-edge-function-directly-47pk</link>
      <guid>https://forem.com/tomokat/compare-openai-llm-performance-from-supabase-edge-function-directly-47pk</guid>
      <description>&lt;p&gt;EDIT: added information about the how to configure "inputs" to your Supabase Edge funciton and how to run CLI tool.&lt;/p&gt;

&lt;p&gt;As I was continue building my app, I started to wonder, am I using optimal AI model for my Edge function? Behind the scene, these Edge functions will make a call to OpenAI API and I'm sure each model has its strength and weakness so I wanted to find a way to compare it, without manually changing model, capturing response etc.&lt;/p&gt;

&lt;p&gt;I then started to look for utility tool out there, thinking I can't be the first one who wanted to do that but while I can find something similar like &lt;em&gt;promptfoo&lt;/em&gt;, starting point is different - and while I admit measuring directly with LLM call is probably the most generic way, the reason why I want to call Supabase Edge function directly is, there are quite bit of logic exist within my Edge function that I don't want to manually extract all inputs to LLM myself.&lt;/p&gt;

&lt;p&gt;My idea is simple - since I'm talking about the Supabase Edge function, I can certainly create a (temporary?) table to hold data (that way, I don't need to modify response object from the Edge function) I can easily expand request parameters to Edge function without breaking the functionality (this is so that I can pass extra information like model, id to mark each group run etc.) To measure pure LLM performance, I do need to inject stopwatch timer time of code into my Edge function but I learned that you can simply do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const start = performance.now();
//make a LLM call like
const analyzeResponse = await fetch('https://api.openai.com/v1/chat/completions', {
      method: 'POST',
...
});
const end = performance.now();
const latencyMs = end - start;
console.log(`Latency: ${latencyMs} ms`);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and apparently &lt;code&gt;performance&lt;/code&gt; object is built-in to Deno so I thought that is not too bad. Then at the end, simply dump the record into database table (and since I wanted to do this to multiple Edge functions, I wrote a utility code - I will share link to repo at the end of this article where you can see all these code)&lt;/p&gt;

&lt;p&gt;To minimize modification to the Edge function itself, I'm inserting record twice - once from the Supabase Edge function and once from the CLI tool itself. Once again I need to do this so that I can capture the raw response from LLM while I can group the execution - I feel this is good compromise but you might not like it (and if so, feel free to modify script - this is expected to run locally and hence I open these tools to public - also pull requests are always welcome!)&lt;/p&gt;

&lt;p&gt;Maybe I want to mention about how to pass in parameters - hopefully it is pretty obvious but the input file to run CLI tool can be used for that and for example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "models": ["o3", "o3-mini", "gpt-4o", "gpt-4o-mini"],

  "inputs": {
    "textInput": "{some resume data}",
    "targetJobDescription": "",
    "userPrompts": [],
    "resumeId": "new"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;here "inputs" are input to Edge function and this is of course expected to be custom to your need. Once you have input file ready, you can simply execute (assuming you already done &lt;code&gt;npm install&lt;/code&gt;)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm start &amp;lt;&lt;span class="k"&gt;function&lt;/span&gt;&lt;span class="nt"&gt;-name&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &amp;lt;path-to-scenario&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or for scenario&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm start analyze-resume-data scenario/analyze-resume-data/test-data.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once I got data into table, I then wanted a quick way to visualize the result so I vibe code this super preliminary viewer (using Gemini Code Assistant) I have plan to expand this but it serve my purpose already. When you use CLI tool to generate data, then this visualization app will simply fetch record, group them and show it to you in a way (hopefully) bit more consumable. Here is a screenshot of one of my test result:&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%2Ffjok0zwsfirvjsmgf0kv.png" 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%2Ffjok0zwsfirvjsmgf0kv.png" alt="Screenshot of the viewer" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Maybe there is a way to achieve this by not injecting code but for now, I'm pretty satisfied with what I got but if you have a way to extend this, please do so and share it back to the community!&lt;/p&gt;

&lt;p&gt;Lastly, here are the links to my repo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CLI tool: &lt;a href="https://github.com/tomokat/supabase-llm-usage-benchmark" rel="noopener noreferrer"&gt;supabase-llm-usage-benchmark&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Viewer: &lt;a href="https://github.com/tomokat/supabase-llm-benchmark-viewer" rel="noopener noreferrer"&gt;supabase-llm-benchmark-viewer&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hopefully some of you find this interesting/useful - happy (vibe?) coding!&lt;/p&gt;

</description>
      <category>supabase</category>
      <category>benchmark</category>
      <category>llm</category>
      <category>performance</category>
    </item>
    <item>
      <title>How to check if your Supabase table is open to public</title>
      <dc:creator>tomokat</dc:creator>
      <pubDate>Thu, 21 Aug 2025 04:03:29 +0000</pubDate>
      <link>https://forem.com/tomokat/how-to-check-if-your-supabase-table-is-open-to-public-5f1n</link>
      <guid>https://forem.com/tomokat/how-to-check-if-your-supabase-table-is-open-to-public-5f1n</guid>
      <description>&lt;p&gt;These days tools like Lovable is getting better and know how to handle Supabase table better and more secure way but by the time I generate my code, it wasn't really putting RLS properly (for reading data) so please read on if you have a slightest doubt that you might be victim of this.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I'm coming from
&lt;/h2&gt;

&lt;p&gt;If you read Reddit, there are many people warn you about the potential security issue, but I know I have RLS enabled so I'm fine - I was so WRONG! Just because you have RLS for add, update and delete (at least in the old days), Lovable tend to leave read wide open. Also there are so many discussions about this and some people are offering app that we can check security etc. but I wonder if I can do this check by myself so I asked Chat GPT this prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can you show me without tightening, how can someone query my table?&lt;br&gt;
(this way I can test myself to see how information get exposed?)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and I got this super simple node script&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { createClient } from '@supabase/supabase-js'

const supabase = createClient(
  'https://YOUR_PROJECT.supabase.co',
  'YOUR_PUBLIC_ANON_KEY'
)

async function testLeak() {
  const { data, error } = await supabase
    .from('{repalce-this-with-your-table-name}')
    .select('*') // &amp;lt;-- selects ALL columns

  console.log({ data, error })
}

testLeak()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is extremely simple - all it's doing is to use information that is fairly easily extractable from Lovable app (especially if you know how to check what kind of network activity are happening within app) to create Supabase client and then execute simple SELECT * - this can't be right ... this is joke, until, I have to admit it actually returned data for me.&lt;/p&gt;

&lt;p&gt;I was shocked ... and glad that I didn't rush to ship my app to public quickly. I'm not blaming tool at all - security should be responsibility for all of us who build app (whether if let AI generate or hand coded, doesn't matter) I also want to share that Lovable added quite bit of security feature and it now properly flag these issues (even offer free security check) and almost prevent user to publish app unless you resolve these critical security issues.&lt;/p&gt;

&lt;p&gt;If you know how to set up node, add package.json etc. above code example is probably enough but with bit of help from Gemini Code Assistant (read as "I was lazy to do this myself"), I created this repo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/tomokat/supabase-security-checker" rel="noopener noreferrer"&gt;https://github.com/tomokat/supabase-security-checker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;that you can checkout and try it - it's all in your local so no need to worry about leaking anything but please note, this is the simplest and almost dumbest way to check if your table is publicly exposed (you should kick yourself if this returns table data, especially that table contains sensitive user data) and just because this says secure, it doesn't mean anything and you should definitely do the more thorough, proper security review/audit (as AI generated and call this out properly in README)&lt;/p&gt;

&lt;p&gt;I will also put another small warning - depends on when you generate your code and how much of your code uses that table, fixing these issues may not be as easy as adding RLS (or removing SELECT privilege from admin/public) because your code might reference it exactly that way! (This is one of the reason I believe when I ask Lovable to auto fix security issues it flag as errors, it often break app) - I'm still in the middle of doing this myself but I'm carefully changing code (and this is one of the reason why I strongly feel I want to have local Supabase AGAIN - but since I didn't use it for while, it was no longer really in synch and migration scripts are erroring out - if you are in the same situation as I am, I just wrote &lt;a href="https://dev.to/tomokat/setting-up-local-supabase-when-migration-scripts-error-out-4k60"&gt;another article&lt;/a&gt; talking about how I resolve it so please check it out) &lt;/p&gt;

</description>
      <category>supabase</category>
      <category>lovable</category>
      <category>security</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>Setting up local Supabase when migration scripts error out</title>
      <dc:creator>tomokat</dc:creator>
      <pubDate>Thu, 21 Aug 2025 03:11:45 +0000</pubDate>
      <link>https://forem.com/tomokat/setting-up-local-supabase-when-migration-scripts-error-out-4k60</link>
      <guid>https://forem.com/tomokat/setting-up-local-supabase-when-migration-scripts-error-out-4k60</guid>
      <description>&lt;p&gt;I'm not sure how common this problem is, but I use few AI tools to build my app (Lovable and Gemini Code Assistant) and as the result I can't naturally apply migrations sql files that are auto-generated by these tools (it could be also what I've done manually outside of these scripts)&lt;/p&gt;

&lt;p&gt;This prevent for me to naturally bring remote Supabase locally with CLI commands liike:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;supabase db reset
supabase link --project-ref {supabase-project-id}
supabase db pull --linked
supabase db push
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; first command will reset your local Supabase so please use this if and only if you are not happy with the state of local Supabase&lt;/p&gt;

&lt;p&gt;If this works, then good for you! You must be keeping good care of supabase/migrations/*.sql files but when I run into issues and this article is trying to explain how I get around that.&lt;/p&gt;

&lt;h2&gt;
  
  
  My thinking
&lt;/h2&gt;

&lt;p&gt;Since there is perfectly working remote Supabase, why can't I just somehow ignore these bad/invalid migration scripts? There must be a way!&lt;/p&gt;




&lt;h2&gt;
  
  
  Let's get schemas/tables first
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; I wish I capture all the prompts I used, as well as some of the response I got from Gemini Code Assistant before it crash (not sure why, but I started to see this happening way more recently ...) so some information I'm sharing below might not be 100% accurate but hopefully still good enough to give reader the idea of how I resolve this bad/invalid migration issue.&lt;/p&gt;

&lt;p&gt;So I started to ask Gemini Code Assistant about how I can do this and after few going back and force, it actually suggested to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;destroy docker volume&lt;/li&gt;
&lt;li&gt;create dummy migration files (I renamed supabase/migrations folder to something like supabase/migrations_old)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That way, when we pull schema off of remote Supabase and then (it think) applying all the migration files, it's no longer error out (now that I think about it, you can probably just empty file content too) - and it should create one new migration script in the end that contains all the schema. You then ask it to squash all migration into single file - and wola, you now successfully clean up your migration history.&lt;/p&gt;

&lt;p&gt;I think I then need to restart supabase instance to pick up this migration sql and after that, finally I can see all the tables!&lt;/p&gt;

&lt;p&gt;Btw, here is a script that generated for me - I'll warn you one more time, this will delete your local Supabase so use this if and only if you are ready to recreate your local Supabase&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash
set -euo pipefail

echo "⚠️  This will WIPE your LOCAL Supabase database(s) and resync schema from PROD."
read -p "Are you sure? (yes/no): " confirm
if [[ "$confirm" != "yes" ]]; then
  echo "Aborted."
  exit 1
fi

# Stop local Supabase
supabase stop || true

# Remove local db volumes
db_volumes=$(docker volume ls --format '{{.Name}}' | grep '^supabase_db_') || true
if [[ -n "$db_volumes" ]]; then
  echo "Removing volumes:"
  echo "$db_volumes" | xargs docker volume rm || true
else
  echo "No supabase_db_* volumes found."
fi

# Start local supabase (empty db, no migrations)
supabase start

# Dump schema from prod (read-only)
supabase db pull --linked --schema public

# Push schema.sql into local DB
supabase db push

echo "✅ Local Supabase is now synced with PROD schema (migrations ignored)."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and to run this, save this at project root, give it a name (I name it &lt;code&gt;synch-local-db.bash&lt;/code&gt;) and execute permission (&lt;code&gt;chmod +x {filename}&lt;/code&gt;) and then run with&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./synch-local-db.bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Populate data next
&lt;/h2&gt;

&lt;p&gt;For me my remote Supabase contains relatively little amount of data (as it is still just in beta release), easiest way for me to get data is by running this command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;supabase db dump --data-only &amp;gt; supabase/seed.sql
psql "postgresql://postgres:postgres@127.0.0.1:54322/postgres" -f supabase/seed.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Download Edge Functions
&lt;/h2&gt;

&lt;p&gt;For Edge functions, easiest way is to get list of functions with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;supabase functions list —project-ref {supabase-project-id}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and then for each function you can run&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;supabase functions download {function-name} --project-ref {supabase-project-id}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(btw, you can easily tell AI to generate these for you and concatenate them with "&amp;amp;&amp;amp;" to run it in one shot)&lt;/p&gt;

&lt;p&gt;At this point, (hopefully) you should have pretty good local Supabase, other than secret (which you most likely should manage via .env or .env.local) and Google Auth set up, which I'm almost got it working but still working on the final part so I'll plan to write about it whenever I figure everything so please stay tuned!&lt;/p&gt;

</description>
      <category>supabase</category>
      <category>migration</category>
      <category>localhost</category>
    </item>
  </channel>
</rss>
