<?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: hcacode</title>
    <description>The latest articles on DEV Community by hcacode (@hcacode).</description>
    <link>https://dev.to/hcacode</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%2F3842009%2F85fbabe3-8df9-4053-a4e6-fa236079cf75.png</url>
      <title>DEV Community: hcacode</title>
      <link>https://dev.to/hcacode</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hcacode"/>
    <language>en</language>
    <item>
      <title>I built a minimal task manager with Next.js and Turso — here's what I learned</title>
      <dc:creator>hcacode</dc:creator>
      <pubDate>Sun, 29 Mar 2026 17:47:42 +0000</pubDate>
      <link>https://dev.to/hcacode/i-built-a-minimal-task-manager-with-nextjs-and-turso-heres-what-i-learned-5hce</link>
      <guid>https://dev.to/hcacode/i-built-a-minimal-task-manager-with-nextjs-and-turso-heres-what-i-learned-5hce</guid>
      <description>&lt;p&gt;&lt;strong&gt;The problem&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I tried Todoist, Notion, TickTick — all great tools. But I kept spending more time tweaking my system than actually getting things done.&lt;/p&gt;

&lt;p&gt;I wanted something dead simple: show me today's tasks, let me check them off, move on.&lt;/p&gt;

&lt;p&gt;So I built Daybrick.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The concept&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Daybrick is a daily task manager built around one idea: one day at a time.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Duties — areas of responsibility (Work, Health, Learning) that group your tasks&lt;/li&gt;
&lt;li&gt;Tasks — scheduled for a specific day, so you only see what matters today&lt;/li&gt;
&lt;li&gt;Habits — recurring tasks with streak tracking&lt;/li&gt;
&lt;li&gt;Paths — multi-day goals with progress visualization&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No kanban boards, no AI, no complexity. Just your day, broken into bricks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The stack&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next.js 16 (App Router)&lt;/li&gt;
&lt;li&gt;React 19&lt;/li&gt;
&lt;li&gt;Turso (SQLite at the edge)&lt;/li&gt;
&lt;li&gt;Drizzle ORM&lt;/li&gt;
&lt;li&gt;Vercel for hosting and cron jobs&lt;/li&gt;
&lt;li&gt;Resend for transactional emails&lt;/li&gt;
&lt;li&gt;Web Push API for notifications&lt;/li&gt;
&lt;li&gt;PostHog for privacy-friendly analytics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some technical decisions worth sharing&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Turso over Postgres?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SQLite is fast, simple, and Turso gives you edge replication for free. For a single-user-per-request app like a task manager, it's a perfect fit. Drizzle ORM makes the DX feel no different from Postgres.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PWA over native&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I wanted Daybrick on both desktop and mobile without maintaining two codebases. A PWA with a service worker handles push notifications, offline capability, and "Add to Home Screen" — close enough to native for a productivity tool.&lt;/p&gt;

&lt;p&gt;Push notifications that actually work&lt;/p&gt;

&lt;p&gt;This was the trickiest part. A few gotchas I hit:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Chrome deduplicates notifications by tag — if you send the same tag twice, the second one silently replaces the first. I append Date.now() to make each tag unique.&lt;/li&gt;
&lt;li&gt;event.data.json() can crash your service worker — a malformed payload kills the push handler for all future notifications. Always wrap it in try/catch.&lt;/li&gt;
&lt;li&gt;Multi-device support — storing a single "notifications enabled" flag per user doesn't work. If you toggle off on your phone, your laptop stops getting notifications too. I store
subscriptions per device and check active subscriptions directly.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Localization without URL params&lt;/p&gt;

&lt;p&gt;Daybrick supports English and Turkish. Instead of /en/dashboard or /tr/dashboard, the locale is stored in a cookie and the user's DB profile. Cleaner URLs, simpler routing, same result.&lt;/p&gt;

&lt;p&gt;Emails that match the user's language&lt;/p&gt;

&lt;p&gt;All transactional emails (OTP, welcome, password reset, "we miss you") pull from a centralized i18n module, so a Turkish user gets Turkish emails automatically.&lt;/p&gt;

