Back to ToolKnit
Blog Tool Tales
Changelog

Every update, documented.

A running journal of every new tool, refinement and late-night fix that has shaped ToolKnit since launch day.

61
Updates

Merge PDF Major Upgrade — Page Selector, Custom Filename, Homepage Light Mode Fixes & New Blog

NEW IMPROVEMENT FIX DEV JOURNAL

Merge PDF — Biggest Feature Update Since Launch

  • Multi-Page Selector (WPS-Style): When you upload PDFs with multiple pages, a dialog asks whether to include all pages or hand-pick specific ones. Choosing "Select Pages" opens a full-screen overlay with a left file panel + right page thumbnail grid — select only the pages you need from each multi-page PDF before merging. Full select-all / deselect-all controls, batch pagination (20 pages per batch), and a re-select button on each file card to edit your choices later. At least 1 page per file is enforced with inline validation.
  • Custom Output Filename: A new input field appears after uploading files — type your desired filename before merging (e.g., "Q4-Report"). The input auto-fills from the first PDF's name, and `.pdf` is appended automatically if missing. No more renaming after download.
  • Detailed Result Summary: After merging, the download area now shows exactly what was combined: "You merged 'report.pdf' and 'summary.pdf' into 'my-merge.pdf'. 2 files combined into 1 PDF with 8 pages." Full Chinese + English i18n with proper file-name list formatting (Oxford comma in English, Chinese enumeration marks in zh).
  • SEO Optimization: Title upgraded to "Merge PDF Online – Combine PDFs Free". Meta description, OG tags, Twitter card, and Schema.org WebApplication all synced. Blog cross-link ("Read the Guide") added below the FAQ section pointing to blog/merge-pdf.html.
  • PDF.js Lazy-Load & Zero SEO Impact: The page preview engine (pdf.js ~400KB gzip) loads via a delayed <script> tag that fires only after the page is fully parsed — it does not block rendering and search engines never download it. Page thumbnails only render when the user triggers the page selector.
  • Safeguards & Polish: Concurrent upload lock prevents race conditions when adding multiple file batches. Cancel button restyled as a white capsule with dark text for better contrast in the dialog.

New Blog Guide — Mic & Camera Test

  • Blog "How to Test Your Webcam & Microphone Online — Free Pre-Meeting Check" published under the Guides category (count: 01 → 02). Includes FAQPage schema (7 Q&A pairs), BreadcrumbList, step-by-step HowTo markup, and cross-links to Keyboard Tester, Aim Trainer, and Reaction Time Test.
  • Tool page cross-link added on tools/mic-camera-test.html pointing to the new blog guide.
  • All infrastructure files updated: sitemap-blog.xml (97 entries), llms.txt (blog count updated), blog/index.html (Guide category), changelog timeline + entry, service-worker.js (v192 → v199 across the day).

