<?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: uni928</title>
    <description>The latest articles on DEV Community by uni928 (@uni928).</description>
    <link>https://dev.to/uni928</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%2F1769007%2F31d8b973-bff2-4bd9-b0ec-57b51de523cb.png</url>
      <title>DEV Community: uni928</title>
      <link>https://dev.to/uni928</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/uni928"/>
    <language>en</language>
    <item>
      <title>A Simple API Pricing Simulator for Estimating LLM Costs(Free to use)</title>
      <dc:creator>uni928</dc:creator>
      <pubDate>Wed, 23 Sep 2026 03:48:48 +0000</pubDate>
      <link>https://dev.to/uni928/a-simple-api-pricing-simulator-for-estimating-llm-costsfree-to-use-50j4</link>
      <guid>https://dev.to/uni928/a-simple-api-pricing-simulator-for-estimating-llm-costsfree-to-use-50j4</guid>
      <description>&lt;p&gt;When using an AI API, even small differences in input tokens, output tokens, or the number of requests can significantly affect the total cost.&lt;/p&gt;

&lt;p&gt;I created a simple browser-based &lt;strong&gt;API Pricing Simulator&lt;/strong&gt; to make these calculations easier.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs/index14English.html" rel="noopener noreferrer"&gt;https://uni928.github.io/Uni928PublicHTMLs/index14English.html&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Can Calculate
&lt;/h2&gt;

&lt;p&gt;The simulator calculates estimated API costs for multiple models based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Input tokens&lt;/li&gt;
&lt;li&gt;Output tokens, including reasoning tokens&lt;/li&gt;
&lt;li&gt;Number of requests per day&lt;/li&gt;
&lt;li&gt;A specific number of requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The results are divided into three tables:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Cost per Request&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Monthly Cost (30 Days)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cost for a Specific Number of Requests&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The daily and monthly summary also shows the estimated request count, such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1,000 requests/day
30,000 requests / 30 days
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Compare Multiple Models
&lt;/h2&gt;

&lt;p&gt;The tool displays estimated costs for multiple AI models in the same table.&lt;/p&gt;

&lt;p&gt;This makes it easier to compare how much the same workload may cost depending on the model you choose.&lt;/p&gt;

&lt;p&gt;The calculation formula is also displayed, so the result is not just presented as a final number.&lt;/p&gt;

&lt;h2&gt;
  
  
  Share the Same Calculation with a URL
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;Copy URL&lt;/strong&gt; button creates a URL containing the current input values.&lt;/p&gt;

&lt;p&gt;This is useful when you want to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Share a cost estimate with someone else&lt;/li&gt;
&lt;li&gt;Keep a specific calculation for later&lt;/li&gt;
&lt;li&gt;Compare several usage scenarios&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No installation is required. Everything runs directly in the browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;API Pricing Simulator:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs/index14English.html" rel="noopener noreferrer"&gt;https://uni928.github.io/Uni928PublicHTMLs/index14English.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I made this mainly as a small utility for quickly estimating API costs before implementing or scaling an AI-powered feature.&lt;/p&gt;

&lt;h2&gt;
  
  
  For Those Who Want to Review the Code or Prioritize Security
&lt;/h2&gt;

&lt;p&gt;👇 GitHub&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/uni928/Uni928PublicHTMLs/blob/main/index14English.html" rel="noopener noreferrer"&gt;https://github.com/uni928/Uni928PublicHTMLs/blob/main/index14English.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The GitHub source code is available for anyone who would like to inspect it themselves and check whether it contains any malicious or suspicious code.&lt;/p&gt;

&lt;p&gt;While this does not guarantee a comprehensive security review, another option is to provide the code to ChatGPT or a similar AI tool and ask it to check for potentially malicious behavior, suspicious network requests, or other security concerns before running it locally.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>openai</category>
      <category>webdev</category>
      <category>tools</category>
    </item>
    <item>
      <title>Reduce Repeated HTML Traffic~Toward the Ultimate Lightweight Site~(Includes makng site)</title>
      <dc:creator>uni928</dc:creator>
      <pubDate>Thu, 17 Sep 2026 04:45:49 +0000</pubDate>
      <link>https://dev.to/uni928/reduce-repeated-html-traffic-with-indexeddb-a-simple-two-file-approach-26o4</link>
      <guid>https://dev.to/uni928/reduce-repeated-html-traffic-with-indexeddb-a-simple-two-file-approach-26o4</guid>
      <description>&lt;p&gt;When publishing a site that claims to be lightweight, relying entirely on the browser cache may not be ideal if users are expected to open the HTML site repeatedly.&lt;/p&gt;

&lt;p&gt;Because caching is not fully controlled by the site itself, the actual amount of data transferred may be higher than the developer expects.&lt;/p&gt;

&lt;p&gt;As a mechanism that can be controlled by the site, I created a system that &lt;strong&gt;saves the main HTML document to IndexedDB on the first visit and restores it from IndexedDB on subsequent visits&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The browser cache can still provide its usual benefits.&lt;/p&gt;

&lt;p&gt;For a practical implementation, I recommend providing both a regular version and a version designed to reduce traffic on subsequent visits. Most users can use the regular version, while frequent users can be guided to the traffic-reduction version.&lt;/p&gt;

&lt;p&gt;Here is a working sample:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs/index80English3B.html" rel="noopener noreferrer"&gt;https://uni928.github.io/Uni928PublicHTMLs/index80English3B.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/uni928/Uni928PublicHTMLs/blob/main/index80English3B.html" rel="noopener noreferrer"&gt;Github Main&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/uni928/Uni928PublicHTMLs/blob/main/index80English3BBody.html" rel="noopener noreferrer"&gt;Github OneTimeVisit&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I created this by taking &lt;a href="https://uni928.github.io/Uni928PublicHTMLs/index80English3.html" rel="noopener noreferrer"&gt;https://uni928.github.io/Uni928PublicHTMLs/index80English3.html&lt;/a&gt;, making a few minor adjustments, and then applying the process I am introducing here.&lt;/p&gt;

&lt;p&gt;Here is the tool for creating this type of site:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs2/index23MakingEnglish.html" rel="noopener noreferrer"&gt;https://uni928.github.io/Uni928PublicHTMLs2/index23MakingEnglish.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/uni928/Uni928PublicHTMLs2/blob/main/index23MakingEnglish.html" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;The structure consists of two files. The &lt;code&gt;index&lt;/code&gt; portion can be replaced with any filename.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;index.html
indexBody.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The general flow is as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Open index.html
  ↓
Check IndexedDB
  ↓
If saved, restore the HTML from IndexedDB
  ↓
If not saved, navigate to indexBody.html
  ↓
Save the main HTML document to IndexedDB
  ↓
Return to index.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In other words, &lt;strong&gt;the large main HTML document is normally loaded only on the first visit&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;On subsequent visits, the browser loads a lightweight restoration page and displays the main site from IndexedDB stored in the browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  A tool for creating the files
&lt;/h2&gt;

&lt;p&gt;The tool can convert a regular HTML file to this format. Simply drag and drop an HTML file, enter the desired filename, and download the result.&lt;/p&gt;

&lt;p&gt;The tool generates these two files in a ZIP archive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;chosen-name.html
chosen-nameBody.html
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The generated files use the name you specify in place of &lt;code&gt;chosen-name&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Important considerations
&lt;/h2&gt;

&lt;p&gt;IndexedDB is managed per origin, so the two files should generally be hosted on the same domain.&lt;/p&gt;

&lt;p&gt;Even when the main HTML document is restored from IndexedDB, requests for external images, CSS, JavaScript, and other resources will still occur separately.&lt;/p&gt;

