<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://leviv.cool/feed.xml" rel="self" type="application/atom+xml" /><link href="https://leviv.cool/" rel="alternate" type="text/html" /><updated>2026-03-26T23:51:11+00:00</updated><id>https://leviv.cool/feed.xml</id><title type="html">leviv.cool</title><subtitle>Levi Villarreal&apos;s blog</subtitle><author><name>Levi Villarreal</name></author><entry><title type="html">Non-AI Image Generation</title><link href="https://leviv.cool/projects/2026/02/22/non-ai-image-generation.html" rel="alternate" type="text/html" title="Non-AI Image Generation" /><published>2026-02-22T00:00:00+00:00</published><updated>2026-02-22T00:00:00+00:00</updated><id>https://leviv.cool/projects/2026/02/22/non-ai-image-generation</id><content type="html" xml:base="https://leviv.cool/projects/2026/02/22/non-ai-image-generation.html"><![CDATA[<p><img src="/assets/img/2026-02-22-non-ai-image-generation/image-generation.png" alt="image generation" /></p>

<p class="caption">A screenshot of the image generation interface</p>

<p>This project was made with Queenie Wu as the second midterm project for NYU Connections Lab.</p>

<p><a href="https://leviv.cool/quale/">Visit the project here</a></p>

<p><a href="https://queeniwu.notion.site/Midterm-Project-2-29eb6cf74c4780a88a8ec4313e6b15e6">Read the project write-up here!</a></p>

<h2 id="technical-details">Technical details</h2>

<p>We’re using <a href="https://github.com/typicode/lowdb">lowdb</a> to structure our data, and have a simple node backend that runs a Discord bot to notify us in a private server when a request is sent, and send our reply picture back to the server.</p>

<p>There’s a lot more details in the documentation link above!</p>]]></content><author><name>Levi Villarreal</name></author><category term="projects" /><category term="grad-school" /><summary type="html"><![CDATA[]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://leviv.cool/assets/img/2026-02-22-non-ai-image-generation/image-generation.png" /><media:content medium="image" url="https://leviv.cool/assets/img/2026-02-22-non-ai-image-generation/image-generation.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">World Dumpling Index</title><link href="https://leviv.cool/projects/2026/02/21/world-dumpling-index.html" rel="alternate" type="text/html" title="World Dumpling Index" /><published>2026-02-21T00:00:00+00:00</published><updated>2026-02-21T00:00:00+00:00</updated><id>https://leviv.cool/projects/2026/02/21/world-dumpling-index</id><content type="html" xml:base="https://leviv.cool/projects/2026/02/21/world-dumpling-index.html"><![CDATA[<p><img src="/assets/img/2026-02-21-world-dumpling-index/dumpling-hero.png" alt="dumpling hero" /></p>

<p class="caption">This was me and <a href="https://www.instagram.com/daeyunart/">Dae Kim’s</a> final project for NYU Connections Lab - fall 2025.</p>

<p><a href="https://leviv.cool/dumpling/">Check out the project here</a></p>

<p><a href="https://github.com/leviv/dumpling">Check out the code here</a></p>

<p>When I went to Poland in 2020, I ordered pierogies for the first time. I was shocked when the sizzling cast-iron skillet arrived at the table, and I realized they were basically just dumplings. That sparked a discussion around the table where we talked about different kinds of dumplings around the world. This is hardly a new observation; Wikipedia even has a <a href="https://en.wikipedia.org/wiki/List_of_dumplings">list of dumplings article</a> with hundreds of entries, and you can find many examples of <a href="https://dumplinghunter.net/2024/01/26/around-the-world-in-50-dumplings/">infographics</a> showcasing various world dumplings. Yet, I wondered if I could do better. Would it be possible to find a dumpling for every single country in the world? How far would I need to stretch the definition of the word dumpling to make that happen?</p>

<h2 id="what-is-a-dumpling-anyway">What is a dumpling anyway?</h2>

<p>When researching dumplings from different cultures, I chose the dishes based more on vibes than any strict definition of the word. My personal idea of a dumpling is:</p>

<blockquote>
  <p>A filling (sweet or savory) cooked in some sort of wrapper.</p>
</blockquote>

<p>This quickly went off the rails, though. Savory foods like ‘chicken and dumplings’ or fufu (and its variations) are closer to the original 17th-century English definition of the word, but don’t match what most people commonly think of as a dumpling today. These dumplings are steamed dough eaten with a stew or soup.</p>

<p><img src="/assets/img/2026-02-21-world-dumpling-index/chicken-and-dumplings.jpg" alt="chicken and dumplings" /></p>

<p class="caption">Vegan chicken and dumpling made by <a href="https://www.livveganstrong.com/vegan-chicken-and-dumplings/">Liv Vegan</a></p>

<p>To further complicate things, most countries around the world have been changed by centuries of colonization, slavery, and human migration, which makes it hard to say what food definitively belongs to what country. For example, Bapao is a popular Suriname street food that originated in China and made its way to the South American country through Indonesian influence as both countries were Dutch colonies. Would it be offensive or incorrect to include it as a part of Surinamese cuisine? Does that highlight the unique influence the country has had on the dish, or erase its Asian roots?</p>

<p><img src="/assets/img/2026-02-21-world-dumpling-index/bapao.png" alt="bapao" /></p>

<p class="caption">Vegan Indonesian bapao made from <a href="https://pisangsusu.com/vegan-bapao/">Pisang Susu</a></p>

<p>With all that in mind, I had this mental flowchart for finding dumplings to represent each country and territory on the map:</p>

<iframe style="border: 1px solid rgba(0, 0, 0, 0.1);" width="100%" height="450" src="https://embed.figma.com/board/0fE3OdedGTQmwNlzZqOqqA/Dumpling-flowchart?node-id=0-1&amp;embed-host=share" allowfullscreen=""></iframe>

<p>As represented in the flowchart, I prioritized finding traditional foods for countries above foods that were more dumpling-like. We currently have 276 ‘dumplings’ from 241 countries and territories in our database. This research was pretty evenly split between Dae and me over the course of a few weeks. This was my favorite part of the project, and I loved learning about the history of dishes from around the world.</p>

<p>However, in user testing, we received a lot of pushback on what different people considered dumplings, especially when it came to dishes from their home country. Because of this, we made one of the core mechanics of the site a vote where you can decide for yourself whether the listed item is a dumpling or not.</p>

<p><img src="/assets/img/2026-02-21-world-dumpling-index/dumpling-vote.png" alt="dumpling vote" /></p>

<p class="caption">The voting screen for each dumpling</p>

<p>And while we’re on the topic, let’s talk more about the actual website.</p>

<h2 id="the-website">The Website</h2>

<p>Dae and I spent a long time brainstorming the aesthetic we wanted. We discussed the nostalgia we both held for our family’s treasured recipes scrawled down on index cards. You can see the warm tones and handwritten aesthetics in our mood board.</p>

<iframe style="border: 1px solid rgba(0, 0, 0, 0.1);" width="100%" height="450" src="https://embed.figma.com/board/4nrzL0e3vxz1VDZHbKOr4T/World-Dumpling-Index-Inspo?node-id=0-1&amp;embed-host=share" allowfullscreen=""></iframe>

<p>I’m no stranger to creating online maps (see <a href="https://leviv.cool/projects/2025/05/16/put-it-in-park.html">PutItInPark</a> and <a href="https://leviv.cool/projects/2025/09/18/abortion-deserts.html">Abortion Deserts</a>), and for this project, I used the same initial approach. Somewhat selfishly, we used Svelte for the website framework and D3 for the map - both frameworks that my project partner Dae had never used before.</p>

<p><img src="/assets/img/2026-02-21-world-dumpling-index/wip.gif" alt="wip" /></p>

<p class="caption">The first iteration of the map - you can click on countries and have them show in the sidebar</p>

<p>Once we had the basic functionality of a map, we turned our attention to the aesthetics. We wanted the map to be an extension of the handwritten aesthetic of the index card, and I luckily found <a href="https://roughjs.com/">Rough.js,</a> a library that can give SVG shapes a hand-drawn, sketchy vibe. There are many parameters to play with that influence the look and feel of the map. I added all of the relevant ones to a debug panel to allow us to prototype. If you press ‘d’ on the current live site, you can play with the debug panel too!!</p>

<p><img src="/assets/img/2026-02-21-world-dumpling-index/debug.jpeg" alt="debug" /></p>

<p class="caption">Debug view on the dumping website</p>

<p>We attempted to find a set of parameters that looked visually appealing, while avoiding overly complicating the shape geometry, which can cause actions like panning and zooming to noticeably slow down.</p>

<h2 id="art">Art</h2>

<p>In my opinion, the most impressive part of the website is the 174 unique, hand-drawn assets. When you click on a country, you’ll almost always see a beautiful icon to accompany the dumpling description. Originally, Dae and I planned to split the dumpling drawings evenly between the two of us. However, as the end of semester deadline loomed larger, I took on more of the technical work, while Dae took on more of the artistic aspects. There’s still about 20 of my dumpling assets in there, but they are sorely lower quality than Dae’s.</p>

<iframe src="https://drive.google.com/file/d/17YzdNFnRvKMlMpLDH0BtsM7dwm7s3RVi/preview" width="100%" height="480"></iframe>

<p class="caption">Timelapse of dozens of dumplings Dae drew</p>

<p>From <a href="https://www.notion.so/World-Dumpling-Index-2aa525646c0a80139c7ced963e57d58c">Dae’s documentation</a></p>

<blockquote>
  <p>My “typical” process: sketch, lines, colors, shading/highlights, post-production edits.  For the dumplings, my process was: lines, colors, random bullshit GO!!</p>

  <p>As a disclaimer, I drew these on a small canvas since I didn’t know how big they’d be on the page. For most projects, I draw large and shrink as needed, but this time I drew small since there would be over 100+ dumplings (and thus 100+ files unless we compiled into a sprite sheet).</p>

  <p>I took advantage of the small size to be honest and tried to create the “look” of details without actually creating them.</p>
</blockquote>

<p>Dae also designed the landing page graphic, the recipe box, and our logo. Basically, if anything looks good on the website, it was Dae’s doing.</p>

<p><img src="/assets/img/2026-02-21-world-dumpling-index/dumpling-hero.png" alt="dumpling hero" /></p>

<p class="caption">Our intro page with a recipe box, background, and logo</p>

<h2 id="reception-and-reflection">Reception and Reflection</h2>

<p>This site was an enormous undertaking. There were hundreds of points of research, drawings, and a fully interactive map and voting system. I am extremely proud of what we completed in less than two months. I found myself discussing dumplings in day-to-day life and got the chance to talk to dozens of people in New York City from around the world about which dumpling they considered representative of their country.</p>

<p>An informal feedback session came when I posted the link in the Figma #random Slack channel.</p>

<p><img src="/assets/img/2026-02-21-world-dumpling-index/slack-message.png" alt="slack message" /></p>

<p class="caption">158 passionate replies</p>

<p>I had a coworker who shared a <a href="https://www.amazon.com/dp/1797216929?social_share=cm_sw_r_ffobk_cp_ud_dp_ZT8ADH19G06MB43B7ZP1&amp;bestFormat=true">children’s book</a> they had written to highlight dumplings from around the world. Some other gems from the thread include:</p>

<blockquote>
  <p>is a chimichanga a dumpling?</p>

  <p>maybe a penguin egg is a (crunchy, illegal) raw antarctic dumpling</p>

  <p>This is incredible. Truly important sociological archival knowledge here</p>

  <p>going into a bathtub is basically a wonton soup. especially if you add bath salt</p>
</blockquote>

<p>Along with this knowledge drop.</p>

<p><img src="/assets/img/2026-02-21-world-dumpling-index/dump.png" alt="dump" /></p>

<p class="caption">Plato and Aristotle could never</p>

<p>I also posted the website on <a href="https://www.reddit.com/r/web_design/comments/1poao6t/a_friend_and_i_made_a_map_of_world_dumplings/">r/web_design,</a> where I got relatively few upvotes but hundreds of visitors and some submissions to our feedback form! Someone even wrote about us as their ‘<a href="https://www.geekinheels.com/world-dumpling-index/">website of the day</a>.’</p>

<p>All of this just highlights the real joy of this project. Starting conversations and debates about food and learning about lots of tasty things along the way. I have already had heartwarming interactions with people who were shocked to see their favorite childhood food on the website, and watched so many people discover new foods from around the world.</p>

<p>For future work, the site currently has some bugs, and the mobile version in particular could use some love. I want to see this project expanded and continued, and hope to make this the best version it could be!</p>]]></content><author><name>Levi Villarreal</name></author><category term="projects" /><category term="grad-school" /><summary type="html"><![CDATA[]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://leviv.cool/assets/img/2026-02-21-world-dumpling-index/dumpling-hero.png" /><media:content medium="image" url="https://leviv.cool/assets/img/2026-02-21-world-dumpling-index/dumpling-hero.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Clock design</title><link href="https://leviv.cool/miscellaneous/2026/02/18/clock-design.html" rel="alternate" type="text/html" title="Clock design" /><published>2026-02-18T00:00:00+00:00</published><updated>2026-02-18T00:00:00+00:00</updated><id>https://leviv.cool/miscellaneous/2026/02/18/clock-design</id><content type="html" xml:base="https://leviv.cool/miscellaneous/2026/02/18/clock-design.html"><![CDATA[<p><img src="/assets/img/2026-02-18-clock-design/bird-clock.png" alt="bird clock" /></p>

<p class="caption">Very rough draft</p>

<p>I want to make a riff on an existing bird clock but only use birds that are thought to be extinct. Each of the birds was chosen because there are recordings of their cry before they went extinct. They will be ordered from date of extinction. E.g. 1 is the earliest extinction and 11 is the most recent. 12 will be kept as a question mark that cycles through different bird cries of endangered birds.</p>

<h2 id="parts-list">Parts list</h2>

<ul>
  <li><strong>Clock Base:</strong> * <strong>Quartz Clock Movement ($6–$10):</strong>
    <ul>
      <li><strong>Foam Core or Plywood ($3):</strong> For the clock face.</li>
    </ul>
  </li>
  <li><strong>Audio System:</strong>
    <ul>
      <li><strong>DFPlayer Mini ($4–$6):</strong> This is a tiny MP3 player module with a built-in SD card slot and a small amplifier.</li>
      <li><strong>Micro SD Card ($5):</strong> To hold the bird call</li>
      <li><strong>8-Ohm 0.5W Speaker ($2–$4):</strong> A small “laptop style” or toy speaker</li>
    </ul>
  </li>
  <li><strong>Control Logic:</strong>
    <ul>
      <li><strong>Arduino Nano ($5–$8):</strong></li>
    </ul>
  </li>
  <li><strong>Power:</strong>
    <ul>
      <li><strong>3x AA Battery Holder ($2):</strong></li>
    </ul>
  </li>
</ul>]]></content><author><name>Levi Villarreal</name></author><category term="miscellaneous" /><category term="miscellaneous" /><summary type="html"><![CDATA[]]></summary></entry><entry><title type="html">Time assignment 2</title><link href="https://leviv.cool/miscellaneous/2026/02/18/time-assignment-2.html" rel="alternate" type="text/html" title="Time assignment 2" /><published>2026-02-18T00:00:00+00:00</published><updated>2026-02-18T00:00:00+00:00</updated><id>https://leviv.cool/miscellaneous/2026/02/18/time-assignment-2</id><content type="html" xml:base="https://leviv.cool/miscellaneous/2026/02/18/time-assignment-2.html"><![CDATA[<p>I tried to implement an idea I’ve hard for a while where you get notified of the daylight gained each day so you can appreciate the days getting longer. I used a sunset/sunrise API along with built-in javascript location and notification services. I think it mostly works</p>

