<?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: ludy.dev</title>
    <description>The latest articles on DEV Community by ludy.dev (@lyyluca).</description>
    <link>https://dev.to/lyyluca</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%2F3749447%2F916d0753-f6e8-4be4-9608-6ef818f69843.jpg</url>
      <title>DEV Community: ludy.dev</title>
      <link>https://dev.to/lyyluca</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lyyluca"/>
    <language>en</language>
    <item>
      <title>Building an AI Photo Enhancer Around a Verifiable Output</title>
      <dc:creator>ludy.dev</dc:creator>
      <pubDate>Tue, 22 Sep 2026 08:38:21 +0000</pubDate>
      <link>https://dev.to/lyyluca/building-an-ai-photo-enhancer-around-a-verifiable-output-14b2</link>
      <guid>https://dev.to/lyyluca/building-an-ai-photo-enhancer-around-a-verifiable-output-14b2</guid>
      <description>&lt;p&gt;I’m Ludy, and I built &lt;a href="https://uplenz.io/" rel="noopener noreferrer"&gt;Uplenz&lt;/a&gt;, a web utility for enhancing photos with AI, comparing details, and downloading a PNG.&lt;/p&gt;

&lt;p&gt;The product scope is intentionally small. The interesting engineering discussion isn’t "how many editing controls can fit on a page?" It’s "how do you help someone evaluate a generated result without hiding the constraints?"&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with the processing contract
&lt;/h2&gt;

&lt;p&gt;At the product level, the flow is an input image, an AI enhancement operation, a comparison step, and a PNG download.&lt;/p&gt;

&lt;p&gt;That sounds simple, but each boundary deserves a clear contract. An accepted image isn’t the same as a completed edit. A completed edit isn’t the same as a successful download. And an unavailable processing slot shouldn’t look like a broken upload.&lt;/p&gt;

&lt;p&gt;Those distinctions are the foundation I’d use to review any implementation of this workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stack choices versus observable behavior
&lt;/h2&gt;

&lt;p&gt;The underlying framework, inference provider, hosting setup, and storage implementation aren’t detailed in this launch post. I don’t want to turn an architecture discussion into an invented stack diagram.&lt;/p&gt;

&lt;p&gt;What is observable is the browser-based workflow and the AI enhancement step. For a technical review, I’d separate image input, processing orchestration, result presentation, and export into distinct responsibilities, regardless of the specific libraries involved.&lt;/p&gt;

&lt;p&gt;That separation makes it easier to reason about failures without coupling every UI state to one long request.&lt;/p&gt;

&lt;h2&gt;
  
  
  No signup still needs resource boundaries
&lt;/h2&gt;

&lt;p&gt;Uplenz requires no signup and offers up to three shared free AI edits daily, subject to capacity.&lt;/p&gt;

&lt;p&gt;That makes capacity communication a core interface concern. "Free" doesn’t mean computation has no cost, and anonymous access doesn’t remove the need for resource controls.&lt;/p&gt;

&lt;p&gt;A useful design review would ask when availability is checked, how a failed attempt is explained, and whether the interface makes it obvious when someone should retry. Those are architectural questions as much as copywriting questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The output needs inspection
&lt;/h2&gt;

&lt;p&gt;AI enhancement can create convincing artifacts. A comparison experience should help users notice those changes rather than just celebrate a more dramatic image.&lt;/p&gt;

&lt;p&gt;I’m especially interested in feedback on comparing fine textures, evaluating faces, and making the download step unambiguous.&lt;/p&gt;

&lt;p&gt;Try &lt;a href="https://uplenz.io/" rel="noopener noreferrer"&gt;Uplenz&lt;/a&gt; with an image you know well. What would you inspect first, and what information would you need before trusting the result?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>ux</category>
      <category>discuss</category>
    </item>
    <item>
      <title>I built a lightweight aspect ratio calculator with vanilla JavaScript</title>
      <dc:creator>ludy.dev</dc:creator>
      <pubDate>Tue, 22 Sep 2026 07:23:17 +0000</pubDate>
      <link>https://dev.to/lyyluca/i-built-a-lightweight-aspect-ratio-calculator-with-vanilla-javascript-1pdh</link>
      <guid>https://dev.to/lyyluca/i-built-a-lightweight-aspect-ratio-calculator-with-vanilla-javascript-1pdh</guid>
      <description>&lt;p&gt;I built &lt;a href="https://aspectdock.com" rel="noopener noreferrer"&gt;AspectDock&lt;/a&gt; after repeatedly doing the same aspect-ratio calculations while working on images, video exports, and responsive layouts.&lt;/p&gt;