&lt;p&gt;For this reason, the approach appears particularly suitable for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sites that are close to a single-HTML structure&lt;/li&gt;
&lt;li&gt;Sites with a relatively large HTML document&lt;/li&gt;
&lt;li&gt;Use cases where the same page is opened repeatedly&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;This approach reduces repeated transfers of the main HTML document by &lt;strong&gt;fetching it only on the first visit and restoring it from IndexedDB thereafter&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Service Workers can also be used for similar purposes. This implementation uses a relatively simple &lt;strong&gt;two-file plus IndexedDB&lt;/strong&gt; structure.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>performance</category>
      <category>indexeddb</category>
    </item>
    <item>
      <title>Share Discord. One-Click Viewing for Recipients, No File Upload Required.(Free to use)</title>
      <dc:creator>uni928</dc:creator>
      <pubDate>Wed, 16 Sep 2026 03:31:22 +0000</pubDate>
      <link>https://dev.to/uni928/share-ai-created-documents-on-discord-in-a-win-win-wayone-click-viewing-for-recipients-no-file-1gej</link>
      <guid>https://dev.to/uni928/share-ai-created-documents-on-discord-in-a-win-win-wayone-click-viewing-for-recipients-no-file-1gej</guid>
      <description>&lt;p&gt;This article introduces a simple document-sharing method that benefits both sides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Recipients can view formatted documents with one click.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The person sharing the document does not need to upload a file.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The process is simple.&lt;/p&gt;

&lt;p&gt;Markdown created with AI is compressed and encoded in Base64, then embedded in a URL. A Discord-ready message is automatically generated in the following format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;View the document&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;URL containing the compressed and Base64-encoded Markdown&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When shared on Discord, the recipient sees only a simple link such as “View the document.”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;By clicking the link, the recipient can view the Markdown as a formatted document, including headings, bold text, bullet points, and other formatting.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can choose from multiple fonts. Disable Japanese fonts if necessary.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs/index80Sample3English3.html" rel="noopener noreferrer"&gt;Sample&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(For illustration only. Actual text use under 1,920 characters and use the &lt;code&gt;[]()&lt;/code&gt; format.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/uni928/Uni928PublicHTMLs/blob/main/index80English3.html" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Share a Document
&lt;/h2&gt;

&lt;p&gt;First, visit the website below. You can use it simply by accessing the site—no login or installation is required.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs/index80English3.html" rel="noopener noreferrer"&gt;https://uni928.github.io/Uni928PublicHTMLs/index80English3.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, ask ChatGPT or another generative AI to create a document in Markdown format.&lt;/p&gt;

&lt;p&gt;For example, you can ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Please create a simple document in Markdown format that can be shared on Discord about [topic].
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Paste the generated Markdown.&lt;/p&gt;

&lt;p&gt;Clicking “Save in URL” creates a Discord-ready link in the following format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;View the document&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;URL containing the compressed and Base64-encoded Markdown&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The generated text is copied to your clipboard.&lt;/p&gt;

&lt;p&gt;You can then paste it directly into Discord.&lt;/p&gt;

&lt;p&gt;Instead of displaying the full, lengthy URL, Discord shows it as a simple link such as “View the document.”&lt;/p&gt;




&lt;h2&gt;
  
  
  Discord Allows You to Give Links a Name
&lt;/h2&gt;

&lt;p&gt;Discord supports Markdown links in the following format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;View the document&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;URL&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;View the document&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;URL containing the compressed and Base64-encoded Markdown&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you post this message, the recipient sees it as a link labeled “View the document.”&lt;/p&gt;

&lt;p&gt;This makes it possible to share even very long URLs with a clean and simple appearance on Discord.&lt;/p&gt;




&lt;h2&gt;
  
  
  Store AI-Generated Markdown Inside a URL
&lt;/h2&gt;

&lt;p&gt;The website introduced in this article compresses the Markdown text, encodes it in Base64, and embeds the resulting data in the URL.&lt;/p&gt;

&lt;p&gt;The sharing process is therefore:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ask ChatGPT or another AI to create a document in Markdown format.&lt;/li&gt;
&lt;li&gt;Paste the Markdown into the website.&lt;/li&gt;
&lt;li&gt;Create a sharing URL.&lt;/li&gt;
&lt;li&gt;Paste the generated message into Discord.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In other words, &lt;strong&gt;you can let someone view a document using only a URL, without creating or uploading a separate Markdown, PDF, or HTML file.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This makes it possible to go from creating a document with ChatGPT to sharing it on Discord with relatively few operations.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fewer Steps Than Conventional Document Sharing
&lt;/h2&gt;

&lt;p&gt;Generative AI tools such as ChatGPT make it easy to create explanations, instruction manuals, and simple reports in Markdown format.&lt;/p&gt;

&lt;p&gt;However, sharing such documents on Discord may sometimes require additional steps, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Saving the content as a Markdown file&lt;/li&gt;
&lt;li&gt;Converting it to HTML or PDF&lt;/li&gt;
&lt;li&gt;Uploading the file to Discord&lt;/li&gt;
&lt;li&gt;Moving it to Google Docs or another document service&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With this method, the Markdown is stored directly inside the URL instead.&lt;/p&gt;

&lt;p&gt;For a simple text-based document, you can share it with a short message such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;Here are the details.

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;View the document&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;URL&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Suitable Use Cases
&lt;/h2&gt;

&lt;p&gt;I find this method particularly useful for the following purposes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple explanatory documents created with AI&lt;/li&gt;
&lt;li&gt;Work instructions&lt;/li&gt;
&lt;li&gt;Explanations of game or community rules&lt;/li&gt;
&lt;li&gt;Sharing development-related information&lt;/li&gt;
&lt;li&gt;Organizing long Discord posts into a more readable format&lt;/li&gt;
&lt;li&gt;Notes that only need to be shared temporarily&lt;/li&gt;
&lt;li&gt;Organizing the results of a discussion with ChatGPT&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compared with posting a long message directly in Discord, this method helps keep the original post short and easy to read.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Use It
&lt;/h2&gt;

&lt;p&gt;The website is available here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs/index80English3.html" rel="noopener noreferrer"&gt;Create a Viewing Page from Markdown&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The basic steps are as follows:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enter a &lt;strong&gt;document title&lt;/strong&gt; and the &lt;strong&gt;Markdown text of the document&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click “Save in URL.”&lt;/li&gt;
&lt;li&gt;If you want to share the document for viewing, click &lt;strong&gt;Copy the “View the document” link for Discord&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Paste the copied text into Discord.&lt;/li&gt;
&lt;li&gt;Discord displays it as a link labeled “View the document.”&lt;/li&gt;
&lt;li&gt;The recipient can view the document simply by clicking the link.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;Because the document text itself is stored inside the URL, you do not need to send a separate document file.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;With this method, the Markdown text itself is compressed, encoded in Base64, and included in the URL.&lt;/p&gt;

&lt;p&gt;Therefore, considering the maximum URL length that can be handled by browsers, Discord, and other services, the compressed and Base64-encoded data embedded in the URL is currently limited to &lt;strong&gt;fewer than 1,920 characters&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Embedding image data as Base64 would make the URL extremely long.&lt;/p&gt;

&lt;p&gt;For this reason, &lt;strong&gt;it is difficult to use image embedding practically when sharing documents through URLs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This method is intended for:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Easily sharing text-based documents created with AI on Discord&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is not intended to replace full-scale online storage or document-sharing services.&lt;/p&gt;

&lt;p&gt;For simple documents that mainly consist of text, however, it can be a convenient option.&lt;/p&gt;

&lt;p&gt;Also, when the document content is changed, you generally need to create a new URL. Therefore, &lt;strong&gt;this method is not suitable for continuously updating the content associated with the same URL.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  For Those Who Want to Check the Code or Prioritize Security
&lt;/h2&gt;

&lt;p&gt;The source code is publicly available on GitHub.&lt;/p&gt;

&lt;p&gt;👇 GitHub&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/uni928/Uni928PublicHTMLs/blob/main/index80English3.html" rel="noopener noreferrer"&gt;https://github.com/uni928/Uni928PublicHTMLs/blob/main/index80English3.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to check whether the code contains suspicious data transmission to external services or malicious code, you can inspect the source code and communication destinations yourself.&lt;/p&gt;