<p><a href="https://leviv.cool/sun">Link</a></p>

<p>I spent most of my time on this and I got lazy with my second timekeeping sketch. I forked a skeuomorphic clock and added a cat to the second hand. It was interesting to see how different code pens implemented clock hand movement in code.</p>

<p><a href="https://codepen.io/leviv/pen/WbxqNVb">Link</a></p>

<h2 id="ui-study">UI study</h2>

<p><img src="/assets/img/2026-02-18-time-assignment-2/microwave.png" alt="microwave" /></p>

<p class="caption">Picture of a microwave that looks like mine</p>

<p>The only non-computer clock I have access to is a microwave. Not a ton to say about it. To set the time</p>

<ol>
  <li>Press dedicated ‘time’ button. Numbers flash</li>
  <li>Enter the time via the number pad (12 hour time)</li>
  <li>Press confirm/start</li>
</ol>

<p>I usually set it 1-2 minutes late so I trick myself to being on-time to things.</p>]]></content><author><name>Levi Villarreal</name></author><category term="miscellaneous" /><category term="miscellaneous" /><summary type="html"><![CDATA[I tried to implement an idea I’ve hard for a while where you get notified of the daylight gained each day so you can appreciate the days getting longer. I used a sunset/sunrise API along with built-in javascript location and notification services. I think it mostly works]]></summary></entry><entry><title type="html">Ouroboros</title><link href="https://leviv.cool/projects/2026/02/15/ouroboros.html" rel="alternate" type="text/html" title="Ouroboros" /><published>2026-02-15T00:00:00+00:00</published><updated>2026-02-15T00:00:00+00:00</updated><id>https://leviv.cool/projects/2026/02/15/ouroboros</id><content type="html" xml:base="https://leviv.cool/projects/2026/02/15/ouroboros.html"><![CDATA[<iframe width="100%" height="400" src="https://www.youtube.com/embed/L1A-TUjEWKQ" title="Ouroboros Trailer" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<p class="caption">Gameplay trailer</p>

<p><a href="https://github.com/leviv/ouroboros">View the source code</a></p>

<p>In January 2026, I spent two weeks in Berlin for the January term of <a href="https://itp.nyu.edu/lowres/">NYU IMA Low-Res</a>. It sounded like an insignificant amount of time, but we were truly able to cram an extraordinary amount of content into those short two weeks. In addition to a Conversations: Berlin class, I chose the elective <a href="https://github.com/periode/designing-games/wiki">Designing Games</a>, which met daily for three hours, with additional homework assigned every night and on weekends.</p>

<h2 id="proposal">Proposal</h2>

<p>In the first week of class, we learned the basics of game design theory and Unity. In the second week, we learned by working on our final group project, which was to be shown at the end-of-semester student showcase. To form groups and generate ideas, each class member had to put together a short game proposal. Mine was based on the assassination of Charlie Kirk:</p>

<p><img src="/assets/img/2026-02-15-ouroboros/proposal.png" alt="proposal" /></p>

<p class="caption">Mood board/proposal for a micro single-action game</p>

<p>However (understandably), no one else was interested in joining me to build this game, so I instead looked to join another project. One of my classmates, Nate, shared a single bullet point that captured my attention:</p>

<blockquote>
  <p>a reverse snake game, where the snake has to eat itself to remain small enough to advance to other sections</p>
</blockquote>

<p>My first two thoughts when hearing this proposal were:</p>

<ol>
  <li>This sounds like it could be very narratively compelling</li>
  <li>This gameplay sounds extremely doable in the week-long time frame we were working with.</li>
</ol>

<p>We found another interested classmate, Anna, and started planning the game.</p>

<h2 id="planning-brainstorming-prototyping">Planning, Brainstorming, Prototyping</h2>

<p>We started with a brainstorming whiteboard to align on the vibe, mechanics, and story for the game.</p>

<iframe style="border: 1px solid rgba(0, 0, 0, 0.1);" width="100%" height="450" src="https://embed.figma.com/board/ybiwNvEvJJFOrrt5GSTGtU/Game-Dev-brainstorm?node-id=0-1&amp;embed-host=share" allowfullscreen=""></iframe>

<p>Some of the core decision points included:</p>

<ul>
  <li>2D or 3D?</li>
  <li>Multiplayer or single player game?</li>
  <li>What would the snake/food/hazards look like?</li>
</ul>

<p>We had not yet made a decision for each of these questions, and knew that we had more play-testing to do before making informed decisions. Nate (a project management pro) put together a document to track all of the moving pieces we had going on, and we divided up the different areas of responsibility among ourselves</p>

<p><img src="/assets/img/2026-02-15-ouroboros/planning.png" alt="image 20260215123606764" /></p>

<p class="caption">A very detailed Google Sheets project tracker.</p>

<p>Initially, I was responsible for the core snake gameplay mechanics and the 3D assets for the game. This was a good mix of my strengths - programming the movement and object interactions, and my weaknesses - I had not done much 3D modeling in over a decade. To test the core gameplay and ensure that a snake eating itself could be both fun and challenging, my first prototype was a <a href="https://editor.p5js.org/leviv/sketches/U1yvlHHAl">p5.js sketch</a> that implemented the core mechanic of snake eating itself. This gave me some idea of how to program the snake, and allowed me to tweak different parameters to find what would be fun much more easily than making those same changes in the Unity game engine.</p>

<iframe width="100%" height="400" src="https://www.youtube.com/embed/Othfqn2mXec" title="Ouroboros pixel gameplay" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<p>Once I finished that prototype, I began making the game in Unity 3D. I found a <a href="https://www.youtube.com/watch?v=iuz7aUHYC_E&amp;t=23s">great tutorial</a> to follow that showed how to do this and used it to create the first playable versions of the game in Unity. Anna worked on the first version of the player-two controls to kill the snake.</p>

<iframe width="100%" height="400" src="https://www.youtube.com/embed/Bvylo_1eLxI" title="Ouroboros development" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<p>As you can see, in this version we have hazards (black cubes), food (gray spheres), and the two players with their respective controls. From here, it was all about polish and juice.</p>

<h2 id="polish">Polish</h2>

<p>As stated above, I was initially responsible for the 3D models for the game. Given our limited amount of time and my limited 3D experience, I sought to achieve a more cute, low-poly aesthetic rather than aiming for photo-realism. I used <a href="https://www.womp.com/">Womp</a> to create low-poly versions of the snake, food (mouse), and found/edited an open-source sword model.</p>

<p><img src="/assets/img/2026-02-15-ouroboros/snek.png" alt="snek" /></p>

<p class="caption">3D snake model</p>

<p><img src="/assets/img/2026-02-15-ouroboros/mouse.png" alt="mouse" /></p>

<p class="caption">3D Mouse model</p>

<p><img src="/assets/img/2026-02-15-ouroboros/sword.png" alt="sword" /></p>

<p class="caption">3D sword model</p>

<p>I am new to 3D modeling, so these relatively simple models took me many hours to create, and I was very proud to show them off to my project partners when I was finished. However, when I shared in the group chat, there was immediate pushback:</p>

<p><img src="/assets/img/2026-02-15-ouroboros/text.png" alt="text" /></p>

<p class="caption">Text after sharing the snake design</p>

<p>When I had tried to start a conversation the previous day on the aesthetic direction of the game, my teammates agreed that we should have a strict division of tasks, and the individual working on story, art, or modeling would decide on the direction themselves. However, upon sharing my work, Nate and Anna both strongly wanted more realistic models, something that was at odds with the previous assets we had agreed upon. I saw an inherent tradeoff for more realistic assets vs more polished and precise gameplay. Because our snake had to be able to grow and shrink in size, it made it extremely difficult to use existing free 3D assets that were fixed sizes. In addition, any realistic 3D models we used would require more complex colliders and more possibilities for janky gameplay.</p>

<p>I ended the day frustrated that an entire day’s worth of work was essentially for nothing, and really confused at the lack of alignment on our team. I scheduled a team meeting with our teaching assistant specifically to align on game direction and intentions. I came prepared with a list of aesthetic points to align on, but throughout the  meeting, I got very little discussion from my teammates, even when I directly asked for their input. Their faces buried in their laptops throughout the hour-long discussion, it felt much more like a 1-1 meeting between me and the TA rather than a group effort, with the occasional “yeah, that sounds fine.”</p>

