<?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: Mardeg</title>
    <description>The latest articles on DEV Community by Mardeg (@mardeg).</description>
    <link>https://dev.to/mardeg</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%2F541567%2F1c6bfad0-93cb-4b35-8662-c4b9bfd0ef26.png</url>
      <title>DEV Community: Mardeg</title>
      <link>https://dev.to/mardeg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mardeg"/>
    <language>en</language>
    <item>
      <title>I tested free subdomain hosting for WebTiles so you don't have to</title>
      <dc:creator>Mardeg</dc:creator>
      <pubDate>Fri, 23 Jan 2026 08:43:09 +0000</pubDate>
      <link>https://dev.to/mardeg/i-tested-free-subdomain-hosting-for-webtiles-so-you-dont-have-to-4kn7</link>
      <guid>https://dev.to/mardeg/i-tested-free-subdomain-hosting-for-webtiles-so-you-dont-have-to-4kn7</guid>
      <description>&lt;h2&gt;
  
  
  What are WebTiles?
&lt;/h2&gt;

&lt;p&gt;Miniature 250x250 pixel websites hosted at &lt;a href="https://webtiles.kicya.net/" rel="noopener noreferrer"&gt;https://webtiles.kicya.net/&lt;/a&gt; with each one linking to a real website you control.  Once you register there you need to add such websites and complete the verification process to confirm you control each one before you can use them to create a webtile. Note that where you place your WebTile doesn't have to be its permanent position, WebTiles can join others in a Clan to attack their way closer to the centre. Leaving your WebTile blank after adding it attracts downvotes.&lt;/p&gt;

&lt;p&gt;I won't go into the rules/restrictions on the code used inside the mini-site WebTiles (it isn't just an iframe of your website), read them yourself: &lt;a href="https://web.archive.org/web/20260122075506id_/https://webtiles.kicya.net/t/webtiles.kicya.net/rules.html" rel="noopener noreferrer"&gt;Rules&lt;/a&gt;, &lt;a href="https://web.archive.org/web/20260123215716id_/https://bf.mywebcommunity.org/html.html" rel="noopener noreferrer"&gt;HTML&lt;/a&gt;, &lt;a href="https://web.archive.org/web/20260124122447id_/https://bf.mywebcommunity.org/js.html" rel="noopener noreferrer"&gt;JS&lt;/a&gt;. You can both upload files for your tile and edit the .css and .html files directly. As of the date of this post all image types viewable in a web browser except .avif are permitted.&lt;/p&gt;

&lt;h2&gt;
  
  
  How do I verify my site?
&lt;/h2&gt;

&lt;p&gt;There are three ways to complete the verification process for your added site:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Register at &lt;a href="https://nekoweb.org/" rel="noopener noreferrer"&gt;NekoWeb&lt;/a&gt; and upload your site files to a subdomain of your choice there, then &lt;a href="https://kicya.net/account/connections" rel="noopener noreferrer"&gt;connect it as a service&lt;/a&gt; to WebTiles. This is the easist method and if you're only looking to have a single WebTile probably the one you should go with and you needn't read this post any further.&lt;/li&gt;
&lt;li&gt;Create a TXT DNS record for your domain with the 64 byte code as the content. Since this post is about free subdomains we won't go into this method here.&lt;/li&gt;
&lt;li&gt;Edit your site creating a specific subfolder containing a specific file named &lt;strong&gt;kicya&lt;/strong&gt; with the same 64 byte code as its entire content, test that it exists, then &lt;a href="https://kicya.net/account/sites" rel="noopener noreferrer"&gt;click the verify button at kicya.net&lt;/a&gt;:
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5pfvj3r7rydjrtky7lra.png" alt=" " width="620" height="378"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  I want multiple WebTiles without spending a cent, how?
&lt;/h2&gt;

&lt;p&gt;With free subdomains you will find various restrictions that either hinder or completely prevent the verificaton process from working. I'll list them after first listing the ones I had no difficulty verifying at all.&lt;/p&gt;