&lt;p&gt;As an additional method, you can download the HTML file, attach it to ChatGPT or another AI service, and ask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Please check whether this HTML contains suspicious data transmission to external services or malicious code.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, an AI-based check alone cannot completely guarantee the safety of the code.&lt;/p&gt;

&lt;p&gt;If you use it for an important purpose, please inspect the code and communication destinations yourself as well.&lt;/p&gt;

&lt;h3&gt;
  
  
  If You Want to Prioritize Security Even Further
&lt;/h3&gt;

&lt;p&gt;If you want to take additional security precautions, you can:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download the HTML file from GitHub.&lt;/li&gt;
&lt;li&gt;Check the code and communication destinations.&lt;/li&gt;
&lt;li&gt;Ask an AI service to perform an additional review if necessary.&lt;/li&gt;
&lt;li&gt;Host the file on your own GitHub Pages or another environment you control.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This approach allows you to use your own copy without worrying about future changes to the code on the original website.&lt;/p&gt;




&lt;h2&gt;
  
  
  You Can Customize It for Your Own Use
&lt;/h2&gt;

&lt;p&gt;Because the HTML source code is publicly available, you can use ChatGPT or another AI service to make changes such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Changing the design&lt;/li&gt;
&lt;li&gt;Removing unnecessary buttons&lt;/li&gt;
&lt;li&gt;Changing the input method&lt;/li&gt;
&lt;li&gt;Adding Discord-related features&lt;/li&gt;
&lt;li&gt;Adding document templates for personal use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Adjusting the tool to suit your own workflow is another option.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you create and publish an even more convenient version, I would be happy to try it, so please let me know.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you publish a modified version based on this repository, please follow the conditions of the MIT License.&lt;/p&gt;

&lt;p&gt;You must include the copyright notice and the MIT License text.&lt;/p&gt;




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

&lt;p&gt;With this method, documents can be shared as follows:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For the person creating and sharing the document&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Create Markdown with AI → Paste it into the website → Paste the generated message into Discord&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;For the person viewing the document&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Click “View the document”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This method is particularly suitable when you want to easily share a simple, text-based document created with AI on Discord.&lt;/p&gt;

&lt;p&gt;👇 The website is available here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs/index80English3.html" rel="noopener noreferrer"&gt;Create a Viewing Page from Markdown&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  For Those Who Want to Review the Code or Prioritize Security
&lt;/h2&gt;

&lt;p&gt;👇 GitHub&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/uni928/Uni928PublicHTMLs/blob/main/index80English3.html" rel="noopener noreferrer"&gt;https://github.com/uni928/Uni928PublicHTMLs/blob/main/index80English3.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The GitHub source code is available for anyone who would like to inspect it themselves and check whether it contains any malicious or suspicious code.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;While this does not guarantee a comprehensive security review, another option is to provide the code to ChatGPT or a similar AI tool and ask it to check for potentially malicious behavior, suspicious network requests, or other security concerns before running it locally.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can also use ChatGPT or similar tools to customize the code to better suit your own needs before using it.&lt;/p&gt;

&lt;p&gt;Whether you customize it or not, another option is to &lt;strong&gt;host it on your own GitHub Pages site or server&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you create an improved or more convenient version and make it publicly available, I would be happy to try it as well.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you publish a modified version based on this repository rather than a completely independent rewrite, please make sure to comply with the terms of the MIT License.&lt;/p&gt;

</description>
      <category>discord</category>
      <category>markdown</category>
      <category>documentation</category>
      <category>fileless</category>
    </item>
    <item>
      <title>Adding a Simple News Feed to a Custom Start Page with RSS.app(Includes a sample)</title>
      <dc:creator>uni928</dc:creator>
      <pubDate>Fri, 11 Sep 2026 04:44:32 +0000</pubDate>
      <link>https://dev.to/uni928/adding-a-simple-news-feed-to-a-custom-start-page-with-rssapp-10n3</link>
      <guid>https://dev.to/uni928/adding-a-simple-news-feed-to-a-custom-start-page-with-rssapp-10n3</guid>
      <description>&lt;p&gt;I recently added a simple news section to a custom browser start page that I am building.&lt;/p&gt;

&lt;p&gt;Demo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs2/index4BEnglish.html" rel="noopener noreferrer"&gt;https://uni928.github.io/Uni928PublicHTMLs2/index4BEnglish.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The page already works as a lightweight start page where shortcuts can be saved and organized into folders.&lt;/p&gt;

&lt;p&gt;This time, I wanted to add one more feature:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A news feed that can be opened only when needed.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I used an RSS widget
&lt;/h2&gt;

&lt;p&gt;At first, I considered retrieving news data myself and building the entire news UI manually.&lt;/p&gt;

&lt;p&gt;However, for a small personal web tool, maintaining news sources, parsing feeds, and creating the display logic adds quite a lot of unnecessary code.&lt;/p&gt;

&lt;p&gt;Instead, I used an RSS.app widget.&lt;/p&gt;

&lt;p&gt;RSS.app provides embeddable widgets for RSS feeds, including list-style news feeds.&lt;/p&gt;

&lt;p&gt;The basic implementation can be very small:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;iframe&lt;/span&gt;
  &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://rss.app/embed/v1/list/YOUR_WIDGET_ID"&lt;/span&gt;
  &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"News feed"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The widget handles the actual feed display, while my page only needs to provide the surrounding UI.&lt;/p&gt;

&lt;h2&gt;
  
  
  Load the news only when the panel is opened
&lt;/h2&gt;

&lt;p&gt;I did not want the news widget to load every time the start page was opened.&lt;/p&gt;

&lt;p&gt;So the iframe is created only when the user opens the News panel for the first time.&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;let&lt;/span&gt; &lt;span class="nx"&gt;newsLoaded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;loadNewsOnce&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newsLoaded&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;newsLoaded&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&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;frame&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;iframe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;className&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;newsFrame&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;News feed&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;eager&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;referrerPolicy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;strict-origin-when-cross-origin&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://rss.app/embed/v1/list/YOUR_WIDGET_ID&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;newsFrameWrap&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps the start page lightweight when I only want to use the search box or shortcuts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Remember whether the news panel was open
&lt;/h2&gt;

&lt;p&gt;The page already uses IndexedDB for its saved data.&lt;/p&gt;

&lt;p&gt;I also store the open/closed state of the news panel.&lt;/p&gt;

&lt;p&gt;Conceptually, it works 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="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;setSetting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;newsPanelOpen&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the page is opened again, the previous state can be restored.&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;wasOpen&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;getSetting&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;newsPanelOpen&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;setNewsOpen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;wasOpen&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a very small detail, but it makes the page feel more like a persistent browser tool rather than a normal temporary web page.&lt;/p&gt;

&lt;h2&gt;
  
  
  The resulting layout
&lt;/h2&gt;

&lt;p&gt;The final page has three main areas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Search&lt;/li&gt;
&lt;li&gt;Saved shortcuts and folders&lt;/li&gt;
&lt;li&gt;An expandable news section&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The news feed is placed at the bottom so it does not interfere with the main purpose of the page.&lt;/p&gt;

&lt;p&gt;It is also displayed as a vertical list rather than a large dashboard.&lt;/p&gt;

&lt;p&gt;For this type of start page, I found a simple list easier to scan.&lt;/p&gt;

&lt;h2&gt;
  
  
  A note about third-party content
&lt;/h2&gt;

&lt;p&gt;The news items displayed inside the widget come from third-party sources.&lt;/p&gt;

&lt;p&gt;The widget is therefore used as an external feed display rather than copying or republishing the full news articles inside the page.&lt;/p&gt;

&lt;p&gt;If you build something similar, it is worth checking the terms of the RSS/widget provider and the rights associated with the feeds you choose to display.&lt;/p&gt;

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

&lt;p&gt;Embedding an RSS widget turned out to be a convenient way to add news to a small static HTML application.&lt;/p&gt;

&lt;p&gt;The main advantage for me was that I could keep the implementation simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Static HTML
    ↓
Expandable news panel
    ↓
RSS.app widget
    ↓