<p>Unfortunately, this was a pattern for the rest of the project. My teammates would meet without me, make decisions when I wasn’t present, and assign work to each other, leaving me very little to do. When I raised concerns about gameplay, I was systemically voted down 2 to 1. At first, I thought I was seeking too much control over the game, and tried to turn the project into an exercise in implementing others’ creative direction. However, as the days went on, I found I was not just being overruled, I was being ignored. This was especially confusing to me because I was far from a deadbeat project partner. I had written nearly every line of code in our codebase and had stepped in to solve problems where the other two couldn’t.</p>

<p>I found myself feeling very detached from the game I was working on. It was something I had put dozens of hours into, but I didn’t feel any ownership. For the last few days, any work I did was discouraged by my teammates until they saw my results. They and external testers would immediately agree that my changes made the gameplay far superior.</p>

<h2 id="what-went-wrong--what-could-i-have-done-better">What went wrong / what could I have done better?</h2>

<p>I don’t think either of my teammates was intentionally trying to be rude or had a vendetta against me to minimize my contributions. However, there are factors that could have led to this mismatch in team dynamics.</p>

<ul>
  <li>On the first weekend of the program, I underestimated the work my teammates were putting into the project. I am unsure if they met without me, but from their perspective, perhaps I did not sufficiently contribute to the mood board and planning document. That could have led them to take my ideas less seriously than their own. Also, I think my two project partners were better friends with each other than with me, which makes it a lot easier to have sidebar conversations or meet without me.</li>
  <li>Both my partners had more formal art and media backgrounds than I do. I also had exponentially more coding experience than they did. I have found that this mismatch can often lead to getting pigeon-holed into just working on technical tasks.</li>
  <li>The biggest factor was that I did not talk with my project partners about my feelings. I hinted at it and alluded to it, but never directly told them that I was feeling really invisible and devalued as a member of the team. At the time, I felt that I just had to stick it out for a few days and then it would be over. Looking back, even though it was a short project, it would have been worth it to have that discussion and ensure that future collaborations would go smoothly.</li>
</ul>

<p>And lastly, it was a reminder to check my ego in group projects. I would find myself getting frustrated to the point of migraines over a small game that was, at the end of the day, pretty inconsequential. The negative feedback loop left me completely drained at the end of the semester, and presenting a project that I felt entirely detached from.</p>

<h2 id="reception">Reception</h2>

<p>The January semester culminated in a three hour open house at DOCK 11 in Berlin.</p>

<p><img src="/assets/img/2026-02-15-ouroboros/open-studio.jpg" alt="open studio" /></p>

<p class="caption">Open studio poster</p>

<p>We had a setup of a large monitor connected to our laptop, with a controller controlling the machete, and the laptop controlling the snake. Throughout the showcase, we had a few dozen people try the game, and for the most part, attendees were able to grasp the controls quickly and have fun competing against their friends for a 3-5 minute gameplay session. I was surprised by how many people enjoyed playing it! The sound effects I added and the satisfying snake movements and machete ‘thud’ added a lot to the satisfying feel of the game.</p>

<p><img src="/assets/img/2026-02-15-ouroboros/showcase.png" alt="showcase" /></p>

<p class="caption">Attendees play testing the game.</p>

<p>The constructive feedback we heard from attendees and our professor was aspects of the game I had also sought to change.</p>

<ul>
  <li>The collision mechanics and outer bounds were not very clear. Many games ended because the player controlling the snake kept falling off a hidden game floor.</li>
  <li>The story was convoluted and lost on most of the players. We should have incorporated more thematic storytelling elements into the gameplay instead of just the start and end menu.</li>
</ul>

<p>For the reasons discussed above, I don’t have any intentions to continue work on this game, but I am glad for the opportunity to learn Unity. As always, learning by doing taught me quicker than lectures could, and I am proud of the work I contributed to the project. Without my contributions, the game would simply be an empty environment with a broken machete and a start and end menu that did not work. There are many lessons I will take away from this project, both technical and interpersonal.</p>

<p>Again - here’s the trailer for the final gameplay.</p>

