<?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: punts</title>
    <description>The latest articles on DEV Community by punts (@puntsza).</description>
    <link>https://dev.to/puntsza</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3947422%2F99009eb7-7eb5-4278-af71-30adf5460f29.png</url>
      <title>DEV Community: punts</title>
      <link>https://dev.to/puntsza</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/puntsza"/>
    <language>en</language>
    <item>
      <title>Open World Cup 2026 fixtures in South African Standard Time</title>
      <dc:creator>punts</dc:creator>
      <pubDate>Sun, 31 May 2026 17:58:45 +0000</pubDate>
      <link>https://dev.to/puntsza/open-world-cup-2026-fixtures-in-south-african-standard-time-58o0</link>
      <guid>https://dev.to/puntsza/open-world-cup-2026-fixtures-in-south-african-standard-time-58o0</guid>
      <description>&lt;p&gt;If you have ever tried to build anything around a major football tournament from South Africa, you already know the pain: every published schedule seems to live in a different time zone. Match listings come in UTC, in the host country's local time, or in some broadcaster's preferred zone, and almost none of them are in South African Standard Time (SAST, UTC+2). So before you can render a single fixture, you are stuck writing fragile offset math and second-guessing daylight-saving edge cases that do not even apply to SAST but absolutely apply to the source data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why SAST fixture data is annoying
&lt;/h2&gt;

&lt;p&gt;The core problem is that fixtures for the 2026 World Cup are spread across multiple North American host cities, each in its own zone, several of which observe daylight saving time. Converting those kickoff times into a clean, consistent SAST value means tracking each venue's offset on each date, then normalizing everything to UTC+2. It is the kind of tedious, error-prone work that quietly breaks a calendar widget or a reminder feature, usually right before kickoff.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Edges published
&lt;/h2&gt;

&lt;p&gt;To take that conversion burden off developers, Edges put together an open dataset of every 2026 World Cup fixture, pre-converted to SAST. You can browse it here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.edges.co.za/data/wc2026-fixtures/" rel="noopener noreferrer"&gt;World Cup 2026 fixtures dataset&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The dataset is plain, machine-readable, and offered in two formats so you can drop it straight into whatever you are building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CSV: &lt;a href="https://www.edges.co.za/data/wc2026-fixtures.csv" rel="noopener noreferrer"&gt;wc2026-fixtures.csv&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;JSON: &lt;a href="https://www.edges.co.za/data/wc2026-fixtures.json" rel="noopener noreferrer"&gt;wc2026-fixtures.json&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How developers can use the CSV/JSON
&lt;/h2&gt;

&lt;p&gt;The JSON is the easiest starting point for a JavaScript project. A minimal fetch looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://www.edges.co.za/data/wc2026-fixtures.json&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fixtures&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// Already in SAST, so no offset math needed&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;upcoming&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;fixtures&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;kickoff_sast&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;kickoff_sast&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;kickoff_sast&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;upcoming&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because the times are already normalized to SAST, you skip the conversion layer entirely and go straight to filtering, sorting, and rendering. The CSV is just as handy if you would rather pull the data into a spreadsheet, a quick pandas script, or a static-site build step. Both files share the same fields, so you can switch formats without rewriting your parsing logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the dataset deliberately excludes odds and predictions
&lt;/h2&gt;

&lt;p&gt;This is a fixtures dataset, and nothing more. It deliberately leaves out betting odds, model predictions, and any kind of forecast. That is a design decision, not an oversight. Mixing scheduling data with odds tends to blur the line between a neutral reference and a betting product, and it nudges projects toward territory that carries real responsibilities. Keeping the dataset to dates, venues, teams, and SAST kickoff times means it stays a clean, dependable source you can build on without inheriting any of that baggage.&lt;/p&gt;

