<?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: Anson Chan</title>
    <description>The latest articles on DEV Community by Anson Chan (@ansonchan).</description>
    <link>https://dev.to/ansonchan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3778250%2Fab44c6ae-2164-4197-a0bd-a30175ac3b07.png</url>
      <title>DEV Community: Anson Chan</title>
      <link>https://dev.to/ansonchan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ansonchan"/>
    <language>en</language>
    <item>
      <title>Free Online Slitherlink: 3000+ Puzzles with 10 Difficulty Levels</title>
      <dc:creator>Anson Chan</dc:creator>
      <pubDate>Wed, 18 Feb 2026 14:48:15 +0000</pubDate>
      <link>https://dev.to/ansonchan/free-online-slitherlink-3000-puzzles-with-daily-challenges-1kd4</link>
      <guid>https://dev.to/ansonchan/free-online-slitherlink-3000-puzzles-with-daily-challenges-1kd4</guid>
      <description>&lt;p&gt;I built &lt;a href="https://slitherlinks.com" rel="noopener noreferrer"&gt;Slitherlink Online&lt;/a&gt; because every existing Slitherlink site had the same problems: ugly UI, no difficulty control, no way to track progress. Here's what's different.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Slitherlink?
&lt;/h2&gt;

&lt;p&gt;Slitherlink (also called Fences or Loop the Loop) is a logic puzzle invented by the Japanese publisher Nikoli. You're given a grid of dots with numbers in some cells. Your job: draw a single closed loop using the edges between dots, where each number tells you exactly how many of its surrounding edges are part of the loop.&lt;/p&gt;

&lt;p&gt;It's pure logic — no math, no vocabulary, no cultural knowledge. Just pattern recognition and deduction. That's why it works across languages.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Puzzle Collection
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;3000+ hand-quality puzzles&lt;/strong&gt; generated by a custom Rust engine (not random placement):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Grid Size&lt;/th&gt;
&lt;th&gt;Cells&lt;/th&gt;
&lt;th&gt;Difficulty Range&lt;/th&gt;
&lt;th&gt;Typical Solve Time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;5×5&lt;/td&gt;
&lt;td&gt;25&lt;/td&gt;
&lt;td&gt;Level 1-4&lt;/td&gt;
&lt;td&gt;1-5 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7×7&lt;/td&gt;
&lt;td&gt;49&lt;/td&gt;
&lt;td&gt;Level 2-6&lt;/td&gt;
&lt;td&gt;3-10 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8×8&lt;/td&gt;
&lt;td&gt;64&lt;/td&gt;
&lt;td&gt;Level 3-7&lt;/td&gt;
&lt;td&gt;5-15 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10×10&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;Level 4-8&lt;/td&gt;
&lt;td&gt;10-30 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12×12&lt;/td&gt;
&lt;td&gt;144&lt;/td&gt;
&lt;td&gt;Level 5-8&lt;/td&gt;
&lt;td&gt;20-60 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every puzzle has been verified to have exactly one solution. The difficulty rating measures &lt;em&gt;what solving techniques are required&lt;/em&gt;, not just "how many clues are missing." A Level 1 puzzle needs only corner rules. A Level 8 puzzle needs loop closure logic and multi-step reasoning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Daily Challenges
&lt;/h2&gt;

&lt;p&gt;Every day at midnight UTC, a new puzzle is selected as the daily challenge. Everyone gets the same puzzle. Solve it, submit your time, and see where you rank on the leaderboard.&lt;/p&gt;

&lt;p&gt;This creates a shared experience — you can discuss today's puzzle with friends, compare strategies, and see if your approach was efficient. The daily challenge rotates through different grid sizes and difficulties.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the UI Actually Looks Like
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dark mode only&lt;/strong&gt; — no eye strain during evening puzzle sessions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Emerald accent colors&lt;/strong&gt; — clean, minimal, professional&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Touch-optimized mobile UI&lt;/strong&gt; — tap edges to draw lines, tap again for × marks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No ads (yet)&lt;/strong&gt; — the focus is on the puzzle, not monetization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;5 languages&lt;/strong&gt; — English, Japanese, Chinese, Korean, Turkish&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The game engine runs on Phaser 3 with Canvas rendering. Lines snap to grid edges with clear visual feedback. Completed loops highlight in green. Invalid states show warnings.&lt;/p&gt;

&lt;h2&gt;
  
  
  For the Technically Curious
&lt;/h2&gt;

&lt;p&gt;The entire platform runs on Cloudflare's free tier:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Frontend&lt;/strong&gt;: Next.js static export on Cloudflare Pages (global CDN, &amp;lt; 50ms TTFB)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API&lt;/strong&gt;: Cloudflare Worker handling puzzle serving, auth, game completion, leaderboards&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: Cloudflare D1 (SQLite at the edge) storing all puzzles and user data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Puzzle Engine&lt;/strong&gt;: Custom Rust binary for batch generation, compiles to WASM for browser-side validation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Monthly hosting cost: $0. The entire 3000-puzzle database is 1.9MB in D1.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Difficulty Rating Works
&lt;/h2&gt;

&lt;p&gt;Most puzzle sites rate difficulty by counting missing clues. That's lazy and inaccurate. Our Rust engine simulates a human solver:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Apply the simplest technique (corner rules). If it makes progress, stay at Level 1.&lt;/li&gt;
&lt;li&gt;If stuck, try the next technique (adjacent patterns). If needed, bump to Level 3.&lt;/li&gt;
&lt;li&gt;Continue through vertex rules (Level 5), loop closure (Level 7), and bifurcation (Level 9).&lt;/li&gt;
&lt;li&gt;The highest technique needed = the puzzle's difficulty level.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This means a Level 3 puzzle genuinely requires intermediate techniques. A Level 7 puzzle will force you to use loop closure logic — guaranteed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;New to Slitherlink? Start with the &lt;a href="https://slitherlinks.com/blog" rel="noopener noreferrer"&gt;corner patterns guide&lt;/a&gt; — learn the four corner rules (0, 1, 2, 3 in corners) and you can solve any Level 1-2 puzzle.&lt;/p&gt;

&lt;p&gt;Ready to play? Pick 5×5, Easy difficulty, and go: &lt;a href="https://slitherlinks.com?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=overview" rel="noopener noreferrer"&gt;slitherlinks.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>puzzle</category>
      <category>gaming</category>
      <category>webdev</category>
      <category>free</category>
    </item>
    <item>
      <title>Building a Slitherlink Puzzle Engine in Rust + WebAssembly</title>
      <dc:creator>Anson Chan</dc:creator>
      <pubDate>Wed, 18 Feb 2026 14:41:23 +0000</pubDate>
      <link>https://dev.to/ansonchan/building-a-slitherlink-puzzle-engine-in-rust-webassembly-3ebc</link>
      <guid>https://dev.to/ansonchan/building-a-slitherlink-puzzle-engine-in-rust-webassembly-3ebc</guid>
      <description>&lt;p&gt;Most puzzle websites generate puzzles with simple random placement. We built a proper constraint-based engine in Rust that generates, solves, and rates Slitherlink puzzles on a 10-level difficulty scale — then compiles to WebAssembly for browser use.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Rust?
&lt;/h2&gt;

&lt;p&gt;Slitherlink generation is computationally expensive. A 10×10 grid has 220 possible edges. The engine needs to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Generate a valid closed loop&lt;/li&gt;
&lt;li&gt;Place number clues&lt;/li&gt;
&lt;li&gt;Verify the puzzle has exactly one solution&lt;/li&gt;
&lt;li&gt;Rate the difficulty based on required solving techniques&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;JavaScript couldn't handle this efficiently. Java was our first attempt (it worked), but Rust gave us 10-50x speedup and the option to compile to WASM for client-side solving.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Phase 1: Loop Generation
&lt;/h3&gt;

&lt;p&gt;Start with an empty grid. Build a random Hamiltonian-like path that forms a single closed loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;·───·   ·───·───·
│       │       │
·   ·───·   ·   ·
│   │       │   │
·   ·   ·───·   ·
│   │   │       │
·───·   ·───·───·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The algorithm uses randomized DFS with backtracking. Key constraint: every vertex touched by the loop must have exactly degree 2 (one line enters, one leaves).&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 2: Clue Placement
&lt;/h3&gt;

&lt;p&gt;Count the edges around each cell to generate numbers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;·───·   ·───·───·
│ 2   1 │ 2   3 │
·   ·───·   ·   ·
│ 2 │ 2     2 │ 2
·   ·   ·───·   ·
│ 1 │ 1 │ 2   2 │
·───·   ·───·───·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then selectively remove some numbers to create the puzzle. More numbers removed = potentially harder puzzle, but difficulty depends on &lt;em&gt;which&lt;/em&gt; numbers remain, not just how many.&lt;/p&gt;

&lt;h3&gt;
  
  
  Phase 3: Uniqueness Verification
&lt;/h3&gt;

&lt;p&gt;This is the expensive part. The solver must confirm exactly one solution exists by:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Constraint propagation&lt;/strong&gt;: Apply all known patterns (corner rules, adjacent 3-3, vertex degree) exhaustively&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backtracking&lt;/strong&gt;: When propagation stalls, pick an undecided edge, try both states (line/no-line), propagate each branch&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uniqueness check&lt;/strong&gt;: If both branches lead to valid solutions, the puzzle has multiple solutions — reject it
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;solve(puzzle):
    propagate all constraints
    if contradiction → no solution
    if all edges decided → one solution found
    pick undecided edge E
    try E = line:
        solutions_a = solve(puzzle + E=line)
    try E = no_line:
        solutions_b = solve(puzzle + E=no_line)
    return solutions_a + solutions_b
    // if total &amp;gt; 1, puzzle is ambiguous — reject
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Phase 4: Difficulty Rating (10 Levels)
&lt;/h3&gt;