<iframe width="100%" height="400" src="https://www.youtube.com/embed/L1A-TUjEWKQ" title="Ouroboros Trailer" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>]]></content><author><name>Levi Villarreal</name></author><category term="projects" /><category term="grad-school" /><summary type="html"><![CDATA[]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://leviv.cool/assets/img/2026-02-15-ouroboros/ouroboros.png" /><media:content medium="image" url="https://leviv.cool/assets/img/2026-02-15-ouroboros/ouroboros.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Brandon Gill Simulator</title><link href="https://leviv.cool/projects/2026/02/08/brandon-gill-simulator.html" rel="alternate" type="text/html" title="Brandon Gill Simulator" /><published>2026-02-08T00:00:00+00:00</published><updated>2026-02-08T00:00:00+00:00</updated><id>https://leviv.cool/projects/2026/02/08/brandon-gill-simulator</id><content type="html" xml:base="https://leviv.cool/projects/2026/02/08/brandon-gill-simulator.html"><![CDATA[<p><a href="https://leviv.cool/gill/">Play the game here</a></p>

<p><a href="https://github.com/leviv/gill">Look at the code here</a></p>

<p><img src="/assets/img/2026-02-08-brandon-gill-simulator/gill.png" alt="gill" /></p>

<p class="caption">Gameplay screenshot</p>

<p>Brandon Gill was first brought to my attention in early 2025 with the headline, “<a href="https://www.axios.com/2025/02/11/ilhan-omar-deport-brandon-gill-fundraisng">House Republican fundraises with petition to deport Ilhan Omar</a>”. Ilhan Omar is a congresswoman who is a legal United States citizen and Somali refugee with left-wing politics, which was all Gill needed to call for her exile. Despite the increasing number of depraved marks by Republican politicians over the past years, this in particular stuck with me and made me furious. This was due in no small part to the fact that he is the representative for the 26th Congressional District of Texas, only a short drive from my family home. Looking further into Brandon revealed that this vitriolic attack was no anomaly; he has a track record of promoting conspiracy theories, fear-mongering, and doing anything for a modicum of attention. When I come across a politician this comically corrupt and hateful, I cannot help but wonder, what choices led them to this point in their life? Where did it all go so wrong?</p>

<h2 id="brandon-gills-background">Brandon Gill’s background</h2>

<p>Brandon Gill’s family has a history of getting involved in politics. His dad, Russ Gill, was an Air Force veteran turned Delta Airlines pilot and ran an unsuccessful bid for Congress in the 2004 midterms, when Brandon was only nine years old. Brandon, his parents (Russell and Judi), and his younger brother Taylor grew up on ‘a cattle ranch’ near Eula, Texas, not too far from where I grew up.</p>

<p>It’s important to clarify the culture of cattle ranching in Texas. Rich Texans like Brandon’s dad will often buy ranching land as a form of investment and put a few cow on it so that they can cosplay as a rancher a few weekends out of the year. They will often hire ranch hands to do all of the actual work on the land, and if they’re lucky, break even by selling the cattle after a few years. All my research points to the likelihood that Brandon had a comfortable upbringing, and his family would use the ranch for leisure and not hard labor like he would lead you to believe in his <a href="[https://gill.house.gov/about">biography blurbs</a>.</p>

<p>Brandon attended Dartmouth, where he met his soon to be wife Danielle D’Souza, who is the daughter of <a href="https://en.wikipedia.org/wiki/Dinesh_D'Souza">Dinesh D’Souza</a>. Dinesh is a high-powered and influential far-right conservative who is behind some of the most vile pieces of divisive media in the past few decades. This includes pushing for rollbacks of civil rights protections and spouting slavery apologist rhetoric, <a href="https://www.rottentomatoes.com/m/hillarys_america_the_secret_history_of_the_democratic_party">conspiracy theories about the Democratic Party</a>, and <a href="https://www.rottentomatoes.com/m/2000_mules">lies about the 2020 US presidential election being stolen</a>. However, he himself is an Indian immigrant married to a Venezuelan immigrant. He has been accused of beating his ex-wife and is a registered felon due to campaign finance fraud. He is basically everything that he publicly fear-mongers about - a violent felon immigrant who commits campaign fraud. Despite that, however, his vitriolic right-wing media empire has amassed powerful allies. His wedding was officiated by Ted Cruz, and his felony charge was pardoned by Donald Trump in 2018.</p>

<p>Therefore, when Brandon Gill, president of the conservative editorial <em>The Dartmouth Review,</em> married the daughter of the man who was one of the first writers of the publication (his ‘journalism’ included outing gay students and interviewing KKK members), Brandon Gill had a path forward to political relevancy. While working as an investment banker in New York City, he followed the same tactics that his father-in-law had used for decades: stoke tensions and generate controversy, regardless of consequences or truth. He founded the hyper-partisan online ‘newspaper’ <em>D.C. Enquirer</em> with his wife and father-in-law in 2022. For the articles, he paid a <a href="https://www.linkedin.com/in/sterling-mosley-21105b188/">UT-Austin intern</a> to write hundreds of poorly-researched, inflammatory articles that consistently praised Donald Trump. Again, using the tactics of his father-in-law, he set up multiple shell Facebook pages to aggressively repost these links and spent <a href="https://popular.info/p/a-far-right-website-created-36-days">hundreds of thousands of dollars to run deceptive ads to artificially boost the clicks on these pages</a>.</p>

<p><img src="/assets/img/2026-02-08-brandon-gill-simulator/Facebook-pages.jpeg" alt="Facebook pages post" /></p>

<p class="caption">Screenshot of multiple Facebook pages posting the same link. Screenshot by <a href="https://popular.info/p/a-far-right-website-created-36-days">Popular Info</a>.</p>

<p>The result was that he was getting many eyeballs, and fast. His far-right articles were shared many times by <a href="https://www.ms.now/opinion/msnbc-opinion/house-rep-brandon-gill-texas-trump-dc-enquirer-rcna184882">Donald Trump over 150 times,</a> and the millions of hits gave Brandon Gill a platform to rival Dinesh D’Souza. Finally, his chance came in November 2023, when Representative Michael C. Burgess announced his intention to retire after twenty years in office. Very coincidentally, Gill had moved to the same district only less than a year earlier. A week later, he launched his campaign across his social media, receiving an online endorsement from Trump before the end of the year.</p>

<p><img src="/assets/img/2026-02-08-brandon-gill-simulator/endorsement.jpeg" alt="Trump endorsement" /></p>

<p class="caption">Trumps endorsement</p>

<p>His political connections paid off, and Brandon Gill won the Republican primary and eventually the congressional seat, with <a href="https://www.fec.gov/data/candidate/H4TX26149/?cycle=2024">over 1 million dollars</a> of political contributions. Once he entered Congress, Brandon Gill wiped the D.C. Enquirer from the internet and started trying out new ways of getting attention. His strategy appears to be ‘clip-farming’: both on the floor of the House of Representatives and on talk shows, voicing divisive and witty statements live and posting clips of his rants on social media, hoping they will go viral. It’s a surreal experience to watch a congressman speak live on C-SPAN, performing for a future online audience that he hopes will see spliced versions of his speech on their Facebook and X feeds, all for the possibility of gaining a bit more political relevance. Of course, his grift also extends to insider trading, and in his first year in Congress, he violated the federal STOCK Act by improperly disclosing up to half a million dollars in Bitcoin purchases. According to <a href="https://www.opensecrets.org/news/2025/06/crypto-backer-rep-brandon-gill-violated-stock-act-with-bitcoin-trades">OpenSecrets</a>:</p>

<blockquote>
  <p>The lawmaker’s Feb. 27 purchase came after a weeks-long slide in Bitcoin prices — and a week before Trump <a href="https://www.whitehouse.gov/fact-sheets/2025/03/fact-sheet-president-donald-j-trump-establishes-the-strategic-bitcoin-reserve-and-u-s-digital-asset-stockpile/">announced the creation of a “strategic Bitcoin reserve and digital asset stockpile”</a> to make the United States “a leader among nations in government digital asset strategy.” Bitcoin traded at around $85,000 per coin on Feb. 27.</p>

  <p>It was <a href="https://ca.finance.yahoo.com/quote/BTC-USD/">trading</a> at above $104,000 early Monday afternoon.</p>
</blockquote>

<p>From the unfortunate number of hours I had spent looking at the life of this man, I was struck by just how laughable it all was. Brandon Gill, his wife, and father-in-law have long treated politics as a game with consequences that they personally are exempt from. They lazily hide their greed, they hardly try to cover up lies, and they have a track record that shows they can bury their opponents through sheer amounts of misinformation. Well, if Brandon Gill wanted to treat politics like a game, I wanted to make it into one for him.</p>

<h2 id="the-game">The Game</h2>

<p>I was inspired by online clicker games where the goal is to simply accumulate <em>more</em> of something, even though it didn’t really make much sense. Clicker games have been especially top of mind for me since watching my friend make <a href="https://isabellee.me/clickipedia/">Clickipedia</a> (a Wikipedia clicker game) at a <a href="https://leviv.cool/projects/2025/11/09/wikimystery.html">Wikipedia game jam</a>. I thought this fit the vibe of Brandon Gill and the D’Souzas insatiable thirst for money and power.</p>

<p><img src="/assets/img/2026-02-08-brandon-gill-simulator/cookie-clicker.jpeg" alt="Cookie Clicker" /></p>

<p class="caption">Cookie clicker screenshot</p>

<p>However, I also wanted this game to have a touch of legitimacy, so I used a few sources of real-world data to augment the game. As mentioned above, the DC Enquirer website is now defunct, but I was able to find a list of all the <a href="https://github.com/leviv/gill/blob/main/src/lib/dcenquirer_headlines.json">URLs archived by archive.org</a> (Trump is mentioned 2,693 times) and extract the rough headlines from there. A better option would have been scraping the URLs from the DC Enquirer’s Twitter or Facebook feed, but I didn’t have the API credentials to do that.</p>

<p>In addition, I downloaded a CSV of all Brandon Gill’s personal and corporate donations (often the line is blurry) <a href="https://www.fec.gov/data/candidate/H4TX26149/">from the FEC</a>. When you play the game, you can see the real headlines his news company published and the real donations that he received during his congressional campaign.</p>

<p><img src="/assets/img/2026-02-08-brandon-gill-simulator/gameplay.png" alt="Gameplay" /></p>

<p class="caption">Screenshot of the action on the website where you can see real headlines and donations</p>

<p>Due to the looming project deadline for this website, I did not spend a lot of time writing the prologue and epilogue. I want to clean it up to ensure the motivations and morals of the main protagonist are clear. Instead, I spent most of the time fine-tuning the ‘click’ animation to make it as satisfying as possible.</p>

<p><img src="/assets/img/2026-02-08-brandon-gill-simulator/blah.gif" alt="blah" /></p>

<p class="caption">Click animation minus the sound effects</p>

<h2 id="reception">Reception</h2>

<p>Some common feedback from my classmates included</p>

<ul>
  <li>They liked the duration of the game, and the goal of one billion dollars felt achievable without getting bored.</li>
  <li>They wanted more background on who this guy was and why he was so villainous.</li>
  <li>The upgrade options were not very balanced. E.g., insider trading was incredibly overpowered compared to buying Facebook ads.</li>
  <li>They were unclear about what the donations and headlines were popping up on screen, and only understood they were real-world artifacts when I explained it.</li>
</ul>

<p>Overall, I learned a lot making this game, and I am happy with this first version. However, I have still fallen short of my goal of educating the public - especially Texas voters - about Brandon Gill. My hope is that I could potentially make this game engaging enough to be picked up by a local news station or to be seen and talked about by Brandon Gill himself. Until that happens, it will be hard to officially declare this project a success.</p>]]></content><author><name>Levi Villarreal</name></author><category term="projects" /><category term="grad-school" /><summary type="html"><![CDATA[Play the game here]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://leviv.cool/assets/img/2026-02-08-brandon-gill-simulator/gill.png" /><media:content medium="image" url="https://leviv.cool/assets/img/2026-02-08-brandon-gill-simulator/gill.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Clocks I like</title><link href="https://leviv.cool/miscellaneous/2026/02/04/clocks-i-like.html" rel="alternate" type="text/html" title="Clocks I like" /><published>2026-02-04T00:00:00+00:00</published><updated>2026-02-04T00:00:00+00:00</updated><id>https://leviv.cool/miscellaneous/2026/02/04/clocks-i-like</id><content type="html" xml:base="https://leviv.cool/miscellaneous/2026/02/04/clocks-i-like.html"><![CDATA[<h2 id="sbb-clocks">SBB Clocks</h2>

<p>Recently I spent a week in Switzerland - and naturally I was thinking a lot about clocks. However, instead of luxury watch brands like Rolex, what I was focused on were the iconic Swiss railway clock.</p>

<p><img src="/assets/img/2026-02-04-clocks-i-like/clock.png" alt="clock" /></p>

<p class="caption">A few examples of the clock face</p>

<p>I traveled the country quite a bit by rail, and I saw it everywhere. They were in the station, on the platform, and even on every display I could see inside the trains. They were big, small, analog and digital. I was captivated by stories of the clock. My Swiss friend told me the story of how Johnny Ive stole the design for the flat, redesigned iOS 7, a decision that later cost them over 22 million USD for licensing rights.</p>

<p><img src="/assets/img/2026-02-04-clocks-i-like/apple-clock.png" alt="apple clock" /></p>

<p class="caption">iOS 7 Clock app</p>

<p>My friend’s father told me that in the days before smartphones, people used to set their watches using train arrival times, because they were so reliable. But in fact, the only reason why the trains were so reliable was due to the standardization of time across the continent. Even now, the clock still looks ahead of its time, with its minimalist interface that shows no numbers or letters, only clean lines and three simple colors.</p>

<p>One quirk I found especially interesting was that the second hand completes it’s revolution in 58.5 seconds and pauses at the top, as if giving permission to the minute hand to make the next step forward.  What started as a techincal quirk became iconic, and the modern Swiss clocks still keep that characteristic to this day.</p>

<h2 id="joshjoshjosh-lamp">JoshJoshJosh Lamp</h2>

<p>My second inspirational clock is from ITP alum joshjoshjosh.net, who created a lamp who’s brightness corresponds to sunrise and sunset in his home country of New Zealand.</p>

<blockquote class="tiktok-embed" cite="https://www.tiktok.com/@joshjoshjosh.net/video/7229566445498273066" data-video-id="7229566445498273066" style="max-width: 605px;min-width: 325px;"> <section> <a target="_blank" title="@joshjoshjosh.net" href="https://www.tiktok.com/@joshjoshjosh.net?refer=embed">@joshjoshjosh.net</a> There’s no sun like home <a title="physicalcomputing" target="_blank" href="https://www.tiktok.com/tag/physicalcomputing?refer=embed">#physicalcomputing</a> <a title="arduino" target="_blank" href="https://www.tiktok.com/tag/arduino?refer=embed">#arduino</a> <a title="lamp" target="_blank" href="https://www.tiktok.com/tag/lamp?refer=embed">#lamp</a> <a title="industrialdesign" target="_blank" href="https://www.tiktok.com/tag/industrialdesign?refer=embed">#industrialdesign</a> <a title="bicrunga4eva" target="_blank" href="https://www.tiktok.com/tag/bicrunga4eva?refer=embed">#bicrunga4eva</a> <a title="itp" target="_blank" href="https://www.tiktok.com/tag/itp?refer=embed">#itp</a> <a target="_blank" title="♬ Listening for the Weather - Bic Runga" href="https://www.tiktok.com/music/Listening-for-the-Weather-6705810639727626242?refer=embed">♬ Listening for the Weather - Bic Runga</a> </section> </blockquote>
<script async="" src="https://www.tiktok.com/embed.js"></script>

<p>Seeing this for the first time made me think of both my feelings of homesickness in New York City, as well as the desire of humans for millennia to track the cycles of the sun. I think having such a physical reminder home would be very comforting, and it’s something that I find myself thinking of whenever I’m traveling and many time zones from people I care about.</p>

<h2 id="my-designs">My designs</h2>

<p><img src="/assets/img/2026-02-04-clocks-i-like/idea1.png" alt="idea1" /></p>

<p class="caption">idea 1</p>

<p>I would say this idea is <em>kairos</em> because it is individualistic and tied to something inherently fragile</p>

<p><img src="/assets/img/2026-02-04-clocks-i-like/idea2.png" alt="idea2" /></p>

<p class="caption">idea 2</p>

<p>I would say this clock is <em>chronos</em> because once a bird is extinct it is extinct forever. Confronting the extinction of a species often makes people think about long-term, big picture consequences of our present actions.</p>]]></content><author><name>Levi Villarreal</name></author><category term="miscellaneous" /><category term="miscellaneous" /><summary type="html"><![CDATA[SBB Clocks]]></summary></entry><entry><title type="html">On Games</title><link href="https://leviv.cool/miscellaneous/2025/11/18/on-games.html" rel="alternate" type="text/html" title="On Games" /><published>2025-11-18T00:00:00+00:00</published><updated>2025-11-18T00:00:00+00:00</updated><id>https://leviv.cool/miscellaneous/2025/11/18/on-games</id><content type="html" xml:base="https://leviv.cool/miscellaneous/2025/11/18/on-games.html"><![CDATA[<p>This week in Critical Experiences, we read <em>On Games</em> by Hito Steyerl. The work explores the ways in which the modern world is a blurring of ‘games’ and reality. Drone pilots in the USA who grew up playing Call of Duty find themselves sitting in an air-conditioned room, remotely killing people through drones that are physically thousands of miles away. And despite the screen, <a href="https://www.dailyjournal.com/articles/379594-the-trauma-of-killing-remotely">can still suffer from PTSD</a> at a comparable rate to their ‘traditional’ counterparts flying machines of war. Politicians treat congressional hearings as opportunities to get a viral clip on Facebook, performing for a spectral, digital audience in the hopes that the views and likes will translate to campaign donations and political clout. Nowadays both pleasure and business is run through an optimization algorithm, our jobs, music, and credit score are managed by all-important algorithms whose number goal is to self-perpetuate themselves. How can we break free? Should we?</p>

<blockquote>
  <p>Some of the first things that were run on Neumann’s new machine were simulations for hydrogen bombs. He then proceeded to model Cold War mutual assured destruction (mad) scenarios.</p>
</blockquote>

<p>This brought to mind the <a href="https://en.wikipedia.org/wiki/1983_Soviet_nuclear_false_alarm_incident">1983 Soviet nuclear false alarm incident</a>, in which a single Soviet engineer ignored protocol and prevented a full-out nuclear war. Not everything can boil down to game theory, and sometimes people just don’t want to be responsible for killing a billion people.</p>

<blockquote>
  <p>In 2011, the New York Times reported that people who had to fill out captchas had unwittingly been enlisted in ‘a project to transform an old book, magazine, newspaper or pamphlet into an accurate, searchable and easily sortable computer text file’. Google were using captcha to check text scanned for Google Books:</p>

  <p>In 2012, Google shifted the captcha technology to correct street numbers in Google Street View.</p>
</blockquote>

<p>The way the book talks about this is kind of doom-and-gloom, but to be honest, I love captcha. It was made to solve a real problem on the internet (bots), and the solution could have easily been a waste of time, a 3 second puzzle that could waste a collective 500 years of human life every day (if each internet user filled out a captcha every day). Instead, we used this time to digitize incredible wealths of knowledge and map out the streets of the entire world. In turn, this data improved text recognition and road recognition by such a degree that we are fast approaching a future where identifying text, or traffic signs from a picture is a task that a human will never need to perform again in perpetuity.</p>

<p>The United States had 55 Remote Encoding Centers for processing handwritten mail in 1997. Now, thanks in large part to Captcha, we have 1. The contention, however, arises because of those who profit based on this labor. While yes, the technologies developed from them are unquestionably powerful and worthwhile, the rewards are not equally reaped by all who shared it’s creation. The CEOs of Google, Amazon, etc continue making billions, the engineers and designers who actually created the Captcha system get a comfortable upper-middle class salary, and the people inputting the Captchas get nothing except new OCR software that is sold back to them.</p>

<p>But what’s the alternative? Captcha’s are menial <em>and</em> useless? Every correct captcha results in .0001 cents being paid to the user? Captchas are run by the government and the results are open sourced? I have no good answers here.</p>