&lt;p&gt;If your project does touch betting in any way, please keep it strictly 18+ and point users toward support resources, such as this &lt;a href="https://www.edges.co.za/responsible-gambling/" rel="noopener noreferrer"&gt;responsible gambling&lt;/a&gt; page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping up
&lt;/h2&gt;

&lt;p&gt;The whole idea here is boring in the best way: accurate fixtures, already in SAST, in formats you can consume in a few lines of code. Grab the CSV or JSON, wire it into your app, and spend your time on the features that matter instead of fighting time-zone math.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>opensource</category>
      <category>data</category>
      <category>football</category>
    </item>
    <item>
      <title>Building a Slot-Machine Picker Without Making Gambling Claims</title>
      <dc:creator>punts</dc:creator>
      <pubDate>Sat, 23 May 2026 09:39:57 +0000</pubDate>
      <link>https://dev.to/puntsza/building-a-slot-machine-picker-without-making-gambling-claims-31pf</link>
      <guid>https://dev.to/puntsza/building-a-slot-machine-picker-without-making-gambling-claims-31pf</guid>
      <description>&lt;p&gt;A small open-source HTML/CSS widget that links to a live random casino game picker with responsible-&lt;br&gt;
  gambling guardrails.&lt;/p&gt;

&lt;p&gt;Post:&lt;/p&gt;

&lt;p&gt;I built a small open-source widget for a larger web tool: a random casino game picker for&lt;br&gt;
  CasinoGaming.co.za.&lt;/p&gt;

&lt;p&gt;The goal was simple: make game discovery feel like a slot-machine spin, while being careful not to&lt;br&gt;
  imply that the tool predicts outcomes, improves odds, or recommends a deposit.&lt;/p&gt;

&lt;p&gt;Live picker:&lt;br&gt;
  &lt;a href="https://www.casinogaming.co.za/random-casino-game-picker-south-africa/" rel="noopener noreferrer"&gt;https://www.casinogaming.co.za/random-casino-game-picker-south-africa/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub repo:&lt;br&gt;
  &lt;a href="https://github.com/puntsza-web/random-casino-game-picker" rel="noopener noreferrer"&gt;https://github.com/puntsza-web/random-casino-game-picker&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub Pages demo:&lt;br&gt;
  &lt;a href="https://puntsza-web.github.io/random-casino-game-picker/" rel="noopener noreferrer"&gt;https://puntsza-web.github.io/random-casino-game-picker/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;## The Product Constraint&lt;/p&gt;

&lt;p&gt;Casino interfaces can get noisy fast. A random picker sounds fun, but the wording matters because a&lt;br&gt;
  So the tool had a few hard rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It is a discovery tool, not a prediction tool.&lt;/li&gt;
&lt;li&gt;It links to game guides, not directly to a deposit action.&lt;/li&gt;
&lt;li&gt;It keeps 18+ and responsible-gambling notes visible.&lt;/li&gt;
&lt;li&gt;It avoids certainty language, prediction language, and deposit-push language.&lt;/li&gt;
&lt;li&gt;It shows practical context such as RTP, volatility, caution notes, and availability checks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;## The Embeddable Card&lt;/p&gt;

&lt;p&gt;The open-source repo is intentionally small. It is just HTML and CSS, with no build step, so&lt;br&gt;
  publishers can drop a card into an article or resource page.&lt;/p&gt;

&lt;p&gt;The card uses a single component namespace so it is less likely to collide with the host page. The&lt;br&gt;
  reel tiles are decorative, so they are hidden from assistive technology. That keeps the screen-&lt;br&gt;
  reader path focused on the actual action: the link to the live picker.&lt;/p&gt;

&lt;p&gt;## The Live Tool&lt;/p&gt;

&lt;p&gt;The full page has a slot-machine UI, category filters, shareable result URLs, a share-card download,&lt;br&gt;
  and a copyable credit section for anyone who wants to reference the tool.&lt;/p&gt;

</description>
      <category>html</category>
      <category>css</category>
      <category>javascript</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