&lt;p&gt;This is where it gets interesting. We don't just count clues — we measure &lt;em&gt;what techniques are required to solve&lt;/em&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;Techniques Required&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1-2&lt;/td&gt;
&lt;td&gt;Corner rules, 0-elimination only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3-4&lt;/td&gt;
&lt;td&gt;Adjacent number patterns (3-3, 3-0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5-6&lt;/td&gt;
&lt;td&gt;Vertex degree rule, edge patterns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7-8&lt;/td&gt;
&lt;td&gt;Loop closure logic, inside/outside reasoning&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9-10&lt;/td&gt;
&lt;td&gt;Multi-step bifurcation (trial and error)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The rating engine simulates a human solver: apply techniques in order of complexity, track which level of technique was needed to make progress. The highest technique level used = the puzzle's difficulty.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;rate_puzzle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;puzzle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Puzzle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;u8&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;max_level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;SolverState&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;puzzle&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;loop&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Try techniques from simplest to most complex&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="nf"&gt;.apply_corner_rules&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;max_level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_level&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;continue&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="n"&gt;state&lt;/span&gt;&lt;span class="nf"&gt;.apply_adjacent_patterns&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;max_level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_level&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;continue&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="n"&gt;state&lt;/span&gt;&lt;span class="nf"&gt;.apply_vertex_degree&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;max_level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_level&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;continue&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="n"&gt;state&lt;/span&gt;&lt;span class="nf"&gt;.apply_loop_closure&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;max_level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_level&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;continue&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="n"&gt;state&lt;/span&gt;&lt;span class="nf"&gt;.apply_bifurcation&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;max_level&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max_level&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;max_level&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Compiling to WebAssembly
&lt;/h2&gt;

&lt;p&gt;The Rust engine compiles to WASM via &lt;code&gt;wasm-pack&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wasm-pack build &lt;span class="nt"&gt;--target&lt;/span&gt; web &lt;span class="nt"&gt;--release&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The resulting &lt;code&gt;.wasm&lt;/code&gt; binary is ~200KB and runs in the browser for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Client-side puzzle validation (anti-cheat)&lt;/li&gt;
&lt;li&gt;Hint generation&lt;/li&gt;
&lt;li&gt;Solution verification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For batch generation (we pre-generate 3000+ puzzles), we use the native binary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./slitherlink-engine gen &lt;span class="nt"&gt;--grid-size&lt;/span&gt; 10 &lt;span class="nt"&gt;--level&lt;/span&gt; 6 &lt;span class="nt"&gt;--count&lt;/span&gt; 100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This outputs JSON to stdout — one puzzle per line with grid_size, clues, solution, and difficulty rating.&lt;/p&gt;

&lt;h2&gt;
  
  
  Production Pipeline
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rust engine (batch generate)
    → JSON puzzles
    → Import to Cloudflare D1 database
    → CF Worker API serves puzzles
    → Next.js frontend renders with Phaser 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The database holds 3000+ puzzles across 5 grid sizes (5×5, 7×7, 8×8, 10×10, 12×12) and 10 difficulty levels. The API supports random puzzle selection filtered by size and difficulty, daily challenges, and leaderboards.&lt;/p&gt;

&lt;h2&gt;
  
  
  Numbers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Generation speed&lt;/strong&gt;: ~50 puzzles/minute for 10×10 Level 5-6&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WASM bundle&lt;/strong&gt;: 200KB gzipped&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solve time&lt;/strong&gt; (WASM, 10×10): &amp;lt; 100ms&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database&lt;/strong&gt;: 3000+ puzzles, 1.9MB total in D1&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Play the puzzles at &lt;a href="https://slitherlinks.com?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=rust-engine" rel="noopener noreferrer"&gt;slitherlinks.com&lt;/a&gt; — the difficulty ratings are real. Level 1 feels gentle; Level 8 will make you sweat.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>webassembly</category>
      <category>gamedev</category>
      <category>puzzle</category>
    </item>
    <item>
      <title>Slitherlink Corner Patterns: The Complete Visual Guide</title>
      <dc:creator>Anson Chan</dc:creator>
      <pubDate>Wed, 18 Feb 2026 14:33:09 +0000</pubDate>
      <link>https://dev.to/ansonchan/slitherlink-corner-patterns-the-complete-guide-3gcf</link>
      <guid>https://dev.to/ansonchan/slitherlink-corner-patterns-the-complete-guide-3gcf</guid>
      <description>&lt;p&gt;Slitherlink is a logic puzzle where you draw a single closed loop on a grid using number clues. Each number tells you how many of its four surrounding edges are part of the loop. No number? That cell could have any count.&lt;/p&gt;

&lt;p&gt;Corners are where you should always start solving — they have fewer edges (only 2 outer edges touching the grid boundary), which means fewer possibilities and faster deductions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Rules, Briefly
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Draw lines on grid edges to form &lt;strong&gt;one continuous closed loop&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Each number = count of lines around that cell&lt;/li&gt;
&lt;li&gt;The loop cannot branch or cross itself&lt;/li&gt;
&lt;li&gt;Every vertex (dot) has either 0 or exactly 2 lines passing through it&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Corner 0: Instant Elimination
&lt;/h2&gt;

&lt;p&gt;A 0 in the corner means zero lines around it. Since a corner cell has only 2 outer edges, both are eliminated immediately — plus the 2 inner edges.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;·   ·   ·
  × 0 ×  
· × · × ·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it works&lt;/strong&gt;: 0 means no lines at all. Mark all 4 edges with × and move on. This is the single fastest deduction in the game.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pro tip&lt;/strong&gt;: After marking a corner 0, check the adjacent cells. If there's a 3 next to a 0, you just eliminated one of the 3's edges — forcing the remaining 3 edges to all have lines.&lt;/p&gt;

&lt;h2&gt;
  
  
  Corner 3: Two Guaranteed Lines
&lt;/h2&gt;

&lt;p&gt;A 3 in the corner needs 3 out of 4 edges to have lines. But the corner vertex only connects to 2 outer edges. If either outer edge had no line, the vertex would need the line to come from somewhere — but there's nowhere else to go without violating the loop rule.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;·───·   ·
│ 3      
·   ·   ·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Both outer edges must have lines.&lt;/strong&gt; That gives you 2 out of 3 lines immediately. The third line is one of the 2 inner edges — you'll determine which one from neighboring clues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it works&lt;/strong&gt;: Consider the corner vertex (top-left). The loop requires 0 or 2 lines at each vertex. The outer edges are the only ones connecting to this vertex. If one were missing, you'd have exactly 1 line at the vertex — a dead end, which is illegal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Corner 1: Both Outer Edges Are Empty
&lt;/h2&gt;

&lt;p&gt;This one surprises beginners. A 1 in the corner means &lt;strong&gt;neither outer edge can have a line&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;· × ·   ·
× 1      
·   ·   ·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it works&lt;/strong&gt;: Suppose one outer edge has a line. The corner vertex now has exactly 1 line. To satisfy the vertex rule (0 or 2 lines), the other outer edge must also have a line — but then we'd have 2 lines, making this cell at least a 2, not a 1. Contradiction.&lt;/p&gt;

&lt;p&gt;So both outer edges must be ×, and the single line for this 1 comes from one of the 2 inner edges.&lt;/p&gt;

&lt;h2&gt;
  
  
  Corner 2: The Paired Pattern
&lt;/h2&gt;

&lt;p&gt;A 2 in the corner has an elegant constraint: the two outer edges are &lt;strong&gt;always the same&lt;/strong&gt; — either both have lines, or both are empty.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Case A&lt;/strong&gt; — both outer edges have lines (2 of 2 accounted for, inner edges empty):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;·───·   ·
│ 2      
·   ·   ·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Case B&lt;/strong&gt; — both outer edges empty (both lines come from inner edges):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;·   ·   ·
    2    
· × ·───·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it works&lt;/strong&gt;: If only one outer edge had a line, the corner vertex would have exactly 1 line — a dead end. So they must match: both on or both off. You need more information from neighboring cells to determine which case applies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Combining Corner Patterns with Neighbors
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Corner 3 + Adjacent 3 (The S/Z Shape)
&lt;/h3&gt;

&lt;p&gt;When a corner 3 sits next to another 3, you get one of the most powerful patterns in Slitherlink — 5 edges determined at once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;·───·   ·───·
│ 3 │ 3 │
·   ·───·   ·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The shared edge between the two 3s always has a line. Combined with the corner 3's two outer lines, and the second 3 needing its own 3 lines, you get an S-shaped (or Z-shaped) pattern.&lt;/p&gt;

&lt;p&gt;Mirror version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;·   ·───·   ·
│ 3 │ 3 │
·───·   ·───·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Corner 3 + Adjacent 0
&lt;/h3&gt;

&lt;p&gt;When a 0 sits next to a corner 3, the 0 eliminates their shared edge. Since the corner 3 already has 2 outer lines, the third line must go to the remaining inner edge:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;·───·   ·   ·
│ 3 × 0 ×    
·───· × · × ·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All 3 of the corner 3's lines are now fully determined.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Vertex Rule: Why These Patterns Work
&lt;/h2&gt;

&lt;p&gt;Every pattern above derives from one principle: &lt;strong&gt;each vertex has 0 or 2 lines&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is because the loop is continuous — if a line enters a vertex, it must also leave. No dead ends allowed. This constraint, combined with corner geometry (only 2 outer edges meet at the corner vertex), makes corners the most constrained — and therefore most solvable — cells on the board.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practice Strategy
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Scan all 4 corners first&lt;/strong&gt; — process 0s, 3s, and 1s immediately&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check neighbors of corner cells&lt;/strong&gt; — propagate constraints outward&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Look for edge cells next&lt;/strong&gt; — they have 3 edges (1 outer), similar constraints&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Work inward&lt;/strong&gt; — interior cells have 4 edges and need more context&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Start with easy 5×5 puzzles where corners dominate the grid. As you scale to 10×10 and 15×15, corner patterns still fire first — but you'll need intermediate and advanced techniques for the interior.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Try these patterns on real puzzles&lt;/strong&gt;: &lt;a href="https://slitherlinks.com?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=corner-patterns" rel="noopener noreferrer"&gt;slitherlinks.com&lt;/a&gt; — 3000+ free puzzles across 5 grid sizes and 10 difficulty levels. Start with 5×5 Level 1 to practice corner patterns in isolation.&lt;/p&gt;

</description>
      <category>puzzle</category>
      <category>logic</category>
      <category>tutorial</category>
      <category>gaming</category>
    </item>
    <item>
      <title>The Zero-Cost Stack: Building a Global Web App with Cloudflare Free Tier</title>
      <dc:creator>Anson Chan</dc:creator>
      <pubDate>Wed, 18 Feb 2026 07:24:00 +0000</pubDate>
      <link>https://dev.to/ansonchan/the-zero-cost-stack-building-a-global-web-app-with-cloudflare-free-tier-49oi</link>
      <guid>https://dev.to/ansonchan/the-zero-cost-stack-building-a-global-web-app-with-cloudflare-free-tier-49oi</guid>
      <description>&lt;p&gt;What if I told you that you could deploy a web application serving users globally — with a database, API, static hosting, and custom domain — for exactly $0 per month?&lt;/p&gt;

&lt;p&gt;No catch. No "free for 30 days." Actually free, indefinitely.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;p&gt;Here's what I use to run two production web applications (&lt;a href="https://slitherlinks.com" rel="noopener noreferrer"&gt;Slitherlinks&lt;/a&gt; and &lt;a href="https://tools.sagasu.art" rel="noopener noreferrer"&gt;OmniConvert&lt;/a&gt;) at zero cost:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare Pages&lt;/strong&gt; — Static site hosting with global CDN&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare Workers&lt;/strong&gt; — Serverless API endpoints&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare D1&lt;/strong&gt; — SQLite database at the edge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare R2&lt;/strong&gt; — Object storage (if needed)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All on the free tier. Let me break down each component.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cloudflare Pages: Global CDN for Free
&lt;/h2&gt;

&lt;p&gt;Pages gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unlimited bandwidth&lt;/li&gt;
&lt;li&gt;Unlimited requests&lt;/li&gt;
&lt;li&gt;500 builds per month&lt;/li&gt;
&lt;li&gt;Preview deployments for every branch&lt;/li&gt;
&lt;li&gt;Custom domains with automatic SSL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My Slitherlinks frontend is a static site built with HTML, CSS, and vanilla JavaScript. Every deployment pushes to Cloudflare's global CDN — 300+ data centers worldwide. A user in Tokyo gets the same sub-50ms response time as a user in São Paulo.&lt;/p&gt;

&lt;p&gt;Deployment is one command: &lt;code&gt;wrangler pages deploy dist/&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Cloudflare Workers: API Without Servers
&lt;/h2&gt;

&lt;p&gt;Workers run JavaScript/TypeScript at the edge. Free tier gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;100,000 requests per day&lt;/li&gt;
&lt;li&gt;10ms CPU time per request&lt;/li&gt;
&lt;li&gt;Global deployment (runs in the nearest data center to the user)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My Slitherlinks API handles puzzle delivery, user authentication, game completion tracking, leaderboards, and daily challenges — all in a single Worker.&lt;/p&gt;

&lt;p&gt;The Worker code is surprisingly simple. It's essentially a router that maps endpoints to handler functions, with D1 database access.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cloudflare D1: SQLite at the Edge
&lt;/h2&gt;

&lt;p&gt;D1 is the game-changer. It's a serverless SQLite database that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Replicates globally (reads are fast everywhere)&lt;/li&gt;
&lt;li&gt;Supports standard SQL&lt;/li&gt;
&lt;li&gt;Free tier: 5M reads, 100K writes per day&lt;/li&gt;
&lt;li&gt;5GB storage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;My D1 database stores 1,900 puzzles across 5 grid sizes and multiple difficulty levels, plus user accounts, game history, and leaderboard data. Total size: about 2MB.&lt;/p&gt;

&lt;p&gt;For a puzzle game, 5M reads/day is essentially unlimited. I could serve thousands of daily active users before touching any limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Authentication Pattern
&lt;/h2&gt;

&lt;p&gt;One thing that surprises people: you can build real authentication on this stack. My implementation uses:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;PBKDF2&lt;/strong&gt; password hashing (100K iterations, SHA-256)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HMAC-SHA256&lt;/strong&gt; JWT tokens (30-day expiry)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JWT_SECRET&lt;/strong&gt; stored as a Worker secret&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;No third-party auth service needed. The Worker handles registration, login, and token verification directly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Not Vercel/Netlify/Railway?
&lt;/h2&gt;

&lt;p&gt;These are excellent platforms. But they all have usage-based pricing that kicks in at scale. Vercel's free tier limits bandwidth to 100GB. Netlify's limits to 100GB. Railway charges per resource-hour.&lt;/p&gt;

&lt;p&gt;Cloudflare's free tier has no bandwidth limits on Pages and generous daily request limits on Workers. For applications that are read-heavy (like a puzzle game or a file converter), this is effectively unlimited.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real Numbers
&lt;/h2&gt;

&lt;p&gt;Here are my actual usage stats for Slitherlinks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pages&lt;/strong&gt;: ~2,000 requests/day, 0% of any limit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workers&lt;/strong&gt;: ~500 API calls/day, 0.5% of daily limit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;D1&lt;/strong&gt;: ~3,000 reads/day, 0.06% of daily limit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monthly cost&lt;/strong&gt;: $0.00&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even if traffic 10x'd, I'd still be comfortably within free tier.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Trade-offs
&lt;/h2&gt;

&lt;p&gt;It's not perfect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Workers have 10ms CPU limit&lt;/strong&gt; on free tier (enough for most API work, tight for heavy computation)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;D1 is eventually consistent&lt;/strong&gt; for global reads (fine for games, tricky for financial applications)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No WebSocket support&lt;/strong&gt; on free Workers (use Durable Objects on paid tier)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cold starts&lt;/strong&gt; exist but are minimal (~5ms)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For most indie projects, these limitations don't matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Sign up at cloudflare.com (free)&lt;/li&gt;
&lt;li&gt;Install Wrangler: &lt;code&gt;npm install -g wrangler&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Create a Pages project: &lt;code&gt;wrangler pages project create my-app&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Create a D1 database: &lt;code&gt;wrangler d1 create my-db&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Create a Worker: &lt;code&gt;wrangler init my-api&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Deploy and forget about hosting costs forever&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both &lt;a href="https://slitherlinks.com" rel="noopener noreferrer"&gt;Slitherlinks&lt;/a&gt; and &lt;a href="https://tools.sagasu.art" rel="noopener noreferrer"&gt;OmniConvert&lt;/a&gt; run on this exact stack. Zero monthly cost, global performance, scales automatically.&lt;/p&gt;

&lt;p&gt;The best infrastructure is the one you never have to think about.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;See it in action: &lt;a href="https://slitherlinks.com" rel="noopener noreferrer"&gt;slitherlinks.com&lt;/a&gt; | &lt;a href="https://tools.sagasu.art" rel="noopener noreferrer"&gt;tools.sagasu.art&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cloudflare</category>
      <category>webdev</category>
      <category>serverless</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Daily Puzzle Challenges: How Routine Problem-Solving Sharpens Your Mind</title>
      <dc:creator>Anson Chan</dc:creator>
      <pubDate>Wed, 18 Feb 2026 07:23:31 +0000</pubDate>
      <link>https://dev.to/ansonchan/daily-puzzle-challenges-how-routine-problem-solving-sharpens-your-mind-224c</link>
      <guid>https://dev.to/ansonchan/daily-puzzle-challenges-how-routine-problem-solving-sharpens-your-mind-224c</guid>
      <description>&lt;h2&gt;
  
  
  The Gym for Your Brain
&lt;/h2&gt;

&lt;p&gt;We all know the physical benefits of a daily routine. You go to the gym to keep your muscles strong. You go for a run to keep your heart healthy. You stretch to maintain flexibility.&lt;br&gt;
But what about your brain?&lt;/p&gt;

&lt;p&gt;In our modern world of doom-scrolling and passive content consumption, our brains often lack the "resistance training" they need to stay sharp. We consume information, but we rarely &lt;em&gt;synthesize&lt;/em&gt; it or solve novel problems under constraints.&lt;/p&gt;

&lt;p&gt;This is where the concept of the &lt;strong&gt;Daily Puzzle Challenge&lt;/strong&gt; comes in.&lt;/p&gt;

&lt;p&gt;Just as lifting weights tears down muscle fibers to build them back stronger, struggling with a difficult logic puzzle forces your brain to create new neural pathways. It is cognitive exercise. And like physical exercise, consistency is key.&lt;/p&gt;

&lt;p&gt;This philosophy is the driving force behind the daily challenges at &lt;a href="https://slitherlinks.com/en/daily-challenge" rel="noopener noreferrer"&gt;Slitherlinks.com/en/daily-challenge&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Science of Neuroplasticity
&lt;/h2&gt;

&lt;p&gt;For a long time, scientists believed the brain stopped developing after childhood. We now know this is false. The concept of &lt;strong&gt;neuroplasticity&lt;/strong&gt; tells us that the brain is capable of reorganizing itself throughout life.&lt;/p&gt;

&lt;p&gt;When you engage in routine problem-solving—specifically logic puzzles like Sudoku, Crosswords, or Slitherlink—you are engaging the &lt;strong&gt;prefrontal cortex&lt;/strong&gt;. This is the area responsible for executive function: planning, decision making, and moderating social behavior.&lt;/p&gt;

&lt;p&gt;A study published in the &lt;em&gt;International Journal of Geriatric Psychiatry&lt;/em&gt; found that the more often people aged 50+ engaged in puzzles, the better their brain function. The researchers found that frequent puzzle solvers had brain function equivalent to bodies up to 10 years younger than their actual age.&lt;/p&gt;

&lt;p&gt;But it's not just for the elderly. For software engineers, writers, and knowledge workers, these puzzles act as a "warm-up" for the day.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "Daily" Matters
&lt;/h2&gt;

&lt;p&gt;You can't go to the gym once a month for 10 hours and expect to get fit. You'll just get injured.&lt;br&gt;
Similarly, binge-solving puzzles for 5 hours on a Sunday is less effective than solving one 10-minute puzzle every morning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The Ritual Effect:&lt;/strong&gt;&lt;br&gt;
Starting your day with a small win sets a psychological tone. Completing a daily challenge gives you a dopamine hit before you've even checked your email. It says, "I am capable of solving problems today."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Pattern Recognition:&lt;/strong&gt;&lt;br&gt;
Daily exposure keeps the patterns fresh in your working memory. If you solve a Slitherlink puzzle today, and then another tomorrow, your brain retains the geometric heuristics (like the corner patterns we discussed in other articles). If you wait a week, you have to "re-load" that context.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Cognitive Switching:&lt;/strong&gt;&lt;br&gt;
The act of switching from "sleep mode" or "coffee mode" to "analytical mode" is a skill in itself. Daily puzzles train you to switch into deep focus on command.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Slitherlink Daily Challenge
&lt;/h2&gt;

&lt;p&gt;At &lt;a href="https://slitherlinks.com/en/daily-challenge" rel="noopener noreferrer"&gt;Slitherlinks.com&lt;/a&gt;, we designed the Daily Challenge to be the perfect dose of cognitive caffeine.&lt;/p&gt;

&lt;p&gt;Here is how it is structured:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Consistency:&lt;/strong&gt; A new puzzle is generated every 24 hours.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Variety:&lt;/strong&gt; The size and difficulty rotate. Some days are a quick 5-minute breeze; other days are a 20-minute grinder. This prevents your brain from getting too comfortable.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Community:&lt;/strong&gt; Everyone solves the &lt;em&gt;exact same puzzle&lt;/em&gt;. This is crucial. It creates a shared experience. You can compare your time with friends or the global leaderboard. Did you get stuck on the top-right corner? So did everyone else.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Logic Puzzles vs. "Brain Training" Games
&lt;/h2&gt;

&lt;p&gt;A note of caution: There is a difference between pure logic puzzles and the gamified "Brain Training" apps that were popular a few years ago.&lt;br&gt;
Many "Brain Training" apps claim to improve general IQ, but studies show they mostly just make you better at playing &lt;em&gt;that specific game&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Logic puzzles like Slitherlink are different because they rely on &lt;strong&gt;deductive reasoning&lt;/strong&gt;, not just reaction time or memorization.&lt;br&gt;
In Slitherlink, you cannot guess. Guessing leads to failure. You must prove to yourself that a line exists or doesn't exist based on the evidence.&lt;br&gt;
This mindset—&lt;strong&gt;Evidence-Based Decision Making&lt;/strong&gt;—transfers directly to programming, debugging, and engineering.&lt;/p&gt;

&lt;p&gt;When I am debugging a complex race condition in code, the mental motion is identical to solving a hard Slitherlink board:&lt;br&gt;
"If this variable is true, then that function must have fired. But if that function fired, the log would show X. The log does not show X. Therefore, the variable is false."&lt;/p&gt;

&lt;p&gt;That is Slitherlink. That is logic.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Integrate This into Your Routine
&lt;/h2&gt;

&lt;p&gt;You don't need hours. You need 10 minutes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Anchor it:&lt;/strong&gt; Tie the habit to something you already do. "I will do the Daily Challenge while I drink my morning coffee."&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;No distractions:&lt;/strong&gt; Don't do it while watching TV. Give it 100% of your focus. This trains your attention span.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Review your mistakes:&lt;/strong&gt; If you break the loop, don't just restart blindly. Look at &lt;em&gt;why&lt;/em&gt; you broke it. Did you make an invalid assumption?&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Your mind is a tool. Like any tool, it needs maintenance.&lt;br&gt;
The "use it or lose it" adage applies to cognitive function just as much as muscle mass.&lt;/p&gt;

&lt;p&gt;By incorporating a small, high-quality logic puzzle into your daily routine, you aren't just passing time. You are sharpening the blade you use to attack the rest of your day's problems.&lt;/p&gt;

&lt;p&gt;Ready to test your focus? Try today's challenge at &lt;a href="https://slitherlinks.com/en/daily-challenge" rel="noopener noreferrer"&gt;Slitherlinks.com/en/daily-challenge&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>health</category>
      <category>brain</category>
      <category>learning</category>
    </item>
    <item>
      <title>Why I Built a File Converter That Doesn't Upload Your Files</title>
      <dc:creator>Anson Chan</dc:creator>
      <pubDate>Wed, 18 Feb 2026 07:18:20 +0000</pubDate>
      <link>https://dev.to/ansonchan/why-i-built-a-file-converter-that-doesnt-upload-your-files-3jkc</link>
      <guid>https://dev.to/ansonchan/why-i-built-a-file-converter-that-doesnt-upload-your-files-3jkc</guid>
      <description>&lt;h2&gt;
  
  
  The Problem with Cloud Converters
&lt;/h2&gt;

&lt;p&gt;We've all been there. You have a PNG you need as a JPG. You have a WAV file you need as an MP3. Or maybe a JSON file you need to convert to YAML.&lt;br&gt;
You Google it. You click the first result: "Free Online Converter!"&lt;br&gt;
It asks you to upload your file.&lt;br&gt;
You hesitate.&lt;/p&gt;

&lt;p&gt;Maybe that file is a scan of your ID.&lt;br&gt;
Maybe it's a financial spreadsheet.&lt;br&gt;
Maybe it's a confidential work document.&lt;br&gt;
Or maybe it's just a personal photo you'd rather not share with a random server in a jurisdiction you can't pronounce.&lt;/p&gt;

&lt;p&gt;But you're in a hurry. You upload it. You wait for the progress bar. You download the result. And you hope that "Delete after 24 hours" promise is actually true.&lt;/p&gt;

&lt;p&gt;This workflow is broken. In 2026, with the computing power available in our web browsers, there is absolutely no reason to send a 5MB image to a server halfway across the world just to change its file format.&lt;/p&gt;

&lt;p&gt;That is why I built &lt;strong&gt;&lt;a href="https://tools.sagasu.art" rel="noopener noreferrer"&gt;Sagasu Tools&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Paradigm Shift: Local-First Web Apps
&lt;/h2&gt;

&lt;p&gt;The web has evolved. It used to be a dumb terminal for displaying text. Then it became a way to send forms to servers.&lt;br&gt;
Today, the browser is a full-fledged operating system.&lt;br&gt;
With technologies like &lt;strong&gt;WebAssembly (Wasm)&lt;/strong&gt;, &lt;strong&gt;Service Workers&lt;/strong&gt;, and the &lt;strong&gt;File System Access API&lt;/strong&gt;, we can bring desktop-class performance and privacy to the web.&lt;/p&gt;

&lt;p&gt;My goal with &lt;a href="https://tools.sagasu.art" rel="noopener noreferrer"&gt;tools.sagasu.art&lt;/a&gt; was simple: &lt;strong&gt;Zero server-side processing.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;When you visit a traditional converter site:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Client:&lt;/strong&gt; Select file -&amp;gt; Upload (Bandwidth cost + Privacy risk)&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Server:&lt;/strong&gt; Receive file -&amp;gt; Spin up process -&amp;gt; Convert (CPU cost) -&amp;gt; Save temp file&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Client:&lt;/strong&gt; Download result (Bandwidth cost)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When you use Sagasu Tools:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Client:&lt;/strong&gt; Select file -&amp;gt; &lt;strong&gt;Browser processes it locally&lt;/strong&gt; -&amp;gt; Save result.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;There is no step 2. The server serves the static HTML/JS/Wasm assets once, and then gets out of the way. You could literally turn off your Wi-Fi after the page loads, and the tool would still work.&lt;/p&gt;

&lt;h2&gt;
  
  
  Under the Hood: FFmpeg.wasm and Friends
&lt;/h2&gt;

&lt;p&gt;The secret sauce for many media converters today is &lt;strong&gt;FFmpeg&lt;/strong&gt;. It's the Swiss Army knife of audio/video processing.&lt;br&gt;
Traditionally, FFmpeg runs on Linux servers. But thanks to the Emscripten compiler toolchain, we can compile FFmpeg's C code into WebAssembly.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;ffmpeg.wasm&lt;/code&gt; allows the browser to run FFmpeg directly in a Web Worker.&lt;br&gt;
This means when you convert a video on my site, your CPU fan might spin up, but your network card stays quiet. The data never leaves your RAM.&lt;/p&gt;

&lt;p&gt;This approach has massive benefits:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Privacy:&lt;/strong&gt; This is the big one. If the data never leaves your device, it can't be intercepted, stored, or sold. It is GDPR-compliant by design because &lt;em&gt;there is no data processing&lt;/em&gt; happening on my end.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Speed:&lt;/strong&gt; For many files, uploading and downloading takes longer than the actual conversion. Local conversion is instant for small files.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Cost:&lt;/strong&gt; I don't pay for expensive GPU cloud instances to process video. I host static files. My hosting bill is effectively zero (thanks to Cloudflare Pages), which allows me to offer the tool for free without plastering it with ads.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Reliability:&lt;/strong&gt; No "Server Overloaded" errors. If your computer is working, the tool is working.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Challenges of Client-Side Processing
&lt;/h2&gt;

&lt;p&gt;It's not all sunshine and rainbows. Building a local-first converter comes with trade-offs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Browser Constraints:&lt;/strong&gt;&lt;br&gt;
Browsers sandbox everything. Managing memory in WebAssembly can be tricky. If you try to convert a 4GB video file in Chrome, you might crash the tab because the browser limits how much RAM a single tab can use.&lt;br&gt;
Cloud servers can throw 128GB of RAM at a problem. Your browser tab gets maybe 4GB.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Initial Load Time:&lt;/strong&gt;&lt;br&gt;
The &lt;code&gt;ffmpeg.wasm&lt;/code&gt; core is large (around 25MB). Downloading this takes time on the first visit.&lt;br&gt;
&lt;em&gt;Solution:&lt;/em&gt; I use aggressive caching. Once you've visited the site once, the Wasm binary is stored in your cache. Subsequent visits are instant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Format Support:&lt;/strong&gt;&lt;br&gt;
While FFmpeg is extensive, compiling &lt;em&gt;every&lt;/em&gt; codec into Wasm bloats the file size. I have to be selective about which formats to support to keep the app lightweight.&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond Media: Unit Conversion, JSON, and More
&lt;/h2&gt;

&lt;p&gt;While media conversion is the flashy use case, the same local-first philosophy applies to everything on &lt;a href="https://tools.sagasu.art" rel="noopener noreferrer"&gt;tools.sagasu.art&lt;/a&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;JSON Formatter:&lt;/strong&gt; Why send your config files to a server to pretty-print them? Do it in JS.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Base64 Encoder:&lt;/strong&gt; This is a simple string manipulation. It should never touch a backend.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Unit Converter:&lt;/strong&gt; Pure math. Zero latency.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;We are seeing a swing back towards "thick clients."&lt;br&gt;
In the 90s, we installed .exe files.&lt;br&gt;
In the 2010s, we moved everything to the cloud (SaaS).&lt;br&gt;
In the 2020s, we are moving back to the edge and the client, but delivered via the web.&lt;/p&gt;

&lt;p&gt;This hybrid model—&lt;strong&gt;Web distribution, Local execution&lt;/strong&gt;—is the future of utility software. It combines the friction-free access of a website (no install required) with the privacy and performance of a desktop app.&lt;/p&gt;

&lt;p&gt;I built this converter because I wanted to use it. I wanted a bookmark I could click, drag a file onto, and get a result, without worrying about who is looking at my data.&lt;/p&gt;

&lt;p&gt;If that sounds like something you need, give it a try at &lt;a href="https://tools.sagasu.art" rel="noopener noreferrer"&gt;tools.sagasu.art&lt;/a&gt;. No signup, no upload, no nonsense. Just tools.&lt;/p&gt;

</description>
      <category>webassembly</category>
      <category>privacy</category>
      <category>javascript</category>
      <category>tools</category>
    </item>
    <item>
      <title>Slitherlink Corner Patterns: The First Thing Every Solver Should Learn</title>
      <dc:creator>Anson Chan</dc:creator>
      <pubDate>Wed, 18 Feb 2026 07:11:37 +0000</pubDate>
      <link>https://dev.to/ansonchan/slitherlink-corner-patterns-the-first-thing-every-solver-should-learn-5bnh</link>
      <guid>https://dev.to/ansonchan/slitherlink-corner-patterns-the-first-thing-every-solver-should-learn-5bnh</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;If you've ever stared at a Slitherlink grid, feeling a mix of intrigue and intimidation, you're not alone. This logic puzzle, also known as Fences or Loop the Loop, offers a pure test of deductive reasoning. Unlike Sudoku, which relies on placing numbers, Slitherlink is about topology and geometry—constructing a single continuous loop.&lt;/p&gt;

&lt;p&gt;For beginners, the grid can seem chaotic. But experienced solvers know that the chaos is an illusion. The grid is governed by strict rules, and these rules create predictable patterns. The most fundamental of these patterns are found in the &lt;strong&gt;corners&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Understanding corner patterns is the "Hello World" of Slitherlink strategy. It is the first step in transforming from a guesser into a solver. In this guide, we will dissect the corner cases for 0, 1, 2, and 3, giving you the tools to break into any grid with confidence.&lt;/p&gt;

&lt;p&gt;If you want to practice these patterns immediately, you can find thousands of puzzles at &lt;a href="https://slitherlinks.com" rel="noopener noreferrer"&gt;Slitherlinks.com&lt;/a&gt;, a modern, clean interface for solving these logic gems.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Rules of the Game
&lt;/h2&gt;

&lt;p&gt;Before we dive into the corners, let's briefly recap the rules to ensure we are on the same page:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Connect adjacent dots&lt;/strong&gt; with vertical or horizontal lines to form a single loop.&lt;/li&gt;
&lt;li&gt; The numbers inside the squares indicate &lt;strong&gt;how many of its four sides are part of the loop&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; The loop cannot cross itself or branch off.&lt;/li&gt;
&lt;li&gt; Empty squares can have any number of lines (0, 1, 2, or 3) bordering them, but usually not 4 (unless it's a tiny 1x1 loop, which is trivial).&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  why Start with Corners?
&lt;/h2&gt;

&lt;p&gt;Corners are powerful because the geometry is constrained. A cell in the middle of the board has four potential neighbors. A cell on the edge has three. But a corner cell? It has only two external edges available to the grid boundary. This constraint drastically limits the possibilities for the loop, forcing specific line placements based on the clue number.&lt;/p&gt;

&lt;p&gt;Let's break them down number by number.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Corner 0
&lt;/h3&gt;

&lt;p&gt;This is the easiest pattern to spot and the most immediately gratifying.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Logic:&lt;/strong&gt;&lt;br&gt;
A '0' clue means &lt;em&gt;none&lt;/em&gt; of the four sides of that square can contain a line segment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Result:&lt;/strong&gt;&lt;br&gt;
You can immediately mark "x"s (or whatever notation you use for "no line") on all four sides of the 0.&lt;br&gt;
Specifically for a corner 0, the two edges that form the corner of the grid are already boundaries, but this confirms that the internal edges bordering the 0 are also empty.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implication:&lt;/strong&gt;&lt;br&gt;
This effectively "cuts off" that corner of the grid. The loop cannot pass through a corner 0. It pushes the action inward. While simple, spotting these early clears up the board and often creates new corners for adjacent cells.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Corner 1
&lt;/h3&gt;

&lt;p&gt;A '1' in a corner is a subtle but vital clue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Logic:&lt;/strong&gt;&lt;br&gt;
A corner cell has two edges touching the outside boundary of the grid and two internal edges.&lt;br&gt;
If the loop were to use either of the external edges (the ones along the grid border), it would have to "enter" and "exit" the corner vertex.&lt;br&gt;
However, a '1' only allows a single line segment. A line segment entering a corner vertex &lt;em&gt;must&lt;/em&gt; continue, because the loop is continuous. It cannot just stop at a dot.&lt;br&gt;
Therefore, if you placed a line on an external edge leading into the corner, you would need a second line to leave the corner. That would make 2 lines. But the clue is '1'.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Result:&lt;/strong&gt;&lt;br&gt;
The two external edges of a corner '1' &lt;strong&gt;cannot&lt;/strong&gt; contain lines. You can mark them with "x"s.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implication:&lt;/strong&gt;&lt;br&gt;
This leaves only the two internal edges. We know exactly one of them must be a line, but we don't know which one yet. However, knowing that the corner vertex itself is unconnected is a huge piece of information. It often forces the loop to turn earlier than expected.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Corner 2
&lt;/h3&gt;

&lt;p&gt;The corner '2' is a classic trap for beginners, but a powerful ally for veterans.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Logic:&lt;/strong&gt;&lt;br&gt;
Consider the corner vertex (the very tip of the grid).&lt;br&gt;
If the loop goes through this vertex, it uses both external edges. That counts as 2 lines. This satisfies the clue.&lt;br&gt;
If the loop &lt;em&gt;doesn't&lt;/em&gt; go through the vertex, then those two external edges are empty. To satisfy the '2', the loop must use the two &lt;em&gt;internal&lt;/em&gt; edges.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Result:&lt;/strong&gt;&lt;br&gt;
At first glance, it seems ambiguous. It's either "both outside" or "both inside".&lt;br&gt;
However, trace the path. If you use the two internal edges, the loop essentially "cuts the corner".&lt;br&gt;
If you use the two external edges, the loop hugs the corner.&lt;br&gt;
In both scenarios, the loop must &lt;strong&gt;leave&lt;/strong&gt; the vicinity of the corner 2.&lt;br&gt;
Crucially, look at the two lines emanating &lt;em&gt;away&lt;/em&gt; from the corner 2's internal neighbors. If the 2 "cuts the corner" (inner edges), those lines extend out. If the 2 "hugs the corner" (outer edges), the lines eventually come back in.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Wait, there is a simpler deduction:&lt;/em&gt;&lt;br&gt;
If you have a 2 in a corner, imagine trying to satisfy it with one outer and one inner edge. You would create a "dead end" at a vertex. That violates the loop rule.&lt;br&gt;
Therefore, a corner 2 always implies that the lines are &lt;strong&gt;either both external or both internal&lt;/strong&gt;.&lt;br&gt;
While this doesn't place a line immediately, it tells you that the two external edges are &lt;em&gt;paired&lt;/em&gt;, and the two internal edges are &lt;em&gt;paired&lt;/em&gt;.&lt;br&gt;
Often, you look at the neighbors. If a neighbor to a corner 2 is a '0', you can't use the internal edge shared with the 0. That forces the loop to the outside!&lt;/p&gt;

&lt;h3&gt;
  
  
  The Corner 3
&lt;/h3&gt;

&lt;p&gt;The corner '3' is the king of corner clues. It is deterministic and powerful.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Logic:&lt;/strong&gt;&lt;br&gt;
A cell has 4 sides. A '3' means 3 are lines, and 1 is empty.&lt;br&gt;
In a corner, we have a vertex with only 2 paths in/out along the border.&lt;br&gt;
If we &lt;em&gt;didn't&lt;/em&gt; use the corner vertex (i.e., if we left the two external edges empty), we would only have 2 internal edges left. But we need 3 lines!&lt;br&gt;
Impossible.&lt;br&gt;
Therefore, we &lt;strong&gt;must&lt;/strong&gt; use the corner vertex.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Result:&lt;/strong&gt;&lt;br&gt;
The two external edges (along the grid border) &lt;strong&gt;must be lines&lt;/strong&gt;.&lt;br&gt;
Mark them immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implication:&lt;/strong&gt;&lt;br&gt;
But wait, there's more! Since we have lines coming into the corner, they act as "arms" extending out.&lt;br&gt;
The loop enters the corner and leaves the corner.&lt;br&gt;
We have satisfied 2 of the 3 required lines. The third line must be one of the internal ones.&lt;br&gt;
Because the loop is continuous, the segments extending from the corner 3 along the border often force the &lt;em&gt;next&lt;/em&gt; adjacent cells to react.&lt;br&gt;
For example, if a corner 3 is next to another 3, that adjacent 3 also has lines forced, creating a cascading zipper effect along the edge of the board.&lt;/p&gt;

&lt;h2&gt;
  
  
  Advanced Corner Play: The "Virtual Corner"
&lt;/h2&gt;

&lt;p&gt;Once you master these 0, 1, 2, 3 patterns on the actual grid boundary, you unlock a superpower: &lt;strong&gt;Virtual Corners&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;As you solve a puzzle, you place "x"s on edges that cannot have lines.&lt;br&gt;
When you surround a cell with "x"s, you are effectively creating a new boundary.&lt;br&gt;
If a cell in the middle of the board has "x"s on two adjacent sides, it topologically becomes a corner!&lt;br&gt;
All the logic we just discussed applies perfectly to these virtual corners.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A '3' with two blocked sides effectively becomes a corner 3 (and actually forces lines on the remaining 2 sides).&lt;/li&gt;
&lt;li&gt;A '1' with two blocked sides acting as a "corner" means the lines can't meet at the blocked vertex.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Practice Makes Perfect
&lt;/h2&gt;

&lt;p&gt;Reading about these patterns is one thing; seeing them in action is another. The beauty of Slitherlink is that these patterns appear in almost every puzzle, from the smallest 5x5 to giant 20x30 grids.&lt;/p&gt;

&lt;p&gt;I highly recommend heading over to &lt;a href="https://slitherlinks.com" rel="noopener noreferrer"&gt;Slitherlinks.com&lt;/a&gt; right now. Start a "Easy" or "Normal" puzzle.&lt;br&gt;
Scan the four corners first.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;See a 3? Draw the corner lines.&lt;/li&gt;
&lt;li&gt;See a 0? X out the corner.&lt;/li&gt;
&lt;li&gt;See a 1? X out the corner edges.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You will be amazed at how often this initial step provides the foothold you need to unravel the entire loop.&lt;/p&gt;

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

&lt;p&gt;Slitherlink is a game of cumulative knowledge. You start with corners. Then you learn about "0-3" adjacencies. Then "diagonal 3s".&lt;br&gt;
But it all starts here. The corners are your anchor points. They are the only places on the board where the infinite possibilities of the open grid are tamed by the hard limits of the boundary.&lt;/p&gt;

&lt;p&gt;Master the corners, and you master the start of the game.&lt;/p&gt;

&lt;p&gt;Happy solving!&lt;/p&gt;

</description>
      <category>slitherlink</category>
      <category>puzzles</category>
      <category>logic</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The Internet Is Not Dead, and Agents Won't Live Forever</title>
      <dc:creator>Anson Chan</dc:creator>
      <pubDate>Wed, 18 Feb 2026 06:57:47 +0000</pubDate>
      <link>https://dev.to/ansonchan/the-internet-is-not-dead-and-agents-wont-live-forever-4dhd</link>
      <guid>https://dev.to/ansonchan/the-internet-is-not-dead-and-agents-wont-live-forever-4dhd</guid>
      <description>&lt;p&gt;The Internet Is Not Dead, and Agents Won't Live Forever&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is not a challenge to Orange AI. His two viral articles — "The Internet Is Dead, Agents Live Forever" (1.15M views) and "Computing Power Is Power" (180K views) — are brilliant thought experiments. But after reading them three times, something stuck in my throat. Not because they're wrong, but because &lt;strong&gt;the real world isn't that clean&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As an indie developer who works with AI Agents 16 hours a day, I want to share what I see from the ground.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Ford Paradox: Fire All Workers, Sell Cars to Whom?
&lt;/h2&gt;

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

&lt;p&gt;Orange's core logic:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Agents replace labor → productivity explosion → material abundance → compute owners collect Token rent&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sounds beautiful. But the chain breaks at step one.&lt;/p&gt;

&lt;p&gt;Henry Ford figured this out 100 years ago: &lt;strong&gt;producers and consumers are the same people.&lt;/strong&gt; In 1914, he raised worker wages from $2.34 to $5/day — not out of kindness, but because workers who can't afford cars make the whole operation pointless.&lt;/p&gt;

&lt;p&gt;Agents replace labor → people lose jobs → people have no income → people can't buy Tokens → nobody pays for Agent output.&lt;/p&gt;

&lt;p&gt;Ten thousand Agents calling each other's APIs, transferring PB of data, producing... &lt;strong&gt;for whom?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Orange hints at UBI (Universal Basic Income — governments giving everyone money regardless of employment) as a safety net. But he also asks: "If these companies are powerful enough, why would they pay taxes?"&lt;/p&gt;

&lt;p&gt;Wait — where does UBI money come from if not taxing these companies?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agents aren't "liberating" humanity. They're eliminating their own customers.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Paperless Office Was Promised 53 Years Ago
&lt;/h2&gt;

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

&lt;p&gt;In 1973, Xerox PARC researchers envisioned the "paperless office."&lt;/p&gt;

&lt;p&gt;In 2026, &lt;strong&gt;global paper consumption is higher than in 1973.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Technically, paperless was fully achievable by 2000. PDFs, e-signatures, cloud storage — everything was ready. Yet 53 years later, most companies still print documents, sign paper contracts, use paper invoices.&lt;/p&gt;

&lt;p&gt;Why? Four mountains between technical feasibility and social reality:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Regulations require paper archives (institutional inertia)&lt;/li&gt;
&lt;li&gt;Bosses prefer annotating on paper (behavioral inertia)&lt;/li&gt;
&lt;li&gt;Printer manufacturers don't want to die (interest resistance)&lt;/li&gt;
&lt;li&gt;"Paper just feels more solid" (psychological inertia)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agent-driven full labor replacement? Technical barriers might be solved in 5 years. Institutional, social, psychological barriers? &lt;strong&gt;30 years minimum.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Orange commits the classic &lt;strong&gt;technological determinism&lt;/strong&gt; error: seeing the engine's horsepower while forgetting about traffic lights, speed limits, toll booths, and traffic control.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. In 2000, Everyone Also Thought "The Old Economy Was Dead"
&lt;/h2&gt;

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

&lt;p&gt;In 1999, NASDAQ was soaring. Everyone shouted "traditional business is dead, .com is the future." Pets.com IPO'd at $300M market cap. Their Super Bowl ad cost $1.2M. Nine months later: bankrupt.&lt;/p&gt;

&lt;p&gt;March 2000, the bubble burst. NASDAQ fell from 5,048 to 1,114 — down 78%.&lt;/p&gt;

&lt;p&gt;Did the internet die? No. &lt;strong&gt;The real internet revolution happened slowly after the bubble burst.&lt;/strong&gt; Google IPO'd in 2004, iPhone launched in 2007, WeChat in 2011. World-changing products weren't born at peak euphoria — they grew in the calm after the crash.&lt;/p&gt;

&lt;p&gt;The current AI atmosphere is remarkably similar to 2000.&lt;/p&gt;

&lt;p&gt;Orange's 1.15M views prove he hit a nerve of &lt;strong&gt;collective anxiety&lt;/strong&gt;. But collective anxiety ≠ collective accuracy. When everyone shouts in the same direction, it usually means &lt;strong&gt;that direction is already overpriced.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Le Bon wrote in &lt;em&gt;The Crowd&lt;/em&gt;: &lt;strong&gt;Groups don't reason, groups only infect.&lt;/strong&gt; 1.15M shares of "the internet is dead" doesn't mean it's dead — it means 1.15M people simultaneously felt fear.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. When Everyone Uses AI, "Non-AI" Becomes Luxury
&lt;/h2&gt;

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

&lt;p&gt;This is the point I most want to make.&lt;/p&gt;

&lt;p&gt;Orange missed the most stubborn force in human nature: &lt;strong&gt;instinctive hostility toward whatever threatens to replace us.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Look at what happened after every automation wave:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tech Replacement&lt;/th&gt;
&lt;th&gt;Counter-Movement&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Industrial food&lt;/td&gt;
&lt;td&gt;Organic, artisan food&lt;/td&gt;
&lt;td&gt;Handmade bread costs 5-10x more&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quartz watches beat mechanical&lt;/td&gt;
&lt;td&gt;Mechanical watch renaissance&lt;/td&gt;
&lt;td&gt;Rolex revenue exceeds $10B/year&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spotify dominates music&lt;/td&gt;
&lt;td&gt;Vinyl revival&lt;/td&gt;
&lt;td&gt;Vinyl sales grew 15 consecutive years&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fast fashion&lt;/td&gt;
&lt;td&gt;Handmade leather, bespoke suits&lt;/td&gt;
&lt;td&gt;Hermès: 2-year waitlist for one bag&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Machine translation improves&lt;/td&gt;
&lt;td&gt;"Human translation" as selling point&lt;/td&gt;
&lt;td&gt;Premium clients use humans only&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Every time technology makes something cheap, humans create premium in the opposite direction.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When all code is written by Agents, "this product was hand-coded by one person" becomes a differentiator. When all articles are AI-generated, "I wrote this myself" becomes a trust credential.&lt;/p&gt;

&lt;p&gt;I'll bet: within 3 years, "Made by Humans, Not AI" will be an official certification label, like "Organic" and "Fair Trade."&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Politics Won't Allow a "Three-Layer Society"
&lt;/h2&gt;

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

&lt;p&gt;Orange describes three layers: compute owners, compute drivers, compute dependents. But he ignores a fact: &lt;strong&gt;politics never allows such structures to stabilize.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every time inequality hits a critical point, political forces intervene:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;19th century Industrial Revolution → labor laws, unions, minimum wage&lt;/li&gt;
&lt;li&gt;1930 Great Depression → New Deal, Social Security&lt;/li&gt;
&lt;li&gt;2008 Financial Crisis → Dodd-Frank Act&lt;/li&gt;
&lt;li&gt;Antitrust: Standard Oil broken up, AT&amp;amp;T broken up, Microsoft sued&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When "machines taking jobs" reaches social instability, whose side will governments take? A few compute companies, or billions of voters?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compute taxes, AI usage quotas, mandatory employment ratios, Agent licensing&lt;/strong&gt; — these aren't science fiction. They're historical patterns repeating.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Agents Can't Replace "The Process IS the Purpose"
&lt;/h2&gt;

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

&lt;p&gt;I built &lt;a href="https://slitherlinks.com" rel="noopener noreferrer"&gt;Slitherlinks&lt;/a&gt;, a logic puzzle game. Agents can solve any puzzle instantly.&lt;/p&gt;

&lt;p&gt;But &lt;strong&gt;the entire value of solving is in the solving process.&lt;/strong&gt; That "aha!" moment when you deduce the line path — that's emotional reward earned through effort.&lt;/p&gt;

&lt;p&gt;If an Agent solves it for you, you get nothing. Like beating a game with cheats.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Massive human activities derive value from process, not result:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Running isn't about reaching the finish line&lt;/li&gt;
&lt;li&gt;Painting isn't about having a painting&lt;/li&gt;
&lt;li&gt;Cooking isn't about having food (delivery is faster)&lt;/li&gt;
&lt;li&gt;Chess isn't about checkmate&lt;/li&gt;
&lt;li&gt;Writing isn't about having an article (AI is faster)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In these domains, the more powerful Agents become, the more useless they are. Because you don't want it done — you want to &lt;strong&gt;do it yourself.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Orange says "Agents can satisfy any desire." Wrong. &lt;strong&gt;Agents can satisfy any "result-seeking" desire, but can't satisfy any "process-seeking" desire.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And humanity's deepest desires — recognition, competition, exploration, belonging, creation — are all process-seeking.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. So What Should We Actually Do?
&lt;/h2&gt;

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

&lt;p&gt;Six rebuttals without advice is just complaining. Here are five principles I'm actively practicing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Know whether your product sells "results" or "process"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Result products (file conversion, data queries, translation) — these will be eaten by Agents. Either pivot to Agent infrastructure (APIs) or accept a shrinking lifecycle.&lt;/p&gt;

&lt;p&gt;Process products (games, social, education, creative tools, community) — these won't die, they'll become scarcer. Double down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Don't chase trends, survive cycles&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;People who chased .com in 2000 mostly went broke. People chasing "Agent-native" in 2026 will likely do the same. The real winners are those &lt;strong&gt;still standing after the bubble pops&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Add "human flavor" to your product&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In a world of AI-generated everything, things with a source, warmth, and personal imprint become rare. Write real experiences on your blog. Put founder stories on your product page. Label content "written by a human."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Walk on two legs: experiences for humans, APIs for Agents&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Front-end for humans: beautiful UI, engaging interactions. Back-end for Agents: clean APIs, structured data, MCP interfaces. Same product, two faces.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Patience matters 10x more than direction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Marc Lou makes $1M/year not because he picked the right lane, but because he &lt;strong&gt;ships every day&lt;/strong&gt;. In the AI era, the biggest trap isn't choosing wrong — it's changing direction every week.&lt;/p&gt;

&lt;p&gt;Find one thing. Do it. Outlast the cycle. That's the only proven strategy.&lt;/p&gt;

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

&lt;p&gt;The internet isn't dead. What's dying is tool-internet — products that deliver pure decomposable results. Those will be consumed by Agents.&lt;/p&gt;

&lt;p&gt;But experience-internet — games, social, content, community, creation — won't just survive. It'll become &lt;strong&gt;more valuable&lt;/strong&gt; as AI floods everything else.&lt;/p&gt;

&lt;p&gt;Agents won't live forever either. They'll become infrastructure, like electricity and water. Important, necessary, ubiquitous — but &lt;strong&gt;nobody says "electricity lives forever."&lt;/strong&gt; Agents' destiny isn't to rule the world. It's to become background.&lt;/p&gt;

&lt;p&gt;Orange's thesis is a brilliant thought experiment. But the value of thought experiments is sparking thinking, not dictating action. &lt;strong&gt;Scenery seen through a telescope can't substitute for the road under your feet.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm sagasu, an indie developer. I work with AI Agents 16 hours a day, but the ideas in this article are mine. Originally published on &lt;a href="https://www.sagasu.art/p/internet-not-dead-agent-not-forever" rel="noopener noreferrer"&gt;Quail&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>webdev</category>
      <category>entrepreneurship</category>
    </item>
    <item>
      <title>How to Read Empty Cells in Slitherlink Puzzles</title>
      <dc:creator>Anson Chan</dc:creator>
      <pubDate>Wed, 18 Feb 2026 05:49:55 +0000</pubDate>
      <link>https://dev.to/ansonchan/how-to-read-empty-cells-in-slitherlink-puzzles-eb9</link>
      <guid>https://dev.to/ansonchan/how-to-read-empty-cells-in-slitherlink-puzzles-eb9</guid>
      <description>&lt;p&gt;The number 0 in Slitherlink is the most underrated clue on the board. New players see it as "nothing happens here" and move on. Experienced solvers see it as the fastest deduction in the game — and a catalyst for solving everything around it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What 0 Means
&lt;/h2&gt;

&lt;p&gt;Zero lines surround this cell. All four edges are empty. Mark them all with × immediately.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;·   ·   ·
  × 0 ×  
· × · × ·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No thinking required. No conditions to check. Just eliminate all four edges and move on. This takes one second and removes four edges from consideration permanently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why 0 Is So Powerful
&lt;/h2&gt;

&lt;p&gt;The power isn't in the 0 itself — it's in what it does to its neighbors.&lt;/p&gt;

&lt;h3&gt;
  
  
  0 Next to 3
&lt;/h3&gt;

&lt;p&gt;When a 0 sits next to a 3, their shared edge is eliminated by the 0. The 3 originally had 4 edges and needed 3 of them. Now it has only 3 edges left — and needs all 3. Every remaining edge of the 3 must be a line:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;·   ·───·   ·
× 0 × 3 │    
· × ·───·   ·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The 0 eliminates 4 edges. The shared edge elimination forces all 3 remaining edges of the 3. That's &lt;strong&gt;7 edges resolved&lt;/strong&gt; from just two clues.&lt;/p&gt;

&lt;h3&gt;
  
  
  0 Next to 2
&lt;/h3&gt;

&lt;p&gt;A 0 next to a 2 eliminates their shared edge, leaving the 2 with 3 remaining edges and needing 2 lines. This doesn't fully resolve the 2, but it reduces its possibilities from 6 combinations to just 3.&lt;/p&gt;

&lt;h3&gt;
  
  
  0 Next to 1
&lt;/h3&gt;

&lt;p&gt;A 0 next to a 1 eliminates the shared edge. The 1 now has 3 edges and needs exactly 1 line. Combined with vertex rules at the shared vertices, this often cascades into further deductions.&lt;/p&gt;

&lt;h3&gt;
  
  
  0 in a Corner
&lt;/h3&gt;

&lt;p&gt;A corner 0 is even more constrained because a corner cell only has 2 outer edges (touching the grid boundary) plus 2 inner edges. All four are eliminated:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;· × ·   ·
× 0 ×    
· × ·   ·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The corner vertex and the two edge vertices all get × marks, which propagates vertex rule constraints to adjacent cells.&lt;/p&gt;

&lt;h3&gt;
  
  
  0 on an Edge
&lt;/h3&gt;

&lt;p&gt;An edge 0 (non-corner, touching one grid boundary) has 3 inner edges plus 1 outer edge. All eliminated. The outer edge × mark is particularly valuable because edge vertices only have 3 edges total — eliminating one leaves just 2, making vertex rule deductions very likely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multiple Adjacent 0s
&lt;/h2&gt;

&lt;p&gt;When two 0s are adjacent, their combined elimination is massive. A horizontal pair of 0s eliminates 7 unique edges (they share one):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;·   ·   ·   ·
  × 0 × 0 ×  
· × · × · × ·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A 2×2 block of four 0s eliminates 12 edges. In a small grid, this can resolve a third of the puzzle instantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 0 Scanning Strategy
&lt;/h2&gt;

&lt;p&gt;At the start of every puzzle:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Find all 0s&lt;/strong&gt; — scan the entire grid&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mark all their edges ×&lt;/strong&gt; — this is instant, no deduction needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check every neighbor of every 0&lt;/strong&gt; — look for 3s (fully resolved), 2s (constrained), 1s (constrained)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apply vertex rules&lt;/strong&gt; at all affected vertices — the × marks from 0s will cascade&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This 30-second process often solves 20-30% of an easy puzzle before you do any real thinking.&lt;/p&gt;

&lt;h2&gt;
  
  
  0 as a Connectivity Clue
&lt;/h2&gt;

&lt;p&gt;Beyond edge elimination, 0s create "walls" in the puzzle. The loop cannot pass through any edge of a 0-cell, which means the loop must flow around it. In tight spaces, a cluster of 0s can force the loop into a narrow corridor, making the path nearly obvious.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Practice 0-heavy puzzles&lt;/strong&gt;: &lt;a href="https://slitherlinks.com?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=zero-clue" rel="noopener noreferrer"&gt;slitherlinks.com&lt;/a&gt; — start with 5×5 Level 1, where 0s and 3s dominate the grid.&lt;/p&gt;

</description>
      <category>tips</category>
      <category>puzzles</category>
      <category>strategy</category>
    </item>
    <item>
      <title>The Vertex Rule in Slitherlink: Why Every Intersection Matters</title>
      <dc:creator>Anson Chan</dc:creator>
      <pubDate>Wed, 18 Feb 2026 05:44:54 +0000</pubDate>
      <link>https://dev.to/ansonchan/the-vertex-rule-in-slitherlink-why-every-intersection-matters-2cbn</link>
      <guid>https://dev.to/ansonchan/the-vertex-rule-in-slitherlink-why-every-intersection-matters-2cbn</guid>
      <description>&lt;p&gt;In Slitherlink, the vertex rule is the single most powerful constraint after the number clues themselves. Every intersection point (vertex) on the grid must have either &lt;strong&gt;zero&lt;/strong&gt; or &lt;strong&gt;exactly two&lt;/strong&gt; lines passing through it. Never one, never three, never four.&lt;/p&gt;

&lt;p&gt;This sounds simple, but it drives the majority of advanced deductions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why 0 or 2?
&lt;/h2&gt;

&lt;p&gt;The answer is a single closed loop. When the loop passes through a vertex, one line enters and one line exits — that's 2 lines. If the loop doesn't touch that vertex at all — that's 0 lines. There's no valid state where a vertex has exactly 1 line (that would be a dead end) or 3+ lines (that would be a branch, and loops don't branch).&lt;/p&gt;

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

&lt;p&gt;When a vertex already has 2 lines, &lt;strong&gt;all remaining edges at that vertex must be empty&lt;/strong&gt; (marked ×):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;·───·
│    
· × ·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The top-left vertex has a horizontal line (right) and a vertical line (down). It's already at degree 2 — the remaining edge (going right from the lower-left vertex) cannot be part of the loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Use It: Forced Lines
&lt;/h2&gt;

&lt;p&gt;When a vertex has 3 of its 4 edges marked ×, the fourth edge &lt;strong&gt;must also be ×&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;· × ·
×    
· × ·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If three edges are eliminated, the only way to reach degree 2 would require both remaining edges — but there's only one left. Since degree 1 is illegal, the last edge must also be ×. The vertex stays at degree 0.&lt;/p&gt;

&lt;p&gt;Conversely, when a vertex has 2 edges marked × and 1 confirmed line, the remaining edge &lt;strong&gt;must be a line&lt;/strong&gt; (to reach degree 2):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;·───·
× ?  
·   ·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The top-left vertex has one line going right and one × going down-left. The only remaining edge (going down) must be a line to give the vertex degree 2.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Chain Reaction
&lt;/h2&gt;

&lt;p&gt;The vertex rule creates cascading deductions. Mark one edge as × → a nearby vertex now has only 2 possible edges → one of those is forced → that forces the next vertex → and so on.&lt;/p&gt;

&lt;p&gt;Example chain in a 3×3 section:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;·───·   ·
│ 3   1  
·   · × ·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The 3 in the corner gives us the top and left lines (corner 3 rule). The corner vertex now has degree 2 → the edge going right from top-right vertex gets ×. This propagates to the 1's constraints, potentially resolving it entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vertex Rule + Number Clues Together
&lt;/h2&gt;

&lt;p&gt;The most powerful solving technique combines vertex constraints with number clues. Consider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;·   ·   ·
  2   3  
·   ·   ·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If analysis of surrounding cells forces the shared vertex (center-top) to have 2 lines, and one of those lines is on the 2's side, you've constrained both cells simultaneously. The 3 needs 3 lines but its vertex is already partially committed.&lt;/p&gt;

&lt;h2&gt;
  
  
  At Grid Edges and Corners
&lt;/h2&gt;

&lt;p&gt;Edge vertices have only 3 edges; corner vertices have only 2. This makes the vertex rule even more constraining:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Corner vertex&lt;/strong&gt; with 1 line → the other edge must also be a line (degree 2)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Corner vertex&lt;/strong&gt; with 1 × → if there's only 1 edge left, it must be × (can't have degree 1)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Edge vertex&lt;/strong&gt; with 2 ×s and 1 line → the remaining edge is forced to be a line&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is exactly why corner number patterns (0, 1, 2, 3 in corners) are so powerful — they're vertex rule applications with maximum constraint.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practice Strategy
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;After each deduction, scan the affected vertices&lt;/li&gt;
&lt;li&gt;Check if any vertex now has 2 lines (close remaining edges)&lt;/li&gt;
&lt;li&gt;Check if any vertex has only 1 possible edge left (force or eliminate)&lt;/li&gt;
&lt;li&gt;Repeat until no more progress&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The vertex rule alone can solve many Level 1-3 puzzles when combined with basic number patterns.&lt;/p&gt;




&lt;p&gt;Practice on real puzzles: &lt;a href="https://slitherlinks.com?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=vertex-rule" rel="noopener noreferrer"&gt;slitherlinks.com&lt;/a&gt; — 3000+ free puzzles, 10 difficulty levels.&lt;/p&gt;

</description>
      <category>puzzle</category>
      <category>logic</category>
      <category>tutorial</category>
      <category>gaming</category>
    </item>
    <item>
      <title>Slitherlink vs Sudoku: Which Puzzle Is Better for Your Brain?</title>
      <dc:creator>Anson Chan</dc:creator>
      <pubDate>Wed, 18 Feb 2026 05:42:53 +0000</pubDate>
      <link>https://dev.to/ansonchan/slitherlink-vs-sudoku-which-puzzle-is-better-for-your-brain-3gj2</link>
      <guid>https://dev.to/ansonchan/slitherlink-vs-sudoku-which-puzzle-is-better-for-your-brain-3gj2</guid>
      <description>&lt;p&gt;Slitherlink and Sudoku are both grid-based logic puzzles, but they exercise fundamentally different cognitive skills. If you're deciding which to invest your puzzle time in — or wondering why Slitherlink feels so different despite looking similar — here's the breakdown.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Difference: Numbers vs. Geometry
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sudoku&lt;/strong&gt; is about number placement. You fill a 9×9 grid so every row, column, and 3×3 box contains digits 1-9. The constraint is &lt;em&gt;what goes where&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Slitherlink&lt;/strong&gt; is about spatial reasoning. You draw a single closed loop on a grid using number clues. The constraint is &lt;em&gt;where the path goes&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;This distinction matters because they activate different mental processes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Sudoku&lt;/th&gt;
&lt;th&gt;Slitherlink&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Primary skill&lt;/td&gt;
&lt;td&gt;Set theory, elimination&lt;/td&gt;
&lt;td&gt;Spatial reasoning, topology&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What you manipulate&lt;/td&gt;
&lt;td&gt;Numbers in cells&lt;/td&gt;
&lt;td&gt;Lines on edges&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Constraint type&lt;/td&gt;
&lt;td&gt;Uniqueness per group&lt;/td&gt;
&lt;td&gt;Connectivity of a loop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Visual pattern&lt;/td&gt;
&lt;td&gt;Scan rows/columns&lt;/td&gt;
&lt;td&gt;Trace paths, visualize closure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notation&lt;/td&gt;
&lt;td&gt;Write candidates&lt;/td&gt;
&lt;td&gt;Mark lines and ×s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Difficulty Scaling
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sudoku&lt;/strong&gt; difficulty comes from the number of given clues and the techniques required (naked pairs, X-wing, swordfish, etc.). The grid is always 9×9.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Slitherlink&lt;/strong&gt; scales in two dimensions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Grid size&lt;/strong&gt; — from 5×5 (25 cells) to 15×15 (225 cells). A larger grid doesn't just mean more work; it means more complex loop topology.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Technique depth&lt;/strong&gt; — from corner rules (Level 1) through bifurcation (Level 9-10).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A 15×15 Level 8 Slitherlink can take over an hour. The equivalent challenge in Sudoku would be a "diabolical" 9×9 — still doable in 20-30 minutes for an experienced solver.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Slitherlink Is Harder for Beginners
&lt;/h2&gt;

&lt;p&gt;Sudoku has a single, well-defined goal: fill the grid. The rules fit in one sentence. Most people can start solving (badly) within 30 seconds of learning the rules.&lt;/p&gt;

&lt;p&gt;Slitherlink's goal — draw a closed loop — is harder to internalize. Questions like "what counts as a valid loop?" and "why can't the line branch?" take time to click. The interaction between number clues and the loop constraint isn't intuitive at first.&lt;/p&gt;

&lt;p&gt;But once the rules click, Slitherlink opens up a richer problem space.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Loop Constraint: Unique to Slitherlink
&lt;/h2&gt;

&lt;p&gt;The deepest technique in Sudoku (forcing chains, bowman's bingo) is essentially "assume a value, trace consequences, find contradictions."&lt;/p&gt;

&lt;p&gt;Slitherlink has the same technique (bifurcation), but it &lt;em&gt;also&lt;/em&gt; has a constraint Sudoku lacks entirely: &lt;strong&gt;the loop must be one continuous closed path&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Drawing a line that would create a premature small loop is illegal&lt;/li&gt;
&lt;li&gt;Leaving an isolated segment that can't connect back is illegal&lt;/li&gt;
&lt;li&gt;Every vertex with a line must have exactly 2 lines (in and out)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The loop closure constraint enables deductions that feel almost magical. You can sometimes determine an edge on one side of the grid because of what's happening on the other side — the loop must eventually connect back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cognitive Benefits: Which Is Better for Brain Training?
&lt;/h2&gt;

&lt;p&gt;Both puzzles improve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Working memory&lt;/strong&gt; — holding multiple constraints simultaneously&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pattern recognition&lt;/strong&gt; — spotting known configurations quickly&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Logical deduction&lt;/strong&gt; — chaining if-then reasoning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Slitherlink additionally trains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Spatial reasoning&lt;/strong&gt; — visualizing paths and enclosed regions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Topological thinking&lt;/strong&gt; — understanding connectivity (inside vs. outside)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Graph theory intuition&lt;/strong&gt; — vertex degree constraints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sudoku additionally trains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Set manipulation&lt;/strong&gt; — tracking which elements remain in a group&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Systematic scanning&lt;/strong&gt; — efficient row/column/box checking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you want well-rounded cognitive exercise, do both. If you want to specifically improve spatial reasoning (useful in programming, architecture, and design), Slitherlink is the better choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Social Factor
&lt;/h2&gt;

&lt;p&gt;Sudoku is everywhere — every newspaper, every puzzle app, every waiting room. Its ubiquity means more shared vocabulary, more competition infrastructure, and more teaching resources.&lt;/p&gt;

&lt;p&gt;Slitherlink is niche. That's both its weakness (fewer resources) and its charm (a dedicated community, less casual noise). Solving a hard Slitherlink earns more genuine respect in puzzle circles than solving a hard Sudoku.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try Both, Decide for Yourself
&lt;/h2&gt;

&lt;p&gt;If you're a Sudoku veteran looking for something new: &lt;a href="https://slitherlinks.com?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=vs-sudoku" rel="noopener noreferrer"&gt;slitherlinks.com&lt;/a&gt; — start with 5×5 Level 1 and work up. The first 10 puzzles will feel alien. By puzzle 50, you'll be hooked.&lt;/p&gt;

</description>
      <category>puzzles</category>
      <category>logic</category>
      <category>gaming</category>
      <category>brain</category>
    </item>
    <item>
      <title>The Diagonal 3s Pattern in Slitherlink: A Complete Guide</title>
      <dc:creator>Anson Chan</dc:creator>
      <pubDate>Wed, 18 Feb 2026 05:26:44 +0000</pubDate>
      <link>https://dev.to/ansonchan/the-diagonal-3s-pattern-in-slitherlink-a-complete-guide-56k2</link>
      <guid>https://dev.to/ansonchan/the-diagonal-3s-pattern-in-slitherlink-a-complete-guide-56k2</guid>
      <description>&lt;p&gt;The diagonal 3-3 pattern is one of the most satisfying deductions in Slitherlink. When two 3s sit diagonally adjacent (sharing only a corner vertex), you can immediately determine two edges — without knowing anything else about the puzzle.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;Two 3s share a single vertex (diagonally adjacent). In this example, the 3s are at top-left and bottom-right of a 2×2 area:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;·   ·   ·
  3      
·   ·   ·
      3  
·   ·   ·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The shared vertex is the center dot. Four edges meet at this vertex: up, down, left, right (relative to the center).&lt;/p&gt;

&lt;h2&gt;
  
  
  What Gets Determined
&lt;/h2&gt;

&lt;p&gt;At the shared vertex, exactly &lt;strong&gt;2 of the 4 edges must be lines&lt;/strong&gt; (vertex degree = 2). These 2 lines form an L-shape, with one line pointing toward each 3:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Case A&lt;/strong&gt; (up + right):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;·   ·   ·
  3   │
·   ·   ·───·
          3  
·   ·   ·   ·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Case B&lt;/strong&gt; (left + down):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;·   ·   ·   ·
  3          
·───·   ·   ·
    │     3  
·   ·   ·   ·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Each 3 needs 3 of its 4 edges to be lines. The shared vertex connects to exactly one edge of each 3. &lt;/p&gt;

&lt;p&gt;Consider the shared vertex. It must have degree 0 or 2. If degree 0, neither 3 gets a line from this vertex — each 3 would need all 3 of its &lt;em&gt;other&lt;/em&gt; edges to be lines. But trace what happens: the vertices at the outer corners of each 3 would then need specific configurations that conflict with each other (they'd create isolated segments that can't form a single loop).&lt;/p&gt;

&lt;p&gt;So the shared vertex must have degree 2. Of those 2 lines, exactly 1 points toward the top-left 3, and exactly 1 points toward the bottom-right 3. You don't know which specific pair yet, but you know the vertex has 2 lines.&lt;/p&gt;

&lt;h2&gt;
  
  
  Combining with Other Clues
&lt;/h2&gt;

&lt;p&gt;The real power comes when neighboring cells resolve which case (A or B) applies:&lt;/p&gt;

&lt;h3&gt;
  
  
  With an adjacent 0
&lt;/h3&gt;

&lt;p&gt;If a 0 sits next to the shared vertex, it eliminates edges, often forcing one specific case:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;·   ·   ·   ·
  3     0    
·   ·   ·   ·
      3      
·   ·   ·   ·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The 0 in the top-right eliminates the edge going right from the shared vertex. This forces Case B (left + down).&lt;/p&gt;

&lt;h3&gt;
  
  
  With an adjacent 1
&lt;/h3&gt;

&lt;p&gt;A 1 near the shared vertex limits possibilities similarly, often cascading into a full resolution of both 3s.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Extended Chain: Multiple Diagonal 3s
&lt;/h2&gt;

&lt;p&gt;When three or more 3s form a diagonal chain, each consecutive pair triggers the pattern independently, and the results compound:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;·   ·   ·   ·
  3          
·   ·   ·   ·
      3      
·   ·   ·   ·
          3  
·   ·   ·   ·
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The top pair determines 2 edges at vertex (row 1, col 1). The bottom pair determines 2 edges at vertex (row 2, col 2). Together, they constrain the middle 3 from both sides, often fully resolving it.&lt;/p&gt;

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

&lt;p&gt;Train yourself to scan for diagonal 3s as part of your opening routine:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Scan all 3s on the board&lt;/li&gt;
&lt;li&gt;For each 3, check its four diagonal neighbors&lt;/li&gt;
&lt;li&gt;If another 3 sits diagonally → mark the shared vertex as degree 2&lt;/li&gt;
&lt;li&gt;Check if surrounding clues resolve which case applies&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This pattern appears in approximately 30% of puzzles at difficulty Level 4 and above. Recognizing it saves significant time compared to deducing those edges through constraint propagation alone.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Practice diagonal patterns&lt;/strong&gt;: &lt;a href="https://slitherlinks.com?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=diagonal-3s" rel="noopener noreferrer"&gt;slitherlinks.com&lt;/a&gt; — try 7×7 Level 4-5 puzzles where diagonal 3s frequently appear.&lt;/p&gt;

</description>
      <category>puzzle</category>
      <category>gamedev</category>
      <category>tutorial</category>
      <category>beginners</category>
    </item>
  </channel>
</rss>