External news sources
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is no need to build a complete news reader just to add a small news section to a start page.&lt;/p&gt;

&lt;p&gt;For small personal tools and prototypes, this approach can be a useful option.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>html</category>
      <category>rss</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Connecting Screen Transitions with Image Preservation and a Circular Mask(Includes a sample)</title>
      <dc:creator>uni928</dc:creator>
      <pubDate>Mon, 31 Aug 2026 05:25:07 +0000</pubDate>
      <link>https://dev.to/uni928/connecting-screen-transitions-with-image-preservation-and-a-circular-mask-41hc</link>
      <guid>https://dev.to/uni928/connecting-screen-transitions-with-image-preservation-and-a-circular-mask-41hc</guid>
      <description>&lt;p&gt;A simple fade transition can sometimes make the connection between the previous screen and the next screen feel weak.&lt;/p&gt;

&lt;p&gt;One way to create a more seamless transition is to temporarily preserve the previous screen as an image, place it over the next screen, and gradually reveal the new screen with a circular mask.&lt;/p&gt;

&lt;p&gt;👇 Sample site&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs/index95English.html" rel="noopener noreferrer"&gt;https://uni928.github.io/Uni928PublicHTMLs/index95English.html&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Basic Flow
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Save the current screen as an image.&lt;/li&gt;
&lt;li&gt;Generate and load the next screen.&lt;/li&gt;
&lt;li&gt;Place the saved image over the entire screen.&lt;/li&gt;
&lt;li&gt;Reveal the next screen in a circular shape centered around the character or another desired position.&lt;/li&gt;
&lt;li&gt;Delete the saved image once the circle has expanded across the entire screen.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Important Implementation Notes
&lt;/h2&gt;

&lt;p&gt;The captured image should be created according to the screen size and must always be discarded after the transition is complete.&lt;/p&gt;

&lt;p&gt;If loading the next screen takes time, this transition can also be used when navigating to a loading screen and again when leaving the loading screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;By preserving the previous screen as an image, displaying the next screen underneath it, and gradually revealing the new screen with a circular mask, you can create an engaging transition without passing through a black screen.&lt;/p&gt;

&lt;p&gt;Once this type of screen transition has been made reusable, it can be applied not only to mazes and games, but also to web pages, settings screens, detail screens, modal windows, and many other interfaces.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>effect</category>
      <category>javascript</category>
      <category>webanimation</category>
    </item>
    <item>
      <title>Share Formatted AI Documents on Discord—One-Click Viewing, No File Uploads</title>
      <dc:creator>uni928</dc:creator>
      <pubDate>Mon, 31 Aug 2026 01:15:46 +0000</pubDate>
      <link>https://dev.to/uni928/how-to-easily-share-ai-generated-documents-on-discord-2163</link>
      <guid>https://dev.to/uni928/how-to-easily-share-ai-generated-documents-on-discord-2163</guid>
      <description>&lt;p&gt;This article introduces a simple way to share AI-generated documents on Discord:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The recipient can open a formatted document with one click&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The sender does not need to upload any files&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The basic idea is simple.&lt;/p&gt;

&lt;p&gt;The tool generates a Discord-ready link like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;View Document&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;URL containing compressed and Base64-encoded Markdown&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Discord, the recipient only sees a clean link such as:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs/index80Sample2English.html" rel="noopener noreferrer"&gt;View Document&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;They can click the link and immediately view the document as a formatted webpage, with Markdown headings, bold text, lists, and other formatting applied.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Try the Example First
&lt;/h2&gt;

&lt;p&gt;I created a sample page that explains how the tool works using the same sharing method.&lt;/p&gt;

&lt;p&gt;👇 View the example here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs/index80Sample2English.html" rel="noopener noreferrer"&gt;https://uni928.github.io/Uni928PublicHTMLs/index80Sample2English.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After reading the instructions, you can use the actual tool here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs/index80English.html" rel="noopener noreferrer"&gt;Create a Shareable Markdown Page&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;p&gt;First, ask ChatGPT or another AI tool to create a document in Markdown format.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Please create a short Markdown document explaining XX for sharing on Discord.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then paste the generated Markdown into:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs/index80English.html" rel="noopener noreferrer"&gt;Create a Shareable Markdown Page&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the "Save as URL" section, you can generate a Discord-ready link in this format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;View Document&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;URL containing compressed and Base64-encoded Markdown&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then simply paste that text into Discord.&lt;/p&gt;

&lt;p&gt;Instead of seeing the full long URL, the recipient sees a clean link like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs/index80Sample2English.html" rel="noopener noreferrer"&gt;View Document&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Discord Lets You Hide Long URLs Behind Link Text
&lt;/h2&gt;

&lt;p&gt;Discord supports Markdown-style links such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;View Document&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;URL&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;View Document&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;https://uni928.github.io/Uni928PublicHTMLs/index80Sample2English.html&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When posted in Discord, the recipient only needs to click the displayed text.&lt;/p&gt;

&lt;p&gt;This means even if the actual URL is very long, the message itself can stay clean and readable.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Markdown Is Stored Inside the URL
&lt;/h2&gt;

&lt;p&gt;This tool compresses the Markdown text, converts it to Base64, and stores the result directly inside the URL.&lt;/p&gt;

&lt;p&gt;The sharing process is therefore:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ask ChatGPT or another AI to create a Markdown document&lt;/li&gt;
&lt;li&gt;Paste the Markdown into the tool&lt;/li&gt;
&lt;li&gt;Generate a shareable URL&lt;/li&gt;
&lt;li&gt;Paste the generated link into Discord&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This means you do not need to separately create and upload a Markdown, HTML, or PDF file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The document itself can be shared through the URL.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Fewer Steps for Simple Document Sharing
&lt;/h2&gt;

&lt;p&gt;When using ChatGPT or other generative AI tools, it is easy to create things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Short guides&lt;/li&gt;
&lt;li&gt;Instructions&lt;/li&gt;
&lt;li&gt;Simple reports&lt;/li&gt;
&lt;li&gt;Explanatory documents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, sharing them on Discord can sometimes require extra steps such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Saving the text as a Markdown file&lt;/li&gt;
&lt;li&gt;Converting it to HTML or PDF&lt;/li&gt;
&lt;li&gt;Uploading the file to Discord&lt;/li&gt;
&lt;li&gt;Moving the content into Google Docs or another service&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With this method, you can instead share something as simple as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;More details here:

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;View Document&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sx"&gt;URL&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This keeps the Discord message short while letting the recipient view the full formatted document separately.&lt;/p&gt;




&lt;h2&gt;
  
  
  Good Use Cases
&lt;/h2&gt;

&lt;p&gt;I find this method particularly useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Short AI-generated guides&lt;/li&gt;
&lt;li&gt;Work instructions&lt;/li&gt;
&lt;li&gt;Rules for games or communities&lt;/li&gt;
&lt;li&gt;Development notes&lt;/li&gt;
&lt;li&gt;Long Discord messages that are easier to read as a separate page&lt;/li&gt;
&lt;li&gt;Temporary notes&lt;/li&gt;
&lt;li&gt;Summaries of ChatGPT discussions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is especially useful when the document is mostly text.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Use the Tool
&lt;/h2&gt;

&lt;p&gt;The actual tool is available here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs/index80English.html" rel="noopener noreferrer"&gt;Create a Shareable Markdown Page&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The basic steps are:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enter a &lt;strong&gt;document title&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Paste your &lt;strong&gt;Markdown content&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save as URL&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click the option to copy the &lt;strong&gt;Discord "View Document" link&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Paste the copied text into Discord&lt;/li&gt;
&lt;li&gt;The recipient clicks &lt;strong&gt;View Document&lt;/strong&gt; to open the formatted page&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;The document data is stored inside the URL itself, so you do not need to send a separate file.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Limitations
&lt;/h2&gt;

&lt;p&gt;This method stores the Markdown content directly inside the URL.&lt;/p&gt;

&lt;p&gt;Because browsers, Discord, and other services have practical URL-length limits, the current version limits the &lt;strong&gt;compressed and Base64-encoded data to under 1,920 characters&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Images are also not well suited to this method.&lt;/p&gt;