&lt;h3&gt;
  
  
  Directly editing with no Github account needed
&lt;/h3&gt;

&lt;p&gt;Creating a &lt;em&gt;.well-known&lt;/em&gt; subfolder and the &lt;em&gt;kicya&lt;/em&gt; file within it works flawlessly on these hosts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;yoursite&lt;/em&gt;.&lt;a href="https://neocities.org/" rel="noopener noreferrer"&gt;NeoCities.org&lt;/a&gt; - this successor to GeoCities has been around for over a decade and also has a user-friendly interface allowing a customised subdomain name.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;randomstring&lt;/em&gt;.&lt;a href="https://www.drv.tw/" rel="noopener noreferrer"&gt;on.Drv.tw&lt;/a&gt; - for this one you need to link your &lt;a href="https://drive.google.com/drive/my-drive" rel="noopener noreferrer"&gt;Google Drive&lt;/a&gt; which hosts the site files, but if like me you automatically got one just by having a working Android phone, it comes for free with your Google account. Note that you don't get to pick the name of your subdomain with this, a random one is generated.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Deployment from a Github account required
&lt;/h3&gt;

&lt;p&gt;These hosts all allow custom subdomains, but with an increased difficulty level requiring either knowlege of &lt;a href="https://github.com" rel="noopener noreferrer"&gt;Github&lt;/a&gt; or (more difficult) another Git host. Github does allow you to create/edit files directly in it, as well as uploading files within its interface separately from the usual method of committing a git push.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;yoursite&lt;/em&gt;.&lt;a href="https://pages.cloudflare.com/" rel="noopener noreferrer"&gt;pages.dev&lt;/a&gt; - hosted by Cloudflare, follow &lt;a href="https://developers.cloudflare.com/pages/get-started/git-integration/" rel="noopener noreferrer"&gt;this guide&lt;/a&gt;. Allows multiple subdomains for free.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;yoursite&lt;/em&gt;.&lt;a href="https://render.com/" rel="noopener noreferrer"&gt;onrender.com&lt;/a&gt; - with the demise of glitch.me free sites many users migrated to this, follow &lt;a href="https://render.com/docs/github" rel="noopener noreferrer"&gt;this guide&lt;/a&gt;. Only a single free subdomain is allowed.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;yoursite&lt;/em&gt;.&lt;a href="https://vercel.com" rel="noopener noreferrer"&gt;vercel.app&lt;/a&gt; - as onrender above many migrated here, follow &lt;a href="https://vercel.com/docs/git/vercel-for-github" rel="noopener noreferrer"&gt;this guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;yoursite&lt;/em&gt;.&lt;a href="https://docs.github.com/en/pages/getting-started-with-github-pages/creating-a-github-pages-site" rel="noopener noreferrer"&gt;github.io&lt;/a&gt; - for this to work you need to create a repository on Github named exactly &lt;em&gt;yourGithubUsername.github.io&lt;/em&gt; where your site files are AND another repository named &lt;em&gt;.well-known&lt;/em&gt; just for the &lt;strong&gt;kicya&lt;/strong&gt; file, follow &lt;a href="https://docs.github.com/en/pages/getting-started-with-github-pages/creating-a-github-pages-site" rel="noopener noreferrer"&gt;this guide&lt;/a&gt;. This subdomain method only works once per github account.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Hinderance: No .well-known subfolder, creative use of the 404 error page required
&lt;/h3&gt;