&lt;p&gt;The underlying math is straightforward, but building a useful interface around it raised a few interesting implementation questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two Calculation Modes
&lt;/h2&gt;

&lt;p&gt;The first mode accepts a width and height, then calculates the ratio. To reduce the dimensions, the app finds the greatest common divisor of the two values and divides both by it. For example, 1920 × 1080 becomes 16:9 instead of a long decimal representation.&lt;/p&gt;

&lt;p&gt;The second mode starts with a selected ratio and one known dimension. The missing dimension is calculated using the ratio components. A 16:9 ratio with a width of 1280 produces a height of 720.&lt;/p&gt;

&lt;p&gt;Keeping these modes separate makes the input model easier to understand and avoids mixing incomplete values with stale results.&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling Precision
&lt;/h2&gt;

&lt;p&gt;Pixel dimensions are usually integers, but ratio calculations can produce fractional values. The UI keeps the ratio calculation precise while presenting dimension results in a practical format. This matters when working with responsive containers or print dimensions where rounding can affect the final output.&lt;/p&gt;

&lt;p&gt;Validation also needs to cover empty fields, zero values, negative numbers, and incomplete input. A calculator should fail clearly rather than silently return misleading values.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping the App Lightweight
&lt;/h2&gt;

&lt;p&gt;The current implementation is intentionally small: semantic HTML for the structure, CSS for the layout and responsive behavior, and client-side JavaScript for all calculations. No server request is required for the core experience, so results appear immediately and the tool remains useful even when the calculation itself is the only thing someone needs.&lt;/p&gt;

&lt;p&gt;Common ratios are treated as quick presets rather than hidden behind another menu. Copyable results are also important because the usual next step is pasting the value into a design brief, CSS file, or export dialog.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;The hardest part was not the formula. It was deciding what information to show, when to show it, and how to make the interface feel predictable.&lt;/p&gt;

&lt;p&gt;You can try the finished version at &lt;a href="https://aspectdock.com" rel="noopener noreferrer"&gt;AspectDock&lt;/a&gt;. I would especially appreciate feedback on input validation, decimal handling, and whether the two-mode workflow feels natural.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>css</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Building ErasePeople: The Hard Part Is Defining Who Disappears</title>
      <dc:creator>ludy.dev</dc:creator>
      <pubDate>Sun, 13 Sep 2026 15:44:09 +0000</pubDate>
      <link>https://dev.to/lyyluca/building-erasepeople-the-hard-part-is-defining-who-disappears-4gph</link>
      <guid>https://dev.to/lyyluca/building-erasepeople-the-hard-part-is-defining-who-disappears-4gph</guid>
      <description>&lt;p&gt;This is an architectural model, not a disclosure of ErasePeople’s internal implementation.&lt;/p&gt;

&lt;p&gt;At each boundary, there’s a different class of problem. Image orientation can affect coordinates. Selection can become ambiguous when people overlap. Reconstruction can introduce artifacts. Export can accidentally diverge from what the preview showed.&lt;/p&gt;

&lt;p&gt;Keeping those concerns separate makes the system easier to reason about than treating the entire operation as one opaque "edit" button.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stack transparency matters
&lt;/h2&gt;

&lt;p&gt;The public product information describes an AI photo-removal website, not its framework, model provider, storage layer, or deployment platform. I’m keeping those implementation details out of this post rather than presenting an invented stack as a build log.&lt;/p&gt;

&lt;p&gt;For anyone implementing a similar application, I’d evaluate the stack around image handling, asynchronous processing, error recovery, and clear data-retention behavior. Those requirements matter more than choosing a fashionable frontend.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comparison is part of correctness
&lt;/h2&gt;

&lt;p&gt;A technically successful response can still be a bad edit.&lt;/p&gt;

&lt;p&gt;The comparison step gives users a way to inspect whether the intended person disappeared and whether important surroundings remained plausible. That makes it part of the product’s quality loop, not just a presentation feature.&lt;/p&gt;