&lt;p&gt;Embedding image data directly in the URL can make the URL extremely large, so &lt;strong&gt;this method is primarily intended for text-based documents rather than image-heavy content&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In other words, this is not intended to replace full document hosting or cloud storage services.&lt;/p&gt;

&lt;p&gt;It is designed for a simpler use case:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Quickly sharing AI-generated, text-focused documents on Discord&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For short and medium-sized text documents, it can be a convenient approach.&lt;/p&gt;

&lt;p&gt;Also, because the content is embedded in the URL, editing the document usually means generating a new URL.&lt;/p&gt;

&lt;p&gt;So this method is not ideal when you need to keep updating the same shared URL over time.&lt;/p&gt;




&lt;h2&gt;
  
  
  For Users Who Want to Review the Code
&lt;/h2&gt;

&lt;p&gt;The source code is available on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/uni928/Uni928PublicHTMLs/blob/main/index80English.html" rel="noopener noreferrer"&gt;https://github.com/uni928/Uni928PublicHTMLs/blob/main/index80English.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The sample page in this article uses &lt;code&gt;index80Sample2English.html&lt;/code&gt;, while the actual English version of the tool is &lt;code&gt;index80English.html&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The source is published so users who care about security can review the code and network behavior themselves.&lt;/p&gt;

&lt;p&gt;As an additional check, you can download the HTML and ask ChatGPT or another AI tool something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Please review this HTML file and check whether it contains any suspicious external data transmission or malicious code.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;However, AI review should only be treated as an additional check.&lt;/p&gt;

&lt;p&gt;For important use cases, you should also review the code and network destinations yourself.&lt;/p&gt;




&lt;h2&gt;
  
  
  If You Want More Control
&lt;/h2&gt;

&lt;p&gt;If you want to reduce reliance on the original hosted version, you can also:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download the HTML from GitHub&lt;/li&gt;
&lt;li&gt;Review the code yourself&lt;/li&gt;
&lt;li&gt;Optionally ask an AI tool to review it as well&lt;/li&gt;
&lt;li&gt;Host it on your own GitHub Pages site or another static hosting service&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This way, you do not need to worry about the original hosted version changing later.&lt;/p&gt;




&lt;h2&gt;
  
  
  You Can Also Customize It for Your Own Use
&lt;/h2&gt;

&lt;p&gt;Because the HTML is public, you can modify it with ChatGPT or another coding assistant.&lt;/p&gt;

&lt;p&gt;For example, you could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Change the design&lt;/li&gt;
&lt;li&gt;Remove unnecessary buttons&lt;/li&gt;
&lt;li&gt;Change the input workflow&lt;/li&gt;
&lt;li&gt;Add Discord-specific features&lt;/li&gt;
&lt;li&gt;Add your own document templates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Customizing the tool for your own workflow may make it even more useful.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you create and publish an improved version, I would be happy to hear about it and try it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you publish a modified version based on this repository, please follow the MIT License terms.&lt;/p&gt;

&lt;p&gt;You must include the required copyright notice and MIT License text.&lt;/p&gt;




&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;With this method, the sender's workflow is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Create Markdown with AI → Paste it into the tool → Paste the generated link into Discord&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The recipient's workflow is even simpler:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Click "View Document"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This approach works particularly well when you want to &lt;strong&gt;share simple, AI-generated, text-based documents on Discord without uploading files&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;👇 View the sample instructions:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs/index80Sample2English.html" rel="noopener noreferrer"&gt;https://uni928.github.io/Uni928PublicHTMLs/index80Sample2English.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>chatgpt</category>
      <category>gemini</category>
      <category>claude</category>
    </item>
    <item>
      <title>A Small Solution to the Problem of HTML Files Created with ChatGPT Growing Larger with Every Revision(Free to use)</title>
      <dc:creator>uni928</dc:creator>
      <pubDate>Wed, 26 Aug 2026 05:23:25 +0000</pubDate>
      <link>https://dev.to/uni928/a-small-solution-to-the-problem-of-html-files-created-with-chatgpt-growing-larger-with-every-56m8</link>
      <guid>https://dev.to/uni928/a-small-solution-to-the-problem-of-html-files-created-with-chatgpt-growing-larger-with-every-56m8</guid>
      <description>&lt;p&gt;When you ask ChatGPT to create an HTML site, the code can gradually grow larger as you continue making revisions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Existing HTML minification tools are excellent for reducing file size. However, relatively few are designed with ChatGPT-based analysis and re-editing in mind, which makes them less suitable for this kind of workflow.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is why I created a tool that can minify HTML while keeping it as easy as possible for ChatGPT to analyze.&lt;/p&gt;

&lt;p&gt;In this article, I will refer to “minification” as “cleanup” for convenience.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Cleanup is intended to slightly reduce file size and token usage when repeatedly making revisions.&lt;/p&gt;

&lt;p&gt;Compression is intended to reduce file size when sharing HTML in a chat, assuming the recipient only needs to open the file and does not need to edit it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;※Because the cleanup process is performed mechanically, there is no guarantee that it will never introduce bugs. Always check that the HTML works correctly after cleanup.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👇 Try the site here&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs2/index2English.html" rel="noopener noreferrer"&gt;https://uni928.github.io/Uni928PublicHTMLs2/index2English.html&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;p&gt;This tool has three modes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Safe&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Compresses the file without modifying the contents of the HTML, CSS, or JavaScript.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Experimental&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cleans up consecutive whitespace, comments, and similar elements before compressing the file. This mode is suitable when sharing HTML in a chat and you believe the recipient is unlikely to read the source code directly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Clean Only&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only cleans up consecutive whitespace, comments, and similar elements, then saves the result as a regular HTML file without self-extracting compression. This mode is recommended when publishing the file on a web server.&lt;/p&gt;

&lt;p&gt;There are many third-party tools that can achieve more aggressive cleanup. However, this tool prioritizes &lt;strong&gt;keeping the HTML as easy as possible for ChatGPT to analyze while minimizing its impact on reasoning&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  It Can Also Be Used in Conversations with ChatGPT
&lt;/h2&gt;

&lt;p&gt;When you repeatedly ask ChatGPT to revise an HTML file, its size tends to grow because of comments, whitespace, and newly added code.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;With this tool, the parts that are cleaned up can often achieve a &lt;strong&gt;perceptible file-size reduction of around 15%&lt;/strong&gt;, depending on the HTML.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Code generated by ChatGPT is often relatively readable and well structured to begin with.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you only reduce unnecessary whitespace and comments, most of the actual code remains unchanged. Therefore, I believe the impact on reasoning is also relatively small.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For these reasons, when passing the HTML to ChatGPT again, this tool is expected to provide the following benefit:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Slightly reduce input/output token usage while keeping the impact on reasoning relatively small.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The reduction in output applies when asking ChatGPT to generate the entire revised HTML file.&lt;/p&gt;

&lt;p&gt;This does not necessarily apply when asking it to generate only part of the file.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I have added the following prompt to my ChatGPT custom instructions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- Don't reformat minified HTML.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Choose a Mode Based on Your Use Case
&lt;/h2&gt;

&lt;p&gt;If you are only sharing an HTML file in a chat and the recipient probably does not need to read its contents directly, you can use &lt;strong&gt;Experimental&lt;/strong&gt; mode to reduce the file size further.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;On the other hand, when distributing a file through a web server, compression such as gzip or Brotli is often performed automatically. For that reason, self-extracting compression is generally not recommended.&lt;/p&gt;