&lt;p&gt;What I'd do differently&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start with semantic release from day one. I added it later and had to retrofit conventional commits. Setting it up early is 10 minutes of work that saves hours.&lt;/li&gt;
&lt;li&gt;Don't trust toISOString() for dates. It converts to UTC, which shifts your dates. Use local date methods (getFullYear(), getMonth(), getDate()) when working with calendar dates.&lt;/li&gt;
&lt;li&gt;Design your notification system for multiple devices from the start. Retrofitting multi-device support after building around a user-level flag was painful.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result&lt;/p&gt;

&lt;p&gt;I've been using Daybrick daily for my own work. It's minimal, it's fast, and it stays out of my way — which is exactly what I wanted.&lt;/p&gt;

&lt;p&gt;If you want to try it: 👉 &lt;a href="https://daybrick.io" rel="noopener noreferrer"&gt;daybrick.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's free. I'd love feedback from the dev community — especially on the UX and mobile experience.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>productivity</category>
      <category>typescript</category>
    </item>
    <item>
      <title>I Built 71+ Free Browser Tools Because Every "Free" Tool Site Is Terrible</title>
      <dc:creator>hcacode</dc:creator>
      <pubDate>Tue, 24 Mar 2026 17:35:40 +0000</pubDate>
      <link>https://dev.to/hcacode/i-built-71-free-browser-tools-because-every-free-tool-site-is-terrible-2nd5</link>
      <guid>https://dev.to/hcacode/i-built-71-free-browser-tools-because-every-free-tool-site-is-terrible-2nd5</guid>
      <description>&lt;p&gt;Every developer has this workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Need to format some JSON&lt;/li&gt;
&lt;li&gt;Google "json formatter online"&lt;/li&gt;
&lt;li&gt;Land on a site with 47 ads, a cookie banner, and a newsletter popup&lt;/li&gt;
&lt;li&gt;Paste your data into a text box that sends it to god knows where&lt;/li&gt;
&lt;li&gt;Get your formatted JSON and close the tab in disgust&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I got tired of this. So I built &lt;strong&gt;FastUtil&lt;/strong&gt; — a collection of 71+ browser-based utility tools where everything runs client-side. No ads, no sign-ups, no data ever leaves your browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Inside
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Image Tools&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SVG to PNG converter&lt;/li&gt;
&lt;li&gt;Image resizer &amp;amp; compressor&lt;/li&gt;
&lt;li&gt;Favicon generator&lt;/li&gt;
&lt;li&gt;QR code generator&lt;/li&gt;
&lt;li&gt;Screenshot mockup creator&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Developer Tools&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JSON formatter &amp;amp; validator&lt;/li&gt;
&lt;li&gt;Base64 encoder/decoder&lt;/li&gt;
&lt;li&gt;Hash generator (MD5, SHA-1, SHA-256)&lt;/li&gt;
&lt;li&gt;Regex tester with live highlighting&lt;/li&gt;
&lt;li&gt;JWT decoder&lt;/li&gt;
&lt;li&gt;CSS minifier/beautifier&lt;/li&gt;
&lt;li&gt;URL encoder/decoder&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Text Tools&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Markdown editor with live preview&lt;/li&gt;
&lt;li&gt;Word &amp;amp; character counter&lt;/li&gt;
&lt;li&gt;Case converter&lt;/li&gt;
&lt;li&gt;Lorem Ipsum generator&lt;/li&gt;
&lt;li&gt;Text diff checker&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Color Tools&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Color picker &amp;amp; converter (HEX, RGB, HSL)&lt;/li&gt;
&lt;li&gt;Palette generator&lt;/li&gt;
&lt;li&gt;Contrast checker (WCAG compliance)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And about 40 more — check the full list at &lt;a href="https://fastutil.app" rel="noopener noreferrer"&gt;fastutil.app&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Client-Side Only?
&lt;/h2&gt;

&lt;p&gt;This was rule #1 from day one. When you paste JSON with API keys, or convert an image with sensitive content, that data should never leave your machine. Every tool in FastUtil processes&lt;br&gt;
   everything in the browser using JavaScript. There is no backend. No API calls. No analytics tracking your input.&lt;/p&gt;

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

&lt;p&gt;For those who care about what's under the hood:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Next.js 16&lt;/strong&gt; with App Router&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static generation&lt;/strong&gt; — 400+ pages pre-rendered at build time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;next-intl&lt;/strong&gt; for i18n across 20 languages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;shadcn/ui&lt;/strong&gt; for the component library&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vitest&lt;/strong&gt; with React Testing Library (253 tests)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deployed on Vercel&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The i18n Challenge
&lt;/h3&gt;