&lt;p&gt;I’d like feedback from developers working on image interfaces: how would you express ambiguous "background people" intent without making the user complete a complicated selection workflow? You can try the current experience at &lt;a href="https://erasepeople.com/" rel="noopener noreferrer"&gt;ErasePeople&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>ux</category>
      <category>discuss</category>
    </item>
    <item>
      <title>How I built a lightning-fast, ad-free web novel reader using Next.js and Cloudflare</title>
      <dc:creator>ludy.dev</dc:creator>
      <pubDate>Fri, 07 Aug 2026 18:38:02 +0000</pubDate>
      <link>https://dev.to/lyyluca/how-i-built-a-lightning-fast-ad-free-web-novel-reader-using-nextjs-and-cloudflare-5dch</link>
      <guid>https://dev.to/lyyluca/how-i-built-a-lightning-fast-ad-free-web-novel-reader-using-nextjs-and-cloudflare-5dch</guid>
      <description>&lt;p&gt;Reading web novels online is a notoriously laggy experience. Most aggregator sites are packed with heavy tracking scripts, bloated ad networks, and redirects that make mobile reading painful. I wanted to see if I could build a platform that serves thousands of chapters with sub-second page loads.&lt;/p&gt;

&lt;p&gt;That is why I created &lt;a href="https://mubooks.com/" rel="noopener noreferrer"&gt;MuBooks&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;To achieve maximum performance, I built the frontend using Next.js. The reading interface relies heavily on static generation where possible, combined with server-side rendering for newly updated chapters. I offloaded the heavy lifting to Cloudflare Workers to cache the parsed, sanitized chapter content at the edge. By removing the tracking scripts, ads, and heavy assets, the payload size for a standard chapter is under 50KB, resulting in instantaneous page transitions.&lt;/p&gt;

&lt;p&gt;One of the biggest technical challenges was processing the raw chapter feeds. The source files often contain inconsistent HTML formatting, broken tags, and inline styles. I built a custom parser pipeline that strips out all non-essential HTML, sanitizes the text to prevent XSS, and normalizes the structure into clean, responsive Markdown-style components.&lt;/p&gt;

&lt;p&gt;For the client side, I built a highly responsive reader component. Using lightweight Tailwind classes and local storage, users can toggle dark mode, adjust font scaling, and change line heights. The state is saved locally, meaning the user can resume reading exactly where they left off without needing an external database call.&lt;/p&gt;

&lt;p&gt;By keeping the architecture lightweight and caching aggressively at the edge, the hosting costs remain minimal while providing a premium, native-app-like experience for readers.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>webdev</category>
      <category>javascript</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Building a lightning-fast Roblox Wiki using Next.js and Markdown</title>
      <dc:creator>ludy.dev</dc:creator>
      <pubDate>Wed, 08 Jul 2026 04:47:04 +0000</pubDate>
      <link>https://dev.to/lyyluca/building-a-lightning-fast-roblox-wiki-using-nextjs-and-markdown-jmo</link>
      <guid>https://dev.to/lyyluca/building-a-lightning-fast-roblox-wiki-using-nextjs-and-markdown-jmo</guid>
      <description>&lt;p&gt;Most gaming wikis are built on legacy platforms like Fandom, which are notorious for layout shifts, aggressive ad networks, and terrible mobile performance. When I started playing Storage Hunters on Roblox, I realized the community desperately needed a fast, mobile-friendly database to check item values on the fly. &lt;/p&gt;

&lt;p&gt;To solve this, I built &lt;a href="https://storagehunterswiki.com/" rel="noopener noreferrer"&gt;Storage Hunters Wiki&lt;/a&gt; using Next.js, Tailwind CSS, and Markdown.&lt;/p&gt;

&lt;p&gt;Using Static Site Generation (SSG), I pre-render all item database pages at build time. The search functionality is implemented client-side using a simple JSON index, which allows instant filtering of hundreds of in-game items without hitting a server. I also integrated an interactive map component using custom SVG coordinates to track Lost Items, which keeps the bundle size incredibly small compared to pulling in heavy map libraries.&lt;/p&gt;