&lt;p&gt;In such cases, I recommend using &lt;strong&gt;Clean Only&lt;/strong&gt; to reduce the size of the HTML itself before publishing it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You only need to drag and drop the file, so if you frequently create and revise HTML with ChatGPT, please give it a try.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👇 Try the site here&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs2/index2English.html" rel="noopener noreferrer"&gt;https://uni928.github.io/Uni928PublicHTMLs2/index2English.html&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  For Those Who Want to See the Code
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;👇 GitHub&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://github.com/uni928/Uni928PublicHTMLs2/blob/main/index2English.html" rel="noopener noreferrer"&gt;https://github.com/uni928/Uni928PublicHTMLs2/blob/main/index2English.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The GitHub URL is provided for anyone who wants to visually inspect the source code and check for potentially malicious code.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Although it is not possible to perform a completely exhaustive review, another useful approach is to download the file, attach the code to ChatGPT, ask it to check for potentially malicious code, and then use it locally.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I also recommend using ChatGPT or similar tools to tune the site so that it works better for your own needs.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you create a more convenient site, I would be happy to use it as well, so I would appreciate it if you made it publicly available.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you publish a modified version of this repository rather than rebuilding it completely from scratch, please follow the terms of the MIT License when distributing it. This includes retaining the copyright notice and the MIT License text.&lt;/p&gt;

</description>
      <category>chatgpt</category>
      <category>ai</category>
      <category>javascript</category>
      <category>html</category>
    </item>
    <item>
      <title>Make Basic HTML Analysis More Difficult</title>
      <dc:creator>uni928</dc:creator>
      <pubDate>Fri, 21 Aug 2026 01:14:10 +0000</pubDate>
      <link>https://dev.to/uni928/make-basic-html-analysis-more-difficult-372e</link>
      <guid>https://dev.to/uni928/make-basic-html-analysis-more-difficult-372e</guid>
      <description>&lt;p&gt;This plugin makes saving the page with “Save As” and analyzing it through Developer Tools more difficult.&lt;/p&gt;

&lt;p&gt;The page is displayed using a Blob URL, so “View Source” is also unavailable. This reduces the number of simple ways to inspect the source. However, some APIs may not work because the page uses a Blob URL.&lt;/p&gt;

&lt;p&gt;Add the following script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://uni928.github.io/Uni928PublicHTMLs/Plugin/plugin8.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sample:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs/index88_sample2.html" rel="noopener noreferrer"&gt;https://uni928.github.io/Uni928PublicHTMLs/index88_sample2.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is not a complete security measure, but it can make casual analysis more difficult.&lt;/p&gt;

&lt;p&gt;👇Github&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/uni928/Uni928PublicHTMLs/blob/main/index88_sample2.html" rel="noopener noreferrer"&gt;https://github.com/uni928/Uni928PublicHTMLs/blob/main/index88_sample2.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/uni928/Uni928PublicHTMLs/blob/main/Plugin/plugin8.js" rel="noopener noreferrer"&gt;https://github.com/uni928/Uni928PublicHTMLs/blob/main/Plugin/plugin8.js&lt;/a&gt;&lt;/p&gt;

</description>
      <category>html</category>
      <category>javascript</category>
      <category>analytics</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Back Up Your ChatGPT Conversations as Easy-to-Read HTML</title>
      <dc:creator>uni928</dc:creator>
      <pubDate>Wed, 19 Aug 2026 05:54:52 +0000</pubDate>
      <link>https://dev.to/uni928/back-up-your-chatgpt-conversations-as-easy-to-read-html-82b</link>
      <guid>https://dev.to/uni928/back-up-your-chatgpt-conversations-as-easy-to-read-html-82b</guid>
      <description>&lt;p&gt;I created a tool that lets you load a saved ChatGPT HTML file and &lt;strong&gt;convert the conversation into a cleaner, easier-to-read HTML page&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: This tool does &lt;strong&gt;not&lt;/strong&gt; create an HTML file that can be imported back into ChatGPT. It only generates an HTML file for easier viewing.&lt;/p&gt;

&lt;p&gt;Note: The tool is designed for the current HTML format saved by ChatGPT. It may stop working if ChatGPT changes the structure of its saved HTML pages.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Try the Tool
&lt;/h2&gt;

&lt;p&gt;You can use it directly in your browser:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs2/index6English.html" rel="noopener noreferrer"&gt;https://uni928.github.io/Uni928PublicHTMLs2/index6English.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No installation is required.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Use It
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open the conversation you want to save in the browser version of ChatGPT.&lt;/li&gt;
&lt;li&gt;Right-click the page and select &lt;strong&gt;“Save As…”&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Drag and drop the saved HTML file into the tool.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;“Download HTML”&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s it.&lt;/p&gt;

&lt;p&gt;The tool will generate a new HTML file with the conversation organized into a much more readable format.&lt;/p&gt;

&lt;h2&gt;
  
  
  Main Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Organizes messages from you and ChatGPT into a conversation-style layout&lt;/li&gt;
&lt;li&gt;Can generate the page with &lt;strong&gt;ChatGPT responses collapsed by default&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;ChatGPT responses can be expanded and collapsed by clicking them&lt;/li&gt;
&lt;li&gt;Reformats tables to make them easier to read&lt;/li&gt;
&lt;li&gt;Displays code blocks, headings, lists, and other content in a cleaner format&lt;/li&gt;
&lt;li&gt;The generated page is also a single HTML file, making it easy to save or share&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is especially useful for long conversations.&lt;/p&gt;

&lt;p&gt;By keeping ChatGPT responses collapsed by default, you can quickly look through your previous questions and find the part of the conversation you want to review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Notes
&lt;/h2&gt;

&lt;p&gt;I made this tool for situations where you want to &lt;strong&gt;look back at a previous ChatGPT conversation later, almost like reading reference material or notes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Feel free to give it a try:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs2/index6English.html" rel="noopener noreferrer"&gt;https://uni928.github.io/Uni928PublicHTMLs2/index6English.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>chatgpt</category>
      <category>ai</category>
      <category>webdev</category>
      <category>local</category>
    </item>
    <item>
      <title>Turn Markdown into a Readable, Re-Editable HTML File(Free to use)</title>
      <dc:creator>uni928</dc:creator>
      <pubDate>Fri, 24 Jul 2026 03:55:54 +0000</pubDate>
      <link>https://dev.to/uni928/turn-markdown-into-a-readable-re-editable-html-file-3g64</link>
      <guid>https://dev.to/uni928/turn-markdown-into-a-readable-re-editable-html-file-3g64</guid>
      <description>&lt;p&gt;I built a simple browser-based tool that converts Markdown into a clean, readable HTML file.&lt;/p&gt;

&lt;p&gt;You can use it immediately by visiting the following page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs/index80English4.html" rel="noopener noreferrer"&gt;https://uni928.github.io/Uni928PublicHTMLs/index80English4.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The version that saves the site content to IndexedDB to reduce data usage from the second visit onward is available at the URL below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs/index80English4B.html" rel="noopener noreferrer"&gt;https://uni928.github.io/Uni928PublicHTMLs/index80English4B.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No installation, account registration, or development environment is required.&lt;/p&gt;

&lt;p&gt;You can choose from multiple fonts. Disable Japanese fonts if necessary.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs/index80Sample3English3.html" rel="noopener noreferrer"&gt;Sample&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Tool Does
&lt;/h2&gt;

&lt;p&gt;Write or paste Markdown into the editor, add an optional page title, and save the result as a standalone HTML file.&lt;/p&gt;

&lt;p&gt;For example, you can enter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;## Completed&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Fixed the login screen
&lt;span class="p"&gt;-&lt;/span&gt; Corrected a layout issue

&lt;span class="gu"&gt;## Under Review&lt;/span&gt;
&lt;span class="p"&gt;
-&lt;/span&gt; Mobile browser behavior
&lt;span class="p"&gt;-&lt;/span&gt; Final accessibility checks
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The tool converts this content into a visually organized page that can be opened directly in a web browser.&lt;/p&gt;

&lt;p&gt;The downloaded file contains everything required to display the document, so you do not need a separate Markdown viewer.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Saved HTML Can Be Edited Again
&lt;/h2&gt;

&lt;p&gt;One useful difference from a typical Markdown-to-HTML converter is that the generated file is not limited to viewing.&lt;/p&gt;

&lt;p&gt;When you open the saved HTML file, you can return to the editing screen, update the title or Markdown content, and save a new version.&lt;/p&gt;