<blockquote>
  <p>It is the game score of your past, and predicted future, social and economic behaviour—or,
more precisely, the game score of someone who looks like you.</p>
</blockquote>

<p>A lot of my bias comes from the fact that I am ‘winning’ at many of these games. The fact that I could walk into any bank in the United States and get a small loan approved because I have a good credit score seems incredible. The idea of surveillance online or in person would likely make me safer because of my gender and the color of my skin. But I can’t let my bias get in the way of understanding that better systems are possible. I want to succeed in games that aren’t rigged in my favor and one whose win condition is not zero-sum.</p>

<h2 id="project-work">Project Work</h2>

<p>This reading was especially relevant for me because I’m considering making a game for project 2. I decided my project will be on Texas Representative <a href="https://en.wikipedia.org/wiki/Brandon_Gill">Brandon Gill</a>. I hate this guy. A real far-right POS from Texas who cosplays as a good-ol cowboy but in reality is an ivy-league educated rich kid who will do anything for a crumb of attention from the president. And the money that comes with being a corrupt politician who stands for nothing.</p>

<p>His rise in politics caught my eyes with his petition to <a href="https://www.axios.com/2025/02/11/ilhan-omar-deport-brandon-gill-fundraisng">deport Ilhan Omar</a> and over <a href="https://www.opensecrets.org/news/2025/06/crypto-backer-rep-brandon-gill-violated-stock-act-with-bitcoin-trades">half a million dollars in illegal bitcoin trading</a>. A few months ago I started doing some research into his family background and rise to power, and found some very interesting initial results. I decided for project 2 I wanted to make it all about him, and showcase his blatant corruption and hypocrisy.</p>

<p>I met with ITP researcher Margaret Smith (who is also from the Dallas area) to get some more resources for my deep dive. She pointed me towards FEC election data, and some local newspapers I could use to search through for my project. Overall though, I feel solid with my research direction and that I already have enough to go on to start thinking about the form. My deadlines are as follows.</p>

<ul>
  <li>November 11 - Project 02 topic finalized (via Email)</li>
  <li>November 18 - Preliminary prototype/sketch due</li>
  <li>November 25 - Iterated prototype due</li>
  <li>December 16 - Project 02 due and Project 02 presentations in class</li>
  <li>December 18 - All documentation due for Project 02 due,</li>
</ul>

<p>Since I’m thinking of doing a game, I want to ensure I have enough time to play-test and refine the game before final presentations. My research and production plan is as follows:</p>

<p>November 11-18</p>

<ul>
  <li>Gather research on Brandon Gill’s family
    <ul>
      <li>Any signs from his parents or during his education that he would turn into such a weird little freak?</li>
    </ul>
  </li>
  <li>Gather examples of corruption and abuse of power</li>
  <li>Gather examples of ridiculous public statements and insane legislation proposed</li>
  <li>Decide on the type of game I want to work on</li>
</ul>

<p>November 18 - November 25</p>

<ul>
  <li>Work on the narrative of the game - I want the takeaways to be clear to the player</li>
  <li>Ideate on the look and feel of the game - put together a mood board</li>
  <li>Initial Figma prototype?</li>
</ul>

<p>November 25 - Dec 2</p>

<ul>
  <li>Get a basic website up and running for the game and core mechanics</li>
  <li>Play test and note feedback</li>
</ul>

<p>Dec 2-16</p>

<ul>
  <li>Continue to iterate and playtest!</li>
  <li>Will be very busy with my other class, grad school applications, and work so I’ll keep goals light here</li>
</ul>]]></content><author><name>Levi Villarreal</name></author><category term="miscellaneous" /><category term="miscellaneous" /><summary type="html"><![CDATA[This week in Critical Experiences, we read On Games by Hito Steyerl. The work explores the ways in which the modern world is a blurring of ‘games’ and reality. Drone pilots in the USA who grew up playing Call of Duty find themselves sitting in an air-conditioned room, remotely killing people through drones that are physically thousands of miles away. And despite the screen, can still suffer from PTSD at a comparable rate to their ‘traditional’ counterparts flying machines of war. Politicians treat congressional hearings as opportunities to get a viral clip on Facebook, performing for a spectral, digital audience in the hopes that the views and likes will translate to campaign donations and political clout. Nowadays both pleasure and business is run through an optimization algorithm, our jobs, music, and credit score are managed by all-important algorithms whose number goal is to self-perpetuate themselves. How can we break free? Should we?]]></summary></entry><entry><title type="html">StuyTown</title><link href="https://leviv.cool/projects/2025/11/12/stuytown.html" rel="alternate" type="text/html" title="StuyTown" /><published>2025-11-12T00:00:00+00:00</published><updated>2025-11-12T00:00:00+00:00</updated><id>https://leviv.cool/projects/2025/11/12/stuytown</id><content type="html" xml:base="https://leviv.cool/projects/2025/11/12/stuytown.html"><![CDATA[<iframe width="100%" height="450" loading="lazy" src="https://www.youtube.com/embed/yylbERGlL6A?mute=1" title="StuyTown demo" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="">
</iframe>

<p class="caption"><em>StuyTown</em> by Levi Villarreal. Exhibited at the 2025 NYU IMA Low-Res Summer Showcase in Brooklyn, NY</p>

<p>Please check out the live version of the project <a href="https://leviv.cool/stuy-town/">here</a>! Check out the code <a href="https://github.com/leviv/stuy-town">here</a>.</p>

<h2 id="introduction">Introduction</h2>

<p>It was summer 2021, and I was a fresh graduate who had just moved to New York City. I was going out nearly every single night, exploring parks, neighborhoods, restaurants, and saying yes to every single opportunity that came my way. This particular night, I was in the East Village with my roommates, eating at Spicy Moon. We ordered and ate so much food that I could barely move (it was delicious), and I staggered out of that restaurant, knowing I needed to walk around a bit to avoid slipping into a food coma. I decided it was time for one of my newfound favorite hobbies in the city - a meandering walk paired with reading Wikipedia on my phone.</p>

<p>I headed north up 1st Ave from 8th Street, looking up buildings and landmarks on Wikipedia here and there, with nothing standing out until I reached 14th Street. What loomed in front of me was a dark, imposing series of red brick apartment buildings, stretching as far north and as far east as I could see. I had seen enough TV shows and Fox News segments of New York to surmise that I was looking at ~the projects~, something I knew nothing about besides the fact that they were stereotypically poor and potentially dangerous. Nevertheless, I was intrigued. I put my phone away to be fully alert and walked into the thicket of trees and tall buildings.</p>

<p>However, as the sounds of the city faded beneath the giant trees, I realized that the neighborhood was not at all what I expected. I saw coffee shops, yoga studios, and well-manicured gardens crisscrossed by walking paths filled with hypoallergenic dogs and college students. The atmosphere was surreal and like nothing I had experienced in the city. Was I even allowed to be here at night? What had spurred the creation of these 110 project-like towers that were nestled in greenery and guarded by private security? And that’s when I sat down on a bench and started to read about the neighborhood’s history. This history only made me even more intrigued, and I knew I wanted to dive further. Over the years since then, I gathered more bits and pieces about the neighborhood’s history, until eventually, in 2025, I made it the subject of my so-called “summer thesis” for IMA Low-Res.</p>

<h2 id="research">Research</h2>

<p>By far the most time-consuming part of this project was the research. I wanted to cover as many sources as possible to support my claims. It was harder than I expected, as so much of what I found online did not cite its sources or else contained scant details. I’ll list below some of the most helpful resources I found, and what I used them for. If you haven’t already, please read through the live site to understand the narrative structure and overarching history of StuyTown.</p>

<p><img src="/assets/img/2025-11-12-stuytown/research.png" alt="research" /></p>

<p class="caption">My research workflow in action!</p>