&lt;p&gt;The result is a lightweight resource that loads under 500ms on mobile devices, allowing players to pull up trade values instantly.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>webdev</category>
      <category>jamstack</category>
      <category>gaming</category>
    </item>
    <item>
      <title>Building a Client-Side Grid Solver for Block Blast in React</title>
      <dc:creator>ludy.dev</dc:creator>
      <pubDate>Tue, 07 Jul 2026 05:28:58 +0000</pubDate>
      <link>https://dev.to/lyyluca/building-a-client-side-grid-solver-for-block-blast-in-react-4p22</link>
      <guid>https://dev.to/lyyluca/building-a-client-side-grid-solver-for-block-blast-in-react-4p22</guid>
      <description>&lt;p&gt;I recently built a tool to solve board layouts for the popular mobile puzzle game Block Blast. The app runs completely on the client side and helps players figure out the optimal placement for their blocks to maximize their score or clear lines.&lt;/p&gt;

&lt;p&gt;The core engine relies on a backtracking search algorithm. In Block Blast, you get three pieces at a time and must place all three to receive the next batch. This means for any given turn, the solver needs to calculate the permutations of placing these three pieces onto an 8x8 grid. &lt;/p&gt;

&lt;p&gt;To model this, the board is represented as a 2D array of boolean values. The pieces are defined by their relative coordinates. The algorithm checks every permutation of the three pieces ($3! = 6$ possible orders) and recursively attempts to place them in all valid coordinates on the grid. &lt;/p&gt;

&lt;p&gt;Once a valid placement sequence is found, it calculates a heuristic score for the resulting board state. The heuristic evaluates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Number of cleared lines (full rows or columns)&lt;/li&gt;
&lt;li&gt;Number of empty cells remaining&lt;/li&gt;
&lt;li&gt;Grid fragmentation (isolated empty spaces that are hard to fill)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To make the user experience seamless, I implemented an HTML5 Canvas interface that allows users to either manually tap the grid to match their game board or upload a screenshot. &lt;/p&gt;

&lt;p&gt;You can check out the live tool at &lt;a href="https://blockblastersolver.com/" rel="noopener noreferrer"&gt;Block Blast Solver&lt;/a&gt; to see the solver in action. I would love to hear your thoughts on optimization strategies for the heuristic search function!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
      <category>algorithms</category>
      <category>gaming</category>
    </item>
    <item>
      <title>I built a collection of 160+ client-side utility calculators using Next.js and Tailwind CSS</title>
      <dc:creator>ludy.dev</dc:creator>
      <pubDate>Thu, 25 Jun 2026 14:50:57 +0000</pubDate>
      <link>https://dev.to/lyyluca/i-built-a-collection-of-160-client-side-utility-calculators-using-nextjs-and-tailwind-css-4kjh</link>
      <guid>https://dev.to/lyyluca/i-built-a-collection-of-160-client-side-utility-calculators-using-nextjs-and-tailwind-css-4kjh</guid>
      <description>&lt;p&gt;As web developers, we often build complex SaaS products, but sometimes the most satisfying projects are clean, fast utility tools. Recently, I set out to build &lt;a href="https://multicalctool.com" rel="noopener noreferrer"&gt;MultiCalcTool&lt;/a&gt;, a collection of over 160 free calculators designed to replace the slow, ad-bloated legacy calculator sites that dominate search engines. Here is a breakdown of the tech stack and the architectural decisions I made to keep it fast.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture: Pure Client-Side Execution
&lt;/h2&gt;

&lt;p&gt;One of my core requirements was speed and privacy. I decided that all calculations should run entirely client-side. There is no backend database processing user inputs. Whether someone is calculating their monthly mortgage payments, estimated income tax, or body mass index, the math happens instantly inside their browser.&lt;/p&gt;

&lt;p&gt;To achieve this, I used Next.js to handle static site generation and page routing, combined with Tailwind CSS for a responsive, clean design system. Each calculator page is statically exported, meaning the HTML is pre-rendered at build time. When a user visits a calculator, they download a tiny, optimized JavaScript bundle that handles only the formula logic for that specific tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Managing 160+ Unique Calculation Formulas
&lt;/h2&gt;

&lt;p&gt;Managing the math logic for over 160 distinct tools was a major organizational challenge. I structured the codebase by separating the UI components from the mathematical engine. Each category (finance, math, health, tax) has a dedicated directory of mathematical utility functions.&lt;/p&gt;

&lt;p&gt;For instance, the financial formulas use standard amortization algorithms, while the construction calculators rely on precise geometry functions. I implemented TypeScript across the entire project to ensure that input variables were strictly typed. This prevented runtime rounding bugs, which are common when dealing with JavaScript's floating-point precision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optimizing for Page Speed
&lt;/h2&gt;