&lt;p&gt;This makes the file useful as a small self-contained document rather than a one-time export.&lt;/p&gt;

&lt;p&gt;A simple workflow might look like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a report in Markdown.&lt;/li&gt;
&lt;li&gt;Save it as an HTML file.&lt;/li&gt;
&lt;li&gt;Place it in a shared folder.&lt;/li&gt;
&lt;li&gt;Open the same file later.&lt;/li&gt;
&lt;li&gt;Edit the original Markdown.&lt;/li&gt;
&lt;li&gt;Save the updated version.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You do not need to keep a separate Markdown source file unless you want to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful for Shared Folders
&lt;/h2&gt;

&lt;p&gt;The generated HTML file can be placed in a shared team folder, cloud storage folder, USB drive, or local project directory.&lt;/p&gt;

&lt;p&gt;Other people can read it simply by opening the file in a browser.&lt;/p&gt;

&lt;p&gt;This can be useful because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no document-viewing application is required&lt;/li&gt;
&lt;li&gt;the result is easier to read than a plain text file&lt;/li&gt;
&lt;li&gt;the content can still be updated using Markdown&lt;/li&gt;
&lt;li&gt;only one HTML file needs to be shared&lt;/li&gt;
&lt;li&gt;links, headings, lists, tables, quotes, and code blocks can be displayed clearly&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Possible Use Cases
&lt;/h2&gt;

&lt;p&gt;The tool is suitable for lightweight documents such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;work reports&lt;/li&gt;
&lt;li&gt;project status pages&lt;/li&gt;
&lt;li&gt;meeting notes&lt;/li&gt;
&lt;li&gt;checklists&lt;/li&gt;
&lt;li&gt;setup instructions&lt;/li&gt;
&lt;li&gt;internal manuals&lt;/li&gt;
&lt;li&gt;reference link collections&lt;/li&gt;
&lt;li&gt;handover documents&lt;/li&gt;
&lt;li&gt;personal notes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is especially useful when a full document management system would be excessive, but a plain text file would be difficult to read.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Use It
&lt;/h2&gt;

&lt;p&gt;Open the tool:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs/index80English4.html" rel="noopener noreferrer"&gt;https://uni928.github.io/Uni928PublicHTMLs/index80English4.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Enter a page title.&lt;/li&gt;
&lt;li&gt;Write or paste your Markdown.&lt;/li&gt;
&lt;li&gt;Preview the formatted page in the browser.&lt;/li&gt;
&lt;li&gt;Save it as a readable HTML file.&lt;/li&gt;
&lt;li&gt;Reopen the saved file whenever you need to view or edit it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The generated file can start either in viewing mode or editing mode, depending on the save option you choose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Supported Markdown Elements
&lt;/h2&gt;

&lt;p&gt;The tool supports commonly used Markdown formatting, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;headings&lt;/li&gt;
&lt;li&gt;bold and italic text&lt;/li&gt;
&lt;li&gt;ordered and unordered lists&lt;/li&gt;
&lt;li&gt;task lists&lt;/li&gt;
&lt;li&gt;blockquotes&lt;/li&gt;
&lt;li&gt;links&lt;/li&gt;
&lt;li&gt;images&lt;/li&gt;
&lt;li&gt;horizontal rules&lt;/li&gt;
&lt;li&gt;code blocks&lt;/li&gt;
&lt;li&gt;inline code&lt;/li&gt;
&lt;li&gt;tables&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is not to replace a full Markdown publishing system, but to make everyday Markdown documents easy to read and share.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;This tool provides a simple middle ground between a plain Markdown file and a full document platform.&lt;/p&gt;

&lt;p&gt;You can write in Markdown, export the content as a readable standalone HTML page, share it as a single file, and edit the same file again later.&lt;/p&gt;

&lt;p&gt;Try it here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs/index80English4.html" rel="noopener noreferrer"&gt;https://uni928.github.io/Uni928PublicHTMLs/index80English4.html&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  For Those Who Want to Review the Code or Prioritize Security
&lt;/h2&gt;

&lt;p&gt;👇 GitHub&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/uni928/Uni928PublicHTMLs/blob/main/index80English4.html" rel="noopener noreferrer"&gt;https://github.com/uni928/Uni928PublicHTMLs/blob/main/index80English4.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The GitHub source code is available for anyone who would like to inspect it themselves and check whether it contains any malicious or suspicious code.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;While this does not guarantee a comprehensive security review, another option is to provide the code to ChatGPT or a similar AI tool and ask it to check for potentially malicious behavior, suspicious network requests, or other security concerns before running it locally.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can also use ChatGPT or similar tools to customize the code to better suit your own needs before using it.&lt;/p&gt;

&lt;p&gt;Whether you customize it or not, another option is to &lt;strong&gt;host it on your own GitHub Pages site or server&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If you create an improved or more convenient version and make it publicly available, I would be happy to try it as well.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you publish a modified version based on this repository rather than a completely independent rewrite, please make sure to comply with the terms of the MIT License.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>html</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>A Button Showcase with One-Click HTML Copy</title>
      <dc:creator>uni928</dc:creator>
      <pubDate>Fri, 24 Jul 2026 03:40:59 +0000</pubDate>
      <link>https://dev.to/uni928/a-button-showcase-with-one-click-html-copy-5gi7</link>
      <guid>https://dev.to/uni928/a-button-showcase-with-one-click-html-copy-5gi7</guid>
      <description>&lt;p&gt;When building a website, choosing a button design can take more time than expected.&lt;/p&gt;

&lt;p&gt;You may want something simple, soft, colorful, dark, outlined, or slightly unusual—but comparing many styles usually means repeatedly editing CSS and refreshing the page.&lt;/p&gt;

&lt;p&gt;To make that process easier, I created a browser-based button showcase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Online
&lt;/h2&gt;

&lt;p&gt;You can use it directly from the following page:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs/index78.html" rel="noopener noreferrer"&gt;https://uni928.github.io/Uni928PublicHTMLs/index78.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There is nothing to install. Open the page, browse the available designs, and choose a button you like.&lt;/p&gt;

&lt;h2&gt;
  
  
  Many Button Styles in One Place
&lt;/h2&gt;

&lt;p&gt;The page includes a wide range of button designs, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Light and subtle buttons&lt;/li&gt;
&lt;li&gt;Solid-color buttons&lt;/li&gt;
&lt;li&gt;Dark buttons&lt;/li&gt;
&lt;li&gt;Gradient buttons&lt;/li&gt;
&lt;li&gt;Outline buttons&lt;/li&gt;
&lt;li&gt;Rounded and pill-shaped buttons&lt;/li&gt;
&lt;li&gt;Buttons with icons&lt;/li&gt;
&lt;li&gt;More experimental designs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The buttons are displayed as actual interactive elements, so you can compare their hover, focus, and pressed states directly in the browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Click a Button to Copy It
&lt;/h2&gt;

&lt;p&gt;The main feature of this tool is its copy workflow.&lt;/p&gt;

&lt;p&gt;Clicking a button copies a minimal HTML example for that design. This makes it easier to take only the button you need instead of copying the entire showcase page.&lt;/p&gt;

&lt;p&gt;The generated example includes the necessary HTML and CSS, so it can be pasted into a new file and tested immediately.&lt;/p&gt;

&lt;h2&gt;
  
  
  Copy Features for Faster Comparison
&lt;/h2&gt;

&lt;p&gt;The site also includes additional copy-related features to make browsing a large number of designs more convenient.&lt;/p&gt;

&lt;p&gt;You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copy a button directly by clicking it&lt;/li&gt;
&lt;li&gt;Review the generated code&lt;/li&gt;
&lt;li&gt;Copy frequently used button types from the quick-copy panel&lt;/li&gt;
&lt;li&gt;Receive visual feedback after a successful copy&lt;/li&gt;
&lt;li&gt;Use copied examples as standalone HTML files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is especially useful when you want to compare several designs before deciding which one to use in a project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful for Prototypes and Small Projects
&lt;/h2&gt;