&lt;p&gt;This was honestly the hardest part. Each tool has its own translation file with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tool name and descriptions&lt;/li&gt;
&lt;li&gt;All UI strings (labels, placeholders, buttons, error messages)&lt;/li&gt;
&lt;li&gt;FAQ content (3-5 Q&amp;amp;A pairs per tool)&lt;/li&gt;
&lt;li&gt;Educational content (200+ words per tool)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Multiply that by 20 languages and 71 tools. That's thousands of translation keys. The file structure looks like this:&lt;/p&gt;

&lt;p&gt;messages/&lt;br&gt;
    en/&lt;br&gt;
      common.json&lt;br&gt;
      tools/&lt;br&gt;
        json-formatter.json&lt;br&gt;
        svg-to-png.json&lt;br&gt;
        ...&lt;br&gt;
    fr/&lt;br&gt;
      common.json&lt;br&gt;
      tools/&lt;br&gt;
        json-formatter.json&lt;br&gt;
        ...&lt;br&gt;
    ... (20 locales)&lt;/p&gt;

&lt;p&gt;A merge script combines everything at load time into the single object that next-intl expects. Keeping all of this in sync is a challenge, but it means the site works properly in Arabic&lt;br&gt;
   (RTL), Japanese, Chinese, and 17 other languages.&lt;/p&gt;

&lt;h3&gt;
  
  
  Static Generation at Scale
&lt;/h3&gt;

&lt;p&gt;Every tool page is generated for every locale at build time:&lt;/p&gt;

&lt;p&gt;/tools/json-formatter          (English, clean URL)&lt;br&gt;
  /fr/tools/json-formatter       (French)&lt;br&gt;
  /ja/tools/json-formatter       (Japanese)&lt;br&gt;
  /ar/tools/json-formatter       (Arabic, RTL)&lt;/p&gt;

&lt;p&gt;That's 71 tools × 20 locales = 1,420+ tool pages, plus home pages, category pages, and blog posts. The build outputs 400+ static HTML files. Everything is fast because there's nothing&lt;br&gt;
  to compute at request time.&lt;/p&gt;

&lt;h3&gt;
  
  
  SEO Architecture
&lt;/h3&gt;

&lt;p&gt;Each tool page is server-rendered with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Translated metadata (title, description, keywords, OpenGraph, Twitter cards)&lt;/li&gt;
&lt;li&gt;JSON-LD structured data (WebApplication + BreadcrumbList + FAQPage)&lt;/li&gt;
&lt;li&gt;Canonical URLs and hreflang alternates for all 20 locales&lt;/li&gt;
&lt;li&gt;FAQ section rendered on the page (also feeds Google's "People Also Ask")&lt;/li&gt;
&lt;li&gt;Educational content section (200+ words of crawlable text per tool)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also generate &lt;code&gt;llms.txt&lt;/code&gt; and &lt;code&gt;llms-full.txt&lt;/code&gt; for AI discoverability.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;1. i18n is a product, not a feature.&lt;/strong&gt; Supporting 20 languages isn't just translating strings. It's RTL layouts, different text lengths breaking your UI, date/number formatting, and&lt;br&gt;
  cultural context in your content.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Static sites can be complex.&lt;/strong&gt; "It's just a static site" doesn't mean it's simple. The build pipeline, routing, and content management for 400+ pages requires real architecture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Privacy as a feature sells itself.&lt;/strong&gt; Every time I mention "nothing leaves your browser," people pay attention. In 2026, privacy isn't a nice-to-have — it's a differentiator.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. One tool leads to another.&lt;/strong&gt; I started with 5 tools. Then someone asked for a Base64 decoder. Then a hash generator. Then a color picker. 71 tools later, I'm still getting&lt;br&gt;
  requests.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I'm still adding tools based on what people ask for. Currently working on expanding the developer tools section and adding more converters.&lt;/p&gt;

&lt;p&gt;If there's a tool you wish existed — or if you've tried it and have feedback — I'd love to hear it in the comments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it:&lt;/strong&gt; &lt;a href="https://fastutil.app" rel="noopener noreferrer"&gt;fastutil.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No sign-up. No ads. No BS.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>nextjs</category>
      <category>opensource</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