&lt;p&gt;Since utility websites rely heavily on organic search traffic, performance metrics were critical. By keeping the pages static and leveraging local client-side execution, the site achieved near-perfect core web vitals. There are no external tracking scripts or advertising SDKs blocking the main thread, resulting in instantaneous page loads even on slower mobile connections.&lt;/p&gt;

&lt;p&gt;The project is now live, and I would love to hear feedback from other developers on how to improve the overall responsive layout.&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>javascript</category>
      <category>tailwindcss</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Building a Zero-Database, No-Signup Quiz Engine for Instant Psychometric Scoring</title>
      <dc:creator>ludy.dev</dc:creator>
      <pubDate>Tue, 23 Jun 2026 05:18:08 +0000</pubDate>
      <link>https://dev.to/lyyluca/building-a-zero-database-no-signup-quiz-engine-for-instant-psychometric-scoring-hj1</link>
      <guid>https://dev.to/lyyluca/building-a-zero-database-no-signup-quiz-engine-for-instant-psychometric-scoring-hj1</guid>
      <description>&lt;p&gt;The scoring engine is a lightweight, pure JavaScript function. As the user selects answers, the engine mutates an in-memory vector representing the scoring dimensions. &lt;/p&gt;

&lt;p&gt;For the MBTI test, it calculates the raw coordinate offsets across the four dichotomies (E/I, S/N, T/F, J/P). For the IQ test, it matches the cumulative correct answers against a statically loaded age-based standard deviation matrix to output a normalized percentile score instantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Challenge of Shareable Results Without a Database
&lt;/h2&gt;

&lt;p&gt;If there is no database storing the results, how can a user share their unique score page with a friend? &lt;/p&gt;

&lt;p&gt;I solved this by using high-entropy URL state encoding. When a user completes a test, the scoring engine compiles their performance vector, compresses it using a lightweight LZW compression algorithm, and serializes it into a Base64-like URL token:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://quizvex.com/results/mbti?data=e30xNDIsLTEyLDM0fQ==&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;When the &lt;code&gt;/results&lt;/code&gt; route loads, the client-side router decompresses the token, hydrates the state vector, and renders the custom SVG charts on the fly. No read queries, no database latency, and absolute privacy for the user.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping CLS at Absolute Zero
&lt;/h2&gt;

&lt;p&gt;Because quizzes involve constant DOM updates as users transition from question to question, Cumulative Layout Shift (CLS) was a major concern. To prevent layout jumps, the question container uses a fixed-aspect-ratio CSS Grid container with hardware-accelerated CSS transitions for slide-in animations. This guarantees a smooth 60fps experience even on low-end mobile devices.&lt;/p&gt;

&lt;p&gt;I’d love to hear your thoughts on this stateless approach. How do you handle complex scoring algorithms without bloating your backend? Let's discuss in the comments!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>serverless</category>
      <category>jamstack</category>
    </item>
    <item>
      <title>Bayesian math is hard, so I built a zero-database A/B test &amp; conversion calculator</title>
      <dc:creator>ludy.dev</dc:creator>
      <pubDate>Tue, 23 Jun 2026 05:17:52 +0000</pubDate>
      <link>https://dev.to/lyyluca/bayesian-math-is-hard-so-i-built-a-zero-database-ab-test-conversion-calculator-3ng7</link>
      <guid>https://dev.to/lyyluca/bayesian-math-is-hard-so-i-built-a-zero-database-ab-test-conversion-calculator-3ng7</guid>
      <description>&lt;h2&gt;
  
  
  Keeping the UI Fast
&lt;/h2&gt;

&lt;p&gt;For the frontend, I went with React and Tailwind CSS. Instead of pulling in heavy charting libraries that bloat the bundle size, I wrote custom lightweight SVG generators for the funnel visualizations. This kept the entire site's initial load size under 45kb gzipped, making it load almost instantly.&lt;/p&gt;

