<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Franco Balik</title>
    <description>The latest articles on DEV Community by Franco Balik (@franco_balik_545dd90ac493).</description>
    <link>https://dev.to/franco_balik_545dd90ac493</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4120364%2Fef80eb25-1e0d-4cd5-9ce2-ece5a8d889eb.png</url>
      <title>DEV Community: Franco Balik</title>
      <link>https://dev.to/franco_balik_545dd90ac493</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/franco_balik_545dd90ac493"/>
    <language>en</language>
    <item>
      <title>How I Started Organizing NoLimit City Game Data on the Frontend</title>
      <dc:creator>Franco Balik</dc:creator>
      <pubDate>Fri, 11 Sep 2026 06:58:03 +0000</pubDate>
      <link>https://dev.to/franco_balik_545dd90ac493/how-i-started-organizing-nolimit-city-game-data-on-the-frontend-3cco</link>
      <guid>https://dev.to/franco_balik_545dd90ac493/how-i-started-organizing-nolimit-city-game-data-on-the-frontend-3cco</guid>
      <description>&lt;p&gt;A few days ago I was looking through a bunch of NoLimit City games and noticed something that I had never really paid attention to before.&lt;/p&gt;

&lt;p&gt;Their games can get complicated pretty quickly.&lt;/p&gt;

&lt;p&gt;You don't just have a game name and an image.&lt;/p&gt;

&lt;p&gt;There are things like RTP, volatility, release date, maximum win, bonus modes, and then mechanics such as xWays, xNudge, xSplit and xBet.&lt;/p&gt;

&lt;p&gt;At first I thought:&lt;/p&gt;

&lt;p&gt;"This should be pretty easy to organize."&lt;/p&gt;

&lt;p&gt;It wasn't.&lt;/p&gt;

&lt;p&gt;Once the number of games starts growing, manually writing every card in HTML becomes annoying very fast.&lt;/p&gt;

&lt;p&gt;So I started thinking about how I would structure the data if I wanted to build a simple game catalog.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Starting with a simple object&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of writing something like this repeatedly:&lt;/p&gt;


&lt;h2&gt;Game Name&lt;/h2&gt;
&lt;br&gt;
  &lt;p&gt;RTP: 96%&lt;/p&gt;
&lt;br&gt;
  &lt;p&gt;Mechanic: xWays&lt;/p&gt;

&lt;p&gt;I prefer keeping the information separate from the HTML.&lt;/p&gt;

&lt;p&gt;Something simple like:&lt;/p&gt;

&lt;p&gt;const games = [&lt;br&gt;
  {&lt;br&gt;
    name: "Example Game",&lt;br&gt;
    provider: "NoLimit City",&lt;br&gt;
    rtp: 96.0,&lt;br&gt;
    volatility: "High",&lt;br&gt;
    mechanics: ["xWays", "xNudge"]&lt;br&gt;
  },&lt;br&gt;
  {&lt;br&gt;
    name: "Another Game",&lt;br&gt;
    provider: "NoLimit City",&lt;br&gt;
    rtp: 96.1,&lt;br&gt;
    volatility: "High",&lt;br&gt;
    mechanics: ["xSplit"]&lt;br&gt;
  }&lt;br&gt;
];&lt;/p&gt;

&lt;p&gt;Then the frontend can generate the cards automatically.&lt;/p&gt;