&lt;p&gt;These hosts allow custom subdomain names but prevent public access to the &lt;em&gt;.well-known&lt;/em&gt; subfolder, even if they allow you to create one, but they DO allow a custom &lt;strong&gt;404.html&lt;/strong&gt; file which if it contains the 64 byte kicya code as the entirety of its content will cause the verification process to succeed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;yoursite&lt;/em&gt;.&lt;a href="https://shipstatic.com/" rel="noopener noreferrer"&gt;shipstatic.com&lt;/a&gt; - allows direct file uploads only, no online editing so upload a new folder/zip file containing your updated index.html and 404.html then in the &lt;strong&gt;Domains&lt;/strong&gt; tab pick your existing subdomain from the dropdown in the dialog you get when you select &lt;strong&gt;Deployment&lt;/strong&gt; from the &lt;strong&gt;⋮&lt;/strong&gt; menu of what you just uploaded. You'll then need to remove the previous upload from the &lt;strong&gt;Deployments&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;yoursite&lt;/em&gt;.&lt;a href="https://surge.sh/" rel="noopener noreferrer"&gt;surge.sh&lt;/a&gt; - normal usage requires the surge NPM module installed, then to be invoked from the exact folder on your system containing the site files within the commandline terminal, but has multiple &lt;a href="https://surge.sh/help/" rel="noopener noreferrer"&gt;alternative deployment guides&lt;/a&gt;. Unlimited free subdomains.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Unknown
&lt;/h3&gt;

&lt;p&gt;These hosts are untested and require providing a publicly visible email and knowledge of github pages custom domain usage:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;yoursite&lt;/em&gt;.&lt;a href="https://js.org/" rel="noopener noreferrer"&gt;js.org&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;yoursite&lt;/em&gt;.&lt;a href="https://github.com/2929-domains" rel="noopener noreferrer"&gt;029290.xyz&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;yoursite&lt;/em&gt;.&lt;a href="https://is-cool.dev/" rel="noopener noreferrer"&gt;is-cool.dev&lt;/a&gt; (also has the following available: *.is-a-fullstack.dev, *.is-local.org, *.is-not-a.dev, *.localplayer.dev, *.open-comm.org)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Blacklist: hosts which prevent free verification
&lt;/h3&gt;

&lt;p&gt;These prevent either creation of or public access to the &lt;em&gt;.well-known&lt;/em&gt; subfolder or the extensionless &lt;em&gt;kicya&lt;/em&gt; file. Additionally they all use cPanel and require upgrading to the paid version before allowing either a custom 404 error page (even overriding any 404.php or .htaccess file you upload with their default one) or a custom TXT DNS record (for the other verification method):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;InfinityFree&lt;/li&gt;
&lt;li&gt;ByetHost&lt;/li&gt;
&lt;li&gt;AwardSpace&lt;/li&gt;
&lt;li&gt;FreeHostingNoAds&lt;/li&gt;
&lt;li&gt;biz.nf&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Once I saw the same cPanel interface as the pattern for this non-free access, I suspect this is a good indicator of any future "free" hosts doing the same.&lt;/p&gt;

&lt;p&gt;Let me know in the comments if you found this post useful, need further clarificaton, or have tested hosts not listed. Good luck!&lt;/p&gt;

</description>
      <category>frontend</category>
      <category>html</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>SVG Spritesheet builder using document fragments</title>
      <dc:creator>Mardeg</dc:creator>
      <pubDate>Thu, 11 Sep 2025 01:36:48 +0000</pubDate>
      <link>https://dev.to/mardeg/svg-spritesheet-builder-using-document-fragments-5h5p</link>
      <guid>https://dev.to/mardeg/svg-spritesheet-builder-using-document-fragments-5h5p</guid>
      <description>&lt;p&gt;This online tool stemmed from webpage authoring where hosts disable the keep-alive HTTP headers forcing a new connection for each resource. A way to combine many arbitrary images in a single SVG file to reduce network overhead was needed, something that did all the necessary positioning and dimension calculating.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://svgspritebuilder.pages.dev/" rel="noopener noreferrer"&gt;SVG Spritesheet Builder&lt;/a&gt; is a simple web app for creating SVG spritesheets from uploaded images, supporting PNG, JPG, SVG, WEBP, and AVIF formats.&lt;/p&gt;

&lt;p&gt;With intuitive drag-and-drop uploading and rearranging, you can easily add your images and choose between custom sizing or preserving original dimensions for pixel-perfect results. The app lets you configure spacing, number of columns, and sprite naming, and generates optimized downloadable SVG spritesheets with clean code all processed client-side for privacy and accessibility.&lt;/p&gt;