&lt;p&gt;This tool is intended for situations where you need a usable button quickly, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating a prototype&lt;/li&gt;
&lt;li&gt;Building a small static website&lt;/li&gt;
&lt;li&gt;Testing a landing page design&lt;/li&gt;
&lt;li&gt;Comparing color combinations&lt;/li&gt;
&lt;li&gt;Looking for CSS design ideas&lt;/li&gt;
&lt;li&gt;Preparing a GitHub Pages project&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The copied code can also be used as a starting point and customized for your own interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This is not a complete UI framework. It is a practical collection of button ideas with a copy-focused workflow.&lt;/p&gt;

&lt;p&gt;Rather than searching through documentation or manually rebuilding a design, you can open the page, choose a button, and copy a small working example.&lt;/p&gt;

&lt;p&gt;Try it here:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://uni928.github.io/Uni928PublicHTMLs/index78.html" rel="noopener noreferrer"&gt;https://uni928.github.io/Uni928PublicHTMLs/index78.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>html</category>
      <category>css</category>
    </item>
    <item>
      <title>Practical baseline safeguards for ChatGPT-powered services</title>
      <dc:creator>uni928</dc:creator>
      <pubDate>Fri, 13 Feb 2026 04:21:16 +0000</pubDate>
      <link>https://dev.to/uni928/practical-baseline-safeguards-for-chatgpt-powered-services-efd</link>
      <guid>https://dev.to/uni928/practical-baseline-safeguards-for-chatgpt-powered-services-efd</guid>
      <description>&lt;p&gt;Practical baseline safeguards for ChatGPT-powered services&lt;/p&gt;

&lt;p&gt;When building an application using the OpenAI API, it is tempting to ship as soon as “it works.”&lt;br&gt;
However, insufficient safeguards often lead to &lt;strong&gt;API key leakage&lt;/strong&gt;, &lt;strong&gt;unexpected traffic spikes&lt;/strong&gt;, and ultimately &lt;strong&gt;serious billing incidents&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This article summarizes &lt;strong&gt;practical, lightweight protections&lt;/strong&gt; that are especially relevant for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;personal projects&lt;/li&gt;
&lt;li&gt;internal tools&lt;/li&gt;
&lt;li&gt;early-stage prototypes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are &lt;strong&gt;not universal requirements&lt;/strong&gt;.&lt;br&gt;
What counts as a “baseline” depends heavily on your threat model, user anonymity, billing model, and scale.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A common but underestimated risk&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One frequently overlooked risk is &lt;strong&gt;direct access to your backend API endpoints&lt;/strong&gt;, bypassing the UI entirely.&lt;/p&gt;

&lt;p&gt;In practice, incidents may also be caused by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;abuse by authenticated users&lt;/li&gt;
&lt;li&gt;bugs or retry loops&lt;/li&gt;
&lt;li&gt;misconfigured proxies or shared environments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, direct scripted access to your backend is a &lt;strong&gt;very common failure mode&lt;/strong&gt;, especially when no safeguards exist.&lt;/p&gt;

&lt;p&gt;If an attacker can replay the exact same request your frontend sends, they can often exhaust your usage limits in minutes.&lt;/p&gt;

&lt;p&gt;This article therefore focuses primarily on &lt;strong&gt;protecting your backend (Workers / server)&lt;/strong&gt; rather than the UI.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Never call the OpenAI API directly from the client&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your frontend should &lt;strong&gt;never&lt;/strong&gt; call the OpenAI API directly.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;API keys embedded in browsers or apps will leak&lt;/li&gt;
&lt;li&gt;DevTools, network inspection, and modified requests make this trivial&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recommended architecture&lt;/p&gt;

&lt;p&gt;Client → Your backend (Workers / server)&lt;br&gt;
Backend → OpenAI API&lt;/p&gt;

&lt;p&gt;The client receives only the processed result.&lt;/p&gt;

&lt;p&gt;This allows you to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;keep API keys secret&lt;/li&gt;
&lt;li&gt;validate and throttle requests&lt;/li&gt;
&lt;li&gt;support streaming safely&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OpenAI explicitly recommends this approach in its official documentation.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Always implement rate limiting&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Rate limiting is essential, even for small projects.&lt;/p&gt;

&lt;p&gt;Typical limits include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;per 5 minutes&lt;/li&gt;
&lt;li&gt;per hour&lt;/li&gt;
&lt;li&gt;per day&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Implementation can be simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;store a counter&lt;/li&gt;
&lt;li&gt;store the start time of the window&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cloudflare Workers with KV, Durable Objects, or D1 make this straightforward using IPs, user IDs, or session identifiers.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Lightweight one-time tokens (with clear limitations)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;To discourage trivial scripted abuse, you may introduce &lt;strong&gt;short-lived request tokens&lt;/strong&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;embed an encrypted timestamp&lt;/li&gt;
&lt;li&gt;validate that it was generated recently (e.g., within 10 seconds)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ Important limitations&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is &lt;strong&gt;not cryptographically strong authentication&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;This does &lt;strong&gt;not fully prevent replay within the valid window&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;This must &lt;strong&gt;never replace proper authentication&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of this as &lt;strong&gt;friction&lt;/strong&gt;, not security.&lt;/p&gt;

&lt;p&gt;It is useful against:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;naive replay scripts&lt;/li&gt;
&lt;li&gt;casual scraping&lt;/li&gt;
&lt;li&gt;low-effort abuse&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is &lt;strong&gt;not sufficient&lt;/strong&gt; against a determined attacker.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Review auto-recharge and billing assumptions carefully&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Billing incidents are often underestimated.&lt;/p&gt;

&lt;p&gt;There are real-world reports of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;usage continuing briefly after limits were reached&lt;/li&gt;
&lt;li&gt;negative balances appearing despite prepaid setups&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Budget limits should be treated as &lt;strong&gt;operational safeguards&lt;/strong&gt;, not hard guarantees.&lt;/p&gt;

&lt;p&gt;For small projects, consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;disabling auto-recharge&lt;/li&gt;
&lt;li&gt;keeping balances low&lt;/li&gt;
&lt;li&gt;adding monitoring and alerts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Using a &lt;strong&gt;dedicated debit card with a low limit&lt;/strong&gt; can further cap worst-case damage.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Production services require real authentication&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The measures above are suitable for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;prototypes&lt;/li&gt;
&lt;li&gt;internal tools&lt;/li&gt;
&lt;li&gt;anonymous experiments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For real services, you will need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OAuth or equivalent authentication&lt;/li&gt;
&lt;li&gt;session and token management&lt;/li&gt;
&lt;li&gt;per-user quotas and permissions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;IP-based checks alone are insufficient, as client-side values can be forged.&lt;/p&gt;

&lt;p&gt;Defense must be layered: authentication, rate limits, quotas, and monitoring.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Never let the client choose the model&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Model selection directly affects cost.&lt;/p&gt;

&lt;p&gt;Best practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fix allowed models on the server&lt;/li&gt;
&lt;li&gt;reject anything outside a strict allowlist&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Do not rely on obscurity or “confusion” tactics.&lt;br&gt;
Clear validation and rejection are safer, simpler, and easier to operate.&lt;/p&gt;

&lt;p&gt;Conclusion&lt;/p&gt;

&lt;p&gt;For small-scale ChatGPT-powered services, the following baseline practices already eliminate many real-world incidents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;keep API keys on the server&lt;/li&gt;
&lt;li&gt;enforce rate limits&lt;/li&gt;
&lt;li&gt;treat billing controls realistically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These measures will not make your system unbreakable — but they &lt;strong&gt;raise the cost of abuse enough&lt;/strong&gt; that most attackers move on to easier targets.&lt;/p&gt;

&lt;p&gt;Security is not about perfect defenses, but about &lt;strong&gt;making misuse inconvenient and uneconomical&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Original Japanese article (source of revision): &lt;a href="https://qiita.com/uni928/items/061432019b316e418902" rel="noopener noreferrer"&gt;https://qiita.com/uni928/items/061432019b316e418902&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>programming</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