&lt;p&gt;games.forEach(game =&amp;gt; {&lt;br&gt;
  const card = document.createElement("div");&lt;/p&gt;

&lt;p&gt;card.className = "game-card";&lt;/p&gt;

&lt;p&gt;card.innerHTML = &lt;code&gt;&lt;br&gt;
    &amp;lt;h2&amp;gt;${game.name}&amp;lt;/h2&amp;gt;&lt;br&gt;
    &amp;lt;p&amp;gt;${game.provider}&amp;lt;/p&amp;gt;&lt;br&gt;
    &amp;lt;p&amp;gt;RTP: ${game.rtp}%&amp;lt;/p&amp;gt;&lt;br&gt;
    &amp;lt;p&amp;gt;${game.mechanics.join(" / ")}&amp;lt;/p&amp;gt;&lt;br&gt;
&lt;/code&gt;;&lt;/p&gt;

&lt;p&gt;document.querySelector("#games").appendChild(card);&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;Nothing complicated.&lt;/p&gt;

&lt;p&gt;But even this small change makes maintaining the page much easier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The interesting part was actually the mechanics&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This was where things became more interesting for me.&lt;/p&gt;

&lt;p&gt;NoLimit City games don't always follow exactly the same structure.&lt;/p&gt;

&lt;p&gt;One game might heavily use xWays.&lt;/p&gt;

&lt;p&gt;Another could combine xWays with xNudge.&lt;/p&gt;

&lt;p&gt;Others introduce xSplit or completely different bonus features.&lt;/p&gt;

&lt;p&gt;That means putting everything under one generic "feature" field doesn't really work.&lt;/p&gt;

&lt;p&gt;Something like this is more flexible:&lt;/p&gt;

&lt;p&gt;mechanics: [&lt;br&gt;
  "xWays",&lt;br&gt;
  "xNudge",&lt;br&gt;
  "xSplit"&lt;br&gt;
]&lt;/p&gt;

&lt;p&gt;Now I can filter games by mechanics.&lt;/p&gt;

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

&lt;p&gt;const xWaysGames = games.filter(game =&amp;gt;&lt;br&gt;
  game.mechanics.includes("xWays")&lt;br&gt;
);&lt;/p&gt;

&lt;p&gt;That opens up some nice possibilities for the UI.&lt;/p&gt;

&lt;p&gt;A visitor could select:&lt;/p&gt;

&lt;p&gt;xWays&lt;br&gt;
xNudge&lt;br&gt;
xSplit&lt;br&gt;
Bonus Buy&lt;br&gt;
High Volatility&lt;/p&gt;

&lt;p&gt;and instantly narrow down the catalog.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I also noticed that naming gets messy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Another small problem is inconsistent naming.&lt;/p&gt;

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

&lt;p&gt;xways&lt;br&gt;
XWAYS&lt;br&gt;
xWays&lt;br&gt;
xWays®&lt;/p&gt;

&lt;p&gt;Technically those strings are different.&lt;/p&gt;

&lt;p&gt;So before filtering anything, I like normalizing the values.&lt;/p&gt;

&lt;p&gt;function normalizeMechanic(value) {&lt;br&gt;
  return value&lt;br&gt;
    .toLowerCase()&lt;br&gt;
    .replace("®", "")&lt;br&gt;
    .trim();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;It's a tiny thing, but those tiny things usually become annoying later when your dataset gets bigger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Looking at existing NoLimit City catalogs helped&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I spent some time looking at how different websites organize information around the provider.&lt;/p&gt;

&lt;p&gt;Some focus mostly on individual game pages.&lt;/p&gt;

&lt;p&gt;Others organize games around things like mechanics, RTP or popularity.&lt;/p&gt;

&lt;p&gt;While comparing them, I also came across slotnolimitcity.com, which is much closer to the type of niche catalog I had in mind.&lt;/p&gt;

&lt;p&gt;That made me realize something:&lt;/p&gt;

&lt;p&gt;the difficult part isn't necessarily displaying the games.&lt;/p&gt;

&lt;p&gt;It's deciding how people should browse them.&lt;/p&gt;

&lt;p&gt;A developer might naturally think:&lt;/p&gt;

&lt;p&gt;"I'll just sort everything alphabetically."&lt;/p&gt;

&lt;p&gt;But that's probably not how someone actually explores a game catalog.&lt;/p&gt;

&lt;p&gt;They might be looking for a particular mechanic.&lt;/p&gt;

&lt;p&gt;Or a newer release.&lt;/p&gt;

&lt;p&gt;Or something with a specific style of gameplay.&lt;/p&gt;

&lt;p&gt;So the data structure should support that from the beginning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adding a basic search&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once the data is structured properly, search becomes pretty straightforward.&lt;/p&gt;

&lt;p&gt;const search = document.querySelector("#search");&lt;/p&gt;

&lt;p&gt;search.addEventListener("input", event =&amp;gt; {&lt;br&gt;
  const query = event.target.value.toLowerCase();&lt;/p&gt;

&lt;p&gt;const results = games.filter(game =&amp;gt;&lt;br&gt;
    game.name.toLowerCase().includes(query) ||&lt;br&gt;
    game.mechanics.some(mechanic =&amp;gt;&lt;br&gt;
      mechanic.toLowerCase().includes(query)&lt;br&gt;
    )&lt;br&gt;
  );&lt;/p&gt;

&lt;p&gt;console.log(results);&lt;br&gt;
});&lt;/p&gt;

&lt;p&gt;Now searching for either a game name or something like xWays can return relevant results.&lt;/p&gt;

&lt;p&gt;Later this could obviously be improved with tags, sorting and proper UI updates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don't load every image immediately&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Game catalogs tend to contain a lot of thumbnails.&lt;/p&gt;

&lt;p&gt;Loading all of them at once isn't ideal.&lt;/p&gt;

&lt;p&gt;For cards further down the page I normally use:&lt;/p&gt;

&lt;p&gt;
  src="game-thumbnail.webp"&lt;br&gt;
  alt="Game thumbnail"&lt;br&gt;
  loading="lazy"&lt;br&gt;
  width="400"&lt;br&gt;
  height="250"&lt;br&gt;
/&amp;gt;&lt;/p&gt;

&lt;p&gt;That way the browser doesn't immediately download dozens of images that aren't even visible yet.&lt;/p&gt;

&lt;p&gt;For the first few images above the fold, I usually don't lazy-load them.&lt;/p&gt;

&lt;p&gt;What I'd change if the project became bigger&lt;/p&gt;

&lt;p&gt;For a small project, a local JavaScript array is perfectly fine.&lt;/p&gt;

&lt;p&gt;But once you're dealing with hundreds of entries, I'd probably move the data elsewhere.&lt;/p&gt;

&lt;p&gt;Something like:&lt;/p&gt;

&lt;p&gt;API&lt;br&gt;
 ↓&lt;br&gt;
JSON&lt;br&gt;
 ↓&lt;br&gt;
Frontend&lt;br&gt;
 ↓&lt;br&gt;
Search / Filters / Sorting&lt;/p&gt;

&lt;p&gt;It also makes updating releases much easier.&lt;/p&gt;

&lt;p&gt;Instead of touching HTML every time a new game appears, the frontend simply consumes the updated data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This started as a pretty simple idea.&lt;/p&gt;

&lt;p&gt;I just wanted to understand how I would organize a collection of NoLimit City games without hardcoding every single card.&lt;/p&gt;

&lt;p&gt;But it turned into a useful little frontend exercise.&lt;/p&gt;

&lt;p&gt;The biggest lesson for me wasn't actually about JavaScript.&lt;/p&gt;

&lt;p&gt;It was about data structure.&lt;/p&gt;

&lt;p&gt;If the data is messy, search becomes messy.&lt;/p&gt;

&lt;p&gt;Filters become messy.&lt;/p&gt;

&lt;p&gt;Updating content becomes messy.&lt;/p&gt;

&lt;p&gt;But if you decide early what information each item needs and keep the structure consistent, the frontend becomes surprisingly simple.&lt;/p&gt;

&lt;p&gt;I'm probably going to experiment next with combining multiple filters at once — for example filtering by mechanic, volatility and release year without turning the JavaScript into a giant collection of if statements.&lt;/p&gt;

&lt;p&gt;That sounds like a fun problem for another weekend.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>api</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