&lt;p&gt;The app provides a real-time preview as you build, making it even easier to fine-tune your spritesheet before downloading.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbms8qawtkk7wx17q7s76.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbms8qawtkk7wx17q7s76.png" alt="SVG Spritesheet settings" width="800" height="1456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rather than using background positioning to display each image, the HTML and CSS code to use shows how to reference each image via a fragment identifier in the img() of background-image or src of img tags. But you can also use it as the src of an iframe, or even as the poster attribute of a video.&lt;/p&gt;

&lt;p&gt;Comments with suggestions, and also code contributions are welcome!&lt;br&gt;&lt;br&gt;
&lt;a href="https://github.com/Mardeg/svgspritebuilder" rel="noopener noreferrer"&gt;GitHub repo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tooling</category>
      <category>webdev</category>
      <category>css</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Toggle Dark Mode using DIVLESS Pure CSS</title>
      <dc:creator>Mardeg</dc:creator>
      <pubDate>Thu, 31 Oct 2024 09:56:14 +0000</pubDate>
      <link>https://dev.to/mardeg/toggle-dark-mode-using-divless-pure-css-2nkl</link>
      <guid>https://dev.to/mardeg/toggle-dark-mode-using-divless-pure-css-2nkl</guid>
      <description>&lt;p&gt;Coming from the perspective of having to write .html documentation within a workplace sharepoint environment which disallows javascript by default, I was tasked with "Oh, and add a button to toggle dark mode, thanks!"&lt;/p&gt;

&lt;p&gt;This, on top of "Valid and Accessible Semantic HTML" wording in our policy documents which the boss equates with "Even a single DIV is laziness", made things a bit tricky to say the least.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-color-scheme" rel="noopener noreferrer"&gt;@media (prefers-color-scheme: dark)&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;As a counter-point I suggested instead of a toggle we just style the page to match the light/dark system preference of each user with a media query and &lt;a href="https://dev.to/hreuven/css-easy-dark-mode-320"&gt;light-dark()&lt;/a&gt;. The response was "Okay start with that, but still put the toggle in." Great, I created more work for myself by trying to create less.&lt;/p&gt;

&lt;p&gt;I already noted that I'd need &lt;a href="https://developer.mozilla.org/en-US/docs/Web/CSS/Using_CSS_custom_properties" rel="noopener noreferrer"&gt;CSS variables&lt;/a&gt; and a checkbox input / label method to control Light/Dark mode, but &lt;em&gt;:checked ~ *&lt;/em&gt; would still only affect elements coming after the input, making the background style hard to toggle.&lt;/p&gt;

&lt;p&gt;My first solution was to use a generic DIV positioned absolutely underneath everything, which worked until the boss spotted it and said to get rid of it. The one point of relief is they're fine with modern HTML/CSS being used as long as the compatibility support coverage is over 90% of browsers.&lt;/p&gt;

&lt;h2&gt;
  
  
  :has() to the rescue!
&lt;/h2&gt;

&lt;p&gt;When I first saw this CSS syntax proposed for targeting the parent element back before it was implemented I wasn't sure what it'd be useful for. Now coming across it once more while I searched for solutions I thought, "Why not try it on BODY?"&lt;/p&gt;