<ol>
  <li>
    <p><a href="https://nyheritage.contentdm.oclc.org/digital/collection/NYHSR01/id/22170">The New-York Historical Society Quarterly, Vol. 62, No. 4, October 1978</a> - This source did a great job at reporting and summarizing the controversies surrounding StuyTown. This included the tax exemptions, displacement of people previously living in the Gashouse District, architectural critiques, and, most importantly to my project, racial discrimination. It especially impressed upon me the stress that this controversy caused La Guardia, the mayor at the time.</p>

    <blockquote>
      <p>“The mayor had a sensitivity on this issue which virtually drove him into a tantrum at the very mention of Stuyvesant Town” - Benjamin J Davis Jr.</p>
    </blockquote>

    <blockquote>
      <p>In the long run, La Guardia’s position ensured the construction of some additional public housing by private enterprise.</p>
    </blockquote>

    <p>This included the Abraham Lincoln and James Weldon Johnson houses in Harlem.</p>

    <p>This source also included proof that this controversy directly led to the passage of an anti-discriminatory housing bill in New York City.</p>

    <blockquote>
      <p>Councilmen Isaacs and Powell introduced a bill designed to amend the municipal code and deny any redevelopment company tax exemption if it practiced discrimination in tenant selection</p>
    </blockquote>

    <p>Two other bills were proposed, but the one that passed was a compromise bill. This bill terminated tax-exempt privileges if the New York Supreme Court found discrimination that wasn’t remedied within 60 days. The bill was approved 13-0 by the city council and unanimously approved by the Board of Estimate. La Guardia then signed it into law as Local Law No. 20.</p>

    <p>This source also included some wonderful pictures which I didn’t get to include in the final website.</p>

    <p><img src="/assets/img/2025-11-12-stuytown/gashouse.png" alt="gashouse district" /></p>

    <p class="caption">The Gashouse district before demolition. A source of pollution for slum residents at the time.</p>

    <p><img src="/assets/img/2025-11-12-stuytown/moses.png" alt="Moses and LaGuardia" /></p>

    <p class="caption">Mayor Fiorello La Guardia (right) and his parks commissioner, Robert Moses</p>

    <p><img src="/assets/img/2025-11-12-stuytown/construction.png" alt="construction" /></p>

    <p class="caption">Stuyvesant town during it’s construction</p>
  </li>
  <li>
    <p><a href="https://www.jchs.harvard.edu/sites/default/files/tanaka_fiduciary_landlords_final_4-18-17_0.pdf">Fiduciary Landlords: Life Insurers and Large-Scale Housing in New York City</a> - This work was absolutely invaluable to this project. While StuyTown is not the sole focus of this work, Adam Tanka does a phenomenal job outlining the multifaceted reasons why the Metropolitan Life Insurance Company took on projects like StuyTown and many others across the country. There were so many neighborhoods around the nation that I had no idea were built by life insurance companies. If you are interested in this subject, I would highly recommend reading this paper, as it contains a wealth of well-researched material that draws on primary sources that can be hard to obtain. I attached some of my favorite quotes from the work below.</p>

    <blockquote>
      <p>By 1941, Metropolitan Life was the largest employer in the city, with over 15,000 employees in its midtown office alone.105 The issue of convenient and affordable worker housing was hardly inconsequential to company executives. Better housing, many believed, also meant longer lives and stronger business. A New York Times reporter noted that the development of Stuyvesant Town was a “purely self-interested proposition” for the nation’s largest life insurer, as “people in non-slum areas live longer and continue to pay insurance premiums.”</p>

      <p>“Metropolitan Life officials saw their role differently, of course, framing Stuyvesant Town as simply the latest iteration of the company’s longstanding commitment, “characteristic of the American way of life, of private enterprise promoting public welfare.”</p>
    </blockquote>

    <p>There was a strong mix of financial incentives, patriotic sentiment, and good PR that MetLife stood to gain from building StuyTown (and Parkchester).</p>

    <blockquote>
      <p>In 1946, not a single new apartment building was completed in the city. By 1950, New York’s vacancy rate had dipped under one percent. … By the opening of the complex in 1948, over 200,000 applications had been received for 9,000 apartments. This gave company administrators the leeway to implement stringent screening policies to forge a socially and racially homogeneous community whose behavior would appropriately safeguard the company’s investment. Given the project’s proximity to Metropolitan Life headquarters, a substantial portion of tenants were also company employees.</p>
    </blockquote>

    <p>The need for postwar housing was extremely dire.</p>

    <blockquote>
      <p>Within the context of lower Manhattan, however, Stuyvesant Town was a gilded enclave, with median incomes twice those of neighboring census tracts</p>
    </blockquote>

    <p>An oasis for people who could afford it.</p>

    <blockquote>
      <p>While initially unsuccessful, the legal battle over Stuyvesant Town ended up having immense consequences for fair housing legislation, leading to city and state laws banning discrimination in redevelopment projects in 1944, followed by any subsidized private housing in 1950, and eventually all private housing in 1968</p>
    </blockquote>

    <p>Further confirmation that protests over StuyTown discrimination led directly to the passage of the federal Fair Housing Act of 1968.</p>

    <blockquote>
      <p>In 1968, Metropolitan Life sold Parkchester to a syndicate of investors headed by prominent commercial landlord Harry Helmsley. Despite having a portfolio dominated by prestigious office buildings—including the Flatiron and the Empire State buildings —Helmsley had become increasingly enamored with the idea of converting rent-regulated properties into condominiums, and selling off apartments by the hundreds to tenants and other prospective buyers. In the next few years he would purchase several other life insurance developments, including Fresh Meadows in Queens and Parkmerced in San Francisco, with the same objective.</p>
    </blockquote>

    <p>The end of an era.</p>
  </li>
  <li>
    <p><a href="https://researchworks.oclc.org/archivegrid/collection/data/1203731076">Reminiscences of Gilmore David Clarke</a></p>

    <p><img src="/assets/img/2025-11-12-stuytown/clarke.png" alt="clarke" /></p>

    <p class="caption">I loved reading through the copy of the transcript, with lots of scribbled corrections in the text</p>

    <p>I think the copy of this text online was taken down, so I took the liberty to re-upload it on <a href="https://drive.google.com/file/d/1TptzXI7VZKuSQDShrSZL4sDfDBu0qBbJ/view?usp=sharing">Google Drive</a>.</p>

    <p>This is a transcription of the oral history of Gilmore David Clarke, one of the landscape architects of Parkchester and StuyTown and one of the most influential members of the board of design. He was a Moses man for decades, and he reveals a stunning view into the things that shaped his worldview in his boyhood in The Bronx, as a student at Cornell University, and as a Parks Department Employee. The whole thing was a fascinating read and well worth the time for anyone who was a fan of The Power Broker. Through this text, I gained a better understanding of the motivation behind the design of StuyTown and similar projects, as well as fun anecdotes that I was unable to include in my final project. Some of my favorite quotes are below.</p>

    <blockquote>
      <p>They worked very hard to get the greatest economy of use - to cut down to the greatest possible degree the area of public space in the buildings, such as halls, and to arrange the rooms in each apartment in the most efficient possible manner. That effeciency also extended to the problem of the use of structural steel. It was found that, with careful planning, we could reduce the number of columns, thus to get the greatest economy with the least steel and still conform to the building code.”That the units we devised were very efficient is evidenced by the fact that the City Housing has since adopted these basic plans many times over.</p>
    </blockquote>

    <p>Parkchester and StuyTown don’t look like public housing, it’s often public housing that looks like StuyTown and Parkchester.</p>

    <blockquote>
      <p>They made mocked up, real size apartments with furniture and dishes and everything for employees of Met Life to walk through and suggest improvements. This helped inform things like the best place to but light outlets, or how high people should reach for shelves in the kitchen, or what kind of kitchen arrangements. The result was they could eliminate two light outlets - with 12 or 13 thousand apartments and with light outlets at $3 apiece, you can see that we effected quite a saving.</p>
    </blockquote>

    <p>Participatory design in architecture at its finest.</p>

    <blockquote>
      <p>I remember that at one point we had a problem when someone got the idea that the building structures we erected weren’t strong enough. The notion came to Mayor La Guardia’s attention and he ordered an investigation. As I recall, inspectors came up and hoisted two pianos up to the top floor of one of the buildings and arranged to have two people play two pianos at the same time to see if the vibrations would in any way effect the structure. Once it was proved there was no danger in any of the structural work we didn’t here any more about it.</p>
    </blockquote>

    <p>This was such a fun anecdote that I have loved sharing with my friends who live in StuyTown.</p>

    <blockquote>
      <p>A real social problem is created when you redevelop old areas and up-root people separating them from friends, relatives and churches of their habit and choice. It wrenches at the heart strings to see some of these cases, even if one knows in his heart that in the long run the public benefit will far out weigh the individual Misery which attends such change. I don’t see how one can do it any other way. There is no perfect way to do it and in no case are the people going to be entirely satisfied. I think if one can satisfy half of the people a long step has been taken.</p>
    </blockquote>

    <p>At least an acknowledgment from an architect of StuyTown of the pain that the development caused the original residents of the Gashouse district.</p>
  </li>
  <li>
    <p>Roberta Moudry, <a href="https://www.proquest.com/docview/304176224?pq-origsite=gscholar&amp;fromopenview=true&amp;sourcetype=Dissertations%20&amp;%20Theses">“Architecture as Cultural Design: The Architecture and Urbanism of the Metropolitan Life Insurance Company”</a></p>

    <p>I didn’t read this dissertation until after I exhibited my project but it is full of a lot of color that has affected how I talk to other people about the project.</p>
  </li>
</ol>

<p>Works that weren’t as foundational but also informed my research:</p>

<ol>
  <li>The Power Broker - Gave me a lot of background that set me up well for this research</li>
  <li><a href="https://www.6sqft.com/towers-in-the-park-le-corbusiers-influence-in-nyc/">Towers in the Park: Le Corbusier’s Influence in NYC</a></li>
  <li><a href="https://www.nytimes.com/1984/09/06/garden/stuyvesant-town-still-going-strong.html">Stuyvesant Town: Still Going Strong</a></li>
  <li><a href="https://www.nytimes.com/2005/05/15/magazine/a-complex-complex.html">A Complex Complex</a></li>
  <li><a href="https://www.newyorker.com/magazine/1948/11/27/stuyvesant-town-revisited">Stuyvesant Town Revisited</a></li>
  <li><a href="https://www.sholetteseminars.com/wp-content/uploads/2020/01/the-rise-and-fall-of-urban-rene.pdf">Manhattan Projects: The Rise and Fall of Urban Renewal in Cold War New York</a></li>
  <li><a href="https://time.com/archive/6601809/new-york-new-nightmares-for-old/">NEW YORK: New Nightmares for Old?</a></li>
  <li><a href="https://www.bbcfairhousing.org/wp-content/uploads/2022/12/FAIR-HOUSING-TOOLKIT-FHJC-2022-Update.pdf">Fair Housing Toolkit</a></li>
  <li><a href="https://plp.org/home/challenge-newspaper/12349-nyc-housing-history-stuytown-communists-led-antiracist-fight">NYC housing history - Stuytown: communists led antiracist fight</a></li>
  <li><a href="https://callidusai.com/wp/ai/cases/5584926/murray-v-laguardia">Murry v. LaGuardia</a></li>
</ol>

<p>Works that would be good further reading that I did not have time to get to:</p>

<ol>
  <li><a href="https://findingaids.library.nyu.edu/nyhs/pr080_clarke_rapuano/all/">Clarke &amp; Rapuano landscape architecture collection</a> - I still plan on eventually going to this collection in person on New York</li>
  <li>Roberta Moudry, “Architecture as Cultural Design: The Architecture and Urbanism of the Metropolitan Life Insurance Company” (PhD Dissertation, Cornell University, 1995) - I have been unable to find a full copy of this dissertation, and have tried to get in contact with the author.</li>
  <li>Arthur Simon, Stuyvesant Town, U.S.A.: Pattern for Two Americas (1970)</li>
  <li>Priced Out: Stuyvesant Town and the Loss of Middle-Class Neighborhoods (New York, NY: New York University Press, 2016)</li>
  <li>Columbia University Oral History Collection, The Reminiscences of Louis H. Pink, 36-7.</li>
  <li>“Metropolitan’s Parkchester,” Architectural Forum, December 1939</li>
  <li>“Big Insurance Firms Drawing Plans for New Housing Developments,” Wall Street Journal, December 17, 1945.</li>
  <li>Eleven Stories High: Growing Up in Stuyvesant Town by Corinne Demas</li>
</ol>

<p>In addition to these texts, I also interviewed people about StuyTown. I spent an afternoon with my friend Reverie, going up to strangers in the Stuyvesant Oval and recording their experiences living in and around StuyTown. I got great stories about what it was like to raise kids in the neighborhood, to work there, and to be a new resident. I would love to expand this project to include the words and voices of residents, not just historical anecdotes compiled by me.</p>

<h2 id="the-project">The Project</h2>

<p><img src="/assets/img/2025-11-12-stuytown/project.png" alt="project" /></p>

<p class="caption">The project setup on demo day</p>

<p>This project had two distinct components: the physical model and the website. I knew I wanted to make a 3D website of the neighborhood, but it didn’t feel quite interactive enough for this project. I wanted to show an audience who might never have seen StuyTown just how odd the layout is, given the surrounding neighborhoods. I also wanted to build something people could pick up and move around to interact with the website, rather than just using a mouse and keyboard. I settled on a laser-engraved map of the surrounding area and a 3D-printed model of StuyTown with an embedded gyroscope that moved the model on the website.</p>

<h3 id="physical-model">Physical model</h3>

<p><img src="/assets/img/2025-11-12-stuytown/physical-model.png" alt="physical model" /></p>

<p class="caption">The physical model on demo day</p>

<p>When I started this project, I assumed I would need to painstakingly recreate all of StuyTown in Blender. However, I found that the NYC Department of City Planning provides an incredible free resource of <a href="https://www.nyc.gov/content/planning/pages/resources/datasets/nyc-3d-model">downloadable 3D models of the entire city</a>.</p>

<blockquote>
  <p>The NYC 3D Model by Community District is a publicly available model consisting of every building in New York City present in 2014. The model is based on DOITT’s 2014 aerial survey, which provides roof structure details, including a high-level of detail for certain iconic buildings</p>
</blockquote>

<p>This saved me a ton of time! I started the project by downloading MN CD 06, and using Rhinoceros for the first time.  Luckily, they offer a 90-day trial license, which was perfect for me since I only had a few weeks!</p>

<p><img src="/assets/img/2025-11-12-stuytown/rhino.png" alt="rhino" /></p>

<p class="caption">A screenshot of the Rhino interface</p>

<p>I was lucky to have some Rhino experts in the IMA Low-Res program who could help me get the hang of the software. I deleted most of the unnecessary objects (roads, contour lines, non-StuyTown buildings). I added a base and a cutout for the Stuyvesant Oval in the middle, along with four holes for screws. I then exported the file as a <code class="language-plaintext highlighter-rouge">.stl</code> so I could 3D print it on the school printers. It took three tries to get the print level and to get the holes exactly where I wanted them, but the final print looked great! I tried painting one of the models red/brown to match the color of the actual StuyTown buildings, but I didn’t love the result, so I left it as is.</p>

<p><img src="/assets/img/2025-11-12-stuytown/print-timelapse.gif" alt="print timelapse" /></p>

<p class="caption">Timelapse of the print</p>

<p><img src="/assets/img/2025-11-12-stuytown/print.png" alt="print" /></p>

<p class="caption">Finished print on the printbed</p>

<p>I wasn’t sure how best to mount a gyroscope (in this case, an Arduino Nano) to this 3D model, but I saw several other projects by IMA/ITP students that used a sandwich method. They would mount electronic components between acrylic sheets and sandwich the components together. I loved this idea because it made the project easy to fix while still having an interesting aesthetic. I found a piece of clear acrylic in the scrap bin and laser cut it to match the base of the 3D model. And rather than glue my Arduino directly to the acrylic, I stuck the pins in a piece of styrofoam and hot-glued the foam to the acrylic.</p>

<p><img src="/assets/img/2025-11-12-stuytown/acrylic.png" alt="acrylic" /></p>

<p class="caption">The Arduino sandwiched between the 3D model and a piece of acrylic - held together with screws and ~1 inch aluminum spacers I found in the lab</p>