&lt;p&gt;If you are tired of heavy analytics dashboards and just want a fast, clean way to calculate your conversion rates, model your funnels, and test significance, try it out at simplifyconversion.com. I would love to hear your feedback on the math implementation or the UI!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>math</category>
      <category>analytics</category>
    </item>
    <item>
      <title>Building a 10-in-1 Daily Puzzle Hub That Works Offline and Weighs Under 1MB</title>
      <dc:creator>ludy.dev</dc:creator>
      <pubDate>Tue, 23 Jun 2026 05:17:23 +0000</pubDate>
      <link>https://dev.to/lyyluca/building-a-10-in-1-daily-puzzle-hub-that-works-offline-and-weighs-under-1mb-4en2</link>
      <guid>https://dev.to/lyyluca/building-a-10-in-1-daily-puzzle-hub-that-works-offline-and-weighs-under-1mb-4en2</guid>
      <description>&lt;p&gt;By seeding this pseudo-random number generator with the current date, we get consistent daily boards globally without a single API request.&lt;/p&gt;

&lt;h2&gt;
  
  
  True Offline Support with Workbox
&lt;/h2&gt;

&lt;p&gt;To make the app work offline, I configured Vite's PWA plugin with a custom Workbox Service Worker strategy. &lt;/p&gt;

&lt;p&gt;We aggressive-cache all essential game assets (HTML, CSS, JS, and local dictionary modules). Since the daily game configurations are generated programmatically via the local date seed, users can play the current day's puzzles in the middle of a flight or deep inside a subway tunnel without losing their progress. Game states and daily streaks are automatically serialized and synced to &lt;code&gt;localStorage&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Check out the live build at &lt;a href="https://puzzleboxs.com" rel="noopener noreferrer"&gt;https://puzzleboxs.com&lt;/a&gt;, try turning off your network connection, and let me know what you think of the performance and offline synchronization!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>webdev</category>
      <category>pwa</category>
      <category>gamedev</category>
    </item>
    <item>
      <title>Building a distraction-free poetry database that scores 100 on PageSpeed (No bloat, just beautiful layouts)</title>
      <dc:creator>ludy.dev</dc:creator>
      <pubDate>Tue, 23 Jun 2026 05:17:08 +0000</pubDate>
      <link>https://dev.to/lyyluca/building-a-distraction-free-poetry-database-that-scores-100-on-pagespeed-no-bloat-just-beautiful-nbe</link>
      <guid>https://dev.to/lyyluca/building-a-distraction-free-poetry-database-that-scores-100-on-pagespeed-no-bloat-just-beautiful-nbe</guid>
      <description>&lt;p&gt;By parsing this with a customized unified/remark pipeline, I preserved standard line-breaks using CSS &lt;code&gt;white-space: pre-wrap&lt;/code&gt; on the container elements. This ensures that the delicate, visual spacing of poets like Walt Whitman or William Carlos Williams renders exactly as intended on both desktop and mobile screens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Achieving 100/100 PageSpeed
&lt;/h2&gt;

&lt;p&gt;To give students and writers a fast, distraction-free environment:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Static Generation&lt;/strong&gt;: Every page is pre-rendered at build time. No database queries on runtime.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tailwind CSS&lt;/strong&gt;: Using utility-first CSS keeps the global stylesheet footprint under 6KB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zero Bloat&lt;/strong&gt;: Swapped heavy tracker scripts for privacy-first, lightweight analytics.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'd love to hear your thoughts on how you handle preserving formatting for sensitive text structures. Check out the live build at &lt;a href="https://poemexamples.com/" rel="noopener noreferrer"&gt;poemexamples.com&lt;/a&gt; and let me know what you think of the performance!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>performance</category>
      <category>css</category>
      <category>jamstack</category>
    </item>
    <item>
      <title>I built a 3D printing parameter optimizer using Next.js and WebAssembly</title>
      <dc:creator>ludy.dev</dc:creator>
      <pubDate>Tue, 23 Jun 2026 05:16:30 +0000</pubDate>
      <link>https://dev.to/lyyluca/i-built-a-3d-printing-parameter-optimizer-using-nextjs-and-webassembly-2i7m</link>
      <guid>https://dev.to/lyyluca/i-built-a-3d-printing-parameter-optimizer-using-nextjs-and-webassembly-2i7m</guid>
      <description>&lt;p&gt;This keeps the main bundle small while enabling powerful computational modeling on the client. &lt;/p&gt;

&lt;p&gt;I'd love to hear your feedback on the architecture, especially if you've done client-side ML in Next.js before!&lt;/p&gt;

</description>
      <category>nextjs</category>
      <category>3dprinting</category>
      <category>webdev</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