&lt;p&gt;It worked immediately and I kicked myself for not trying it sooner! Here's the relevant CSS I ended up with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      * { 
        --tcolor: light-dark(#000,#FFF);
        --bgcolor: light-dark(#FFF,#000);
        --sbgcolor: light-dark(rgba(255,255,255,0.75),rgba(0,0,0,0.75));
        --alink:light-dark(blue,lightblue);
        --avisited:light-dark(purple,#8467D7);
        /* LIGHT mode */
        --lcontent: "DARK";
        --bgimage: linear-gradient(rgba(255,255,255,0.5),rgba(255,255,255,0.5)), url("INSERT_SEASONAL_BACKGROUND");
      }
      body:has(#d:checked), body:has(#d:checked) * { /* DARK mode */
        --tcolor: #FFF;
        --bgcolor: #000;
        --sbgcolor: rgba(0,0,0,0.75);
        --alink: lightblue;
        --avisited: #8467D7;
        --lcontent: "LIGHT";
        --bgimage: linear-gradient(rgba(0,0,0,0.5),rgba(0,0,0,0.5)), url("INSERT_SEASONAL_BACKGROUND");
      }
@media (prefers-color-scheme: dark) {
      * {
        --lcontent: "LIGHT";
        --bgimage: linear-gradient(rgba(0,0,0,0.5),rgba(0,0,0,0.5)), url("INSERT_SEASONAL_BACKGROUND");
      }
      body:has(#d:checked), body:has(#d:checked) * { /* LIGHT mode */
        --tcolor: #000;
        --bgcolor: #FFF;
        --sbgcolor: rgba(255,255,255,0.75);
        --alink:blue;
        --avisited:purple;
        --lcontent: "DARK";
        --bgimage: linear-gradient(rgba(255,255,255,0.5),rgba(255,255,255,0.5)), url("INSERT_SEASONAL_BACKGROUND");
      }
}
      :root {
        color-scheme: light dark;
        background-color:#888;
        font-size:2vh;
        overflow:hidden;
}
      body { /* base element under control of mode */
        color:var(--tcolor); /* match text color to mode */
        background-image:var(--bgimage); /* match opacity overlay to mode */
        background-repeat: no-repeat no-repeat, space no-repeat;
        background-size:auto 100vh;
        margin:-1ex;
      }
      label[for="d"]::after {content: var(--lcontent);} /* DARK or LIGHT text */
      section{ /* main interaction area */
        margin:0 auto;
        background-color:var(--sbgcolor);
        padding:1ex;
        padding-top:0;
        height:fit-content;
        max-height:96.2vh;
        overflow-y:scroll;
        scrollbar-color:rgba(128,128,128,0.5) var(--sbgcolor);
      }
      li:nth-of-type(even){ /* subtle horizontal lines */
        background-color:rgba(128,128,128,0.1);
      }
      summary:hover,summary:focus-visible,a:hover,a:focus-visible { /* match mouseover or     */
        background-color:var(--bgcolor);                            /* keyboard focus to mode */
      }
      a:link {color: var(--alink)}       /* match link     */
      a:visited {color: var(--avisited)} /* colors to mode */
#d {visibility:hidden;position:fixed;top:0;left:0} /* hide checkbox for mode control */

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I did one cheat using rgba(128,128,128,0.5) to keep the SECTION scrollbar-color neutral. The HTML starts with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;body&amp;gt;&amp;lt;input id="d" type="checkbox"&amp;gt;
&amp;lt;header&amp;gt;
  &amp;lt;label for="d" accesskey="m" title="[Alt][Shift]M toggles mode" aria-label="LIGHT/DARK Mode"&amp;gt;&amp;amp;#8203;&amp;lt;/label&amp;gt;
&amp;lt;/header&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The end result (uninhibited by sharepoint) &lt;a href="https://deconfiguration.pages.dev" rel="noopener noreferrer"&gt;looks like this&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;BONUS: &lt;a href="https://validator.schema.org/#url=https%3A%2F%2Fdeconfiguration.pages.dev%2F" rel="noopener noreferrer"&gt;Here's the schema data structure of that page&lt;/a&gt; as added manually using attributes, another task I was given sans-javascript.&lt;/p&gt;

&lt;p&gt;Now I just need to figure out how to trigger those audio sounds without javascript!😅&lt;/p&gt;

&lt;p&gt;Feel free to comment on your own experience working in limited environments, what worked and what didn't!&lt;/p&gt;

</description>
      <category>css</category>
      <category>html</category>
      <category>frontend</category>
    </item>
  </channel>
</rss>