<p>Lastly, to get a sense of scale, I laser-etched a map of Manhattan’s streets onto a piece of balsa wood. I measured the size of my 3D model and scaled the street map to ensure that, when laser-etched, the model would fit perfectly in the StuyTown cutout. To save time, I bought an <a href="https://www.etsy.com/listing/1825209218/new-york-svgpngcdraiepsdxf-new-york-map?ref=yr_purchases">SVG NYC street map from Etsy</a>, and scaled it with Affinity Designer.</p>

<p><img src="/assets/img/2025-11-12-stuytown/affinity-designer.png" alt="affinity designer" /></p>

<p class="caption">I created a red rectangle with the exact measurements of my model, made with a dial caliper to ensure everything would fit.</p>

<p><img src="/assets/img/2025-11-12-stuytown/laser-cutter.png" alt="laser cutter" /></p>

<p class="caption">I sat there and watched the laser engrave for an hour and 27 minutes</p>

<p>During playtesting, I noticed that the balsa wood was flimsy, and it wasn’t super obvious where to place the model when it wasn’t in use. To solve those problems, I glued the balsa wood to a thicker, heavier piece of wood and added small bumpers around where the model should sit to make it obvious where to place it.</p>

<p><img src="/assets/img/2025-11-12-stuytown/final-wood.png" alt="final wood" /></p>

<p class="caption">Map with the bumpers on a big slab of wood</p>

<p>The final physical model was something I was very happy with. The street view gave me a great visual reference to point to when talking about the Manhattan street grid. And people loved playing with the physical model, and pointing out which buildings they or their friends lived in.</p>

<h3 id="website">Website</h3>

<p>The website also started with using 3D models from the NYC Department of City Planning. I downloaded 3D models of StuyTown, Parkchester, and Riverton, and used Rhino to export them into <code class="language-plaintext highlighter-rouge">.gltf</code> files (I later learned <code class="language-plaintext highlighter-rouge">.glb</code> was 10x faster). I was then able to load these files directly into the ThreeJS scene.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">dracoLoader</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">DRACOLoader</span><span class="p">();</span>
<span class="nx">dracoLoader</span><span class="p">.</span><span class="nx">setDecoderPath</span><span class="p">(</span><span class="dl">'</span><span class="s1">https://www.gstatic.com/draco/versioned/decoders/1.5.6/</span><span class="dl">'</span><span class="p">);</span>

<span class="kd">const</span> <span class="nx">loader</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">GLTFLoader</span><span class="p">();</span>
<span class="nx">loader</span><span class="p">.</span><span class="nx">setDRACOLoader</span><span class="p">(</span><span class="nx">dracoLoader</span><span class="p">);</span>
<span class="nx">loader</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span>
  <span class="nx">filename</span><span class="p">,</span>
  <span class="p">(</span><span class="nx">gltf</span><span class="p">:</span> <span class="p">{</span> <span class="nl">scene</span><span class="p">:</span> <span class="nx">THREE</span><span class="p">.</span><span class="nx">Object3D</span><span class="o">&lt;</span><span class="nx">THREE</span><span class="p">.</span><span class="nx">Object3DEventMap</span><span class="o">&gt;</span> <span class="p">})</span> <span class="o">=&gt;</span> <span class="p">{</span>
    <span class="kd">const</span> <span class="nx">model</span> <span class="o">=</span> <span class="nx">gltf</span><span class="p">.</span><span class="nx">scene</span><span class="p">;</span>
    <span class="p">...</span>
<span class="p">})</span>
</code></pre></div></div>

<p>I also added all the other necessary elements to the scene, such as a camera, lights, and materials. This stuff is complex, but I’ll avoid turning this blog post into another ThreeJS walkthrough!</p>

<p>I also had the vision of giving this 3D website a more hand-drawn look, and I found great inspiration in <a href="https://github.com/spite">Jaume Sanchez</a>, a developer I have followed and admired for years. They published a series of <a href="https://spite.github.io/sketch/">explorations</a> on cross-hatching shaders ~5 years ago that were incredibly inspiring. In particular, their Post Lines I sketch was very similar to what I was looking for.</p>

<p><img src="/assets/img/2025-11-12-stuytown/post-lines-1.png" alt="post lines 1" /></p>

<p class="caption">A screenshot of <a href="https://spite.github.io/sketch/post-lines-i/index.html">the sketch</a>. Hard to believe it’s 3D!</p>

<p>I implemented this shader in my sketch with some tweaks. It took a surprising amount of effort to port this shader to a new version of ThreeJS, and it wasn’t easy since I have a pretty basic knowledge of shaders. But as far as I can tell, we take the light levels from the environmental light reflected on objects in the scene and use them to determine discrete steps of cross-hatching. After a lot of tweaking of the lights and the shader parameters, I finally got a version of the shader working that included geometry edges.</p>

<p><img src="/assets/img/2025-11-12-stuytown/wip-site.png" alt="wip site" /></p>

<p class="caption">My work-in-progress screenshot once I finally got the model loaded correctly and the shader working.</p>

<p>However, after playing around with the parameters, I had a tough time choosing a color scheme and a combination of noise and line thicknesses. But luckily, I had access to a dozen or so art school graduates who I could get to generate ideas for me - my classmates! When I presented this version of the website in class, I asked all my classmates to spend a few minutes playing with the parameters and send me their favorite combination. I got some great iterations:</p>

<p><img src="/assets/img/2025-11-12-stuytown/dae.webp" alt="dae" /></p>

<p class="caption">Dae’s version</p>

<p><img src="/assets/img/2025-11-12-stuytown/jaylin.webp" alt="jaylin" /></p>

<p class="caption">Jaylins version</p>

<p>But my favorite was Daphne’s, and I used their parameter set to this day - with credit, of course!</p>

<p><img src="/assets/img/2025-11-12-stuytown/daphne.webp" alt="daphne" /></p>

<p class="caption">Soooo good</p>

<p>Once the 3D model was working with a camera that flew around the scene, I had to hook it up to the Arduino’s gyroscope. I expected this to be incredibly difficult, but luckily, there was a <a href="https://itp.nyu.edu/physcomp/labs/lab-serial-imu-output-to-p5-js/">tutorial for this exact scenario</a>. I implemented this code exactly as is in ThreeJS, and it worked! I set the ‘upright’ values to the device’s orientation when it connected to the computer to ensure correct calibration. I also added a movement threshold to avoid jittering when the model was still, and smooth transitions to reduce jittery movement. I used AI to help with the math here (give me a break, it’s been 6 years since I took linear algebra)</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Apply calibration offset to normalize orientation</span>
<span class="kd">let</span> <span class="nx">adjustedPitch</span> <span class="o">=</span> <span class="nx">orientation</span><span class="p">.</span><span class="nx">pitch</span> <span class="o">-</span> <span class="nx">calibrationOffset</span><span class="p">.</span><span class="nx">x</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">adjustedHeading</span> <span class="o">=</span> <span class="nx">orientation</span><span class="p">.</span><span class="nx">heading</span> <span class="o">-</span> <span class="nx">calibrationOffset</span><span class="p">.</span><span class="nx">y</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">adjustedRoll</span> <span class="o">=</span> <span class="nx">orientation</span><span class="p">.</span><span class="nx">roll</span> <span class="o">-</span> <span class="nx">calibrationOffset</span><span class="p">.</span><span class="nx">z</span><span class="p">;</span>

<span class="c1">// Movement threshold - need at least 5 degrees of movement to update target</span>
<span class="kd">const</span> <span class="nx">movementThreshold</span> <span class="o">=</span> <span class="mf">5.0</span><span class="p">;</span>