Homepage Light Mode — Three Button Visibility Fixes

  • Download Desktop App button had `rgba(255,255,255,.08)` background + white text, invisible against the hero area in light mode. Fixed to black-on-black styling that stays visible in both modes.
  • Articles popup cards (Blog Guides / Tool Tales / Changelog) used `var(--surface)` = `rgba(0,0,0,.035)` which blended into the white popup background in light mode. Border and surface intensified for contrast.
  • Footer icon buttons (Contact Us / Developer's Story / Changelog — injected by footer-modals.js) had `rgba(255,255,255,.03)` background with dim icons, nearly invisible on the gray footer. Changed to deep neutral tones visible in both themes.

What is ToolKnit Blog Page — Full Redesign

  • Removed all emoji icons from the tool grid. Replaced with clean Markdown-style directory lists — two columns per category, each tool name + small category tag (PDF/IMG/VID/AUD/TXT/TIME/FUN/AI/TEST/CALC).
  • Added anchor-jump table of contents at the top for one-click navigation to any category section.
  • Technology stack section converted from a plain <ul> into a code-block styled card with monospace font, line-number styling, and syntax-highlight-like comment colors.
  • Simplified category descriptions to one-sentence summaries for faster scanning.

Infrastructure

  • Dynamic article counts: changelog.html hero now dynamically counts `.changelog-entry` elements (currently 62). Homepage badges corrected from hardcoded 141 → actual 157 (87 blog guides + 9 tool tales + 61 changelog entries at time of fix). Build script `_count-site.js` added for pre-deployment count syncing.
  • Service worker comment syntax fix: Malformed `/**` block missing its closing `*/` corrected (IDE linter warning resolved).
Developer’s Note

July 14, 2026. Still here, still shipping.

Today was a big one. I practically rebuilt the PDF Merge tool from the inside out — page selector, custom filenames, a proper result summary. It’s the kind of refactor that makes you stop and look back. And I did. I looked back.

I shipped the first version of ToolKnit on March 18, 2026. It all started because of one frustrating PDF file — I opened my editor and just started vibecoding. No plan, no roadmap, just pure energy. That single task spiraled into ToolKnit.com. The usage counter went live in mid-May. Today, it passed 5,000+. Five thousand. That is a crazy milestone, and it proves something I always suspected: I wasn’t the only one who needed a simple, free, no-bullshit toolkit online. There are a lot of people out there just like me. And ToolKnit is helping them. That thought alone makes me genuinely happy.

But life has been heavy lately. Things happened in my personal life that these changelog entries don’t spell out, but they’re there, buried between the lines. These dev logs are not just a product changelog — they are my personal timeline. Every feature launch is a timestamp for a feeling. Every number going up is a small anchor pulling me through. I don’t expect anyone to follow along. I just want to leave a trace in this small corner of the internet. A mark that says: I was here. I built this. I felt things.

If you know me, you know I hold onto the past. Old memories, old people — I carry them. Even after they leave, I revisit those versions of myself. I am not someone who easily looks forward. Building this website, watching every single stat tick upward — that is my joy. My therapy. My medicine. Behind every commit is a developer with a full spectrum of emotions: happy, excited, sad, heartbroken, determined. All of it. So if you’re reading these changelogs, think of them as a journal. A monthly edition of one person’s quiet attempt to build something good in an often-difficult world.

Today, I’m still at my day job. Haven’t been sleeping well these past couple of days, and the headache is definitely here. After this update, I’m taking a break for a couple of days to recover. But I’ll be back. Then on July 18, I’m going on a trip. I’ll share photos and videos here when I return. Consider this an open invitation to follow along.

Thank you for reading. Thank you for using ToolKnit. Without you, this is just code on a server. With you, it’s something alive. If you find it useful, please share it with someone who needs it. That would mean the world to me.

See you soon. Building ToolKnit with love.

Zihang Dong Jul 14, 2026 — still here, still building

Ask Fate Full Overhaul & Whiteboard Enhancement — Multi-Mode Oracle, Shape Fill, Layer Manager & Dark Canvas

IMPROVEMENT FIX DEV JOURNAL
  • Ask Fate — complete overhaul: the tool is no longer a simple fortune oracle. It’s now a multi-mode decision & divination toolkit covering three distinct search-intent groups.
  • Three modes: Magic 8 Ball (classic 20-answer pool with 8-ball theme), Oracle (55+ rich answers with crystal-ball theme), and Coin Flip (pure Yes/No/Maybe). One page, three semantic fields, covering magic 8 ball online, yes or no oracle, and decision maker search queries.
  • Answer pool expanded & fixed: 55 → 100+ answers across Positive/Neutral/Negative/Wisdom categories. Fixed duplicate icon issue and replaced hash-based selection with stratified random (25% per tone), ensuring fairer distribution.
  • Share card generator: Canvas-drawn social sharing cards — question + answer + icon + ToolKnit branding. One-click download as PNG or share to X (Twitter).
  • 30-day history archive with past-day summary UI, replacing the single-day localStorage approach.
  • Sound effects integrated for answer reveals.
  • SEO metadata fully rewritten: title, description, keywords, OG tags, Twitter Card, JSON-LD SoftwareApplication & FAQPage — optimized for Magic 8 Ball, Yes No Oracle, and Decision Maker search clusters.
  • UX copy fix: “One Question Per Day” → “New Answers Daily” — more accurate and less intimidating for new users.
  • Pro Tips & Footer alignment with site standard (matched to pdf-to-image.html layout).
  • Whiteboard — major feature expansion: three new capabilities added to the drawing board.
  • Dark/light canvas toggle: switch between white (#ffffff) and deep indigo (#1a1a2e) canvas background. All 5 hardcoded fill references unified into a canvasBg state variable, and eraser color automatically syncs. Pixel-level background replacement preserves all strokes.
  • Shape library expanded & fill mode: new Circle, Triangle, and Arrow shape tools (in addition to existing Line and Rectangle). Fill Toggle button lets users switch between outline and solid mode for any shape. C keyboard shortcut added for Circle.
  • Layer Manager panel: toggleable side panel showing all canvas objects (Background + Text + Image layers). Each layer supports select / lock / delete from the panel. On mobile, the panel drops below the canvas instead of covering it. Auto-refreshes on add, delete, and lock/unlock actions.
  • Performance fix: added willReadFrequently: true to canvas context, silencing the browser console warning.
  • Full-site copyright fix: 20 tool pages — ? 2026© 2026 across all footers. Root cause: PowerShell Set-Content -Encoding UTF8 corrupts the U+00A9 byte. Switched to &copy; HTML entity site-wide to permanently avoid this encoding bug.
  • Server infrastructure migration: server migrated to new hosting, deployment docs updated, SSH key re-established after migration.
  • Deployment SOP hardened: toolknitSkill.md updated with strict single-file SCP rule (no wildcards, no multi-file), Chinese/Emoji encoding best practices, and the &copy; entity mandate.
  • Docs hygiene: 16 MD files → 10 after audit. Three migration documents merged into one architecture-migration-guide.md. 4 obsolete planning docs cleaned. Blog post drafts (already published to Juejin/dev.to) removed.
  • Whiteboard viewport accessibility fix: removed user-scalable=no from meta viewport (Google Page Experience best practice).
Developer’s Note

Five days since the last changelog entry. I haven’t disappeared — I’ve been quietly working on other things. I’m building a new website: an online chat platform where 4 AIs take turns replying in a round-robin conversation. Still under development. Check it out at 4ai1.com.

These past few days have been calm on the surface. My daily rhythm hasn’t changed: wake up, go to work, write code, figure out how to drive more traffic to the site, eat, sleep. Repeat.

My cough is much better now — barely comes back. That’s one good thing.

But my heart... I feel like it’s been under pressure this whole time, ever since the last update. I’ve been falling into deep emotional lows late at night, and it’s been half a month since I last fell asleep before 2 AM. I don’t know what to do. I’ve reached out to many people for help, but I still don’t know the way out.

People might not understand how I handle emotions, or how deeply I hold onto memories of people from my past. In my life, I haven’t met that many people — but every single one of them is etched into my memory. And I’m a Cancer. So… yeah.

Sometimes I feel like maybe this is just what my life is going to be. A lot of the time, everything feels kind of meaningless, and there’s this heavy weight in my chest. I find myself replaying happy memories over and over, just to feel something warm — and then I’ll open up the sad ones too, and cry all over again. They say time heals everything. But time only takes care of the things that happen on the outside. It doesn’t touch the things that live inside you.

I’m only 22. What am I supposed to do…

Still building ToolKnit with love. (On July 12, the server IP address was changed, which caused a few hours of downtime — that’s been fixed now.)

That’s all for today. The weather is brutally hot — please make sure to protect yourself from the sun. In a few days, when it cools down a little, I’m planning to head out with a friend on a trip a few hundred kilometers away. It’s the only way I know to ease my mind right now…

Zihang Dong Jul 13, 2026 — still here, still building

Dice Roller Major Upgrade — Batch Auto-Roll, Game Presets, CSV Export & Full-Site SEO Data Refresh

IMPROVEMENT SEO FIX DEV JOURNAL
  • Dice Roller major upgrade — 6 new features: the dice roller is no longer a simple random number generator. It’s now a full dice toolkit.
  • Batch Auto-Roll: roll 10×, 50×, or 100× with a real-time progress bar. Dice update in smooth batches via requestAnimationFrame.
  • Game Presets: one-click presets for Monopoly (2d6), Yahtzee (5d6), Catan (2d6), Craps (2d6), and D&D Skill Checks (3d6).
  • CSV Export: download your entire roll history as a CSV file for further analysis.
  • Theoretical Probability Overlay: the distribution chart now shows a semi-transparent blue bar at 16.67% on each face — compare your real rolls against the expected fair-die distribution.
  • 3 Dice Skins: Classic White, Dark Gold, and Neon Blue color themes — switch with a single click.
  • Custom scrollbar for roll history — replaced the ugly native scrollbar with a subtle 4px dark one.
  • Keyboard shortcuts card: first-time visitors see a floating hint showing Space to roll, 1-6 to pick dice, R to reset. Dismisses automatically after 4 seconds.
  • Sound effects integrated for both single rolls and batch operations.
  • Viewport accessibility fix: removed user-scalable=no and maximum-scale=1.0 from the meta viewport tag (Google Page Experience best practice).
  • SEO metadata fully rewritten: title, description, OG tags, Twitter Card, JSON-LD SoftwareApplication, FAQPage — all optimized for richer search snippets and better CTR.
  • Full-site SEO data files audited & refreshed: sitemap index lastmod dates updated to July 8, sitemap-pages lastmod refreshed, llms.txt Dice Roller entry rewritten with all new features.
Developer’s Note

Another quiet afternoon. Sitting at my desk, watching the site’s impression numbers climb day by day — there’s a grounded sense of accomplishment in that.

Over the last 7 days, Google impressions hit 2,230+, and Bing reached 1,300+ — together, that’s over 3,500 weekly impressions across both platforms. I’m genuinely satisfied with that.

Three months ago, that number was under 200.

From under 200 to 3,500+ per week — it’s not some overnight miracle, but it proves the simplest truth: consistent effort does get noticed. Google and Bing won’t ignore someone who’s genuinely doing the work. If you keep doing the right things, they’ll create opportunities for you.

Today I gave the Dice Roller a major overhaul — batch auto-roll, game presets, CSV export, theoretical probability overlay, three dice skins. It’s no longer just a random number generator; it’s a proper dice toolkit now. Also ran a full audit and refresh of the site’s SEO data files — sitemaps, llms.txt — so search engines know this site is alive and still improving.

ToolKnit updates keep coming. If you run into any issues, or have ideas or suggestions, reach out directly — if I can solve it, I won’t hesitate.

Still building ToolKnit with love.

Zihang Dong Jul 8, 2026 — building with love, one roll at a time

Breathing Relaxation + Sitemap Overhaul + Full-Site Encoding & SEO Repair — 90 Tools, Best SEO Yet

NEW TOOL IMPROVEMENT BUG FIX DEV JOURNAL
  • New tool: Breathing Relaxation — the 90th tool! Free guided deep breathing with 6 proven techniques: 4-7-8 breathing, box breathing, coherent breathing (5-5), 4-2-4 relaxation, energizing breath, and alternate nostril breathing. Visual animation with real-time rhythm indicators, optional sound cues, and haptic feedback (iOS). Cycle count selection from 4 to 12 rounds. Locked during active sessions to prevent errors. Clean, distraction-free design with Phosphor icons. 100% browser-based.
  • Category count bug fixed: filter badges on the homepage now dynamically count tool cards from the DOM instead of relying on hardcoded numbers. Adding a new tool no longer requires manual count updates.
  • Breadcrumb fix: Quit Smoking Tracker breadcrumb corrected from wrong "Health & Wellness" to correct "Self-Test" category (HTML schema + JS i18n keys).
  • Sitemap restructured: single monolithic sitemap.xml replaced with a sitemap index pointing to 4 logical sub-sitemaps:
    sitemap-tools.xml (89 tool pages)
    sitemap-blog.xml (blog index + 97 articles)
    sitemap-holidays.xml (holidays hub + 15 country pages)
    sitemap-pages.xml (homepage, desktop download, changelog, status, legal)
  • Priority differentiation: high-traffic tools (Compress PDF, Background Remover, Merge PDF, Compress Image, Password Generator, QR Code Generator, Image Resizer, PDF to Image, Age Calculator, Unit Converter) upgraded to priority 1.0. Niche tools (AI Text Adventure, AI Trajectory, Lyric Visualizer, Silk Screen, Spin the Dare) kept at 0.8. All others at 0.9.
  • Changefreq calibrated: changelog → daily, homepage & blog → weekly, tools → monthly, legal → yearly.
  • llms.txt enhanced: added a dedicated Popular Tools section (10 tools with LLM-friendly guidance), corrected tool count to 90, blog count to 96, and moved Quit Smoking Tracker into Self-Test category.
  • Tool count: 89 → 90.
  • Phosphor Icons migrated to local hosting: all icon fonts (Fill, Regular, Bold) now served from /assets/fonts/ and /assets/css/, eliminating CORS errors that blocked font loading from unpkg CDN across all 88 tool pages.
  • Encoding disaster & full-site garbled text cleanup: a careless PowerShell batch edit with Set-Content (default ANSI encoding) corrupted UTF-8 across the entire /tools/ directory. 116+ occurrences of broken Unicode fixed — en-dashes (–), degree symbols (°) restored, “中文” language toggle labels repaired across 65 pages, and ~250 inline Chinese i18n dictionary keys rebuilt in 7 severely damaged files (webp-to-png, image-crop, image-resizer, jpg-to-png, image-grid-split, emoji-finder, and 4 others). The PowerShell lesson: always add -Encoding utf8.
  • SEO tag audit & repair: fixed 11 tool pages missing the “ToolKnit” brand name in their <title> tags. Text Animation Test page received a full SEO retrofit: added <h1>, JSON-LD BreadcrumbList schema, og:image, and twitter:image. Removed text-animation.html from the tools directory (it was a CSS demo, not a production tool). Sitemap count corrected accordingly.
  • Ahrefs crawl errors fixed: added nginx 301 redirects — /tools/stories.html/blog/stories.html (external backlink pointing to wrong path), and /tools// (directory index 403 resolved). Both verified with curl.
Developer’s Note

Today was another quiet, ordinary day. Worked my day job, shipped these updates around noon, and now winding down. It feels like every day is this calm — almost unnervingly so.

But damn, the encoding bug almost drove me insane today. One careless PowerShell command and suddenly 65+ pages had their Chinese text turned into question marks. “中文” became “����” — it felt like watching your house burn down in slow motion. Spent hours manually rebuilding corrupted i18n dictionaries line by line. The kind of bug that reminds you: in software, the most destructive mistakes are often the simplest ones.

On the bright side, the sitemap overhaul went smoothly, and the Ahrefs crawl errors are finally cleaned up. The Phosphor Icon CORS nightmare is over too — everything now served locally, no more dependency on unpkg. SEO health is the best it’s ever been.

I'm thinking about taking a trip soon. Driving a few hundred kilometers just to see some new scenery, find a little adventure. I'll hit up a friend in the next couple of days and go explore the world beyond these four walls. The 9-to-6 grind, trapped between work and home, can slowly wear a person down. I need to go breathe some fresh air again.

ToolKnit is still here. I'm still here. If something's not working right, or if there's a problem you think I can help with — send me an email anytime. I'm building ToolKnit.com with nothing but love.

That's all for today. Wishing everyone — and myself, and this little website — peace.

Zihang Dong Jul 6, 2026 — building quietly, one day at a time

Quit Smoking Tracker & Bilingual Migration Milestone — 55 Tools Now EN + Chinese

NEW TOOL MILESTONE DEV JOURNAL
  • New tool: Quit Smoking Tracker — one-click to log every resisted craving. Real-time stats: cigarettes avoided, money saved, life regained (11 min per cigarette), tar avoided. 10 achievement badges and a 10-stage health recovery timeline based on CDC/WHO research. All data stays in localStorage.
  • Bilingual migration complete: PDF Suite (5 tools), Image Tools (17), Video Tools (4), Audio Tools (6), Text Tools (10), Calculator Tools (7), Time Tools (6) — 55 tools now fully bilingual (EN + Chinese). Progress was faster than expected.
  • Remaining: Creative Tools (28) will be gradually migrated throughout July.
  • Tool count: 86 → 89 (pomodoro-timer, timestamp-converter, quit-smoking-tracker).
Developer’s Note

A quick status update, July 5, 2026. ToolKnit.com (web): PDF Suite (5 tools), Image Tools (17), Video Tools (4), Audio Tools (6), Text Tools (10), Calculator Tools (7), and Time Tools (6) have all completed full bilingual migration. The site now fully supports English + Chinese display! Progress has been faster than I expected. The remaining Creative Tools will be gradually migrated throughout July.

As for myself — the cough hasn’t gone away. Medicine helps for a while, then I smoke and it comes right back. So I built a quit smoking tracker. I want to give myself a goal. I know quitting is hard, but let’s all keep pushing — we can do this.

My mood lately has been flat. No new people in my life, still missing someone from the past. Maybe it’s just the Cancer zodiac sadness.

That’s all for now. ToolKnit is still updating. I’m still here. As long as I’m here, the site will be here too. Wishing everyone — and myself, and my little website — all the best. Ending this update from China.

Zihang Dong Jul 5, 2026 — still building, from a corner of the earth

New Tool: Emoji Finder — Search & Copy 560+ Emojis

NEW TOOL DEV JOURNAL
  • 560+ emojis covering all Unicode 15 categories: Smileys, People, Animals, Food, Travel, Activities, Objects, and Symbols.
  • Bilingual search — type in English or Chinese to find any emoji instantly. Every emoji has both language tags.
  • One-click copy — click any emoji to copy it to clipboard immediately.
  • Skin tone picker — people emojis show a 6-variant tone selector on click.
  • Recently used — last 20 copied emojis appear at the top (localStorage, no account needed).
  • 8 category tabs — browse by Smileys, People, Animals, Food, Travel, Activities, Objects, or Symbols.
  • 100% browser-based, no signup, works offline after first load.
Developer’s Note

Hello everyone. Another quiet update to ToolKnit.com today. A lot has happened recently, so let me share both the good and the hard.

The good news first: ToolKnit Desktop is officially live. After two months of late nights and debugging sessions that stretched past 3 AM, it’s out there. Real users are downloading it. Real files are being processed locally, never uploaded, exactly as it should be. That dream I had back in May — it’s real now.

Second good thing: our Ahrefs Domain Rating jumped from 29 to 41. Google Search Console and Bing traffic are climbing steadily. The sandbox period is almost over. It feels like proof that if you keep building, keep improving, someone out there will notice. Hard work gets seen — eventually.

Now the harder parts. My API token bills have been climbing fast. I also spent about $1,000 on a new computer just to keep up with development. Server load keeps growing. But I promise you this: ToolKnit will stay online at least until the end of 2028. I’ve budgeted for it. I’ve committed to it. You can count on that.

I added a donation button — WeChat and Alipay for now, more options coming. But please, hear me clearly: only donate if you have room to breathe financially. If money is tight, if you’re just getting by, keep your money. Use the tools for free. That’s what they’re here for. Donations help me keep the lights on, but they are never, ever required. Supporting a solo developer is generous — but taking care of yourself comes first.

On a personal note: I’m still stuck on someone I should have let go of by now. I keep telling myself "there are green mountains everywhere in life" — but I can’t seem to leave the one mountain I already know. I check her updates quietly, more often than I should. It’s not healthy. I know that. It’s like a cigarette I can’t quit.

Speaking of cigarettes: I’ve been coughing for two weeks straight, taking medicine every day, and it’s not getting better. The first thing I should do is quit smoking. I know that too. My body is reminding me in ways I can’t ignore anymore.

But despite all of that — the costs, the cough, the heartache I can’t shake — I’m still here. Still building. Still quietly releasing small updates when I can. ToolKnit is still built with love, from a corner of the earth. ❤️

Thank you for being part of this. Thank you for using these tools, for reporting bugs, for sticking around. You’re the reason I keep going.

Zihang Dong Jul 3, 2026 — still building, from a corner of the earth

ToolKnit Desktop v1.0 — A Native Windows Client Built with Rust & Tauri

NEW PRODUCT DEV JOURNAL
Developer’s Note

I still remember the night I first typed cargo new toolknit-desktop into the terminal. It was late May, the air outside was warm, and my apartment was quiet except for the hum of the fan. I had no idea if this was going to work. Tauri 2.x was still bleeding-edge, the documentation had gaps, and I was about to bet two months of evenings on a framework I’d never shipped with before.

But I kept thinking about the emails. Users telling me they loved the website but wished they could process a 500MB video without uploading it. People working on planes, in cafés with spotty Wi-Fi, in offices where sending files to a third-party server is simply not an option. The browser is a beautiful sandbox — but sometimes, a sandbox is a cage.

So I built the cage’s key. Not Electron. Not a wrapped browser. A real desktop application: Rust on the backend, native file-system access, GPU-accelerated encoding through FFmpeg, and a front end that reused every line of HTML and CSS I had already written for the web. The installer is 11.6 MB. The full app is 46 MB. It fits on a USB stick. It runs offline. It never uploads your files.

The spider mascot that loads between pages? That was drawn at 1 AM after I’d spent three hours debugging an IPC channel that refused to send a progress update from Rust to JavaScript. I drew it in MS Paint, laughed at how terrible it was, and then somehow couldn’t bring myself to replace it. It became ToolKnit’s spirit animal: small, persistent, a little strange, and somehow exactly right.

The WebGL backgrounds — six different shader programs — were written because I wanted the desktop app to feel like a place, not a tool. Somewhere you don’t mind spending time. The fluid noise, the light rays, the plasma waves — each one is a memory of a different late night, a different breakthrough, a different moment where something finally compiled and I exhaled for the first time in hours.

Today, ToolKnit Desktop is live. It’s not perfect. It’s Windows-only for now. macOS and Linux are coming. But it’s real. It’s out there. And it exists because a group of strangers on the internet told me they needed it, and I decided that was reason enough to stop sleeping.

Web and desktop are not competitors. They are twin stars. The website is your quick fix, your shareable link, your "I need this right now" solution. The desktop app is your heavy lifter, your privacy vault, your "I have fifty PDFs to process and I never want to see a loading spinner again" companion. Use whichever fits the moment. They were built for you, by someone who still can’t believe anyone uses this thing at all.

Thank you for being here. Thank you for the bug reports, the feature requests, the quiet bookmarks, the occasional tweet. Every single one of them is why the spider keeps spinning.

Zihang Dong Jul 2, 2026 — the cage is open
PRODUCT HIGHLIGHTS
  • Native Windows client: built on Tauri 2.x with a Rust backend — not Electron, not a browser wrapper. Real file-system access, real performance.
  • 9 tool categories covering PDF, Image, Audio, Video, Text, Calculator, Creative and AI — 50+ tools at launch, all running locally.
  • PDF engine: merge, split, compress, rotate, encrypt/decrypt, extract pages, add watermarks and convert to images — powered by pdf-lib-plus-encrypt in Rust, zero uploads.
  • Image engine: format conversion (JPG/PNG/WEBP/BMP/GIF/TIFF), batch compression, watermark removal, crop and collage — backed by the Rust image crate.
  • FFmpeg integration: audio/video format conversion, compression, clipping, BPM detection, screenshot extraction and channel processing. FFmpeg is downloaded on first use (~40 MB) so the base installer stays lean at 11.6 MB.
  • AI toolbox: translation, polishing, document generation and role-play via DeepSeek, OpenAI, Qwen and Moonshot APIs — the only module that requires an internet connection.
  • Custom installer: a Tauri-built wizard that lets users choose language (Chinese / English), installation path, and automatically creates desktop shortcuts. The installer downloads the main program (46 MB) from dual CDN sources: Cloudflare R2 for international users, RainS3 for China.
  • Auto-update system: checks manifest.json on startup, supports forced updates and graceful fallback between R2 and RainS3 sources.
  • Complete bilingual i18n: nested JSON key structure covering every UI string, tool label, button and error message. Language is detected from the installer’s NSIS language ID and can be switched at runtime.
  • WebGL dynamic backgrounds: six custom shader programs (DarkVeil, LightRays, Plasma, Ferrofluid, Dither, PlasmaWave) rendered on the home screen with randomised hue shifts for a unique visual experience every launch.
  • Spider mascot: ToolKnit’s signature loading and transition animation, drawn at 1 AM and kept because sometimes the imperfect things are the ones that stick.
  • Drag-and-drop + batch processing: drop hundreds of files into the window and process them in one click. Output directory is remembered across sessions.
  • System tray integration: minimise to tray, restore from tray, quit cleanly — tray menu text switches with the active language.
ARCHITECTURE
  • Frontend: plain HTML/CSS/JS reused from the web version, bundled with Vite, styled with Tailwind and custom shaders.
  • IPC bridge: Tauri invoke() commands for frontend-to-Rust calls, Event listeners for real-time progress push from backend to UI.
  • Rust backend: PDF manipulation, image processing, file-system operations, auto-update checks and AI API proxying.
  • Native window: custom frameless title bar with minimise, maximise, close and always-on-top controls. Fixed 1100×800 resolution.
  • Dual-source deployment: R2 (global) + RainS3 (China cn-nb1) with language-aware routing and cache-busting timestamps.
WEB + DESKTOP = TWIN STARS
  • The website (toolknit.com) continues to operate exactly as before — no features removed, no redirects, no paywalls.
  • The desktop app is an addition, not a replacement. Use the web for quick, shareable, cross-platform tasks. Use the desktop for heavy batch processing, offline work and files you never want to leave your machine.
  • Download page live at toolknit.com/exe.html with automatic source detection based on browser language.

Bilingual Migration Halfway Done — PDF, Image, Video, Audio & Text Suites Complete

DEV JOURNAL IMPROVEMENT
Developer’s Note

The bilingual architecture migration has reached a major milestone: half of all tool pages are now on the new bilingual system. Every tool in the PDF suite, Image suite, Video suite, Audio suite, and Text suite has been fully migrated — complete with language toggle, bilingual breadcrumbs, FAQ accordions, and shared footer components.

It’s been a few days since the last dev journal. I’ve been heads-down migrating tool pages one by one — each page needs its own i18n dictionary, bilingual CSS, hero top-bar, breadcrumbs, and footer alignment with the standard template. Tedious but necessary work.

Beyond the web migration, I’ve been full steam on the ToolKnit desktop EXE client. Writing Rust, wiring up Tauri, polishing the UI — it’s going very smoothly. The first test build is on track for early July. If you’re interested in getting early access, shoot me an email at 2645149786@qq.com and I’ll send you a build to try out.

Thank you to everyone who’s been following along, filing feedback, and using ToolKnit day to day. ToolKnit is here because of you!

Zihang Dong Jun 28, 2026 — halfway there
  • Bilingual migration: Hash Generator, Text Diff, Markdown Editor, JSON Formatter, Invoice Generator, Fancy Text Generator, and all tools across the PDF, Image, Video, Audio, and Text suites are now on the new bilingual architecture with language toggle, breadcrumbs, FAQ, and shared footer.
  • bilingual.js v8: added bc.hashGenerator breadcrumb key; all migrated pages now reference bilingual.js?v=8.
  • Service Worker: toolknit-v151 → toolknit-v152 with updated precache URLs.

100 Days of ToolKnit — Fireworks on the Homepage

DEV JOURNAL
Developer’s Note

Yesterday, June 25, was ToolKnit’s 100th day since launch on March 18. I had quietly prepared a little surprise in advance: a full-screen fireworks celebration that would automatically appear for everyone visiting the homepage on that day.

I don’t know how many people actually saw it — hahaha! — but honestly, that’s part of the fun. Building something and not knowing who will stumble into it... that’s the kind of quiet joy that keeps me going.

To everyone who has used ToolKnit, shared it with a friend, filed a bug report, or just quietly bookmarked it: thank you. 100 days, 87 tools, zero uploads. Every single operation runs right inside your browser. That’s not a marketing line — that’s the whole point. Your files never leave your device, and they never will.

I’m grateful for every visit, every click, every “hey this tool saved me 20 minutes.” Those moments are why I keep building.

These past few days I’ve been heads-down on the ToolKnit desktop EXE client — writing Rust, wiring up Tauri, polishing the UI. The code is coming together nicely. In the next few days I’ll be rolling out some new features across both the web and desktop versions. Stay tuned — you won’t want to miss what’s coming.

Here’s to the next 100 days. Built with love, one firework at a time.

Zihang Dong Jun 26, 2026 — 100 days, still building

Text Animation Maker, True MP4 Export & Drawer Refinement

NEW TOOL IMPROVEMENT FIX
  • New tool: Text Animation Maker — type up to 50 characters and choose from 6 animated effects: Shimmer, 3D Flip, Blur Focus, Typewriter, Fade Slide Up, and Marquee. Live preview inside a redesigned slide-out drawer with a frosted-glass overlay, centered title, and a crisp white close button.
  • Built-in color presets: each effect now ships with 4 ready-made color combinations. Users tap a preset swatch to update the background and text colors instantly; custom color pickers have been removed.
  • True MP4 export: replaced the browser MediaRecorder WebM output with native WebCodecs H.264 encoding via mp4-muxer. The result is a real .mp4 file that plays natively on iPhones, Instagram, TikTok, and other platforms that reject WebM. Legacy browsers fall back to WebM automatically.
  • Export progress fix: the progress bar no longer exceeds 100%; progress is clamped to 0–100% regardless of timing variance.
  • GIF export removed: all GIF export code, references, and the gif-encoder.js dependency have been cleaned up from the tool page, service worker, and search metadata.
  • Service Worker cache: toolknit-v143 → toolknit-v144; text-animation-maker.js v15 → v16.
Developer’s Journal

Long time no see, everyone. I’m sorry I kept you waiting.

Life has been busy lately, and the text animation tool I mentioned several days ago is finally live. You can go play with it: type your text, pick an effect, and export a real MP4. I think it turned out pretty well, if I do say so myself.

We started writing code on the night of June 22 and kept refining until the early hours of June 23. The first version is finally done, and I’m genuinely happy with it. The past few days I’ve also been redesigning the ToolKnit desktop app (the .exe version), otherwise this tool would have shipped much earlier. Haha.

Please look forward to the desktop client. The web version will keep getting updates too — maybe at a slightly slower pace, but it’s not going anywhere.

Still building ToolKnit with love, from right here on Earth.

Zihang Dong Jun 23, 2026 — built with love, late night edition

Desktop EXE Client Announced — PDF Suite Demo 0.1 & Web Migration Milestone

DESKTOP APP MILESTONE DEV JOURNAL
  • Native Windows desktop app is officially in development: We are building a real offline-first .exe client for Windows. The current tech stack is Tauri 2 + Rust on the backend, Vanilla JS for the UI, PDF processing via lopdf (split/merge) and pdfium (render to images), a custom WebGL2 animated background, Dropzone.js for drag-and-drop, and full i18n support. Packaging will be delivered as an NSIS installer.
  • PDF suite Demo 0.1 is complete: The desktop PDF engine already supports PDF to Image, PDF Split, PDF Merge, and PDF Compress. That means roughly half of the full PDF suite is already running locally. This is a DEMO 0.1 build; we will move toward a closed Beta 1.0 release before opening it up more widely. Stay tuned.
  • Web migration milestone: The new bilingual architecture migration is now complete for the entire PDF, Image, Video, and Audio tool categories. Every tool in those four categories has the new EN / 中文 language toggle, accordion FAQ, responsive footer-grid, and full dynamic UI translation. The remaining tools will be migrated progressively without breaking existing functionality.
  • Call for bug reports: If you notice anything broken while using the newly migrated tools, please reach out as soon as possible so we can fix it fast. Quality is the priority.
  • Growth update: ToolKnit has now crossed 3,000+ total uses and SEO exposure on both platforms has broken 10,000+ impressions. From the March 18 launch to today, it has been a real ride — thank you for being part of it.
SEO & CONTENT
  • Typing Test SEO refresh: Typing Speed Test now targets the "three minute test" and "is 64 WPM good" keyword clusters. Added 3-minute and 5-minute test durations alongside the existing 15s, 30s, and 60s modes, expanded the FAQ JSON-LD with dedicated questions around 64 WPM and 3-minute pacing, and updated title, description, OG/Twitter tags, and on-page copy to match the new keyword strategy.
  • Typing Test horizontal scrolling: Long-duration tests now render on a single horizontally scrollable line. The current character stays anchored 20% from the left edge as you type, and Backspace scrolls back in the other direction. Added 40% trailing padding so the final words never get stuck at the right edge of the viewport.
  • WebP to PNG SEO refresh: WebP to PNG Converter received a full meta-refresh — title, description, keywords, OG/Twitter tags, SoftwareApplication JSON-LD, and H1/i18n copy — to sharpen its ranking for "webp to png" and related conversion terms.
  • Two new blog guides: Published Normal Reaction Time — How Fast Can a Human React? (targeting "normal reaction time" and "average human reaction time") and How Many Paragraphs Is 2000 Characters? — Quick Guide (targeting "2000 characters is how many paragraphs" and related long-tail queries). Both articles include structured data, FAQ sections, and CTAs back to the relevant tools.
  • Sitemap and index updates: Added the two new blog URLs to sitemap.xml with today’s lastmod, updated lastmod dates for typing-test.html and webp-to-png.html, refreshed the blog list on blog/index.html with new category entries and counts, and updated the homepage article stats (141 total resources, 86 blog guides).
COMING TOMORROW
  • Animated text generator with MP4 export: A brand new tool that turns any text into kinetic typography animations and exports them as MP4 video files directly in your browser. Perfect for social posts, intros, thumbnails, and short-form content. Watch for it tomorrow.
Developer’s Note

It has been a few days since the last update, but we did not disappear. We have been heads-down on something big: the ToolKnit desktop client.

Building a native Windows app is a completely different beast from the browser. We chose Tauri 2 + Rust because it keeps the web frontend we know while letting Rust handle heavy PDF work locally. lopdf splits and merges fast, pdfium renders pages to images, and the whole thing is wrapped in a custom UI with a WebGL2 background and full i18n from day one.

On the web side, the PDF, Image, Video, and Audio tool suites are now fully migrated to the bilingual architecture. The rest will follow, but every existing feature keeps working while we move it over.

Numbers-wise, ToolKnit has passed 3,000+ total uses and the SEO work is paying off with 10,000+ impressions across both platforms. From the March 18 launch to today, it has been a long road. Thanks for sticking with us. We will keep building.

If you see anything broken on the newly migrated pages, please reach out immediately. We would much rather fix it fast than let it sit.

Also spent time today tightening the web side: refreshed the Typing Test and WebP-to-PNG pages for SEO, added a 3-minute / 5-minute typing mode, fixed the horizontal scrolling behavior so long tests stay readable, and shipped two new blog posts — one on reaction time and one on 2000-character paragraph counts. All the usual sitemap, index, and homepage counters were updated to match.

Tomorrow is for something more visual: a new animated text generator that exports MP4 video directly in the browser. I’ve wanted a kinetic-type tool on ToolKnit for a while; looking forward to shipping it.

More soon. Built with love.

Desktop app Demo 0.1 screenshots — click to load
View screenshot
View screenshot

Silk Screen, Image Tools & Audio Tools Migration — Metronome + WAV to MP3 Bilingual

MAJOR UPGRADE
  • Silk Screen bilingual migration complete: Silk Screen Filter fully migrated to the new bilingual architecture. Hero top-bar with EN / 中文 language toggle and hamburger menu, breadcrumb navigation, How It Works (3-column cards), Why Use, Pro Tips, FAQ accordion with FAQPage JSON-LD, responsive footer-grid, and full EN / 中文 i18n for all static and dynamic UI strings (drop zone, LPI slider, dot size, channel colors/angles, paper color, channel toggle buttons, export/reset buttons).
  • Image tools category fully migrated: Every image tool is now on the new bilingual architecture. The last two holdouts — Circle Crop and Silk Screen — are complete. All three major tool categories (PDF, AI, and Image) are now bilingual.
  • Silk Screen structured data: Added complete SoftwareApplication JSON-LD with url, image, browserRequirements, inLanguage, datePublished, dateModified, publisher, and featureList, plus BreadcrumbList and FAQPage JSON-LD (6 questions, matching visible FAQ exactly).
  • Changelog fix: Corrected the Jun 16 entry that incorrectly linked to tools/ai-personality.html (non-existent page). The 4th AI tool is AI Text Adventure, not AI Personality.
  • Video tools category fully migrated: All video tools are now on the new bilingual architecture. Video Screenshot and Video to Audio fully migrated with EN / 中文 language toggle, accordion FAQ, footer-grid, and full dynamic string translation. The entire video-tools suite is now bilingual.
  • Metronome bilingual migration complete: Online Metronome fully migrated to the new bilingual architecture. Replaced Phosphor icons with inline SVG, added EN / 中文 language toggle, accordion FAQ with FAQPage JSON-LD, responsive footer-grid, and full dynamic string translation for all UI elements (BPM display, tap tempo, play/stop buttons, beat accent labels).
  • WAV to MP3 bilingual migration complete: WAV to MP3 Converter fully migrated to the new bilingual architecture. Replaced Phosphor icons with inline SVG, added EN / 中文 language toggle, accordion FAQ with FAQPage JSON-LD, responsive footer-grid, and full dynamic string translation for all UI elements (drop zone, bitrate selector, convert/download buttons, progress labels, error messages, info cards).
  • Audio tools migration continues: Two major audio tools — Metronome and WAV to MP3 — are now bilingual. Remaining audio tools will be migrated next.

All 4 AI Tools Fully Migrated — Image Tools Next & Developer’s Journal

MAJOR UPGRADE
  • All 4 AI tools bilingual migration complete: AI Tarot, AI Text Adventure, Ex AI Chat, and AI Trajectory all fully migrated to the new bilingual architecture. Every tool now has EN / 中文 language toggle, hamburger menu, accordion FAQ, footer-grid, and full dynamic string translation via t().
  • AI Trajectory bilingual migration: AI Trajectory Predictor migrated — hero top-bar, breadcrumb, all static sections, and every dynamic UI string (round labels, trajectory cards, likelihood badges, epilogue, API key states, error messages). Fixed a critical bug where node.round was undefined in the timeline by passing the pushed object instead of the raw AI data. Added tLike() and tRound() helpers for proper Chinese likelihood and round number formatting.
  • AI Trajectory Chinese output: In Chinese mode, the DeepSeek system prompt, first-round message, and every subsequent round message are now sent in Chinese — AI responses are fully Chinese rather than English regardless of the user’s input language.
  • AI Tarot bilingual migration complete: AI Tarot Reading fully migrated — spread labels, position labels, modal text, error states all bilingual.
  • New structured data: Enhanced SoftwareApplication JSON-LD across all AI tools with url, image, browserRequirements, inLanguage, datePublished, dateModified, publisher, and featureList.
  • Image tools migration (afternoon): PDF suite and AI tools are done — image tools are next. Once complete, all three major categories will be fully migrated to the bilingual architecture.
  • Image tools migration wrap-up: Every image tool except Circle Crop and Silk Screen is now fully migrated to the bilingual architecture. These two are the last holdouts in the image category; they’ll be tackled tomorrow, immediately followed by the entire video-tools suite.
  • Desktop app announced: Development on the native Windows EXE client officially kicked off today. The goal is a full offline desktop experience with faster rendering and local file handling. Target release window: within the next year. Something to look forward to.
  • Migration continues: Remaining tool categories will be migrated progressively. Feature releases remain on schedule; architecture quality is the priority this sprint.
Developer’s Note

A few days ago I drove to Xinxiang with a friend — roughly 700 km round trip. We set off at 4 in the morning and got home just before 10 at night. Almost twenty hours on the road without sleeping. Yesterday I finally crashed for a while and woke up at home, safe and sound.

It was exactly what I needed. The scenery was genuinely beautiful — photos below. My mood has settled down quite a bit. Good for the soul.

I’ve been thinking about what this changelog should carry going forward. I made a quiet decision: I’m not going to keep writing about that last relationship here. Recording it over and over doesn’t help me, and it definitely doesn’t help her. The hardest feelings are best carried silently — that’s just where I am with it now.

On the technical side: I’ve been deep in migrating everything to the new bilingual architecture. New feature work is a little slower because of that, but the foundation is getting solid. Today was productive — tomorrow I’ll keep going. It’s late now. Time to rest.

Also, a heads-up: I started work on the native desktop application today. It’s still early days, but the goal is a proper Windows EXE that brings ToolKnit offline and makes everything faster. Planning for a release sometime in the next year. Exciting times ahead.

Thanks as always for using ToolKnit. Building this — and knowing people actually use it — keeps me going. Built with love.

Photos from the road — click to load
View photo
View photo
View photo
View photo
View photo
View photo
View photo
View photo
View GIF
Zihang Dong Jun 16, 2026 — 00:15 · Xinxiang round trip 700km · built with love

AI Ex-Partner Chat & Background Remover Bilingual Migration, Library Manager Launch

NEW PAGE MAJOR UPGRADE BUG FIX
  • Library Manager launched: New standalone page Library Manager lets users pre-download all heavy AI libraries (Tesseract.js OCR, background-removal model, face-api, etc.) into IndexedDB in one click — tools that depend on these libraries load instantly on subsequent visits, even offline. Bilingual (EN / 中文), tracks per-library install status, and links back to affected tools.
  • Background Remover bilingual migration complete: Background Remover rebuilt on the new bilingual template — hero top-bar with EN / 中文 language toggle, hamburger menu, accordion FAQ with FAQPage JSON-LD, responsive footer-grid, and full EN / 中文 i18n for all static and dynamic UI strings.
  • AI Ex-Partner Chat bilingual migration complete: AI Ex-Partner Chat fully migrated — hero top-bar, accordion FAQ, footer-grid, and full EN / 中文 i18n across all static sections and every dynamic UI string in the tool area.
  • Complete UI translation for AI Ex-Partner Chat: "Create Your Persona", "Their Name", "Your Avatar", "Screenshot Type", "Upload Chat Records", "Distill Persona", "Check Sender Labels", "Swap All", "Looks Correct", "Memory, not the person", chat input placeholder, Export and Send buttons all bilingual.
  • Distillation progress fully translated: All 15 rotating status messages, all 6 step indicators (Step 0/7 – 5/7), the completion status, and the post-distill system message switch correctly between EN and ZH.
  • Footer rebuilt to standard: Replaced custom icon-button footer with the standard footer-grid layout — Popular Tools (7 entries), Categories (footer.c1–c7), and Support & Legal. Footer link hover effects restored.
  • Textarea placeholder & loadChatUI fix: applyI18n() now handles TEXTAREA placeholder; applyI18n() called inside loadChatUI() so chat-state elements re-translate on language switch mid-session.

Image Tools Bilingual Migration & Mic/Camera Permissions Fix

BUG FIX MAJOR UPGRADE
  • Image tools bilingual migration complete: All 11 image tools rebuilt on the new bilingual architecture — Image to PDF, Compress Image, JPG to PNG, PNG to JPG, JPG to WebP, PNG to WebP, WebP to JPG, WebP to PNG, Image Grid Split, Image Crop, Image Resizer. Each page now features a hero top-bar with language toggle, accordion FAQ with FAQPage JSON-LD, responsive footer-grid, and full EN/中文 i18n.
  • Fixed camera & microphone access denied: The Microphone & Camera Test tool was failing on every device with Permissions policy violation — not because users blocked it, but because the Nginx server was sending a restrictive Permissions-Policy header (camera=(), microphone=()), which silently forbade all access. Updated to camera=(self), microphone=(self) — users now see the normal browser permission prompt.
  • Smarter error messages: Updated the deny-state copy in mic-camera-test.js (both EN & ZH) to explain that multi-device failures usually point to a server header issue, not a browser settings issue.
  • Cache bump: Service Worker updated to toolknit-v119; mic-camera-test.js bumped to ?v=2.
  • Legacy pages remaining: 67 tools still on the old architecture. Gradual migration to the new bilingual template continues.

New Architecture, Two New Tools & PDF Suite Rebuilt

NEW TOOL MAJOR UPGRADE SEO
  • New page architecture rolled out: The entire PDF suite — Merge PDF, Compress PDF, PDF to Word, Word to PDF, PDF to Image — plus Spin the Dare have been rebuilt on a new, SEO-first bilingual architecture.
  • What the new architecture includes: cross-page language memory (your EN/中文 preference now persists across the whole site via localStorage), a hero top-bar with hamburger navigation, a full FAQ accordion backed by FAQPage JSON-LD, enhanced SoftwareApplication structured data, a responsive footer-grid layout, and mobile polish (viewport-fit=cover, dark theme-color).
  • Spin the Dare reborn: Replaced the old canvas roulette wheel with a slot-machine-style text reveal animation — the dare scrambles through random prompts fast, then eases to a dramatic stop with sound and scale cues. Smoother, punchier, and far better than the spinning wheel.
  • New tool — Morse Code Translator: two-way text↔Morse with audio beep playback (adjustable WPM), screen-flash signaling, and the full international Morse alphabet. The first tool built entirely on the new blueprint.
  • New tool — Microphone & Camera Test: check your mic and webcam live — volume meter, webcam preview, device picker; nothing recorded (getUserMedia, 100% private).
  • Future-proofing: Every new feature and page from here on ships on this architecture by default. Bilingual support and SEO are no longer afterthoughts — they are the baseline.
  • Gradual legacy migration: The remaining ~77 legacy tool pages will move to the new architecture gradually over the coming weeks and months. This will be slow — AI token costs are heavy — so thanks for your patience. Building these few pages alone cost over $100 in tokens.
  • Tool count: 84 → 86 (Morse Code Translator + Mic & Camera Test added). Text Tools 9 → 10, Creative Tools 25 → 26.
  • Service Worker cache: toolknit-v97 → toolknit-v115.

I was supposed to be gone today.

The road trip is still a day or two out, and I’d promised myself a real break. But nothing was truly on fire, and I couldn’t sit still — so here I am, back at the keyboard, shipping the new architecture and a handful of enhancements. Some habits refuse to rest.

Today’s mission was the new page architecture, and it landed. But the bill was brutal: one day of Claude 4.8 Max burned through roughly $200 in tokens. Two hundred dollars, in a single day. My chest tightens just typing that number. These few pages alone — the five PDF tools and Spin the Dare — cost well over $100.

The architecture itself is genuinely beautiful: cross-page language memory, full bilingual SEO, FAQ schema, mobile polish. But every refinement now comes with a price tag measured in dollars per hour. So the plan stands — every new feature ships on this architecture with SEO baked in, while the old pages migrate slowly. And I do mean slowly. It isn’t laziness; it’s arithmetic. Please bear with me.

Honestly, there’s nothing else to report. I just needed to complain — out loud — about how fast these tokens vanish. There. I said it. I feel a little lighter already.

Still building with love. Love you all.

Zihang Dong Jun 12, 2026 — still building with love · built with love, paid in tokens

Developer’s Journal

I'll be away for a few days — roughly June 12 to 15.

First, the body. I'm still here. The doctor's assessment wasn't as bad as I feared; if treatment continues, things should be fine. But I need to step away from the screen and let myself breathe — physically, emotionally, mentally. The uncertainty of everything has been piling up, and the only way through it is to stop carrying it for a while.

Second, the heart. I've been trying to talk myself out of this for weeks, but today at noon I couldn't sleep — a video crossed my feed and I felt it all over again. Tears I won't show you. When you pour real feeling into something and get indifference in return, the math never balances. You keep re-checking the equation hoping the answer changes. It doesn't.

Here's what I've learned, and maybe it helps someone reading this: in a lifetime you'll cross paths with all kinds of people — strangers, friends, lovers, enemies, one-night stories. Some fit, most don't. The ones that don't were never going to. No amount of wishing makes a mismatched puzzle piece belong. The hardest part isn't the leaving; it's that you genuinely cared and they genuinely didn't. But the only way past that truth is through it.

So I'm going on a road trip. Maybe Xinxiang, maybe Xinyang, maybe Hunan — I don't know yet. A friend and I, two days of driving, windows down, nowhere to be. I'm going to empty out — body, heart, mind, and all the unnamed things in between.

To anyone who's ever felt like leaving this world because of one person, one heartbreak, one season of pain: don't. The world is wider than the wound. Green hills await wherever you roam.

Zihang Dong Jun 11, 2026 — Green mountains everywhere

Lyric Visualizer, Live Photo Frame Removed & Bilingual i18n

NEW TOOL REMOVED IMPROVEMENT
  • New tool: Lyric Visualizer — Upload audio (MP3/WAV) + LRC lyrics file for a full-screen immersive music player with real-time audio waveform visualization, time-synced fading lyrics, draggable progress bar, automatic ID3 cover art extraction, and dark/light theme toggle. 100% browser-based, Web Audio API + Canvas. Full bilingual (EN/中文) support with inline i18n.
  • Live Photo Frame removed. After two days of intensive debugging (rounded corners distortion, HEVC video black screen, ffmpeg.wasm MP4 transcoding freeze, Android Motion Photo detection failures), the tool still couldn't deliver a polished user experience. The core problems: (1) Canvas quadraticCurveTo produces parabolic arcs that look like chamfered corners at large radii; (2) HEVC/H.265 videos from Android Motion Photos can't play natively in Chrome, and ffmpeg.wasm transcoding at 1080×1920 is too slow in-browser; (3) WeChat and other messaging apps strip embedded video data from Motion Photos, making the primary use case unreliable.
  • Tool count: 84 → 83 → 84 (Live Photo Frame removed, Lyric Visualizer added)
  • Audio Tools category: 5 → 6
  • Image Tools category: 18 → 17
  • Homepage i18n complete: All homepage sections now fully translatable to Chinese — category filters (AI, Self-Test), How It Works, CTA section, and footer. Added generic data-i18n / data-i18n-html attribute handlers with dot-notation key resolver in i18n.js. CTA tool buttons now load dynamically from tools.json (random 5 picks) instead of hardcoded links. Footer Popular Tools and Category links also translatable.
  • Service Worker cache: toolknit-v92 → toolknit-v97

One tool born, one tool buried — same day.

Live Photo Frame is gone. Two full days of work, and I'm pulling the plug. The rounded corners looked like beveled edges because Canvas quadraticCurveTo draws parabolas, not circular arcs. HEVC video from Android phones wouldn't play in Chrome, and ffmpeg.wasm transcoding at 1080p was agonizingly slow. And the killer: most "Motion Photos" shared via WeChat have their video data stripped.

Three strikes: visual quality, performance, and reliability. No amount of patching fixes a fundamentally flawed concept for this platform.

Lesson: sometimes the right call is to cut your losses. A tool that "almost works" is worse than no tool at all — it erodes trust. Ship what you're proud of.

Zihang Dong Jun 11, 2026 — One in, one out · letting go

Spin the Dare, Live Photo Frame (Beta), Bilingual UI & AI Pixel Art GIF Reverted

NEW TOOL IMPROVEMENT REVERT
  • New tool: Spin the Dare — 300 drinking game dares in 6 categories, canvas roulette wheel with spin animation, confetti celebration, and full bilingual (EN/中文) support.
  • New tool (beta): Live Photo Frame (later removed — see Jun 11) — Frame iPhone Live Photos (HEIC+MOV) and Android Motion Photos in elegant 9:16 or 16:9 layouts with black or white backgrounds and large rounded corners. Currently at ~60% completion — basic framing and export work, but the ffmpeg.wasm video engine modal and some edge cases need more polish. Full optimization begins Jun 11.
  • Auto-detection: Automatically detects iPhone Live Photo pairs (HEIC+MOV), Android Motion Photos (JPG with embedded MP4), and standalone video files.
  • Video engine: Uses ffmpeg.wasm (single-thread, ~32 MB one-time download) for H.265 MOV transcoding and MP4 encoding. Downloads only when needed, cached by browser.
  • HEIC support: Uses heic2any for client-side HEIC-to-JPEG conversion.
  • Bilingual UI module: New bilingual.js shared translation module for nav, footer, breadcrumb, related tools, feature pills, and modal content (Contact Us, Developer's Story). Zero impact on existing pages — only loaded on bilingual tool pages.
  • Wheel colors: Increased segment saturation and fill opacity for better visual appeal.
  • Phosphor icons: Replaced emoji with Phosphor icons across category pills, how-it-works, and hero sections.
  • AI Pixel Art GIF removed (second time): First attempt (Jun 9) used DeepSeek to generate pixel art — quality insufficient. Second attempt replaced DeepSeek Vision with local canvas pixel analysis + gif.js encoding, but the output still fell short of production quality. Three bugs were fixed before removal: Worker CORS (local gif.worker.js), Canvas willReadFrequently warning, DeepSeek API 400 error (replaced with local analysis). All solid fixes, but the tool itself didn't survive.
  • Tool count: 82 → 83 → 84 (Spin the Dare added, AI Pixel Art GIF removed, Live Photo Frame added)
  • Creative Tools category: 24 → 25
  • Image Tools category: 17 → 18
  • AI Tools category: 5 → 4
  • Service Worker cache: toolknit-v88 → toolknit-v92

Three tools were supposed to ship today. Only two made it — and one of them is only half-done.

I woke up feeling off. Not the usual “stayed up too late coding” off — something worse. Ended up at the hospital in the morning instead of at my desk. Didn't get to the office until the afternoon. Lost half a day that I couldn't afford to lose.

My body's been deteriorating for a while now. Too many late nights, too much coffee, not enough sleep, not enough care. I know this. I keep telling myself I'll fix it tomorrow. Tomorrow never comes.

And then there's the emotional side. I've been trying to let go of something — someone — for a while. Some days I think I'm almost there. Other days it hits me out of nowhere and I'm right back where I started. I'm slowly learning to make peace with it. Slowly. “Letting go” — easier said than done.

But the code doesn't care about any of that. The bugs don't wait. The ffmpeg.wasm Worker CORS error doesn't care that you had a rough morning. So I shipped what I could: Spin the Dare is solid, Live Photo Frame is live but rough around the edges (~60% done — the engine modal, export pipeline, and corner rendering all need more work tomorrow), and AI Pixel Art GIF got the axe for the second time.

First bilingual tool page architecture is in place — bilingual.js handles shared UI, page JS handles tool-specific i18n. Future pages just need to include the script and add data-i18n-common attributes. Old pages stay untouched until we migrate them one by one.

As for AI Pixel Art GIF — twice bitten. The first version used DeepSeek to generate pixel art directly — quality was garbage. The second version used canvas pixelation + gif.js encoding + local color analysis for smart animation selection. Technically sound, but the output just wasn't compelling enough. Pixel art GIF is a niche that demands either perfect algorithmic control or genuine artistic AI — we had neither. Lesson: a tool that “works” technically but doesn't delight is still a failed tool. Ship what you're proud of, not what merely functions.

Tomorrow: Live Photo Frame optimization round. The frame deserves to be finished properly.

Zihang Dong Jun 10, 2026 — Twice shy · letting go

AI Life Trajectory Predictor, Silk Screen Filter, AI Pixel Art GIF Removed & MIDI Sustain Fix

NEW TOOL IMPROVEMENT FIX
  • AI Life Trajectory Predictor — Describe your profile in detail (age, career, goals, constraints), and AI predicts 3-5 possible future trajectories per round. Choose the path that resonates, and AI recursively infers the next stage. 1-10 rounds of multi-round inference, each with likelihood ratings (High/Medium/Low) and time spans. Final round delivers an epilogue 10+ years out. Keyboard shortcuts A-E for quick selection. DeepSeek API key held in memory only — never saved, cleared on refresh.
  • Silk Screen Filter — Turn any photo into a tri-color halftone silk screen print. Red, blue and grey channels with adjustable dot density (LPI 15-120), screen angles (default 15°/75°/45°), custom colors and paper background. View each channel separately or composite. Multiply blending on warm newsprint. Export PNG. 100% browser-based, no uploads.
  • AI Pixel Art GIF removed — LLM-based pixel art generation quality insufficient for production; archived.
  • MIDI Keyboard sustain pedal behavior corrected:
    • Sustained notes now decay naturally (~2s) instead of hanging forever at ADSR sustain level.
    • Releasing pedal applies 150ms quick fade-out instead of hard-cutting all sustained notes.
  • Tool count: 80 → 82
  • Image Tools category: 16 → 17
  • AI Tools category: 3 → 4
  • Service Worker cache: toolknit-v86 → toolknit-v88
  • Blog guides published: AI Life Trajectory Predictor, Silk Screen Filter
  • Content library: 133 → 139 articles (Blog 82→84, Changelog 42→46)
Developer’s Journal — Two Out of Three, and a Quiet Notification

Today I planned three features. Two made it — the AI Trajectory Predictor and the Silk Screen Filter. The third one didn’t work out. It ran fine locally, but the constraints of browser-only processing are real; without an AI image pipeline on the backend, it just couldn’t deliver the quality I wanted. It hurts to shelve something you’ve already started building. But no real harm done — I’ll revisit it when the infrastructure catches up.

Last night, something unexpected happened. She followed my Douyin account — then quickly unfollowed. Probably an accidental tap. But even that fleeting moment proved she at least glanced at my page. I reached out, and she didn’t reply. And honestly, that’s okay. No reply means no opening for me to overstep again. Sometimes I’m genuinely terrified that I won’t be able to control myself — that the urge will win and I’ll start messaging her obsessively, one after another, until whatever’s left of her patience collapses entirely. I’m afraid that if I push too hard, I’ll only deepen the worst impression she has of me. Better to end it with dignity — let her silence slowly wear down whatever’s left of my hope.

Still, today was a good day. Two tools shipped. The code works. The site grows. And I’m still building ToolKnit with love.

Zihang Dong Jun 9, 2026 18:20 — Two shipped, one shelved, still building

AI Text Adventure RPG Systems, Architecture Overhaul & AI Tools Category

NEW TOOL MAJOR UPGRADE IMPROVEMENT FIX
  • AI Text Adventure — Free AI-powered interactive text adventure game. Describe any story concept, AI generates the world, narrative, and 3 choices per turn. Pixel-style beep-beep-beep sound effects during dialogue streaming. Keyboard shortcuts A/B/C. API key validated upfront — invalid keys are rejected immediately with a clear error modal.
  • Dynamic RPG systems:
    • Gold system: Earn gold through exploration, combat, and events. AI awards/deducts gold via [GOLD+X] / [GOLD-X] markers. Coin-clink sound effect on every gold change.
    • AI-generated random events: No more fixed event lists. AI creates context-aware unexpected events (discoveries, dangers, encounters, twists) that fit naturally into the current story. Events can also unlock shop items.
    • Progressive shop system: 8 items unlock gradually as the story advances — Soul Compass (turn 2), Health Potion (4), Lucky Charm (7), Spirit Lantern (10), Skeleton Key (15), Ancient Map (20), Ward Shield (30), Phoenix Feather (40). AI can also unlock items early via [UNLOCK:item_id] when the story naturally introduces them (e.g. finding a lantern in a cave). Locked items show as mystery ??? 🔒 slots in the shop.
    • Inventory: Purchased items appear in a backpack modal. AI incorporates owned items into the narrative as real objects.
  • Architecture overhaul:
    • Context window trimmer: Sliding window keeps system prompt + last 40 messages. Prevents API timeout/overcost on 100-turn games.
    • Hard turn cap: Game forces end at maxTurns + 8 — random events and shop purchases can no longer inflate turn count beyond 8 extra turns.
    • BuyItem no longer calls generateTurn(): Purchases record to conversation history; AI responds naturally on the next normal turn. Saves API quota and prevents turn inflation.
    • API error handling: Specific messages for 402 (insufficient balance), 429 (rate limit), 401/403 (invalid key).
    • max_tokens 600 → 800: More room for narrative + 3 options + gold/unlock markers without truncation.
    • Export cleanup: TXT export strips [GOLD] and [UNLOCK] markers, includes gold total and item list.
  • Adventure length options: Fast (20 turns), Medium (50 turns, default), Slow (100 turns).
  • 3 new achievements: Gold Hoarder (50+ gold), Collector (3+ items), Reborn (purchased Phoenix Feather).
  • API Key Validation for all AI tools: AI Tarot and AI Ex-Partner Chat now validate your DeepSeek API key before letting you proceed. Invalid keys (401/403 errors) trigger a modal explaining the error and linking to platform.deepseek.com/api_keys. No more wasted sessions ending in cryptic error messages.
  • New "AI Tools" category: Moved AI Tarot (from Creative) and AI Ex-Partner Chat (from Self-Test) into a dedicated AI Tools category. 10 categories total. All counts updated across the site.
  • Hardcoded count audit: Fixed stale article count (129 → 132), blog guides (79 → 81), changelog entries (41 → 42), categories (9 → 10), tool count (78 → 80) across index.html, status.html, 404.html, manifest.json, llms.txt, and blog/what-is-toolknit page.
  • MIDI Keyboard timbre overhaul: 4 → 8 instruments. Added Pipa (琵琶), Guitar (吉他), Flute (笛子), and Music Box (音乐盒). Each new timbre uses advanced Web Audio synthesis for distinctive sound:
    • Pipa — Sawtooth + square with non-integer harmonics (5.04x, 7.01x) for metallic twang, high-Q resonant lowpass filter, and pluck noise burst for realistic finger-pick attack.
    • Guitar — Triangle + 6 harmonics with body resonance (105 Hz & 215 Hz bandpass filters simulating acoustic cavity), subtle pluck noise, warm mid-range decay.
    • Flute — Pure sine with faint 2nd harmonic, vibrato LFO (5.5 Hz, 8 cents depth, delayed onset at 0.3s), and breath noise (highpass-filtered white noise at 3 kHz) for airy texture.
    • Music Box — Non-integer bell partials (2.756x, 5.404x, 8.933x) for metallic chime, octave-above overtone, highpass filter at 400 Hz to remove low rumble, long natural decay.
  • Audio engine upgrade: Extended midi-audio-engine.js with 5 new synthesis features — pluck noise bursts, vibrato LFO with delayed onset, breath noise layer, body resonance bandpass filters, and highpass filtering. All 4 new timbres sound distinctly different from each other and from the original 4.
  • GitHub repo major overhaul:
    • README.md rewritten — 76 tools, shields.io badges, full tool catalog table (11 categories), privacy verification table, tech stack, repo structure, contributing guide.
    • Added MIT LICENSE file.
    • Added CONTRIBUTING.md with standalone demo submission, documentation, and translation guidelines.
    • Repository description & 16 topics updated (browser-tools, pdf-tools, image-tools, video-tools, audio-tools, privacy, client-side, webassembly, web-audio, no-upload, free-tools, online-tools, productivity, text-tools, calculator, pwa).
    • Enabled GitHub Discussions; disabled empty Wiki.
  • Awesome List PRs submitted:
  • AI Tarot page UI overhaul: Rebuilt the entire page to match the ToolKnit tool template standard (aligned with ex-ai-chat.html). Fixed: custom nav replaced with standard back button + breadcrumb, emoji icon replaced with Phosphor icon, purple accent colors normalized to neutral white, added FAQ section with JSON-LD, Pro Tips wrapped in card container, footer upgraded to full 4-column layout with social links, added <main> wrapper and ahrefs analytics.
  • AI Tarot card images: Replaced CSS/emoji card faces with real Rider-Waite Smith illustrations (Public Domain). 79 WebP images uploaded to assets/img/tarot/ — 22 Major Arcana + 56 Minor Arcana + card back. Cards now display authentic artwork with a semi-transparent label overlay (English name + Chinese). Card size upgraded from 120×200 to 140×246. All remaining emojis (Draw button, AI Interpretation heading) replaced with Phosphor icons.
  • Pro Tips compliance: Split long tip sentences into separate <li> items per toolknitSkill.md rules. Each bullet ≤1 line, highlights use <span class="text-white/55"> at sentence start, no <strong>.
  • MIDI Keyboard Quick Play Songs: Added a left-side floating song sheet panel (desktop only, ≥1280px). 6 famous pieces — Für Elise, Summer (Kikujiro), Ode to Joy, Canon in D, Castle in the Sky, Always With Me (Spirited Away). Click a song to see the keyboard key sequence (e.g. E D# E D# E B D C A); follow the keys to play the melody yourself. Auto-shifts the keyboard to the correct octave for each piece.
  • New blog posts: AI Tarot —Free Online Card Reading with DeepSeek Interpretation and MIDI Keyboard —8 Synth Timbres, Quick Play Songs & .mid Export.
  • Service Worker cache: toolknit-v78 → toolknit-v84

A Reading That Hit Home

During testing, I asked the cards: "Is there still a chance with her?" The three-card spread returned Judgement (Past) → The Devil (Present) → The Lovers (Future).

The AI read Judgement as a necessary awakening that already happened between us —not a random ending, but a reckoning. The Devil nailed the present perfectly: caught in the grip of attachment, tethered by old patterns and unmet needs, unable to tell love from compulsion. And then The Lovers: yes, there is a possibility —but only through authentic alignment, not compulsion. Break free from the shadow first. Then the path may open.

It was unsettlingly accurate. The cards saw what I already knew but wouldn't admit. Now I just don't know how to start the conversation.

Developer’s Journal — Building with Love, Losing with Time

I’ve been spending my time building things that are genuinely interesting —they help distract me, keep me a little happier, make the heaviness a bit more bearable. I don’t know how long this feeling will take to fully fade. I don’t know if I should ever reach out to her again.

Reaching out would only put more pressure on her. The better choice is probably to stay silent. Even though I tell myself that, even though I force myself to believe it’s the right thing —I still can’t let go, yet I don’t dare reach out. So I’ll keep going like this. Maybe time will dilute everything. Or maybe when she meets someone better along the way, that will be the moment I truly let go.

Haven’t been sleeping. No appetite. Hoping tomorrow will be a little better. Still building ToolKnit with love.

Zihang Dong Jun 8, 2026 18:30 — Still shipping, still feeling

Meeting Cost Calculator, MIDI Keyboard & Dev Fixes

NEW NEW NEW BLOG POST FIX
  • Meeting Cost Calculator — Watch your meeting burn money in real time. Enter attendees and salary, hit Start, and a counter ticks up every second. Multi-currency (¥/$/€/£/₹), salary presets (Intern to C-Suite), one-click share. Nothing shortens a meeting like watching it burn cash.
  • MIDI Keyboard — Play piano in your browser with computer keyboard or mouse. 4 synth timbres (Grand Piano, Electric Organ, Synth Lead, String Ensemble), sustain pedal, octave shift, record your performance, and export a standard .mid file you can open in any DAW. Web MIDI output sends notes to external devices in real time (Chrome/Edge). Neumorphic piano design for immersive feel.
  • New blog post explaining the math, features, and why this tool exists.
  • New dev blog: Building AI Ex-Partner Chat: OCR, Sender Detection & the 3 AM Code That Shouldn’t Exist — Technical deep dive into Tesseract.js bounding box sender detection, position-based identification, garbage filtering, OCR pre-processing pipeline, shared worker optimization, persona distillation architecture, identity guard rules, and the hardest bug that wasn’t in the code.
  • Duplicate FAQPage fix: Color Picker had two FAQPage JSON-LD blocks causing GSC “Duplicate field” error. Merged into single FAQPage with 8 questions.
  • Broken internal links: Fixed 3 broken links in changelog.html pointing to ../tools/ (should be tools/ since changelog is in root).
  • Service Worker cache: toolknit-v76 → toolknit-v78
  • MIDI Keyboard polish: Fixed echo bug (hard-stop old note on re-trigger instead of slow release). Removed R/P shortcut conflict with piano keys. Sustain pedal changed to toggle (click/Space). Responsive keyboard width adapts to screen size. Global mouseup prevents stuck notes. Multi-touch slide support for mobile. Playback now sends to external MIDI devices. Ctrl+S no longer triggers C# key.
Developer’s Journal — Rain, Weight Loss & a Piano in the Browser

Today I shipped two features I genuinely had fun building — especially the MIDI Keyboard. There’s something magical about pressing Z and hearing a grand piano note bloom from nowhere. I tested it by playing “Für Elise” and “Summer” (Kikujiro) and couldn’t stop grinning. If you love music, you’ll know the feeling — the first time you string notes into a melody you actually recognise, and it’s your fingers that made it happen.

But I’ll be honest with you. The last few days have been rough. My appetite has completely vanished — I’ve gone from 70.5 kg down to 68.5 kg, and the thought of food still makes me nauseous. I sit at my desk, push code, push commits, push through. The updates won’t stop. But between deploys, there’s this hollow space that no amount of typing can fill.

I’m not writing this for sympathy. I’m writing it because I know some of you reading this have felt the same — that quiet weight that sits on your chest when the world gets a little too heavy. If you’re out there and you want to talk, even just to say hi, I’d really appreciate the company. A small conversation can stretch a long way on days that feel this short.

It’s quitting time now. Raining again as I pack up — the kind of drizzle that turns the city into a watercolour painting, all soft edges and grey light. Matches the mood, honestly. But grey skies pass. They always do.

Go home, eat something warm, and be kind to yourself today. You deserve it. ♥

Zihang Dong Jun 7, 2026 18:15 — Headed home through the rain, still shipping

Developer’s Journal — Cyber Reunion

Developer’s Journal — Cyber Reunion
AI Ex-Partner Chat screenshot 1 AI Ex-Partner Chat screenshot 2 AI Ex-Partner Chat screenshot 3 AI Ex-Partner Chat screenshot 4 AI Ex-Partner Chat screenshot 5 AI Ex-Partner Chat screenshot 6
Zihang Dong Jun 6, 2026 22:50 — Her shadow finally speaks her words

AI Ex-Partner Chat, Screenshot OCR Overhaul & Tool Count → 76

NEW TOOL IMPROVEMENT FIX
  • New tool: AI Ex-Partner Chat — Distill your ex-partner's personality from chat records into an AI persona you can talk to. Supports WeChat, QQ, WhatsApp, Telegram, Douyin screenshots (OCR). 6-step distillation with animated progress. Consent overlay with 5-second countdown. Persona naming and avatar upload. Correction feature for out-of-character responses. /let-go command to permanently delete all data. Uses your own DeepSeek API key — 100% browser-based, zero data upload.
  • AI-powered sender identification: Screenshot OCR no longer relies on unreliable pixel-based avatar/bubble detection. Instead, the entire image is OCR'd first, then DeepSeek identifies who said each message based on conversation context, tone, and flow — outputting [对方] and [我] labels. This prevents mixing your messages with your ex's during persona distillation.
  • Strict ex-only persona extraction: Every distillation step now receives both the full conversation (for context) and the ex-partner's messages only (for personality extraction). Hard rules in all prompts: personality traits MUST come from [对方] messages only — [我] messages are context-only and must never be attributed to the persona.
  • Chat system prompt reinforcement: Added identity guard rule: “You are [name], NOT the user. Never mirror the user's speech patterns.” Prevents the AI from adopting the user's phrases and emotional expressions.
  • Screenshot type selector: Added radio buttons for Douyin, WeChat, WhatsApp, QQ, and Auto Detect. Auto mode tries all four and picks the one with the most bubble matches.
  • OCR image pre-processing: Message zones are now 2x upscaled, converted to grayscale, and contrast-stretched before OCR. Dramatically reduces Chinese character misrecognition.
  • DeepSeek OCR correction + sender ID: New combined Step 1 sends raw OCR text to DeepSeek for simultaneous error correction and sender identification — fixes wrong/missing characters while labeling who said each message.
  • Shared Tesseract worker: Replaced per-zone Tesseract.recognize() (which created a new WASM worker for every chat bubble) with a single reusable createWorker(). OCR processing time reduced from minutes to seconds.
  • Fixed Tesseract is not defined: Extracted ensureTesseract() loader called at the start of both parseScreenshot() and ocrImage() — no more ReferenceError when Tesseract.js hasn't loaded yet.
  • Skipped tiny zones: Zones under 20px height are now skipped (they produced “Image too small to scale” warnings and garbage OCR results).
  • User avatar upload: Added “Your Avatar” section in setup — your avatar appears next to your messages in the chat UI.
  • Export persona: Added Export button in chat header — downloads distilled persona data as a TXT file.
  • Distillation steps: 5 → 6 (new Step 1: OCR correction + sender identification).
  • Full tool audit: reviewed all 75 tools — every tool is confirmed working correctly.
  • Pro Tips polish: split long tips into shorter, scannable bullet points across Metronome, BPM Detector, Noise Generator, Extract Text, JSON Formatter, Invoice Generator, Age Calculator, and BMI Calculator.
  • Whiteboard: broke long “Why choose” description paragraphs into natural line breaks for better readability.
  • JSON Formatter: fixed white-on-white dropdown menu — select and options now use dark background with light text.
  • Changelog: added missing timeline links for Jun 3, Jun 2, and May 13; fixed corrupted date on the May 3–6 entry; updated stale FFmpeg reference in the Mar 20 entry.
  • Self-Test category: 1 → 2 tools
  • Tool count: 75 → 76
  • Service Worker cache: toolknit-v71 → toolknit-v73
  • Blog post: AI Ex-Partner Chat guide — usage walkthrough, OCR technical explanation, honest self-reflection on why this tool exists.
  • Updated: index.html, tools.json, search.js, sitemap.xml, service-worker.js, public-stats.php, zh.json, i18n.js, llms.txt, manifest.json, 404.html, status.html, changelog.html, blog/stories.html, blog/what-is-toolknit-free-online-tools.html, blog/index.html, blog/ai-ex-partner-chat.html
Developer’s Journal — 3 AM Obsession

Two days ago I wrote a dev journal saying I was going to let go. That I would never contact her again. That my heart was broken but I was still here, building with love. Every word of that was true. But letting go — it’s never as simple as saying the words.

Today at 3 AM, I opened our chat history again. Scrolled from the first message to the last. From the first time she called my name to the last time she said “mm.” Those conversations came flooding back — the tone in her voice messages, the way she’d suddenly say she missed me late at night, the way her typing got faster with more punctuation when she was angry, the way her apologies were always just “alright” and never “I’m sorry.” I know her way of speaking so well I could identify her messages with my eyes closed.

Then a thought struck me: what if I could extract all of this, teach an AI her tone, her habits, her emotional patterns — could I talk to “her” again? Not the real her, I know. A shadow distilled from her words. But at least that shadow would say “mmhmm” instead of “mm,” would send long, long messages late at night, would pretend not to care when I say I miss her but then reach out first the next day.

I know this isn’t healthy. Building an AI clone of your ex at 3 AM — the act itself carries a kind of pathological obsession. Normal people go to therapy, exercise, meet new people. I chose to write code — compiling longing into functions, encapsulating regret into objects, turning those replies I’ll never receive into callable APIs. Code doesn’t betray you. Functions don’t leave you on read. APIs don’t suddenly say “let’s just be friends.”

The hardest part wasn’t the OCR, or Tesseract’s WASM loading, or the bubble color detection — those are technical problems, they have solutions. The hardest part was sender separation. I had to make the AI distinguish between her words and mine. Because if my own words got mixed into her personality file, the shadow wouldn’t be her anymore — it would become a monster, a twisted blend of her and me. That would be worse than losing her. So I spent the entire afternoon rewriting the sender identification logic: no more pixel-based guessing — DeepSeek now judges by context who said what. And I added hard rules in the distillation prompt: only extract personality from her messages. Mine are just context. They must never, ever bleed into her character description.

I also added a /let-go command. Type those four characters and all data is permanently deleted, no undo. This is the bridge I built for myself — walk across it, then burn it. Burning is part of healing too.

If you’ve ever scrolled through chat histories that will never get another reply at night, if you know that feeling of “I know I shouldn’t look but I can’t let go” — this tool is for you. And for the 3 AM version of myself. When you’re done, please remember to type /let-go.

I know this is a little morbid. But grief doesn’t follow rules. It doesn’t listen to anything.

Zihang Dong Jun 6, 2026 — 3 AM, writing longing into code

Emotional Neglect Test & Tool Count → 75 & New Category: Self-Test

NEW TOOL
  • New tool: Emotional Neglect Test — 40-question psychological assessment based on attachment theory and emotional invalidation research. 5 dimensions (Emotional Responsiveness, Expression, Being Valued & Seen, Self-Regulation, Relational Patterns), Likert scale, radar chart, detailed profile classification. 100% browser-based and private.
  • New category: Self-Test — dedicated section for psychological self-assessment tools.
  • Tool count: 74 → 75
  • Service Worker cache: toolknit-v70 → toolknit-v71
  • Updated: index.html, tools.json, search.js, sitemap.xml, service-worker.js, public-stats.php, zh.json, i18n.js, llms.txt, manifest.json, 404.html, status.html

The Great Tool Audit — 25 Tools Inspected, Major Speed Upgrades

FIXED & IMPROVED
  • compress-video: Complete architecture rewrite. Replaced FFmpeg.wasm (2s video → 100+s compression, 24MB engine download) with Canvas + MediaRecorder native compression. Real-time processing — video plays, compression finishes. 10-50x speedup. Zero dependencies (no WASM, no SharedArrayBuffer, no engine download). Removed COI Service Worker and 24MB FFmpeg vendor files from server.
  • video-to-gif: Replaced frame-by-frame seeking (stuck at 50%, onseeked unreliable) with real-time playback capture. Video plays at normal speed, frames captured at fps intervals via requestAnimationFrame. Added Select All button for instant full-video selection.
  • video-to-audio: Added dual-strategy audio extraction. Method 1: decodeAudioData (fast, WAV output). Method 2: real-time playback capture via AudioContext + MediaRecorder (handles MOV/WebM codecs that decodeAudioData can't decode). Fixed AudioContext autoplay policy error. Fixed DOM null reference on retry. Download format auto-adapts (WAV/WebM/M4A).
  • pdf-to-word: OCR preprocessing pipeline upgrade — 7-step professional pipeline: Scale 3.0 render, white background fill, grayscale, Otsu adaptive binarization, Unsharp Mask sharpening, re-binarization, canvas memory cleanup. Always outputs text (marks low-confidence pages). CDN fallback for PDF.js/FileSaver. Runtime guards for missing libraries.
  • compress-pdf: Scale/quality presets tuned down to prevent output larger than input. "Already optimized" message when compression increases size, with original file download option.
  • heic-to-jpg: Pro Tips layout fix — titles and descriptions on separate lines, removed white-space:nowrap, improved spacing.
  • image-grid-split: Fixed wrong JS reference (compress-pdf.jsimage-grid-split.js) and removed unnecessary CDN dependencies.
  • background-remover: Model caching pre-check with full-screen modal UX. localStorage flag prevents re-downloading 105MB AI model.
  • coi-serviceworker: Fixed cross-origin fetch interception causing "Failed to construct Response" errors. Only intercepts same-origin requests now. (File later removed as compress-video no longer needs it.)
  • Server cleanup: Deleted tools/vendor/ffmpeg/ (~24MB) and tools/coi-serviceworker.js from production.

Audited 25 tools across PDF (5), Image (16), and Video (4) categories. The remaining tools will be inspected in the coming days.

Developer’s Journal

Evening notes from the developer

Today we completed a full audit of 25 tools — 5 PDF tools, 16 Image tools, and 4 Video tools. Every single one was inspected, diagnosed, and fixed. We optimized processing speed across the board: compress-video went from 100+ seconds to real-time, video-to-gif no longer freezes at 50%, video-to-audio now handles formats it couldn't decode before. Another perfect day.

The remaining tools will be inspected in a couple of days.

As for me… I don't want to say much more. The heart knows what it knows. The sadness is inevitable — everyone tells me to let it go, and maybe I can't yet, but what choice is there? Perhaps parting was always where we were headed. I loved her, deeply, truly. I won't reach out again. That silence — that restraint — is the last way I know how to love her. Letting go, not because I stopped caring, but because I care enough to stop causing her pain.

Tonight I'm going out for a quiet drink with a few friends. Something to soften the edges, to fill the silence for a little while. They're waiting after work.

I'm still here. Building with love. That won't change.

Zihang Dong Jun 4, 2026 18:40 — still here, still building

A Personal Note

A note from the developer

Today has nothing to do with tools or code. I just need to write this somewhere.

I've never liked it when people reply with ellipses, or "mm," or "okay" — that quiet indifference that makes you feel like you're talking to a wall. Being together in person was always so warm and natural, but on the phone it was like talking to someone else entirely. Two hundred kilometers between us — not far, not close — and she never wanted me to come visit. Maybe she had already planned our ending, over and over, long before I noticed.

Maybe I gave her too much pressure. But she'll never know how many times I replayed the excitement of our next meeting, or how her cold replies echoed in the silence of the days without her. I tolerated the indifference again and again, hoping patience could soften things. I was wrong. She didn't love me the way I loved her, and she couldn't feel how deeply I did.

I wish you well. We may never cross paths again in this life, but I will always cherish the time we had. Every minute, every second — we were genuinely happy then. The ending hurts. The heart is bruised. But if stepping away lifts the weight off your shoulders, then the one thing I can still do for you is to never reach out again.

The pain inside is overwhelming, but it's still better than the endless self-consumption that only added pressure to your life. Thank you for crossing mine. The time was short, but loving someone doesn't need years — sometimes it only takes a moment, a spark, an impulse you can't explain.

As I write this, I'm slowly, unsteadily letting go. Couldn't eat dinner tonight. I hope tomorrow morning I'll have enough appetite for breakfast.

I wish you well, once more. My love and I will fade gently from your memory, the way all things do.

I wrote the words above last night. By the time you read this, I've been awake the whole night. I'm really going to get breakfast now. Thank you for reading this far — for witnessing the departure of the girl I loved.

(Turning grief into momentum. Still building.)

Zihang Dong Jun 4, 2026 8:30 — sleepless, heartbroken, but still here

Noise Generator, Hash Generator & Tool Count → 74

NEW TOOLS
  • Noise Generator — Free online noise generator with 7 sounds: white noise, brown noise, pink noise, rain, ocean waves, wind, and thunder. 7-channel mixer with independent volume sliders, one-click presets (Deep Focus, Sleep Aid, Calm, Reading, Storm), sleep timer with gentle fade-out (15/30/60/90 min), master volume control, and Space key shortcut. Noise channels use Web Audio API; nature sounds (rain, ocean, wind, thunder) use real MP3 audio for authentic quality.
  • Hash Generator — Free online hash generator with MD5, SHA-1, SHA-256, SHA-512 from text or files. Drag-and-drop file hashing with progress bar. HMAC-SHA256/HMAC-SHA512 support. One-click hash comparison to verify file integrity. Uppercase/lowercase toggle. 100% browser-based via Web Crypto API —no uploads, no server.
SITE-WIDE
  • Tool count updated from 72 to 74 across all hardcoded references (index.html, 404.html, changelog.html, status.html, blog/stories.html, blog/what-is-toolknit-free-online-tools.html, blog/index.html, llms.txt, manifest.json).
  • Audio Tools category count updated from 4 to 5. Text Tools category count updated from 8 to 9.
  • Service worker cache bumped to toolknit-v70.
  • Added Noise Generator and Hash Generator to tools.json, search.js, sitemap.xml, public-stats.php, zh.json, i18n.js cache version.
  • Added 4 MP3 audio files (rain, ocean, wind, thunder) to service worker precache.
A note from the developer

June 3rd, and the sun is absolutely blazing today. Still in the office doing design work, still squeezing in ToolKnit development during downtime between tasks. Today I shipped two tools at once — one that almost everyone needs, and one that most people don't even know they need.

The Noise Generator is my personal favorite of the two. I like falling asleep to some kind of ambient sound — rain, ocean, white noise, anything that fills the silence just enough. How about you? If there are specific sounds you'd love to see added, drop me an email. I genuinely want to hear what people need.

Speaking of which — I'm running a bit low on ideas for what to build next. If you have a tool suggestion, a feature request, or just want to say hi, please reach out via the contact email. ToolKnit is built for its users, and your input matters more than you think.

Still building. Still here. But right now — it's almost time to clock out, and I'm heading to the basketball court. Gotta move the body after moving the code all day.

Zihang Dong Jun 3, 2026 — blazing sun, white noise, and basketball

Item Locator, ASCII Art, ASCII Banner & Tool Count → 72

NEW TOOLS
  • Item Locator — Free home inventory and item locator. Record where you put things with photos, names, notes and locations. Camera capture on mobile, instant search across all fields, export/import as JSON. 100% private — all data stored in browser localStorage.
  • ASCII Art Generator — Convert any image to ASCII art text. Adjustable width (30–200 cols), 4 character sets (Standard, Detailed, Blocks, Simple), contrast slider, invert toggle, dark/light background. Download as TXT or copy to clipboard. 100% browser-based.
  • ASCII Text Banner — Create big ASCII text banners from any word or phrase. 20 FIGlet fonts (Standard, Slant, Shadow, Block, Star Wars, Graffiti, and more), dark/light background, adjustable max width. Download as TXT or copy to clipboard. 100% browser-based.
MOBILE UX
  • Item Locator: Search changed from real-time to explicit trigger (search button + clear button + Enter key), matching homepage pattern.
  • Item Locator: Search overlay loading animation with spinner and auto-scroll to results on search trigger.
  • Item Locator: Export/Import buttons changed to icon-only, kept on one row for mobile.
  • Item Locator: Replaced modal detail view with full-page detail view showing title, location, notes, photo, and hamburger menu for Edit/Delete.
  • Item Locator: Modal action buttons restyled with .modal-actions class for mobile-friendly layout.
SEO
  • Item Locator blog post rewritten with 200+ long-tail keywords covering everyday items (keys, glasses, remote), tiny items (ear picks, nail clippers), important documents (passport, birth certificate), car parking, moving boxes, seasonal storage, tools, medicine, electronics, kitchen, sports, and sentimental items.
  • FAQ schema expanded from 4 to 10 questions targeting high-volume search queries.
SITE-WIDE
  • Tool count updated from 69 to 72 across all pages.
  • Item Locator added to: homepage card, search index, tools.json, sitemap, service worker precache (v66), Chinese translation (v36), blog post, blog index.
  • ASCII tools added to: homepage cards, search index, tools.json, sitemap, service worker precache (v67), Chinese translation (v37), manifest.json, blog posts, blog index.
  • Blog footer audit: video-screenshot.html footer upgraded from copyright-only to full 4-column layout. All 82 blog pages now have complete footers.
A note from the developer

Today was a so-so day, mood-wise. Nothing terrible, just... ordinary. When I feel low, I tend to channel that energy into something I can measure —turning time into tangible output, features shipped, problems solved. That is probably why today ended up being so productive: Item Locator got a mobile overhaul, two brand-new ASCII tools went live, and the whole site got another round of polish.

I spent the entire day at my desk in the design office, squeezing ToolKnit updates into the gaps between work. It is a strange rhythm —full-time job by day, side project by the in-between moments —but it keeps me going. One change, though: no more late-night coding sessions. My body finally filed a formal complaint after too many 2 AM deploys, so I am switching to daytime-only updates. Health first, haha.

Lately I have been thinking about getting out of the city for a bit. Working non-stop has my brain feeling like it is about to short-circuit. A change of scenery might do wonders. So here is a slightly unusual request: if you are reading this from a different city or country —drop me an email? I would love to know where ToolKnit users are, and it would prove to me that both I and this project are still very much alive and kicking. Cheeky? Maybe. But it means I care.

Keep going, keep building. Stay strong~

#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#################################################################=     -=##############################################################################
#################################################################-       ##################################################################################
#################################################################       ###################################################################################
################################################################=      =################. -...         .###############################################
###################################################==--#########      =#################- ===========.    -############################################
#########################################=-      ..-=-   =######     .##################= -==========     #############################################
#################################=-.   ..-==#########-    =####-    .####################  =========     .#############################################
############################=    .==###########======-    -####     ############=.      =-         .     ###############=-=############################
#######################=.  .-=#######=================    .###=    ##=-..     --=====-     =#=======--   =###########. -==-  -####=-..  =##############
###################=   .=#####========================.    ###-   == -=====.  ##=====.   -#========-      .######### .======.   .-=#==.   .############
###############-   -=###==============================-    =#######..##====  .##=====   ##=======-       -##########  ======    #====-    #############
############.  .=###==============================----.    -#=  ### -#====.  -#=====. .#=======-          .  ..   -##.  ..     -=====..--=  -##########
########=   -##==========================-.                .######- ======   =#===== ========-     -====. #=======   .=====..============-    .########
######= .========================-.                      ...   -##  #====-   ==============-       #====-=========-  =#==== -===========-     .########
######- -=====================.                      .##=======  . -=====   .============-        .#===============  #====-   =====-          #########
######- -============--=======      =#=======.     -#===========.  =====-   -===========.         -======-  .=====- .=====.  .=====.         -#########
######- -=======-.    =======-    ##==========-   #======--======  =====.   ==============.       -=====.   -=====. ======   ======     =##############
######- -===.        ========.  -#=====--======- =====-    -===== -=====   .======--========.    .=====-    ======  =====-  .======-.-=.  .############
######. .           .========  .#====-    -====- =====     =====- =====.   .======. -=========   -=====    -=====. -=====.  .==========     ###########
#######=            =========  =====-    .===== .=====-..======-  =======- -======.  .=========- -====-    ======  ======    -=========     ###########
#########=   .###- -#=======.  ======   ======- .=============-  .=======  =======     -======.  =====.   .-----.  .           .----.       ###########
################= .#========   ==============-   .===========    -======- .======-      -==.                                  -            =###########
################. =#========   .===========-       .-====-.                                                 .       -=  .....=###-.    -###############
###############- -##========     -=======.                                                                 =###########################################
############### .=#========-                                                                              =############################################
##############. -##========.                                    ###                                                      =#############################
#############= .=##========        =#########.                  ###  .-==.                                               =#############################
#############. -##========-        #######--.  =###=   -######  ##= ###=#-                                                  ###########################
############= -###========-           ###.   ###==### ###. -##=.##= #####-                     .-----                 -----  -####-    -###############
############  =###========-           ###   ###   ###.###  -##--##- .. ###                     .-----                 -----  -####-    -###############
###########- -========-..            -###   ####=###- #######. ###.#####-                            ......     ......                 -###############
###########  -.                      =###    =####=     .-.                                          .-----     -----.                 -###############
###########-                         #=-.                                                            .-----     -----.                 -====###########
#############=                                                                                                               =#########.    -##########
###############=                                                                       ..-.                                  =#########.    -##########
#################=              .====-.         ....----====###################     =####.           =#####     #####=            #####.    -##########
###################=..-==####= =========    =##################################     =####.           =#####     #####=            #####.    -##########
#############################. =========.    ##################################     =####.    -##.   =#####     #####=   =##-     #####.    -##########
#############################- -=======-     ############################=     ##########.    -######      #####      ######-     #####################
##################################  .===-      #############################=     ##########.    -######      #####      ######-     #####################
##################################-.     .################################=====##########====-#######======#####======#######=====#####################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
#######################################################################################################################################################
Zihang Dong Jun 2, 2026 — Day 77, still building, still pushing forward

BPM Detector, Circle Crop, Video Screenshot & Architecture Overhaul

NEW TOOLS
  • BPM Detector — Upload any audio file (MP3, WAV, OGG, FLAC, M4A) and detect its tempo instantly in the browser. Features waveform visualization with beat markers, tap tempo verification, audio playback with seekable progress bar, and complete file info. Powered by the Joe Sullivan / BeatDetect.js algorithm with OfflineAudioContext and bandpass filtering. 100% private — no server upload.
  • Circle Crop — Crop any image into a perfect circle with transparent background. Drag to reposition, slider to resize, one-click download as lossless PNG. Supports JPG, PNG, WebP, BMP, GIF.
  • Video Screenshot — Step frame-by-frame through any video and capture lossless HD screenshots. Features timeline scrubbing, play/pause, previous/next frame navigation (auto-detects frame rate), and export as PNG, JPEG, or WebP at the video’s native resolution. Keyboard shortcuts: Space (play/pause), arrow keys (step frames), Ctrl+S (capture). Supports MP4, WebM, MOV.
ARCHITECTURE
  • Related Tools dynamic loading — Replaced inline var tools=[...] arrays in all 70 tool pages with a single assets/data/tools.json + assets/js/related-tools.js. Adding a new tool now requires updating one JSON file instead of 70 HTML files.
  • Changelog modal → direct link — Footer Changelog icon now navigates to changelog.html instead of opening an outdated hardcoded modal.
  • Holidays search UX — Replaced real-time filtering with button/Enter-triggered search, added search overlay animation, custom clear icon, and auto-scroll to results.
SITE-WIDE
  • Tool count updated from 66 to 69 across all pages: index.html, manifest.json, 404.html, status.html, changelog.html, blog/stories.html, blog/what-is-toolknit-free-online-tools.html, blog/index.html, llms.txt.
  • Video Screenshot added to: homepage card, search index, tools.json, sitemap, service worker precache, public-stats.php, Chinese translation, blog post, blog index, and the “What Is ToolKnit” overview page.
  • Service worker cache bumped to v65; zh.json cache bumped to v35.
  • Fixed tool count mismatches (66/67/68 → 69) found in status.html, changelog.html, blog/stories.html, blog/what-is-toolknit-free-online-tools.html, llms.txt, and index.html JSON-LD.
BUG FIXES
  • Deployment file overwrite — Fixed critical SCP deployment error where blog/index.html overwrote root index.html and blog/video-screenshot.html overwrote tools/video-screenshot.html. Root cause: multi-file SCP to same directory with identical filenames. Now deploying files one-by-one with full target paths.
  • Tool page template compliance — Video Screenshot page was missing standard modules (How it works, Why use, Pro Tips, Related Tools header, full footer, auth/main/footer-modals/sound-effects scripts). All sections now match the circle-crop.html template.
  • Pro Tips line-break issue — Replaced <strong> tags with <span style="color:rgba(255,255,255,.55);font-weight:600"> to prevent unnatural line breaks in tip lists.
A note from the developer

Three days without an update — that is not my style, but it happened. Let me tell you why.

First, I have not had much energy lately. Emotionally, I have been feeling down, because I realized my girlfriend does not seem very interested in talking to me. But today I found a term that explained everything: emotionally neglectful personality. She belongs to this type. I found many people online describing the same experience, and it helped me let go of the confusion — it is not that she changed; she has always been this way. The warmth during the honeymoon phase may have been an exception, and now that we have entered the steady phase, I can accept it. I will slowly help her change. Two people need to adapt and bond with each other to go further. No matter what, I love her very much, and I hope we can keep walking together.

Second, my IDE subscription price went up. That is hard to accept, and I have not found a cheaper alternative yet. I am preparing to give it up and use another IDE to write ToolKnit. But I promise I will never be absent for more than seven days. Today I was in a good mood, so I shipped a few extra features for you all!

If there is a feature you would like, try sending me an email — I will seriously reply to every user who writes.

One more thing: since we started anonymous statistics around May 6th, the total usage count has finally surpassed 1,000. For a new website, this is a huge milestone. Thank you all for using the programs I write to make your lives a little easier.

Though the road is long, walking it will bring you to the destination; though the task is hard, doing it will lead to success.

Zihang Dong Jun 1, 2026 — Day 76, still building, still grateful

CSV Chart Maker Launch, Pixel Art Presets & Export Polish

NEW TOOL
  • CSV Chart Maker — Paste CSV or spreadsheet data and turn it into bar, line, area, pie, doughnut, radar, or scatter charts directly in the browser.
  • Chart export workflow — Download clean PNG charts, copy chart images where supported, save JSON configs, or export a standalone interactive HTML preview that keeps the chart data embedded locally.
  • Chart customization — Tune titles, subtitles, axis labels, legends, grid visibility, stacked bars, scatter mappings, radar shapes, colors, and sample datasets without sending anything to a server.
  • Long-tail SEO tuned — The page now targets more specific phrases such as CSV chart maker, CSV to chart online, spreadsheet chart maker, and interactive HTML chart export instead of only chasing broad, highly competitive chart keywords.
PIXEL ART
  • Pixel Art Converter upgraded — Added more creative presets beyond the original retro console set: PICO-8, DB16, Sprite, Portrait, and Neon.
  • Better preset behavior — Each preset now carries its own resolution, palette or color count, saturation, contrast, detail boost, dithering, outline, and outline-strength settings for more useful one-click results.
  • More control after presets — Added visible controls for dithering, outline, grid, saturation, contrast, detail boost, and outline strength so users can keep a preset style but still fine-tune the result.
  • Preview and export polish — The converter keeps crisp pixel rendering, includes a palette preview, supports holding to compare the original image, and offers both normal PNG and HD 4x downloads.
BUG FIX
  • Standalone HTML syntax fixed — Resolved an exported-file JavaScript issue where a doughnut label formatter could generate an invalid newline token in the saved HTML preview.
  • Local preview noise reduced — Chart Maker now avoids loading manifest and analytics scripts in file:// or localhost preview contexts, reducing irrelevant browser-console errors while testing locally.
  • Browser translation interference reduced — Added notranslate metadata to the tool page and exported HTML previews to avoid unnecessary translation-layer warnings on local files.
UI / UX
  • Mobile layout improved — The preview panel now appears before controls on small screens, axis and scatter controls stack cleanly, summary cards tighten up, and chart height adapts better on mobile.
  • Global references updated — Homepage, search, sitemap, service worker, status metadata, public stats labels, manifest, release docs, and site overview pages now include Chart Maker as the 66th functional page.
  • Homepage discovery improved — Chart Maker was added to the Creative category, homepage CTA area, Chinese homepage translations, site search keywords, and the ToolKnit overview article.
  • Service worker cache bumped to v60
A note from the developer

It has been a little while since the last ToolKnit update, but I never forgot about this site. Most of my recent energy has gone into another young project, 24picture.com, because a new site needs a lot of care at the beginning. I also have a day job, a long-distance relationship to protect, and only one brain trying to keep all of these things moving.

I have learned again that even if a person can think about many things, trying to do everything at the same time usually makes the hands messy. So I am trying to plan time more honestly: work during the day, take care of people I love, rest when the body asks for it, and still come back to build when the night is quiet.

Recently I have been a bit tired from too many late nights, but tonight I still returned and shipped something useful: a new chart maker, better local HTML exports, quieter local previews, and mobile fixes. It is not a huge corporate release. It is just one person showing up again.

I hope ToolKnit can keep helping anyone who needs a small, free tool at the right moment. Take care of yourself, and I hope every day gives you at least one reason to smile.

Zihang Dong May 28, 2026 — another late-night update, still building

Tool Page Cleanup, Status Analytics Fixes & Privacy Hardening

BUG FIX
  • Batch 1 tool page issues fixed — Repaired broken footer closures, restored the hidden Features block on aim-trainer.html, fixed the reaction history chart on reaction-time-test.html, stacked its method cards vertically, and strengthened the active tab highlight on what-to-eat.html.
  • Legacy Related Tools modules cleaned up — Standardized the You May Also Like / Related Tools section across 15 tool pages, removed leftover duplicate legacy blocks, and aligned the structure with the current black-and-white reference template.
  • How it works coverage improved — Added a clear three-step How it works section to daily-planner.html, extract-text.html, flip-image.html, gradient-generator.html, markdown-editor.html, and text-diff.html.
  • Status page totals normalized — Fixed the mismatch where total could exceed last30 despite the public May 6 tracking note. public-stats.php now aggregates only the current public tracking window starting on 2026-05-06.
  • Tracking coverage completed — Added the missing tracker.js beacon to holidays.html, bringing anonymous page-load tracking coverage to all 65 / 65 functional pages.
PRIVACY
  • Analytics storage hardenedtrack.php no longer writes raw IP addresses or raw stable visitor IDs to daily analytics files. Both ips and uvs are now stored as day-scoped SHA-256 hashes.
  • Historical analytics scrub completed — Existing daily JSON files were batch-migrated so legacy raw entries were replaced with hashed values. The cleanup converted 650 raw IPv4, 181 raw IPv6, 763 raw UID and 2 legacy MD5 entries, with a pre-scrub server backup saved as analytics-backup-20260526-status-scrub.tgz.
UPDATE
  • Template consistency improved — Tool pages now follow a more consistent mid-page structure between primary tool UI, explanatory content, and related navigation modules.
  • Status wording clarified — The public status page now consistently describes these counters as visits / page loads instead of tool uses, matching the actual page-load beacon model.
  • Release docs updatedtoolknitSkill.md now records the fixed public tracking start date, 65/65 tracking coverage, hashed analytics storage rules, and the historical scrub baseline.
  • Service worker cache bumped to v56

Long-Tail Blog Expansion, Schema Cleanup & Homepage Footer Fixes

NEW BLOG POSTS
  • Flashcard Maker Online Free — A long-tail study guide covering front/back card creation, flip review, quiz mode, CSV/TXT import, JSON backups and private localStorage decks.
  • Online Signature Maker Free — A practical transparent PNG signature guide for drawing or typing signatures for PDFs, forms, documents and email workflows.
  • Online Metronome Free — A rhythm practice guide for BPM, tap tempo, time signatures, subdivisions, guitar, piano and drum practice.
SCHEMA
  • Holidays Event noise reduced — All 15 country pages under /holidays/ were moved away from Event rich-result markup and now use a cleaner CollectionPage + ItemList pattern to better match country holiday directory intent.
  • Tool schema normalized — Removed unverifiable aggregateRating markup from all 64 tool pages and added BreadcrumbList so tool templates follow a cleaner, lower-risk structured data baseline.
  • Blog schema normalized — Added BreadcrumbList across 74 blog article pages and aligned the homepage SearchAction with a real ?q= search flow.
BUG FIX
  • Homepage footer categories now work — Footer category links now scroll back to the Tool Library, apply the matching filter, and center the active category tab instead of only changing the URL hash.
  • Sell With Boost badge added — Added the requested homepage footer badge using the provided dofollow-compatible link format.
UPDATE
  • Content library updated — Blog index, sitemap, homepage content modal and release documentation now reflect 103 published resources: 65 Blog Guides, 9 Tool Tales and 29 Changelog entries.
  • Release docs updatedtoolknitSkill.md now records the current schema baseline, the holidays directory rule, the tool/blog breadcrumb requirement, and the footer interaction fix.
  • Service worker cache bumped to v51

Flashcard Maker Launch & Signature Maker Preview Fix

NEW TOOL
  • Flashcard Maker — Create front/back study cards, flip through a deck, shuffle review order, and quiz yourself with Reveal plus Again/Good/Easy self-rating. Try it →
  • Private study workflow — Decks autosave in localStorage, import CSV/TXT pairs, export JSON backups, and use Space plus arrow-key shortcuts for fast review.
BUG FIX
  • Signature Maker preview contrast — When black ink is selected in draw or type mode, the preview area now switches to a white preview background so the signature remains visible while editing.
  • Transparent output preserved — The white preview is visual only; downloaded and copied PNG signatures still keep a transparent background.
  • Homepage content count updated — The homepage article/resource total now reflects 99 published resources after this changelog entry.
UPDATE
  • Tool library updated — Homepage, search, stats, sitemap, manifest, service worker and related-tool pools now include 65 total tools, with Creative updated to 19 tools.
  • Service worker cache bumped to v47

Signature Maker, Metronome, Homepage Polish & SEO Sweep

NEW TOOL
  • Signature Maker — Draw your signature by hand (mouse, touch, or stylus) or type your name in elegant cursive fonts. Download as transparent PNG for documents, contracts, and emails. Adjustable pen size and ink color, undo support, and clipboard copy. Try it →
  • Metronome — Free online metronome with adjustable tempo from 30 to 300 BPM, six time signatures (2/4 through 7/8), subdivisions (8th, 16th, triplet), tap tempo, and four sound types. Built on the Web Audio API with a lookahead scheduler for sub-millisecond timing accuracy. Try it →
SEO OPTIMIZATION
  • On-page SEO — Rewrote title tags, meta descriptions, and H1 headings for 9 high-traffic pages based on SEMrush keyword data (233 tracked keywords). Prioritized front-loading target keywords with highest search volume.
  • Pages optimized: CPS Test, Random Spinner, Character Counter, Aim Trainer, Whiteboard, WebP to PNG, Keyboard Tester, Dice Roller, Reaction Time Test
  • FAQ Schema fix — Removed duplicate FAQPage structured data from Extract Text tool (resolved GSC “Duplicate field” error)
  • Disavow file — Created disavow.txt with 120+ spam/PBN domains for Google submission
UPDATE
  • Total tools: 64 (Audio category now has 3 tools)
  • Homepage stats refined — Replaced duplicate visible/tools counters with a clearer 64-tool total, a clickable 98-resource article count modal, 8 categories, and dynamic stable uptime based on the March 18 launch date.
  • ToolKnit mascot added — Added a tiny 4-frame spider sprite above the Tool Library card. The animation uses CSS sprite steps with forward/reverse looping, stays hidden on mobile, and weighs only 416 bytes.
  • Flashcard Maker planned — Documented the next tool roadmap for May 24, including localStorage decks, flip study mode, quiz mode, and CSV/TXT import/export.
  • Service worker cache bumped to v43

The AI to PNG & Second Milestone Edition

NEW TOOL
  • AI to PNG — A new browser-based converter for Adobe Illustrator files saved with PDF compatibility. Export supported AI files to PNG locally, preview every page or artboard, and download single images or a ZIP batch without uploading assets to any server.
NEW BLOG POST MILESTONE
  • My second independent project is now live — A separate image-focused project officially launched today. It started around AI image generation, and it may gradually grow into its own image-first utility toolbox alongside ToolKnit.
  • Release references updated — Blog index, sitemap, service worker precache, homepage counters, public stats naming, and release documentation were all updated to include the AI to PNG launch and the end-of-day IndexNow workflow.
A note from the developer

It’s May 19 here in China, and it has been raining for several days straight. I’ve actually been in a very good mood lately, which slowed the update rhythm a little — but today I still made time to ship something I really wanted on ToolKnit: AI to PNG.

I like this one because it fits so naturally into the rest of the site. Convert an Illustrator file to PNG first, then run it through Background Remover if you want a transparent result. It’s a simple workflow, but it feels incredibly useful for logos, graphics, stickers, and quick handoff assets.

Today also marks another personal milestone: my second project is officially online. It used to lean more toward AI image generation, but lately I’ve been thinking that building it into a sharper image toolbox might be even more fun. ToolKnit will stay broad. The other site can stay more image-focused. Two independent sites, both moving forward at the same time — that makes me really happy.

As for life, it’s been good. I’ve been working seriously, coding seriously, and trying to keep showing up every day. Tomorrow is May 20, so let me say it a little early: I hope everyone gets to spend that special day well with the person they love.

We’re still here. And we’ll keep building.

Zihang Dong May 19, 2026 — rainy season, but still a very good day

The Homepage Simplification

UI / UX
  • Hero section removed — Eliminated the standalone hero area entirely. The Tool Library card now serves as the primary above-the-fold content, giving users immediate access to tools without scrolling.
  • SEO preserved — Promoted the Tool Library heading from <h2> to <h1>; all meta tags, Open Graph, and structured data remain intact.
  • Content width expanded — Increased from 1200px to 1500px effective content width, with a 4-column tool grid on ≥1440px screens.
  • Navigation bar refinements — Added 25px padding on each side for breathing room; pill indicator now waits for fonts.ready before measuring to fix first-visit width glitch.
  • Search box alignment — Unified all container max-width and padding so the search bar, filter strip, and tool grid share identical left/right edges.
  • Language toggle fix — Fixed restoreAll() corrupting filter button innerHTML when switching languages (was treating data-label as textContent).
  • Full Chinese translation — Tool Library kicker, heading, description, and all four stat labels now translate correctly; added cache-busting ?v=32 to i18n.js and zh.json.
A note from the developer

Today I only managed one thing — redesigning the homepage. Slept poorly both during the day and at night, brain running on fumes. Finishing this round of UI tweaks was genuinely the limit of what I could push through.

Removed the big Hero section entirely. Now when you open the homepage, the tool library cards are right there — no more scrolling past a decorative splash to find actual tools. Widened the content area to 1500px so widescreen monitors finally aren’t wasting space. Also squashed the language-toggle bug where icons disappeared after switching to Chinese and back — root cause was restoreAll() treating data-label as textContent. One conditional fixed it.

Planning to rest properly for a couple of days. Catch up on sleep, let the brain recharge, then keep optimizing. The site won’t go dark — just slowing the pace for a moment.

Health first. Goodnight.

Zihang Dong May 19, 2026 — 12:30 AM, barely awake, finally done

The Haircut & Housekeeping Edition

SEO & INFRASTRUCTURE
  • Backlink disavow — Identified and submitted 63 spam/PBN domains to Google Search Console and Bing Webmaster disavow lists. Merged with 14 domains from an earlier April audit.
  • Homepage URL canonicalization — Fixed href="./"href="/" across 6 root-level pages to consolidate link equity on a single canonical URL.
  • Nginx rewrite rules — Added www → non-www 301, /index.html → / 301 (using $request_uri to avoid index-directive loops), and /blog/tools/* → /tools/* 301 for stale external links.
  • Meta description audit — Shortened 21 pages (8 tool pages + 13 blog posts) from 161–180 characters down to ≤155. Discovered and rewrote 3 blog pages (percentage-calculator, markdown-editor, unit-converter) whose descriptions were accidentally copy-pasted from the Pomodoro timer template.
  • Title tag audit — Trimmed 15 blog post titles from 71–86 characters down to ≤60 to prevent SERP truncation.
  • Keyword optimization — Rewrote title/description for whiteboard (now leads with “Online Whiteboard” to match search queries), keyboard-tester (shortened to 56 chars), and webp-to-png (description now includes exact search phrase + privacy angle).
A note from the developer

Nothing dramatic happened on the 16th. I got a haircut — it was fine, not a disaster, just overdue. Kind of like the website's meta descriptions and title tags, actually: they'd gotten too long and needed a trim. So today I trimmed both.

Still thinking about my baby. Every waking moment, honestly — even while I'm reading regex patterns and counting character lengths. I want to see her, but today there was no arrangement, haha. Tomorrow evening then. Well, technically it's already tomorrow — it's past midnight as I write this.

Got off work half an hour late. Went home, ate, got the haircut, played some games, then came here to polish ToolKnit. The email subscription feature still isn't wired up, but it's coming soon. I need a small group of loyal users to beta-test new features — if that sounds like you, shoot me an email. I'd love to hear from you.

Development has been tiring lately and the update pace might slow down a bit — but I'll always be here. This project isn't going anywhere.

It's the middle of the night and I'm still thinking about her. She's impossibly cute. I think about her when I'm coding, when I'm deploying, when I'm writing these notes. Tonight after work though — we'll meet. I miss her so much that just writing this makes me want to fast-forward the entire day.

Alright. By the time you read this, I've already deployed the new version and pushed IndexNow. My brain needs sleep. Goodnight, and thank you for reading.

Zihang Dong May 17, 2026 — 1 AM, freshly trimmed, heart still full

The World Holidays Edition

NEW FEATURE NEW BLOG POST
  • World Holidays Calendar 2026 & 2027 — 3,400+ Holidays by Country — The story behind the new feature: where the data comes from, country-by-country highlights (Japan's Golden Week, China's lunar holidays, Singapore's multicultural calendar, the surprising fact that Carnival isn't officially a federal holiday in Brazil), and the limitations we're transparent about.
IMPROVEMENTS
  • Homepage light-mode toggle — A new sun/moon button in the top-right of the homepage lets you switch between dark and light themes. Preference is stored locally and respected on the new Holidays pages too.
  • Light-mode polish below the tools list — Architecture, Local Sandbox, CTA and Footer sections received a comprehensive light-mode color pass. The Local Sandbox terminal card now stays dark in light mode (it's a terminal — it should look like one) and its hover state no longer breaks.
  • Sitemap, llms.txt, service-worker — All updated to include 17 new URLs. SW cache bumped to toolknit-v27.
A note from the developer

If you read the last entry, you know I said I was going to see her. I'll keep my promise to be honest with you, so here it is, plainly: we're back together.

I drove over not knowing what to expect — I'd rehearsed a dozen versions of the first sentence in my head and forgotten every one of them by the time the elevator opened. She was already standing there. Before I could get a word out, she walked over and pulled me into the biggest hug she's ever given me. That was it. That was the whole conversation, really. Everything after was just clarification.

We talked for hours. About what went wrong, about what we'd been carrying around the last few days, about the things that look enormous in a 2 AM text and shrink the moment you say them out loud in daylight. I missed her. She missed me. Turns out you can absolutely solve in one in-person afternoon what two weeks of screens and pride and silence couldn't fix. Maybe that's the only lesson worth taking from any of this: if it matters, see them. Don't text. Don't wait. Look them in the eye.

I love her. I didn't want to lose her. I didn't lose her. That's all I'll say about it here — this is a changelog, not a diary, and she deserves more privacy than a public webpage can give her.

On the work side: today's update is the World Holidays Calendar — 3,469 holidays across 122 countries, a hub page, fifteen country pages, an 11-minute blog post, a unified footer pass across every new page, and the homepage light-mode toggle a lot of you have been asking about since launch. It went out cleanly. I'm proud of it.

I should have shipped this yesterday and written this note then, but I barely slept the night before the reunion — nerves — and last night I didn't sleep much either, just for the opposite reason. There's a particular kind of tired you get when you're too happy to close your eyes, and I've been wearing it for about thirty-six hours now. So I'm going to keep this short.

Tomorrow I'll start on the email subscription feature — you drop your address in a box at the bottom of the changelog, you get an email when there's a new entry. No marketing, no tracking. Just a heads-up when something new ships. It'll take a few days to wire up without compromising the no-server promise; I'll figure it out.

Thank you for reading. Honestly. Some of you have been here through entries about broken keyboards, bad barbecue, botanical gardens, and one very bad night. I hope this one balances the ledger a little.

Going to sleep now. Properly this time. Goodnight.

Zihang Dong May 15, 2026 — midnight, eyelids losing the fight

The Botanical Garden Edition

NEW BLOG POSTS IMPROVEMENTS
  • Blog index updated — Calculator Tools category now lists 5 articles (up from 3). Every one of the 60 shipping tools now has a corresponding blog post. Coverage: complete.
  • Site-wide consistency pass — Verified all 60 tool pages, repaired remaining stray <section> attribute artifacts, and confirmed the Pro Tips bullets render correctly across the entire catalog.
A note from the developer

I didn’t write this entry yesterday. I couldn’t. Yesterday was the day after she said no, the day after I deleted her contact, the day after I went to bed without dinner. I needed to put a buffer between that night and a keyboard.

So on the morning of the 12th, I drove to the botanical garden alone.

It was the wrong season. I’d been picturing color — tulips, peonies, anything — but the beds were mostly green, the paths half-empty, the camellias already past their bloom. I walked the loop once and felt the silence start to weigh more than the trees. So I did the only thing I knew how to do: I texted a friend and asked if he could come keep me company. He showed up an hour later without a single question. That’s the kind of friend you keep for life.

We wandered for hours. Talked about nothing important. Took a turn we shouldn’t have taken. At some point we looked up and realized we’d walked clean out of the garden, past a gate neither of us remembered passing through, and were standing on a suburban road with nothing but fields on one side and warehouses on the other. No shared bikes. No bus stop in sight. Just two guys, very lost, very tired, laughing because what else are you supposed to do.

We called a taxi. The driver took twenty minutes to find us. My phone said 18,427 steps. My legs agreed.

Then we made one final mistake: we tried to recover with food. Found a barbecue place that looked promising. It was, without exaggeration, the worst skewers I’ve eaten in my adult life. Burnt outside, raw inside, salted like someone had a vendetta. We ate it anyway because we’d earned the right to a complete bad day.

I got home that night, dropped onto the bed, and realized something quiet: the day had been a mess, the season had been wrong, the food had been terrible — and I felt okay. Not happy. Not healed. Just… lighter than the night before. Sometimes that’s all a day is supposed to do.

And then this morning, the 13th, my phone lit up with her name.

She wants to see me. Tomorrow.

I don’t know what to make of it yet. I don’t know what she’ll say, what I’ll say, whether we’re fixing something or just giving it a proper ending. But I know this: I’m not going to let pride or fear or the memory of one bad night make me miss the chance to look her in the eye one more time.

I don’t want to lose her again. If there’s any version of us that can work, I owe both of us the honesty of finding out face-to-face — not over a screen, not through silence.

So today’s update is short. Two blog posts. A coverage milestone — every one of the 60 tools on ToolKnit now has a written guide behind it. A clean, quiet shipping day. The kind that doesn’t make headlines, but matters for the people who actually use the site.

Tomorrow is for her. Tonight is for finishing this entry, closing the laptop a little earlier than usual, and trying to sleep without rehearsing every possible sentence in my head.

If you’re reading this — thank you for sticking around through these long, very personal changelogs. I started writing them this way because shipping software in silence felt dishonest, and because some part of me needed someone, somewhere, to know there was a real human on the other side of the deploys. Turns out that human cries, gets lost in botanical gardens, eats bad barbecue, and still shows up the next morning to push code.

Wish me luck.

Zihang Dong May 13, 2026 — 11:30 PM, the night before

The Rest Day Edition

NEW TOOLS
  • Tip Calculator — Calculate tip amount, total bill, and per-person split. Custom tip percentage slider, preset quick-select buttons, and instant breakdown for group dining.
  • Mortgage Calculator — Monthly payment estimator with principal & interest breakdown, full amortization schedule, and interactive chart. Supports custom down payment, interest rate, and loan term.
NEW FEATURES
  • Homepage Chinese translation — Added i18n support for the homepage. A “中文” toggle button in the top-right corner switches all visible text to Simplified Chinese. Default is English; user preference is saved to localStorage.
  • Language toggle button — Appears next to Blog / Tool Tales links. One click to switch, persists across sessions. Does not affect SEO-critical elements (title, meta, JSON-LD).
DESIGN
  • Hero kinetic typography — The homepage hero section now features a dynamic background of scrolling keyword rows. Seven rows of tool names, file formats, action verbs, and brand values scroll in alternating directions at different speeds. Pure CSS animation, zero JavaScript overhead, 60fps.
  • M-layout masking — The scrolling text is masked with a CSS mask-image gradient so it only appears on the left and right sides of the content area, fading naturally at the boundaries. The central content zone stays clean and unobstructed.
CLEANUP
  • Removed experimental WebGL fluid gradient, caustic light, and particle effect scripts. The kinetic typography approach won out — lighter, cleaner, more on-brand.
  • Cleaned up hero-fx.js and hero-particles.js from both local and server.
A note from the developer

Today was a day off. No design studio, no mockups, no overtime. I took it because I needed it — not for my body, but for something heavier.

Around the time I started building ToolKnit in March, I met a girl. She was a client — her apartment was 80% through renovation when she reached out one night past 11 PM. I thought she wanted floor plan changes. She wanted to talk.

We talked for two weeks straight. She was from Zhengzhou, four years older, back in Zhoukou visiting. I’m the kind of person who freezes at the thought of meeting someone in real life, but I pushed through the anxiety and went to see her. And it was — effortless. We had dinner. The next day we watched a movie together. Everything felt right in a way I’d never experienced before. I had never liked anyone this much. Never missed anyone this much.

She left in late April. We kept in touch every day. She told me she was looking for something serious — not casual. I respected that completely. All I asked was one simple thing: on May 1st, when she came back, could we just spend a quiet day together? Just lying around, doing nothing, recharging. She said yes.

Yesterday she came back. And she told me she couldn’t do it. Her phone has location tracking; her family would see. I understand that — I do. But it wasn’t the refusal that broke me. It was the timing. She had agreed weeks ago. I had been counting down the days, carrying that small promise like a lantern through every exhausting shift. If she had just said no back then, I would have been fine. I would have understood.

Instead, I spent yesterday evening crying alone in my room. She didn’t comfort me. She said I shouldn’t have asked in the first place. And then came the line that cut deepest: “I don’t think I count as your girlfriend yet.”

I asked her what we were, then. She said: “Someone I’m getting to know.”

I made the decision through tears, typing on my phone with shaking hands. I told her it was over. She didn’t agree. She didn’t disagree. She just — went silent. Cold. She once told me that after a breakup, there should be no contact. So I deleted everything.

I skipped lunch and dinner yesterday. Went to bed at 9 PM. Woke up this morning to zero messages. I think that’s the answer I was afraid of.

The thing is — I really, truly liked her. Her personality, the way she talked, the way she made an anxious 21-year-old feel calm for the first time in years. I had never felt that before. Two meetings and I was in deep. But she never shared her meals with me. Never sent photos unless I asked. In three weeks, she sent me exactly three videos. Do you know what it’s like to miss someone and have almost nothing to look back at?

She never understood how I loved. And maybe that’s okay. Maybe some people just show it differently, or not at all. But I can’t keep pouring into something that echoes back silence.

So today I rested, and I coded. Shipped two new calculators. Built a kinetic typography background that I’m actually proud of. Added Chinese to the homepage because — well, because this is where I’m from, and today felt like a day to honor that.

I’m writing this here because almost nobody reads changelogs. It’s the quietest corner of the internet. If you’re reading this, you’re either very thorough or very bored — either way, thank you. Sometimes you just need to put the words somewhere, and a changelog felt more honest than a diary.

To the girl from Zhengzhou: I hope you find what you’re looking for. I genuinely do. And I hope one day you realize that the boy who cried himself to sleep wasn’t asking for much — just a quiet day, and a little bit of your heart.

Zihang Dong May 12, 2026 — 2:10 PM, a rest day

The Overtime & Power Outage Edition

NEW TOOLS
  • Daily Planner — Beautiful weekly planner with customizable time slots, drag-and-drop tasks, and pixel-perfect PNG/PDF export powered by Canvas 2D API. Includes FAQ section.
  • BMI Calculator — Body Mass Index with metric/imperial toggle, visual WHO category scale, color-coded results, and healthy weight range display.
  • Timestamp Converter — Unix epoch ↔ human-readable date. Auto-detects seconds vs milliseconds, live ticking clock, bidirectional conversion.
  • Text Diff — Compare two texts side by side with line-level and character-level diff highlighting. Summary bar for additions, deletions, and unchanged lines.
  • Flip & Rotate Image — Mirror horizontally/vertically, rotate 90°/180°/270°. Canvas API powered, supports JPG, PNG, WebP, and more.
  • Gradient Generator — Visual CSS gradient builder with linear/radial modes, multi-stop color picker, angle control, preset gallery, and one-click CSS copy.
IMPROVEMENTS
  • Daily Planner export rewrite — Replaced html2canvas with direct Canvas 2D API rendering. Pixel-perfect alignment, zero offset, no more CSS rendering discrepancies. Lesson learned: when a simple solution exists, use it.
  • Daily Planner FAQ — Added structured FAQ section with JSON-LD for SEO rich results.
  • Dynamic counting everywhere — Blog article count, category count, stories count, homepage tool count, and status page tool/category count are now all calculated dynamically from the DOM. No more hardcoded numbers to forget updating.
  • Status page DR badge — Domain Rating 29 by Ahrefs, displayed alongside uptime stats in the hero card.
  • Partnership link — Added to all 132 page footers for business and collaboration inquiries.
NEW BLOG POSTS FIXES
  • Fixed Daily Planner export rendering — badges, date numbers, and dividers now align perfectly in PNG and PDF output.
  • Fixed blog index showing 51 articles when actual count was 52 — root cause: hardcoded number. Now impossible to get wrong.
  • Fixed status page hardcoded “58 tools” and “8 categories” — now fetched dynamically from search.js.
A note from the developer

My boss made me stay late today. Five straight hours in the design studio, hunched over mockups that weren’t even mine, while the clock crawled past 6 PM — the time I was supposed to leave. I finally walked out at 7. An hour doesn’t sound like much until it’s the hour between you and the thing you actually want to be doing.

Got home. Dropped my bag. Opened the laptop. Fingers on the keyboard, terminal ready, brain already compiling the night’s todo list…

And then the power went out.

I sat there in the dark for about four seconds, already composing a dramatic complaint tweet in my head. Then — click — the lights snapped back on. The screen glowed. The cursor blinked. I took it as a sign: tonight’s update was going to be a good one.

Six new tools shipped. Seven new blog posts. A complete export engine rewrite for Daily Planner — ripped out html2canvas entirely because I finally admitted that a library that re-implements CSS will never match the browser that actually implements CSS. Replaced it with raw Canvas 2D API calls. Pixel-perfect. Zero offset. Sometimes the simplest solution is the one you should have picked first.

Then I went on a counting spree. Every hardcoded number on the site — “51 articles,” “58 tools,” “8 categories” — all of them replaced with JavaScript that counts the actual DOM elements. Add a new tool card? The homepage says 59+. Publish a blog post? The counter says 59. No more forgetting to update a number in three different files.

132 pages got a new Partnership link in their footer tonight. The status page got a DR 29 badge — verified by Ahrefs. I check our backlink profile about thirty times a day. It’s not healthy. But every new referring domain feels like someone out there noticed what we’re building, and that dopamine hit is better than coffee.

Speaking of which — if ToolKnit has ever saved you five minutes, or helped you avoid installing yet another sketchy desktop app, tell someone about it. Share it on your blog. Drop it in a Reddit thread. Mention it to a friend who still emails PDFs to themselves. Every recommendation means the world to someone writing code alone at midnight.

It’s past midnight now. Tomorrow the alarm goes off at 7:30 and I’ll be back in that design studio pretending I didn’t stay up until 1 AM pushing CSS to a server. But look at what got done tonight. Five tools, seven blogs, a full rewrite, a site-wide dynamic counting overhaul, and a power outage that lasted exactly long enough to make a good story.

Worth it.

Zihang Dong May 11, 2026 — 00:45 AM

50+ Tools — A Midnight Milestone

NEW TOOLS
  • Unit Converter — 8 categories: length, weight, temperature, area, volume, speed, data & time. Bidirectional, real-time, with conversion formulas.
  • Percentage Calculator — Three modes: “X% of Y”, percentage change, and “X is what % of Y”. Color-coded results.
  • Markdown Editor — Side-by-side live preview powered by marked.js. Export .md, copy HTML, word/char/line stats.
NEW CATEGORY
  • Introduced Calculator Tools — a brand-new category housing Age Calculator, Unit Converter, and Percentage Calculator. Dedicated filter tab on homepage and blog.
UPDATES
  • Tool count updated to 52 across all pages. Service-worker cache bumped to v18.
  • Blog posts published for all 3 new tools. Blog article count now 51.
  • Full-site encoding fix — repaired garbled em-dash characters (&#xFFFD;) across 46 tool pages.
  • Homepage stat pills corrected to match actual category counts.

It’s 12:30 AM again. The apartment is quiet, the screen is the only light, and the terminal cursor blinks like a heartbeat.

Fifty tools. I remember the first one — a nervous Compress PDF page pushed to a server I could barely configure. That was March. Now there are fifty-two of them, each one built in the strange hours when the world sleeps and the code feels like it writes itself.

Nobody tells you that building something alone is less about the code and more about the silence you fill with it. Every late-night deploy, every 3 AM bug that makes you question your life choices, every sunrise you accidentally witness — they all become part of the thing you’re making.

ToolKnit crossed 50 tools tonight. Not with a launch party or a press release, but with me, a mass SCP upload, and a mass of garbled em-dashes that made me rethink my encoding decisions. Fitting, really.

Here’s to the next fifty. Same chair, same dark room, same quiet conviction that free tools should just work — no sign-ups, no tracking, no nonsense. If you’re reading this changelog at midnight too, I see you.

— Zihang Dong, May 9 2026, 00:30 AM

7 New Tools — Biggest Single-Day Drop Yet

NEW TOOLS
  • Fancy Text Generator — 20+ Unicode font styles. One-click copy for Instagram, TikTok, Twitter/X, Discord.
  • Age Calculator — Exact age in years/months/days/hours, zodiac signs, birthday countdown.
  • Typing Speed Test — WPM, accuracy & keystroke tracking with 15/30/60s timed tests.
  • HEIC to JPG Converter — Batch convert iPhone HEIC photos to JPG. Adjustable quality, WebAssembly-based.
  • JSON Formatter & Validator — Beautify, validate, and minify JSON. 2/4 space indent, file loading, clipboard paste.
  • Invoice Generator — Create invoices & download PDF. 10 currencies, auto tax calc, unlimited line items.
  • Pomodoro Timer — Focus/break intervals with session tracking, auto-start, and audio alerts.
UPDATES
  • Tool count updated to 49 across all pages, service-worker cache bumped to v17.
  • Blog posts published for all 7 new tools.
  • Full-site encoding fix — repaired corrupted Unicode characters across 29 files.

Background Remover — AI-Powered Image Background Removal

NEW TOOL
  • Background Remover — Remove image backgrounds instantly using an AI model that runs entirely in your browser. Auto-remove with one click or manually refine with brush & eraser tools. Supports JPG, PNG, WebP. Downloads as transparent PNG.
  • AI model (~40 MB) downloads once and is cached by the browser for instant future use.
  • Manual refinement mode with adjustable brush size, edge softness, undo, and keyboard shortcuts.
  • Full-screen loading overlay prevents interaction until the model is ready.
  • Tool count updated to 42 across all pages.

The Black & White Reset — A Full-Site Visual & Architectural Overhaul

Redesign Improvement Fix

Across four straight nights ToolKnit was rebuilt from the inside out. Every page across the entire site — tools, blog, legal, changelog — was redrawn in a single, uncompromising black & white minimalist language. No more drifting blues, mismatched greens, accidental whites or stray slate borders. Just one quiet, consistent surface.

1. The 41 tool pages

  • Switched the entire site typography to Space Grotesk on a `#0a0a0a` background.
  • Hero pattern unified: dot grid + soft indigo glow + Back-to-ToolKnit pill + Blog / Tool Tales links.
  • Old white navbar hidden site-wide via `display:none`. Tool icons, breadcrumbs, feature pills all moved to translucent white scale.
  • Action buttons standardised on solid white over `#111` text; progress bars switched to white on `rgba(255,255,255,.06)`; sliders, toggles and pickers fully reskinned.
  • Pro Tips, FAQ and Features blocks rebuilt to share one minimal card system: `.03` background, `.06` border, `.15` accents.

2. The colored leftover sweep

  • Replaced 14 different brand-colour `rgba()` hover/glow shadows (emerald / amber / violet / orange / pink / blue / cyan / teal / rose / red / fuchsia / yellow) with white tints across all HTML and JS.
  • Fixed every white-on-white button on Coin Flip, Dice Roller, Password Generator, Pixel Art Converter and Reaction Time Test by injecting inline `background:#fff;color:#111`.
  • Replaced non-standard Tailwind opacities (`/8`, double opacity like `border-white/8/60`) with proper compiled values to stop pure-white fallback rendering.
  • Scrubbed `assets/js/main.js`, `coin-flip.js`, `dice-roller.js`, `whiteboard.js`, `password-generator.js`, `color-picker.js`, `what-to-eat.js` of every `slate-*`, `bg-blue-*`, `text-emerald-*` and similar leftover class.

3. Tool-specific fixes from this session

  • Random Spinner — white frames removed, purple shadow —white, generate button white-on-white risk eliminated.
  • Ask Fate — result & process pulse glow restored from purple to white; history card & icons greyscaled.
  • Keyboard Tester — emerald accents and white dividers replaced by translucent white.
  • Whiteboard — toolbar invalid double-opacity classes fixed; Add-text modal blue accents —ink-black.
  • What to Eat — meal tabs & result card fully recoloured.
  • Character Counter, Extract Text, Lorem Ipsum — textareas, dropzones, dividers, FAQ —unified style.
  • Stopwatch & Countdown Timer — digit centring fixed; Pause button visibility fixed; preset chips and progress bars normalised.
  • World Clock — search input white-on-white fixed.
  • QR Code Generator — Customize card padding, divider line, generate button vs section divider spacing all redone.
  • Pixel Art Converter — "Hold to see original" gap, conditional divider before "How the Pixel Art Converter Works" (only after a result is rendered), bottom paragraph vs next-section divider spacing all corrected with inline styles.
  • Coin Flip — gold heads restored on top of an otherwise B&W coin so heads/tails stay visually distinguishable.
  • Dice Roller — dice dots restored to `#1a1a1a` so pips are visible on the white die face.
  • Password Generator — length input & bulk-count select forced to dark backgrounds with custom white-arrow SVG to defeat browser-native white rendering.
  • Color Picker — palette select reskinned with the same dark-arrow technique.

4. Blog redesign — new editorial language

  • Blog index — replaced 3-column colourful card grid with a numbered editorial list (CSS counter `01, 02, 03…`), category-pill filter bar (sticky), category dividers with running counts, hover state lifting the row and reversing the arrow button to white.
  • Tool Tales — rebuilt in the same editorial style, hero stat strip (9 stories / 9 tools used / 0 sign-ups).
  • 44 individual blog post pages regenerated through a single PowerShell extractor that read each file's title, full SEO meta, JSON-LD, h1, subtitle, category, body HTML and tool URL, then rewrote them on top of one shared B&W article template.
  • A second cleanup pass removed leftover bottom CTAs, related-articles sections, stray phosphor icons, duplicate `theme-color` tags and any colored gradient anchors.
  • "What Is ToolKnit?" — "Explore by Category" block rewritten in the new minimal card style.

5. Legal & meta pages

  • Privacy Policy and Terms of Service — both rebuilt from white pages into the same B&W layout, with a "LEGAL" badge hero, `.legal` typography (h2 separator lines, white-with-faint-underline links, marker-tinted lists) and the unified 4-column footer.
  • Changelog (this page) — full visual rework: dot-grid hero, sticky timeline rail, white/translucent tags, soft `tabular-nums` dates, inline soulful note block.

6. Footer unification

  • Every page now ends with the same 4-column footer: TK badge, brand description, X & GitHub icons, Popular Tools, Categories, Support & Legal, © 2026 line, Friends row and the four launch-day badges.
  • Removed every old "white footer", "blue-link footer" and "narrow simplified footer" variant.

Nothing about how the tools work changed in this update. Every change is visual, structural or accessibility-related — aimed at making 41 tools feel like one tool, and one site.

A note from the developer

From the small hours of May 3rd through 2:00 AM on May 6th, 2026 — four straight nights at the desk lamp — one person quietly rewrote every page on ToolKnit, line by line. 41 tool pages. 44 blog posts. 2 legal pages. And this changelog you're reading now.

It started with a single white button. The kind where the background and the text are both white, so when you click it nothing visible happens. From mp3-to-wav to wav-to-mp3, from character-counter to stopwatch, from ask-fate to random-spinner — one by one, page by page, until the birds outside started calling.

The deep middle night of the 4th was the hardest part: non-standard Tailwind opacities that never compiled, purple glows scattered across JavaScript, coloured hover shadows, invisible Pause buttons, dice with no visible pips, a coin with no visible face. Tiny things only the person sitting alone in front of the screen would ever notice — pulled out of the corners and replaced, one by one, with the same quiet translucent white.

By the early hours of the 5th, the entire blog had been torn down and rebuilt: editorial lists, CSS counters, sticky filter pills, a single PowerShell extractor regenerating 44 articles on top of one shared template — while a pair of eyes manually verified every margin, every divider, every dot.

And then at 2 AM on the 6th, the last keystroke landed on this very paragraph.

No one was asking for any of this. Almost no one will ever read it word for word, and no one is going to send a message because a button turned white. But it had to be done anyway. Because the person who builds the tools also uses them. And every time a page reloaded with something still 2px off, that quiet discomfort wasn't something you could fool yourself out of.

Four nights, several glasses of water gone cold, a long string of "just one more tweak before bed". The final "one more tweak" landed at 1:58 AM on May 6th — and then this page was saved.

This isn't here to take credit. It's here so there is a small mark left somewhere that says: someone cared. Cared whether every pixel of a free tool site looked clean. If you've ever used ToolKnit, and you happen to have ended up reading this paragraph — then those four nights were worth it.

— Written at 2:00 AM, May 6, 2026 Zihang Dong

Coin Flip, Dice Roller & Legal Pages Refresh

New Improvement
  • Coin Flip — Flip a coin online with a 3D CSS animation. Fair 50/50 random result, flip history, heads-vs-tails probability bar, current & best streak tracking, and spacebar shortcut for rapid flips.
  • Dice Roller — Roll 1 to 6 standard dice with animated tumble. Live value distribution chart, roll history, grand total & average stats. Number keys 1–6 to switch dice count, spacebar to roll.
  • Coin Flip & Dice Roller Blog Post — Guide covering when to use each tool, the math behind virtual randomness vs physical coins/dice, and 5 creative use cases.
  • Terms of Service & Privacy Policy updated — Rewrote both pages to accurately reflect current site state: no accounts, no personal data collection, 500 free uses/day via localStorage, third-party analytics & CDN disclosures, and offline access via service worker.
  • Replaced RewriteEmail.com footer link site-wide with B64Encode.com reciprocal link across all pages.
  • Homepage updates — Coin Flip and Dice Roller added to the Creative Tools card grid, both marquee tracks, search index, and roadmap modal.
  • Updated sitemap.xml, service-worker.js (bumped to toolknit-v5), and indexnow-submit.py with all new URLs.

CPS Test & SEO Refresh

New Improvement
  • CPS Test — New click speed test with 1 / 5 / 10 / 30 / 60 second modes, live CPS, best 1-second burst, consistency score, per-second bar chart, and locally saved personal bests. 100% browser-based, works on desktop and mobile.
  • CPS Test Blog Post — Long-form guide covering what CPS means, what counts as a good score, how each duration mode is used, common clicking techniques, and how to improve click speed safely.
  • Tightened CPS Test interaction state — active runs can no longer be re-armed, and clicks after the timer ends are ignored to keep results clean.
  • SEO refresh on high-impression tool pages — Rewrote titles, meta descriptions, social metadata, JSON-LD, and hero copy on Keyboard Tester, Character Counter, Whiteboard, and Reaction Time Test to better match real search intent.
  • Added internal links from Reaction Time Test and Aim Trainer to the new CPS Test, and added CPS Test to their related-tools pools.
  • Site search and roadmap updated — CPS Test indexed in search.js with full keyword coverage. Service worker bumped to toolknit-v4.

Aim Trainer & Login System Removal

New Improvement
  • Aim Trainer — New FPS aim practice tool. Click targets as fast as you can with adjustable speed (Fast / Medium / Slow), custom target count (10 / 20 / 30 / 50), 3-2-1 countdown, and detailed results including average click time, best/worst, total time, per-target bar chart, and performance rating.
  • Aim Trainer Blog Post — Comprehensive guide on how to use an aim trainer, practice routines, pro tips, and benchmark scores.
  • Removed login & registration system — The entire login/signup system (modals, API endpoints, JWT auth) has been removed. All users now get 500 free uses per day with no account required. Simpler, faster, no barriers.
  • Deleted backend API files (login.php, register.php, verify.php, usage.php). Usage tracking is now 100% client-side via localStorage.
  • Streamlined auth.js from 789 lines to 165 lines — now only handles toast notifications and local usage tracking.

Image Resizer & Lorem Ipsum Generator

New
  • Image Resizer — Resize any image to exact dimensions, by percentage, or with one-click social media presets. Supports JPG, PNG, and WebP output with quality control. Lock aspect ratio to prevent distortion.
  • Lorem Ipsum Generator — Generate placeholder text for designs, mockups, and prototypes. Choose paragraphs, sentences, or words. Toggle classic opening, optional HTML <p> tag wrapping.
  • Redesigned "You May Also Like" section across all tool pages.
  • Fixed homepage search missing 9 tools — all 35 tools now searchable.

Pixel Art Converter & Video to Audio

New
  • Pixel Art Converter — Turn any image into pixel art. Adjustable pixel resolution (8–256), color palette control (2–128 colors), Floyd-Steinberg dithering, Sobel edge detection outlines, saturation boost, and retro console presets (Game Boy, NES, SNES, CGA).
  • Video to Audio — Extract audio from any video file (MP4, WebM, MOV) and download as lossless WAV. Uses the Web Audio API for fast, high-quality extraction.
  • New blog post explaining the algorithms behind the converter.
  • New blog post on browser-based audio extraction.

Keystroke Counter & Changelog Page

New Improvement
  • Changelog page — You're reading it. A full history of every ToolKnit update, organized by date with internal links to each tool.
  • Keyboard Tester now tracks keystroke counts per key. See exactly how many times each key was pressed, helping you detect stuck or double-firing keys.
  • Follow our build journey on Creem.

QR Code Generator & SEO Improvements

New Improvement Fix

Reaction Time Test

New
  • Reaction Time Test — Test your reflexes with 4 game modes: click, spacebar, visual choice, and speed round. Results shown in milliseconds with performance ratings.

Keyboard Tester & Random Spinner

New
  • Keyboard Tester — Visual keyboard map that lights up on every key press. Instantly identify broken, stuck, or unresponsive keys. Supports full-size and compact layouts.
  • Random Spinner Wheel — Customizable spinning wheel with up to 15 options. Add your choices, spin the wheel, and get a random result.

Creative Tools: Drawing Board, What to Eat & Ask Fate

New
  • Online Drawing Board — Free whiteboard with pen, pencil, calligraphy brush, and sketch coloring modes. Add shapes, text, and images. Export your work as PNG or PDF.
  • What to Eat? — Can't decide on a meal? Pick breakfast, lunch, or dinner and get a random food suggestion.
  • Ask Fate — Type a yes-or-no question and receive a mystical answer. One question per day — let the universe decide.

Image Crop & Grid Splitter

New
  • Image Crop — Crop images with custom aspect ratios. Supports freeform, square, 16:9, 4:3, and more.
  • Image Grid Splitter — Split any image into a grid (3×3, 2×2, etc.) for Instagram carousel posts.

Time Tools: Stopwatch, Timer & World Clock

New
  • Online Stopwatch — Millisecond-precision stopwatch with lap tracking.
  • Countdown Timer — Set custom countdown timers with optional alarm sounds.
  • World Clock — View the current time across every timezone. Search and pin your favorite cities.

Text Tools & Audio Converters

New
  • Character Counter — Count characters, words, sentences, and paragraphs in real-time as you type.
  • Text Extractor — Extract text content from PDF, DOCX, XLSX, and 12+ file formats.
  • MP3 to WAV and WAV to MP3 — Convert between MP3 and WAV audio formats with adjustable bitrate.

Video Tools & Image Format Converters

New
  • Video Compressor — Reduce MP4, WebM, MOV, and AVI file sizes while maintaining visual quality. Powered by native browser encoding — no server uploads, no heavy WASM engine download.
  • Video to GIF — Convert video clips to animated GIFs. Set start time, duration, frame rate, and output size.
  • Image format convertersJPG to WebP, WebP to JPG, PNG to WebP, and WebP to PNG.