<span class="c1">// Check if there's significant movement from last recorded position</span>
<span class="kd">const</span> <span class="nx">pitchDiff</span> <span class="o">=</span> <span class="nx">angleDifference</span><span class="p">(</span><span class="nx">adjustedPitch</span><span class="p">,</span> <span class="nx">lastSignificantRotation</span><span class="p">.</span><span class="nx">x</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">headingDiff</span> <span class="o">=</span> <span class="nx">angleDifference</span><span class="p">(</span><span class="nx">adjustedHeading</span><span class="p">,</span> <span class="nx">lastSignificantRotation</span><span class="p">.</span><span class="nx">y</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">rollDiff</span> <span class="o">=</span> <span class="nx">angleDifference</span><span class="p">(</span><span class="nx">adjustedRoll</span><span class="p">,</span> <span class="nx">lastSignificantRotation</span><span class="p">.</span><span class="nx">z</span><span class="p">);</span>

<span class="c1">// If movement is significant enough, update target rotation</span>
<span class="k">if</span> <span class="p">(</span>
  <span class="nx">pitchDiff</span> <span class="o">&gt;</span> <span class="nx">movementThreshold</span> <span class="o">||</span>
  <span class="nx">headingDiff</span> <span class="o">&gt;</span> <span class="nx">movementThreshold</span> <span class="o">||</span>
  <span class="nx">rollDiff</span> <span class="o">&gt;</span> <span class="nx">movementThreshold</span>
<span class="p">)</span> <span class="p">{</span>
  <span class="nx">targetRotation</span><span class="p">.</span><span class="nx">x</span> <span class="o">=</span> <span class="nx">adjustedPitch</span><span class="p">;</span>
  <span class="nx">targetRotation</span><span class="p">.</span><span class="nx">y</span> <span class="o">=</span> <span class="nx">adjustedHeading</span><span class="p">;</span>
  <span class="nx">targetRotation</span><span class="p">.</span><span class="nx">z</span> <span class="o">=</span> <span class="nx">adjustedRoll</span><span class="p">;</span>

  <span class="c1">// Update last significant rotation</span>
  <span class="nx">lastSignificantRotation</span><span class="p">.</span><span class="nx">x</span> <span class="o">=</span> <span class="nx">adjustedPitch</span><span class="p">;</span>
  <span class="nx">lastSignificantRotation</span><span class="p">.</span><span class="nx">y</span> <span class="o">=</span> <span class="nx">adjustedHeading</span><span class="p">;</span>
  <span class="nx">lastSignificantRotation</span><span class="p">.</span><span class="nx">z</span> <span class="o">=</span> <span class="nx">adjustedRoll</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1">// Smoothly interpolate current rotation towards target (lerp factor controls smoothness)</span>
<span class="kd">const</span> <span class="nx">lerpFactor</span> <span class="o">=</span> <span class="mf">0.05</span><span class="p">;</span> <span class="c1">// Lower = smoother, higher = more responsive</span>
<span class="nx">currentRotation</span><span class="p">.</span><span class="nx">x</span> <span class="o">=</span> <span class="nx">interpolateAngle</span><span class="p">(</span><span class="nx">currentRotation</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span> <span class="nx">targetRotation</span><span class="p">.</span><span class="nx">x</span><span class="p">,</span> <span class="nx">lerpFactor</span><span class="p">);</span>
<span class="nx">currentRotation</span><span class="p">.</span><span class="nx">y</span> <span class="o">=</span> <span class="nx">interpolateAngle</span><span class="p">(</span><span class="nx">currentRotation</span><span class="p">.</span><span class="nx">y</span><span class="p">,</span> <span class="nx">targetRotation</span><span class="p">.</span><span class="nx">y</span><span class="p">,</span> <span class="nx">lerpFactor</span><span class="p">);</span>
<span class="nx">currentRotation</span><span class="p">.</span><span class="nx">z</span> <span class="o">=</span> <span class="nx">interpolateAngle</span><span class="p">(</span><span class="nx">currentRotation</span><span class="p">.</span><span class="nx">z</span><span class="p">,</span> <span class="nx">targetRotation</span><span class="p">.</span><span class="nx">z</span><span class="p">,</span> <span class="nx">lerpFactor</span><span class="p">);</span>

<span class="c1">// Get the smoothed orientation values in radians</span>
<span class="kd">const</span> <span class="nx">roll</span> <span class="o">=</span> <span class="nx">THREE</span><span class="p">.</span><span class="nx">MathUtils</span><span class="p">.</span><span class="nx">degToRad</span><span class="p">(</span><span class="nx">currentRotation</span><span class="p">.</span><span class="nx">z</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">pitch</span> <span class="o">=</span> <span class="nx">THREE</span><span class="p">.</span><span class="nx">MathUtils</span><span class="p">.</span><span class="nx">degToRad</span><span class="p">(</span><span class="nx">currentRotation</span><span class="p">.</span><span class="nx">x</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">heading</span> <span class="o">=</span> <span class="nx">THREE</span><span class="p">.</span><span class="nx">MathUtils</span><span class="p">.</span><span class="nx">degToRad</span><span class="p">(</span><span class="nx">currentRotation</span><span class="p">.</span><span class="nx">y</span><span class="p">);</span>

<span class="c1">// Calculate matrix components (from p5 sketch)</span>
<span class="kd">const</span> <span class="nx">c1</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">cos</span><span class="p">(</span><span class="nx">roll</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">s1</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">sin</span><span class="p">(</span><span class="nx">roll</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">c2</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">cos</span><span class="p">(</span><span class="nx">pitch</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">s2</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">sin</span><span class="p">(</span><span class="nx">pitch</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">c3</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">cos</span><span class="p">(</span><span class="nx">heading</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">s3</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">sin</span><span class="p">(</span><span class="nx">heading</span><span class="p">);</span>

<span class="c1">// Create rotation matrix using the p5 formula</span>
<span class="kd">const</span> <span class="nx">matrix</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">THREE</span><span class="p">.</span><span class="nx">Matrix4</span><span class="p">();</span>
<span class="nx">matrix</span><span class="p">.</span><span class="kd">set</span><span class="p">(</span><span class="nx">c2</span> <span class="o">*</span> <span class="nx">c3</span><span class="p">,</span> <span class="nx">s1</span> <span class="o">*</span> <span class="nx">s3</span> <span class="o">+</span> <span class="nx">c1</span> <span class="o">*</span> <span class="nx">c3</span> <span class="o">*</span> <span class="nx">s2</span><span class="p">,</span> <span class="nx">c3</span> <span class="o">*</span> <span class="nx">s1</span> <span class="o">*</span> <span class="nx">s2</span> <span class="o">-</span> <span class="nx">c1</span> <span class="o">*</span> <span class="nx">s3</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="nx">s2</span><span class="p">,</span> <span class="nx">c1</span> <span class="o">*</span> <span class="nx">c2</span><span class="p">,</span> <span class="nx">c2</span> <span class="o">*</span> <span class="nx">s1</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nx">c2</span> <span class="o">*</span> <span class="nx">s3</span><span class="p">,</span> <span class="nx">c1</span> <span class="o">*</span> <span class="nx">s2</span> <span class="o">*</span> <span class="nx">s3</span> <span class="o">-</span> <span class="nx">c3</span> <span class="o">*</span> <span class="nx">s1</span><span class="p">,</span> <span class="nx">c1</span> <span class="o">*</span> <span class="nx">c3</span> <span class="o">+</span> <span class="nx">s1</span> <span class="o">*</span> <span class="nx">s2</span> <span class="o">*</span> <span class="nx">s3</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>

<span class="c1">// Apply the matrix to the Arduino model</span>
<span class="nx">arduinoModel</span><span class="p">.</span><span class="nx">matrix</span><span class="p">.</span><span class="nx">copy</span><span class="p">(</span><span class="nx">matrix</span><span class="p">);</span>
<span class="nx">arduinoModel</span><span class="p">.</span><span class="nx">matrixAutoUpdate</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>
</code></pre></div></div>

<p>Finally, the last part of the site to build was where I displayed the information. Liquid Glass had been all the rage that summer, and I wanted to give it a shot on my site. My first implementation was awful, leaving the text barely legible. What I settled on was <a href="https://medium.com/ekino-france/liquid-glass-in-css-and-svg-839985fcb88d">this guide</a> by Adrien Gautier, which uses SVG filters rather than shaders for the effect. This was great since I had reached my shader limit for this project.</p>

<p><img src="/assets/img/2025-11-12-stuytown/demo-glass.png" alt="liquid glass tutorial demo" /></p>

<p class="caption">Example from the guide</p>

<p>It took some time to port the implementation to Svelte, and I spent a while tweaking the parameters to something I was excited about - albeit far from Apple’s design. I want to revisit this effect in the future, though, especially since it is not supported on iOS devices.</p>

<p><img src="/assets/img/2025-11-12-stuytown/my-glass.png" alt="my liquid glass demo" /></p>

<p class="caption">My implementation of liquid glass</p>

<p>There are a million other implementation details I could cover about this website, but I’ll end it here! If there’s anything else about the site you’re interested in, drop a comment, and I can expand on it. It would also be great motivation for me to clean up my mess of a codebase.</p>

<h2 id="reception">Reception</h2>

<p>Outside of perhaps <a href="https://leviv.cool/projects/2025/05/16/put-it-in-park.html">PutItInPark</a>, this is the most ambitious project I’ve taken on to date. I am incredibly proud of how my research, physical model, and website came together to make something so special. It was made better by all of my classmates who helped and playtested, and by my professors and the IMA residents who gave me feedback. I worked until the very last minute on this project and almost missed the day of presentations because I didn’t leave school until 6 am.</p>

<p><img src="/assets/img/2025-11-12-stuytown/wake-up.jpg" alt="wake up texts" /></p>

<p class="caption">Texts from my classmates while I unintentionally slept through all my alarms</p>

<p><img src="/assets/img/2025-11-12-stuytown/presentation.png" alt="presentation" /></p>

<p class="caption">Me running on 3 hours of sleep on presentation day - Aug 13, 2025</p>

<p>I got the chance to demo this at the NYC summer showcase for IMA low-res students, and I am so grateful that ~20 of my closest friends braved the freak summer downpour to hear me talk about StuyTown. The audience feedback was overwhelmingly positive, and despite my sleep deprivation, I had great conversations with many people about urban planning, architecture, and New York City. This project is still not done in my eyes, and I would love to find a home for it and show it in more places in New York City. I want to get this in front of StuyTown management and ensure that more residents know the history that I have come to appreciate so much about this special place.</p>

<p><img src="/assets/img/2025-11-12-stuytown/presentation-friends.png" alt="presentation friends" /></p>

<p class="caption">Some of my friends who came by to support!! I love you guys</p>]]></content><author><name>Levi Villarreal</name></author><category term="projects" /><category term="grad-school" /><summary type="html"><![CDATA[]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://leviv.cool/assets/img/2025-11-12-stuytown/hero.png" /><media:content medium="image" url="https://leviv.cool/assets/img/2025-11-12-stuytown/hero.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Bodega cat beckoning simulator</title><link href="https://leviv.cool/projects/2025/11/09/bodega-cat-beckoning-simulator.html" rel="alternate" type="text/html" title="Bodega cat beckoning simulator" /><published>2025-11-09T00:00:00+00:00</published><updated>2025-11-09T00:00:00+00:00</updated><id>https://leviv.cool/projects/2025/11/09/bodega-cat-beckoning-simulator</id><content type="html" xml:base="https://leviv.cool/projects/2025/11/09/bodega-cat-beckoning-simulator.html"><![CDATA[<p>Check out the live project and code <a href="https://editor.p5js.org/leviv/full/DVz8cmjhn">on p5.js</a>! Click on the sketch and type ‘pspspsps…’ Without messing up to fill up the screen and win the cats trust.</p>

<p><img src="/assets/img/2025-11-09-bodega-cat-beckoning-simulator/gameplay.png" alt="gameplay" /></p>

<p class="caption">A picture of the game in action</p>

<p>A few months ago, I got to attend the second anniversary party for <a href="https://www.instagram.com/creativecodingnyc/?hl=en">Creative Coding NYC</a>. I had never been to the meetup before, but a lot of my classmates at NYU IMA/ITP were involved, so I knew it had to be good. The anniversary was part scavenger hunt, part game jam, and part <a href="https://en.wikipedia.org/wiki/Live_coding">live coding</a> rave.</p>

<p>We started the night off with a scavenger hunt that sent us out on the streets of downtown Brooklyn on a wet and humid NYC evening. The goal was to take pictures of different objects in order to add constraints to the projects that we would have to make later in the night. For example, we had to photograph a rat, a subway busker, and 4 pigeons a single frame.</p>

<p><img src="/assets/img/2025-11-09-bodega-cat-beckoning-simulator/trio.png" alt="trio" /></p>

<p class="caption">Me, Adalea, and <a href="https://joshjoshjosh.net">JoshJoshJosh</a> waiting for our next set of tasks</p>

<p>Once we finished the scavenger hunt, we had only a little over an hour to create a piece of art related to our journey on the streets of New York. And because of the scavenger hunt our constraints were:</p>

<ul>
  <li>The piece could be no larger than 64x64 pixels</li>
  <li>The piece count not feature any curves</li>
  <li>We could not use Python to make the piece</li>
</ul>

<p>This shaped the aesthetic of our game, and made it clear that needed to make a pixel-based final product. Out of all of the tasks we completed, we decided that the bodega cat we photographed was the most unique, and decided to make our game around that.</p>

<p><img src="/assets/img/2025-11-09-bodega-cat-beckoning-simulator/bodega-cat.jpg" alt="bodega cat" /></p>

<p class="caption">The bodega cat we found in Gowanus</p>

<p>Josh got to work on creating a typing mechanic for the game, and I got to work making the pixel art and loading it into the sketch. Adalea contributed by recording the sound effects (‘pspsps’ and ‘meow’ when you reach the win condition). I had some difficulty loading the images and fonts in the correct way in p5.js, but luckily Dan Schiffman from the <a href="https://www.youtube.com/thecodingtrain">Coding Train</a> was standing right behind me and helped me debug my errors. We finished the game with nearly minutes to spare and play tested it with the dozens of people who had started to show up for the rave part of the night.</p>

<p><img src="/assets/img/2025-11-09-bodega-cat-beckoning-simulator/sleeping-cat.png" alt="sleeping cat pixel art" /></p>

<p class="caption">One of pieces of pixel art I created for the game</p>

<h2 id="reception">Reception</h2>

<p>People loved the game! Bodega cats are such a well-known part of NYCs charm that people got the idea immediately and had fun with the mini game of typing ‘pspspsps’ without messing up. We ended up winning the most popular game of the night and were rewarded by a grand prize of a month membership at <a href="https://brooklynspark.com/">Brooklyn Spark</a>, which I have yet to use.</p>

<p>Overall this was a small but cute project that I had a great time making. My teammate Josh Zhong created a video of the event that does a much better job capturing the vibe of the event - please give it a watch!</p>

<blockquote class="tiktok-embed" cite="https://www.tiktok.com/@joshjoshjosh.net/video/7553511433401601294" data-video-id="7553511433401601294" style="max-width: 605px;min-width: 325px;"> <section> <a target="_blank" title="@joshjoshjosh.net" href="https://www.tiktok.com/@joshjoshjosh.net?refer=embed">@joshjoshjosh.net</a> Bodega Cat Simulator coming to steam next summer!! Maybe! @Levi V <a title="creativecoding" target="_blank" href="https://www.tiktok.com/tag/creativecoding?refer=embed">#creativecoding</a> <a title="nyc" target="_blank" href="https://www.tiktok.com/tag/nyc?refer=embed">#nyc</a> <a title="ccnyc" target="_blank" href="https://www.tiktok.com/tag/ccnyc?refer=embed">#ccnyc</a> <a target="_blank" title="♬ original sound - nicole" href="https://www.tiktok.com/music/original-sound-7275451326566632197?refer=embed">♬ original sound - nicole</a> </section> </blockquote>
<script async="" src="https://www.tiktok.com/embed.js"></script>]]></content><author><name>Levi Villarreal</name></author><category term="projects" /><category term="personal" /><summary type="html"><![CDATA[Check out the live project and code on p5.js! Click on the sketch and type ‘pspspsps…’ Without messing up to fill up the screen and win the cats trust.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://leviv.cool/assets/img/2025-11-09-bodega-cat-beckoning-simulator/gameplay.png" /><media:content medium="image" url="https://leviv.cool/assets/img/2025-11-09-bodega-cat-beckoning-simulator/gameplay.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>